class SublimeDSL::TextMate::Snippet

Attributes

bundle_uuid[RW]
content[RW]
file_format[W]
key_equivalent[RW]
name[RW]
scope[RW]
semantic_class[RW]
tab_trigger[RW]
to_s[RW]
uuid[RW]
warnings[R]

Public Class Methods

import(file) click to toggle source

Returns a Snippet read from file.

# File lib/sublime_dsl/textmate/snippet.rb, line 9
def self.import(file)
  Importer.for(file).snippet
end
new() click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 30
def initialize
  @name = nil
  @content = nil
  @tab_trigger = nil
  @scope = nil

  @key_equivalent = nil
  @semantic_class = nil
  @uuid = nil
  @bundle_uuid = nil

  @file_format = nil
  @warnings = []
end
to_snake_map() click to toggle source

Hash { attributeName => attribute_name }

# File lib/sublime_dsl/textmate/snippet.rb, line 14
def self.to_snake_map
  @to_snake_map ||= Hash[
    %w(
      name content scope tabTrigger keyEquivalent
      semanticClass uuid bundleUUID
    ).map { |a| [a, a.snake_case] }
  ]
end

Public Instance Methods

c(content) click to toggle source

HACK: return <![CDATA]>, except if content is itself <![CDATA[…

# File lib/sublime_dsl/textmate/snippet.rb, line 152
def c(content)
  content =~ /<!\[CDATA\[/ ? h(content) : "<![CDATA[#{content}]]>"
end
complete!() click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 49
def complete!

  # assign name from the base name if not given
  unless name
    if @basename
      warnings << 'name assigned from the file name'
      @name = basename
      @basename = nil
    else
      raise Error, 'the snippet name is required'
    end
  end

  tab_trigger || key_equivalent or
    warnings << 'no tab trigger nor key equivalent'

  warnings.each { |w| warn "snippet #{name}: #{w}" }

  # remove spaces on empty lines
  @content.gsub!(/^[ \t]+$/, '')

end
export(dir) click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 116
def export(dir)
  if file_format == :textmate
    file = "#{dir}/#{basename}.tmSnippet"
    content = to_plist
  else
    file = "#{dir}/#{basename}.sublime-snippet"
    content = to_xml
  end
  File.open(file, 'wb:utf-8') { |f| f.write content }
end
file_format() click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 45
def file_format
  @file_format || :sublime_text
end
h(text) click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 147
def h(text)
  text.html_escape(false)
end
to_dsl(default_scope) click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 76
def to_dsl(default_scope)

  options = ''

  case scope
  when NilClass
    warn "scope missing for snippet #{name.to_source}, set to '#{default_scope}'"
    warnings << 'missing scope, will be default_scope'
  when default_scope
  else
    options << ", scope: #{scope.to_source}"
  end

  options << ", semantic_class: #{semantic_class.to_source}" if semantic_class
  options << ", uuid: #{uuid.to_source}" if uuid
  options << ", bundle_uuid: #{bundle_uuid.to_source}" if bundle_uuid
  options << dsl_file_arg

  dsl = warnings.map { |w| "  # FIXME: #{w}\n" }.join

  if tab_trigger
    start = "tab #{tab_trigger.to_source}"
    options << ", key_equivalent: #{key_equivalent.inspect_dq}" if key_equivalent
  elsif key_equivalent
    start = "key #{key_equivalent.inspect_dq}"
  else
    start = 'key nil'
  end

  if content =~ /[ \t]$/
    dsl << "  #{start}, #{name.to_source}, #{content.inspect_dq}#{options}\n"
  else
    # TODO: use the ruby heredoc mnemonic from default_scope (CPP, RUBY, XML, etc.)
    dsl << "  #{start}, #{name.to_s.to_source}, <<-'TXT'#{options}\n"
    dsl << content << "\nTXT\n"
  end

  dsl
end
to_plist() click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 138
def to_plist
  h = {}
  Snippet.to_snake_map.each_pair do |camel, snake|
    value = send(snake)
    h[camel] = value if value
  end
  PList.dump(h)
end
to_xml() click to toggle source
# File lib/sublime_dsl/textmate/snippet.rb, line 127
    def to_xml
<<-XML
<snippet>
\t<content>#{c(content)}</content>
\t<tabTrigger>#{h(tab_trigger)}</tabTrigger>
\t<scope>#{h(scope)}</scope>
\t<description>#{h(name)}</description>
</snippet>
XML
    end