如何将字符串读入Ruby字典?
我现在想用Jekyll博客取代我的Wordpress博客。为此,我必须找到WordPress标题标签的替代品:如何将字符串读入Ruby字典?,ruby,jekyll,liquid,Ruby,Jekyll,Liquid,我现在想用Jekyll博客取代我的Wordpress博客。为此,我必须找到WordPress标题标签的替代品: [caption id="attachment_76716" align="aligncenter" width="500"]<a href="http://martin-thoma.com/wp-content/uploads/2013/11/WER-calculation.png"><img src="http://martin-thoma.com/wp-cont
[caption id="attachment_76716" align="aligncenter" width="500"]<a href="http://martin-thoma.com/wp-content/uploads/2013/11/WER-calculation.png"><img src="http://martin-thoma.com/wp-content/uploads/2013/11/WER-calculation.png" alt="WER calculation" width="500" height="494" class="size-full wp-image-76716" /></a> WER calculation[/caption]
而它应该被渲染到:
<div style="width: 510px" class="wp-caption aligncenter">
<a href="../images/2013/11/WER-calculation.png">
<img src="../images/2013/11/WER-calculation.png" alt="WER calculation" width="500" height="494" class="size-full">
</a>
<p class="wp-caption-text">WER calculation</p>
</div>
进入ruby字典(它们似乎被称为“Hash”?)
这是我的插件:
# Title: Caption tag
# Author: Martin Thoma, http://martin-thoma.com
module Jekyll
class CaptionTag < Liquid::Tag
def initialize(tag_name, text, tokens)
super
@text = text
@tokens = tokens
end
def render(context)
@hash = Hash.new
@array = @text.split(" ")
@array.each do |element|
key, value = element.split("=")
@hash[key] = value
end
#"#{@text} #{@tokens}"
"<div style=\"width: #{@hash['width']}px\" class=\"#{@hash['alignment']}\">" +
"<a href=\"../images/#{@hash['url']}\">" +
"<img src=\"../images/#{@hash['url']}\" alt=\"#{@hash['text']}\" width=\"#{@hash['width']}\" height=\"#{@hash['height']}\" class=\"#{@hash['class']}\">" +
"</a>" +
"<p class=\"wp-caption-text\">#{@hash['text']}</p>" +
"</div>"
end
end
end
Liquid::Template.register_tag('caption', Jekyll::CaptionTag)
如果将行分隔符设置为空格,将列分隔符设置为“=”,将引号char设置为“”,则可以使用Ruby的
CSV
类轻松地将字符串解析为哈希:
require 'csv'
def parse_attrs(input)
options = { col_sep: '=', row_sep: ' ', quote_char: '"' }
csv = CSV.new input, options
csv.each_with_object({}) do |row, attrs|
attr, value = row
value ||= true
attrs[attr] = value
end
end
例如:
irb(main):031:0> input = 'align="aligncenter" width="500" alt="WER calculation" text="WER calculation" url="../images/2013/11/WER-calculation.png" required'
=> "align=\"aligncenter\" width=\"500\" alt=\"WER calculation\" text=\"WER calculation\" url=\"../images/2013/11/WER-calculation.png\""
irb(main):032:0> parse_attrs input
=> {"align"=>"aligncenter", "width"=>"500", "alt"=>"WER calculation", "text"=>"WER calculation", "url"=>"../images/2013/11/WER-calculation.png"}
你可以用同样的方法使用Ruby的类。或者你可以编写一个合适的解析器。我添加了一个解决方案,可以在Python中实现预期的效果。但是我对Ruby是新手,所以你能告诉我如何在Ruby中实现它吗?
def parse(text):
splitpoints = []
# parse
isOpen = False
for i, char in enumerate(text):
if char == '"':
isOpen = not isOpen
if char == " " and not isOpen:
splitpoints.append(i)
# build data structure
dictionary = {}
last = 0
for i in splitpoints:
key, value = text[last:i].split('=')
last = i+1
dictionary[key] = value[1:-1] # remove delimiter
return dictionary
print(parse('align="aligncenter" width="500" alt="WER calculation" text="WER calculation" url="../images/2013/11/WER-calculation.png"'))
require 'csv'
def parse_attrs(input)
options = { col_sep: '=', row_sep: ' ', quote_char: '"' }
csv = CSV.new input, options
csv.each_with_object({}) do |row, attrs|
attr, value = row
value ||= true
attrs[attr] = value
end
end
irb(main):031:0> input = 'align="aligncenter" width="500" alt="WER calculation" text="WER calculation" url="../images/2013/11/WER-calculation.png" required'
=> "align=\"aligncenter\" width=\"500\" alt=\"WER calculation\" text=\"WER calculation\" url=\"../images/2013/11/WER-calculation.png\""
irb(main):032:0> parse_attrs input
=> {"align"=>"aligncenter", "width"=>"500", "alt"=>"WER calculation", "text"=>"WER calculation", "url"=>"../images/2013/11/WER-calculation.png"}