使用 Nokogiri 解析 TextMate 片段
Parse TextMate snippet with Nokogiri
TextMate 片段 (.tmSnippet) 通常看起来像这样,而有些 key/string-pairs 是可选的,可以在任何位置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>content</key>
<string>${1:the actual snippet}</string>
<key>tabTrigger</key>
<string>my_trigger</string>
<key>name</key>
<string>This is my Snippet's name</string>
<key>scope</key>
<string>source.js</string>
<key>uuid</key>
<string>6C2985F1-9BB8-43D7-A85C-1006B2932A0D</string>
</dict>
</plist>
我正在尝试使用 Nokogiri 解析它,但由于标签都是 <key>
和 <string>
,并且每个 key/string-pair 的位置都可以改变,我不确定怎么做。我在 scope
、tabTrigger
、content
和 name
之后。
假设一个dict
节点的子节点只是key
-string
对,这:
require 'nokogiri'
kws = %w{ scope tabTrigger content name }
doc = Nokogiri::XML(File.read('a.tmsnippet'))
doc.xpath('//dict').each do | dict_node |
dict_node.element_children.map(&:content).each_slice(2) do | k, v |
next unless kws.include? k
puts "#{k} -> #{v}"
end
end
产生
"content -> ${1:the actual snippet}
tabTrigger -> my_trigger
name -> This is my Snippet's name
scope -> source.js"
否则在查看它们的内容之前,您需要对节点类型进行更多逻辑处理。
TextMate 片段 (.tmSnippet) 通常看起来像这样,而有些 key/string-pairs 是可选的,可以在任何位置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>content</key>
<string>${1:the actual snippet}</string>
<key>tabTrigger</key>
<string>my_trigger</string>
<key>name</key>
<string>This is my Snippet's name</string>
<key>scope</key>
<string>source.js</string>
<key>uuid</key>
<string>6C2985F1-9BB8-43D7-A85C-1006B2932A0D</string>
</dict>
</plist>
我正在尝试使用 Nokogiri 解析它,但由于标签都是 <key>
和 <string>
,并且每个 key/string-pair 的位置都可以改变,我不确定怎么做。我在 scope
、tabTrigger
、content
和 name
之后。
假设一个dict
节点的子节点只是key
-string
对,这:
require 'nokogiri'
kws = %w{ scope tabTrigger content name }
doc = Nokogiri::XML(File.read('a.tmsnippet'))
doc.xpath('//dict').each do | dict_node |
dict_node.element_children.map(&:content).each_slice(2) do | k, v |
next unless kws.include? k
puts "#{k} -> #{v}"
end
end
产生
"content -> ${1:the actual snippet}
tabTrigger -> my_trigger
name -> This is my Snippet's name
scope -> source.js"
否则在查看它们的内容之前,您需要对节点类型进行更多逻辑处理。