class Sublime2yas::SublimeSnippet

Public Class Methods

canonicalize(filename) click to toggle source
# File lib/sublime2yas.rb, line 223
def self.canonicalize(filename)
  invalid_char = /[^ a-z_0-9.+=~(){}\/'`&#,-]/i

  filename.
    gsub(invalid_char, '').  # remove invalid characters
    gsub(/ {2,}/,' ').       # squeeze repeated spaces into a single one
    rstrip                   # remove trailing whitespaces
end
extra_substitutions() click to toggle source
# File lib/sublime2yas.rb, line 115
def self.extra_substitutions; @@extra_substitutions; end
new(file) click to toggle source
# File lib/sublime2yas.rb, line 134
def initialize(file)
  @file    = file
  @snippet = SublimeSnippet::read_snippet(open(file))
  @@snippets_by_uid[self.uuid] = self;
  raise SkipSnippet.new "This is not a sublime-snippet, I just do sublime-snippets." unless (@snippet.xpath "//scope")
  raise RuntimeError.new("Cannot convert this snippet #{file}!") unless @snippet;
end
read_snippet(xml) click to toggle source
# File lib/sublime2yas.rb, line 236
def self.read_snippet(xml)
  begin
    parsed = Nokogiri::XML(xml)
    return parsed if parsed
    raise ArgumentError.new "Format not recognised as sublime-snippet..."
  rescue StandardError => e
    raise RuntimeError.new "Failed to read sublime-snippet - Nokogiri gem is required, make sure it's installed"
  end
end
snippets_by_uid() click to toggle source
# File lib/sublime2yas.rb, line 132
def self.snippets_by_uid; @@snippets_by_uid; end
unknown_substitutions() click to toggle source
# File lib/sublime2yas.rb, line 123
def self.unknown_substitutions; @@unknown_substitutions; end

Public Instance Methods

binding() click to toggle source
# File lib/sublime2yas.rb, line 165
def binding
  yas_directive "binding"
end
condition() click to toggle source
# File lib/sublime2yas.rb, line 154
def condition
  yas_directive "condition"
end
content() click to toggle source
# File lib/sublime2yas.rb, line 169
def content
  known = @@known_substitutions["content"]
  extra = @@extra_substitutions["content"]
  if direct = extra[uuid]
    return direct
  else
    ct = (@snippet.xpath "//content").text
    if ct
      known.each_pair do |k,v|
        if v.respond_to? :call
          ct.gsub!(k) {|match| v.call(uuid, match)}
        else
          ct.gsub!(k,v)
        end
      end
      extra.each_pair do |k,v|
        ct.gsub!(k,v)
      end
      # the remaining stuff is an unknown substitution
      #
      [ %r'\$\{ [^/\}\{:]* / [^/]* / [^/]* / [^\}]*\}'x ,
        %r'\$\{[^\d][^}]+\}',
        %r'`[^`]+`',
        %r'\$TM_[\w_]+',
        %r'\(yas-multi-line-unknown [^\)]*\)'
      ].each do |reg|
        ct.scan(reg) do |match|
          @@unknown_substitutions["content"][match] = self
        end
      end
      return ct
    else
      @@unknown_substitutions["content"][uuid] = self
      SublimeSubmenu::excluded_items.push(uuid)
      return "(yas-unimplemented)"
    end
  end
end
key() click to toggle source
# File lib/sublime2yas.rb, line 150
def key
  (@snippet.xpath "//tabTrigger").text
end
name() click to toggle source
# File lib/sublime2yas.rb, line 142
def name
  (@snippet.xpath "//description").text
end
to_yas(opts) click to toggle source
# File lib/sublime2yas.rb, line 208
def to_yas opts
  doc = "# -*- mode: snippet -*-\n"
  doc << "# contributor: Translated to yasnippet by sublime-snippet import\n"
  doc << (self.type || "")
  # doc << "# uuid: #{self.uuid}\n" unless self.uuid.empty?
  doc << "# key: #{self.key}\n" if self.key
  doc << "# group: #{opts.snippet_group}\n" if opts.snippet_group
  doc << "# name: #{self.name}\n"
  doc << (self.binding || "")
  doc << (self.condition || "")
  doc << "# --\n"
  doc << (self.content || "(yas-unimplemented)")
  doc
end
type() click to toggle source
# File lib/sublime2yas.rb, line 158
def type
  override = yas_directive "type"
  if override
    return override
  end
end
uuid() click to toggle source
# File lib/sublime2yas.rb, line 146
def uuid
  (@snippet.xpath "//uuid").text
end
yas_file() click to toggle source
# File lib/sublime2yas.rb, line 232
def yas_file()
  File.join(SublimeSnippet::canonicalize(@file[0, @file.length-File.extname(@file).length]) + ".yasnippet")
end

Private Instance Methods

yas_directive(yas_directive) click to toggle source
# File lib/sublime2yas.rb, line 249
def yas_directive(yas_directive)
  #
  # Merge "known" hardcoded substitution with "extra" substitutions
  # provided in the .yas-setup.el file.
  #
  merged = @@known_substitutions[yas_directive].
    merge(@@extra_substitutions[yas_directive])
  #
  # First look for an uuid-based direct substitution for this
  # directive.
  #
  if direct = merged[uuid]
    return "# #{yas_directive}: "+ direct + "\n" unless direct.empty?
  else
    tm_directive = @@yas_to_tm_directives[yas_directive]
    val = tm_directive && @snippet[tm_directive]
    if val and !val.delete(" ").empty? then
      #
      # Sort merged substitutions by length (bigger ones first,
      # regexps last), and apply them to the value gotten for plist.
      #
      allsubs = merged.sort_by do |what, with|
        if what.respond_to? :length then -what.length else 0 end
      end
      allsubs.each do |sub|
        if val.gsub!(sub[0],sub[1])
          return "# #{yas_directive}: "+ val + "\n" unless val.empty?
        end
      end
      #
      # If we get here, no substitution matched, so mark this an
      # unknown substitution.
      #
      @@unknown_substitutions[yas_directive][val] = self
      return "## #{yas_directive}: \""+ val + "\n"
    end
  end
end