2009-09-16 52 views
0

更新:备案,here's the implementation I ended up using将nowiki-tags添加到此解析器是否可行?

下面是我正在处理的解析器的修剪版本。还有一些代码,但应该很容易掌握这个解析器的基本概念。

class Markup 
    def initialize(markup) 
    @markup = markup 
    end 

    def to_html 
    @html ||= @markup.split(/(\r\n){2,}|\n{2,}/).map {|p| Paragraph.new(p).to_html }.join("\n") 
    end 

    class Paragraph 
    def initialize(paragraph) 
     @p = paragraph 
    end 

    def to_html 
     @p.gsub!(/'{3}([^']+)'{3}/, "<strong>\\1</strong>") 
     @p.gsub!(/'{2}([^']+)'{2}/, "<em>\\1</em>") 
     @p.gsub!(/`([^`]+)`/, "<code>\\1</code>") 

     case @p 
     when /^=/ 
     level = (@p.count("=")/2) + 1 # Starting on h2 
     @p.gsub!(/^[= ]+|[= ]+$/, "") 
     "<h#{level}>" + @p + "</h#{level}>" 
     when /^(\*|\#)/ 
     # I'm parsing lists here. Quite a lot of code, and not relevant, so 
     # I'm leaving it out. 
     else 
     @p.gsub!("\n", "\n<br/>") 
     "<p>" + @p + "</p>" 
     end 
    end 
    end 
end 

p Markup.new("Here is `code` and ''emphasis'' and '''bold'''! 

Baz").to_html 

# => "<p>Here is <code>code</code> and <em>emphasis</em> and <strong>bold</strong>!</p>\n<p>Baz</p>" 

所以,你可以看到,我打破了文成段,每个段是一个页眉,列表或常规段落。

对于像这样的解析器添加对nowiki标记的支持(< nowiki> </nowiki>没有被解析)是否可行?随意回答“否”,并建议创建解析器的其他方法:)

作为旁注,您可以在Github上看到实际的解析器代码。 markup.rbparagraph.rb

回答

3

如果您使用简单的标记器,管理这类事情会容易得多。一种方法是创建一个可以捕捉整个语法的单一正则表达式,但这可能会带来问题。另一种方法是将文档分成需要重写的部分和应该跳过的部分,这可能是更简单的方法。

这里有一个简单的框架,你可以根据需要扩展:

def wiki_subst(string) 
    buffer = string.dup 
    result = '' 

    while (m = buffer.match(/<\s*nowiki\s*>.*?<\s*\/\s*nowiki\s*>/i)) 
    result << yield(m.pre_match) 
    result << m.to_s 
    buffer = m.post_match 
    end 

    result << yield(buffer) 

    result 
end 

example = "replace me<nowiki>but not me</nowiki>replace me too<NOWIKI>but not me either</nowiki>and me" 

puts wiki_subst(example) { |s| s.upcase } 
# => REPLACE ME<nowiki>but not me</nowiki>REPLACE ME TOO<NOWIKI>but not me either</nowiki>AND ME 
+0

是文本的分割成段,像我的解析器确实,分词的一种形式? – 2009-09-17 05:33:26

+0

也许使用一个非常松散的定义。一般来说,一个标记器将输入流分割成不同的组件,可以使用最好的粒度级别单独运行。分割成段落,然后分裂成其他部分是一种双通道标记器。通常,在编写这种类型的东西时,您只能通过自己的方法来解析。在某个时候,使用适当的解析器框架更有效,但这是另一个主题。 – tadman 2009-09-17 15:12:44

+0

标记为答案。谢谢! – 2009-09-21 08:23:53

相关问题