mod/tinymce_editor/lib/card/reference/nest_parser.rb
class Card
class Reference
# Extracts all information needed to generate the nest editor form
# from a nest syntax string
class NestParser
NEST_OPTIONS = %i[view title show hide wrap help variant size params].freeze
attr_reader :name, :view, :options, :item_options, :raw
def self.new nest_string
return super if nest_string.is_a? String
OpenStruct.new(name: "", field?: true,
options: [], item_options: [],
raw: "{{+ }}")
end
def self.new_image name
OpenStruct.new(name: name, field?: false,
view: "content",
options: [%i[size medium]],
item_options: [],
raw: "{{#{name}|view: content; size: medium}}")
end
def empty?
@raw.empty? || @raw =~ /\{\{+?\s*\|?\s*\}\}/
end
def field?
@field
end
def field!
@raw.sub!(/\{\{\s*\+?/, "{{+")
@field = true
end
def option_value name
options.find { |(key, _value)| key == name }&.second
end
def initialize nest_string
@raw = nest_string
# @default_item_view = default_item_view
nest = Card::Content::Chunk::Nest.new nest_string, nil
init_name nest.name
extract_item_options nest.options
@options = extract_options nest.options
end
private
def init_name name
@field = name.to_name.simple_relative?
@name = @field ? name.to_s[1..-1] : name
end
def extract_options options, item_options=false
applicable_options(options).each_with_object([]) do |key, res|
if key.in? %i[show hide]
res.concat viz_values(key, options)
elsif key == :view && !item_options
@view = options[key]
else
res << [key, options[key]]
end
end
end
def viz_values key, options
Card::View.normalize_list(options[key]).map { |val| [key, val] }
end
def applicable_options options
Card::Reference::NestParser::NEST_OPTIONS.select { |key| options[key] }
end
def extract_item_options options
@item_options = []
item_options = options[:items]
while item_options
next_item_options = item_options[:items]
@item_options << extract_options(item_options, true)
item_options = next_item_options
end
# # @item_options << default_item_options
end
def default_item_options
[:view, @default_item_view]
end
end
end
end