gpt4 book ai didi

ruby - 解析 ERB 文件的库

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:31 24 4
gpt4 key购买 nike

我正在尝试以 Hpricot/Nokogiri 类型的方式解析而不是评估 Rails ERB 文件。我试图解析的文件包含 HTML 片段,其中混杂着使用 ERB(标准 rails View 文件)生成的动态内容ERB 符号、<%、<%= 等,就好像它们是 html/xml 标签一样。

理想情况下,我会得到一个类似 DOM 的结构,其中 <%, <%= 等符号将作为它们自己的节点类型包含在内。

我知道可以使用正则表达式将一些东西组合在一起,但我一直在寻找更可靠的东西,因为我正在开发一个工具,我需要在一个非常大的 View 代码库上运行,其中 html 内容和erb 内容很重要。

例如,内容如:

blah blah blah<div>My Great Text <%= my_dynamic_expression %></div>

会返回一个树状结构:

root - text_node (blah blah blah) - element (div)    - text_node (My Great Text )        - erb_node (<%=)

最佳答案

我最终使用 RLex 解决了这个问题,http://raa.ruby-lang.org/project/ruby-lex/ ,具有以下语法的 lex 的 ruby​​ 版本:

%{#define NUM 257#define OPTOK 258#define IDENT 259#define OPETOK 260#define CLSTOK 261#define CLTOK 262#define FLOAT 263#define FIXNUM 264#define WORD 265#define STRING_DOUBLE_QUOTE 266#define STRING_SINGLE_QUOTE 267#define TAG_START 268#define TAG_END 269#define TAG_SELF_CONTAINED 270#define ERB_BLOCK_START 271#define ERB_BLOCK_END 272#define ERB_STRING_START 273#define ERB_STRING_END 274#define TAG_NO_TEXT_START 275#define TAG_NO_TEXT_END 276#define WHITE_SPACE 277%}digit   [0-9]blank   [ ]letter  [A-Za-z]name1   [A-Za-z_]name2   [A-Za-z_0-9]valid_tag_character [A-Za-z0-9"'=@_():/ ] ignore_tags style|script%%{blank}+"\n"                  { return [ WHITE_SPACE, yytext ] } "\n"{blank}+                  { return [ WHITE_SPACE, yytext ] } {blank}+"\n"{blank}+                  { return [ WHITE_SPACE, yytext ] } "\r"                  { return [ WHITE_SPACE, yytext ] } "\n"            { return[ yytext[0], yytext[0..0] ] };"\t"            { return[ yytext[0], yytext[0..0] ] };^{blank}+       { return [ WHITE_SPACE, yytext ] }{blank}+$       { return [ WHITE_SPACE, yytext ] };""   { return [ TAG_NO_TEXT_START, yytext ] }""  { return [ TAG_NO_TEXT_END, yytext ] }""                   { return [ TAG_SELF_CONTAINED, yytext ] }""  { return [ TAG_SELF_CONTAINED, yytext ] }""    { return [ TAG_START, yytext ] }""   { return [ TAG_END, yytext ] }""  { return [ ERB_BLOCK_END, yytext ] }""  { return [ ERB_STRING_END, yytext ] }{letter}+       { return [ WORD, yytext ] }\".*\"          { return [ STRING_DOUBLE_QUOTE, yytext ] }'.*'                    { return [ STRING_SINGLE_QUOTE, yytext ] }.           { return [ yytext[0], yytext[0..0] ] }%%

这不是一个完整的语法,但就我的目的而言,定位和重新发送文本,它起作用了。我将该语法与这一小段代码相结合:

    text_handler = MakeYourOwnCallbackHandler.new    l = Erblex.new    l.yyin = File.open(file_name, "r")    loop do      a,v = l.yylex      break if a == 0      if( a < WORD )        text_handler.character( v.to_s, a )      else        case a        when WORD          text_handler.text( v.to_s )        when TAG_START          text_handler.start_tag( v.to_s )        when TAG_END          text_handler.end_tag( v.to_s )        when WHITESPACE          text_handler.white_space( v.to_s )        when ERB_BLOCK_START          text_handler.erb_block_start( v.to_s )        when ERB_BLOCK_END          text_handler.erb_block_end( v.to_s )              when ERB_STRING_START          text_handler.erb_string_start( v.to_s )        when ERB_STRING_END          self.text_handler.erb_string_end( v.to_s )        when TAG_NO_TEXT_START          text_handler.ignorable_tag_start( v.to_s )        when TAG_NO_TEXT_END          text_handler.ignorable_tag_end( v.to_s )        when STRING_DOUBLE_QUOTE          text_handler.string_double_quote( v.to_s )        when STRING_SINGLE_QUOTE          text_handler.string_single_quote( v.to_s )        when TAG_SELF_CONTAINED          text_handler.tag_self_contained( v.to_s )        end      end      end

关于ruby - 解析 ERB 文件的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com