Class | Kwartz::Handler |
In: |
kwartz/converter.rb
|
Parent: | Object |
(abstract) handle directives
converter | [RW] | |
even | [R] | |
filename | [RW] | |
odd | [R] |
# File kwartz/converter.rb, line 583 def initialize(elem_rulesets=[], properties={}) @elem_rulesets = elem_rulesets #@elem_ruleset_table = elem_rulesets.inject({}) { |table, ruleset| table[ruleset.name] = ruleset; table } @elem_ruleset_table = {} ; elem_rulesets.each { |ruleset| @elem_ruleset_table[ruleset.name] = ruleset } @elem_info_table = {} include_properties(properties) # @delspan and @dattr @odd = properties[:odd] || Config::PROPERTY_ODD # "'odd'" @even = properties[:even] || Config::PROPERTY_EVEN # "'even'" @filename = nil end
# File kwartz/converter.rb, line 794 def self.register_class(lang, klass) @@class_table[lang] = klass end
# File kwartz/converter.rb, line 781 def extract(elem_name, content_only=false) elem_info = @elem_info_table[elem_name] elem_info or raise convert_error("element '#{elem_name}' not found.", nil) stmt_list = [] expand_element_info(elem_info, stmt_list, content_only) #stmt_list << build_print_stmt(etag_info, nil, nil) return stmt_list end
# File kwartz/converter.rb, line 602 def get_element_info(name) # for ElementExpander module return @elem_info_table[name] end
# File kwartz/converter.rb, line 597 def get_element_ruleset(name) # for ElementExpander module and Converter class return @elem_ruleset_table[name] end
handle directives (‘stag’, ‘etag’, ‘elem’, ‘cont’(=’value’))
return true if directive name is one of ‘stag’, ‘etag’, ‘elem’, ‘cont’, and ‘value’, else return false.
# File kwartz/converter.rb, line 657 def handle(stmt_list, handler_arg) arg = handler_arg d_name = arg.directive_name d_arg = arg.directive_arg d_str = arg.directive_str case d_name when nil assert unless !arg.attr_info.empty? || !arg.append_exprs.empty? stmt_list << stag_stmt(arg) stmt_list.concat(arg.cont_stmts) stmt_list << etag_stmt(arg) if arg.etag_info # when empty-tag when :dummy # nothing when :id, :mark unless d_arg =~ /\A(\w+)\z/ || d_arg =~ /\A'(\w+)'\z/ raise convert_error("'#{d_str}': invalid marking name.", arg.stag_info.linenum) end name = $1 elem_info = ElementInfo.new(name, arg.stag_info, arg.etag_info, arg.cont_stmts, arg.attr_info, arg.append_exprs) if @elem_info_table[name] #unless Config::ALLOW_DUPLICATE_ID previous_linenum = @elem_info_table[name].stag_info.linenum msg = "'#{d_str}': id '#{name}' is already used at line #{previous_linenum}." raise convert_error(msg, arg.stag_info.linenum) #end else @elem_info_table[name] = elem_info end #stmt_list << ExpandStatement.new(:element, name) # lazy expantion expand_element_info(elem_info, stmt_list) when :stag, :Stag, :STAG error_if_empty_tag(arg) flag_escape = d_name == :stag ? nil : (d_name == :Stag) expr = NativeExpression.new(d_arg, flag_escape) stmt_list << build_print_expr_stmt(expr, arg.stag_info, nil) stmt_list.concat(arg.cont_stmts) stmt_list << etag_stmt(arg) when :etag, :Etag, :ETAG error_if_empty_tag(arg) flag_escape = d_name == :etag ? nil : (d_name == :Etag) expr = NativeExpression.new(d_arg, flag_escape) stmt_list << stag_stmt(arg) stmt_list.concat(arg.cont_stmts) stmt_list << build_print_expr_stmt(expr, nil, arg.etag_info) when :elem, :Elem, :ELEM flag_escape = d_name == :elem ? nil : (d_name == :Elem) expr = NativeExpression.new(d_arg, flag_escape) stmt_list << build_print_expr_stmt(expr, arg.stag_info, arg.etag_info) when :cont, :Cont, :CONT, :value, :Value, :VALUE error_if_empty_tag(arg) arg.stag_info.tail_space = arg.etag_info.head_space = nil # delete spaces pargs = build_print_args(arg.stag_info, arg.attr_info, arg.append_exprs) flag_escape = (d_name == :cont || d_name == :value) ? nil : (d_name == :Cont || d_name == :Value) pargs << NativeExpression.new(d_arg, flag_escape) pargs << arg.etag_info.tag_text if arg.etag_info.tagname stmt_list << PrintStatement.new(pargs) when :attr, :Attr, :ATTR unless d_arg =~ self.mapping_pattern() # ex. /\A'([-:\w]+)'\s+(.*)\z/ raise convert_error("'#{d_str}': invalid attr pattern.", arg.stag_info.linenum) end aname = $1; avalue = $2 flag_escape = d_name == :attr ? nil : (d_name == :Attr) arg.attr_info[aname] = NativeExpression.new(avalue, flag_escape) when :append, :Append, :APPEND flag_escape = d_name == :append ? nil : (d_name == :Append) arg.append_exprs << NativeExpression.new(d_arg, flag_escape) when :replace_element_with_element, :replace_element_with_content, :replace_content_with_element, :replace_content_with_content arr = d_name.to_s.split(/_/) replace_cont = arr[1] == 'content' with_content = arr[3] == 'content' name = d_arg # error_if_empty_tag(arg) if replace_cont stmt_list << stag_stmt(arg) if replace_cont #stmt_list << ExpandStatement.new(:element, name) elem_info = @elem_info_table[name] unless elem_info raise convert_error("'#{d_str}': element '#{name}' not found.", arg.stag_info.linenum) end expand_element_info(elem_info, stmt_list, with_content) stmt_list << etag_stmt(arg) if replace_cont when :replace_element_with, :replace_content_with, :replace, :placeholder unless d_arg =~ /\A_?(element|content)\(["']?(\w+)["']?\)\z/ raise convert_error("'#{d_str}': invalid #{d_name} format.", stag_info.linenum) end kind = $1 name = $2 replace_cont = d_name == :replace_content_with || d_name == :placeholder with_content = kind == 'content' # error_if_empty_tag(arg) if replace_cont stmt_list << stag_stmt(arg) if replace_cont #stmt_list << ExpandStatement.new(:element, name) elem_info = @elem_info_table[name] unless elem_info msg = "'#{d_str}': element '#{name}' not found." raise convert_error(msg, arg.stag_info.linenum) end expand_element_info(elem_info, stmt_list, with_content) stmt_list << etag_stmt(arg) if replace_cont else return false end #case return true end
(abstract) directive format, which is used at has_directive?() method
# File kwartz/converter.rb, line 644 def directive_format not_implemented #return '%s: %s' end
(abstract) directive pattern, which is used to detect directives.
# File kwartz/converter.rb, line 630 def directive_pattern not_implemented #return /\A(\w+):\s*(.*)/ end