【问题标题】:Write a header HTML tag markdown parser in Ruby在 Ruby 中编写一个标头 HTML 标签 Markdown 解析器
【发布时间】:2020-08-20 08:59:47
【问题描述】:

以下是我能想到的最好的;

def markdownparser(markdown)  
  if markdown.match("#")
    arr = markdown.split("")
    i = 0
    while arr[i] != " "
      if arr[i] == "#"
        i += 1
      end 
    end
    final = markdown[(i + 1)..(markdown.size + i)]
    return "<h" + i.to_s + ">" + final + "</h" + i.to_s + ">"
  else
    return markdown
  end
end

puts markdownparser(" smaller header")

简单的markdown解析器函数:

  • 接受一行降价
  • 将其翻译成适当的 HTML 标头标签

标题由 (1-6) 个哈希 后跟 空格text 指定。散列的数量决定了 HTML 输出的标头级别

  • 标题内容只能出现在初始主题标签之后加上空格字符
  • 无效的标头应该作为没有任何翻译的接收到的降价返回
  • 标题内容和主题标签前后的空格必须在结果输出中忽略

如何进一步降低时间复杂度?

在此先感谢

【问题讨论】:

    标签: ruby parsing markdown


    【解决方案1】:

    用标准方法替换显式循环

    你在循环中做很多事情,所以我会避免这种情况,除非你有一个非常具体的用例不使用 Ruby 的优化方法。有内置的核心或标准库方法可以执行计数或替换文本等操作,因此我会尽可能使用它们。如果速度真的很重要,我也会选择字符串插值而不是与String#+ 连接,其中每个子表达式都会创建一个新的中间字符串。

    一种实现方式如下:

    md_str = <<~'EOF'
      # Header 1
      Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor  
      incidunt ut labore et dolore magna aliqua.
    
      ## Header 2
      Etiam habebis sem dicantur magna mollis euismod.
    
      ####### Invalid Header with 7 "#" Characters
      ^^^^^^^ Too many characters to be valid.
    EOF
    
    # helper method to count header characters
    def header_level str
      str&.count "#"
    end
    
    # replace markdown headers with html headers;
    # escape hash in regex so it won't be treated as interpolation;
    # block form required for proper handling of match variables
    md_str.gsub!(/^(\#{1,6})\s+(.*)$/) { |_| "<h#{header_level $1}>#{$2}</h>" }
    
    puts md_str
    

    这利用String#count 来计算字符串中# 字符的数量,而不必循环遍历它。 String#gsub 仅在以标题字符开头的行上调用#header_level。

    注意事项

    1. 显然这不处理“带下划线”的标题,但这不是您的问题的一部分。
    2. Slurping 文件与一次一行处理涉及各种权衡,但如果没有上下文行,则很难进行复杂的解析。
    3. 没有什么可以替代benchmarking 来测试给定的代码位是否真的更快。
    4. 这种方法本身并没有消除迭代。它只是将迭代卸载到尽可能以 C 速度运行的方法。

    【讨论】:

    • 谢谢托德!您的解决方案对我有用,并且在调整正则表达式以满足所有测试用例后接受了测试站点的 IDE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2019-06-28
    • 2013-06-17
    • 1970-01-01
    相关资源
    最近更新 更多