Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/unitsml/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ def to_mathml(options = {})
math.ordered = true
math.element_order ||= []
value.each { |instance| process_value(math, instance.to_mathml(options)) }

generated_math = math.to_xml.gsub(/&amp;(.*?)(?=<\/)/, '&\1')
reset_mml_models if plurimath_available?

generated_math
else
value.map { |obj| obj.to_mathml(options) }
Expand Down
63 changes: 46 additions & 17 deletions lib/unitsml/intermediate_exp_rules.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,62 @@ module IntermediateExpRules
include Parslet

# Rules for slashed number
rule(:slashed_number_int_exp) { slashed_number | (str("(") >> slashed_number >> str(")")) }
rule(:slashed_number_int_exp) { slashed_number | (opening_paren >> slashed_number >> closing_paren) }

# Rules for prefixes_units
rule(:prefixes_units_int_exp) { prefixes_units | (str("(") >> prefixes_units_named_exp.as(:intermediate_exp) >> str(")") >> extended_prefixed_units.maybe) }
rule(:extended_prefixed_units) { extender >> prefixes_units_int_exp.as(:sequence) }
rule(:prefixes_units_named_exp) do
prefixes_units |
((str("(").as(:open_parenthesis) >> prefixes_units_int_exp.as(:int_exp) >> str(")").as(:close_parenthesis)).as(:intermediate_exp) >> extended_prefixed_units.maybe)
rule(:wrapper_prefixes_units_value) { int_exp_prefixes_units | prefixes_units_int_exp }

rule(:extended_prefixed_units) { extender >> spaces? >> prefixes_units_int_exp.as(:sequence) }

rule(:int_exp_prefixes_units) { opening_paren >> spaces? >> named_int_exp_prefixes_units.as(:int_exp) >> spaces? >> closing_paren }

rule(:implicit_extended) do
prefixes_units.as(:first_set) >> spaces.as(:extender) >> prefixes_units.as(:second_set) |
int_exp_prefixes_units.as(:first_int_exp_set) >> spaces? >> int_exp_prefixes_units.as(:second_int_exp_set) |
prefixes_units.as(:first_set) >> spaces? >> int_exp_prefixes_units.as(:second_int_exp_set) |
int_exp_prefixes_units.as(:first_int_exp_set) >> spaces? >> prefixes_units.as(:second_set)
end

rule(:prefixes_units_int_exp) do
implicit_extended.as(:implicit_extended) >> spaces? >> prefixes_units_int_exp.as(:sequence).maybe |
implicit_extended.as(:implicit_extended) >> spaces? >> extender >> spaces? >> prefixes_units_int_exp.as(:sequence).maybe |
int_exp_prefixes_units >> spaces? >> extender >> spaces? >> prefixes_units_int_exp.as(:sequence).maybe |
prefixes_units >> spaces? >> extender >> spaces? >> prefixes_units_int_exp.as(:sequence).maybe |
int_exp_prefixes_units >> prefixes_units_int_exp.as(:sequence).maybe |
prefixes_units >> prefixes_units_int_exp.as(:sequence).maybe
end

rule(:prefixes_units_named_int_exp) do
opening_paren.as(:open_paren) >> spaces? >> wrapper_prefixes_units_value.as(:int_exp) >> spaces? >> closing_paren.as(:close_paren)
end

rule(:named_int_exp_prefixes_units) do
prefixes_units_named_int_exp.as(:int_exp) >> (prefixes_units_int_exp | extended_prefixed_units).maybe |
prefixes_units_int_exp
end

# Rules for dimension_rules
rule(:dimension_rules_int_exp) { dimension_rules | (str("(") >> dimension_rules_named_exp.as(:intermediate_exp) >> str(")") >> extended_dimension_rules.maybe) }
rule(:extended_dimension_rules) { extender >> dimension_rules_int_exp.as(:sequence) }
rule(:dimension_rules_int_exp) do
dimension_rules.as(:first_set) >> spaces.as(:extender) >> dimension_rules.as(:second_set) >> dimension_rules_int_exp.maybe |
dimension_rules.as(:first_set) >> spaces? >> int_exp_dimension_rules.as(:second_int_exp_set) >> dimension_rules_int_exp.maybe |
int_exp_dimension_rules.as(:first_int_exp_set) >> spaces? >> dimension_rules.as(:second_set) >> dimension_rules_int_exp.maybe |
int_exp_dimension_rules.as(:first_int_exp_set) >> spaces? >> int_exp_dimension_rules.as(:second_int_exp_set) >> dimension_rules_int_exp.maybe |
int_exp_dimension_rules |
dimension_rules
end

rule(:int_exp_dimension_rules) { opening_paren >> dimension_rules_named_exp.as(:int_exp) >> closing_paren >> extended_dimension_rules.maybe }

rule(:extended_dimension_rules) { spaces? >> extender >> spaces? >> dimension_rules_int_exp.as(:sequence) }
rule(:dimension_rules_named_exp) do
dimension_rules |
((str("(").as(:open_parenthesis) >> dimension_rules_int_exp.as(:int_exp) >> str(")").as(:close_parenthesis)).as(:intermediate_exp) >> extended_dimension_rules.maybe)
((opening_paren.as(:open_paren) >> dimension_rules_int_exp.as(:int_exp) >> closing_paren.as(:close_paren)).as(:int_exp) >> spaces? >> (dimension_rules_int_exp | extended_dimension_rules).as(:sequence).maybe) |
dimension_rules_int_exp
end

# Rules for dimensions
rule(:sqrt_dimensions) { str("sqrt(") >> dimensions_int_exp.as(:sqrt) >> str(")") }
rule(:powered_dimensions) { dimensions >> power.maybe }
rule(:dimensions_int_exp) { powered_dimensions | (str("(") >> dimensions_named_exp.as(:intermediate_exp) >> str(")")) }
rule(:dimensions_named_exp) { powered_dimensions | (str("(").as(:open_parenthesis) >> dimensions_int_exp.as(:int_exp) >> str(")").as(:close_parenthesis)) }
rule(:sqrt_dimensions) { sqrt >> opening_paren >> dimension_rules_int_exp.as(:sqrt) >> closing_paren }

# Rules for sequence
rule(:sqrt_sequence) { str("sqrt(") >> sequence_int_exp.as(:sqrt) >> str(")") }
rule(:sequence_int_exp) { sequence | (str("(") >> sequence_named_exp.as(:intermediate_exp)>> str(")")) }
rule(:sequence_named_exp) { sequence | (str("(").as(:open_parenthesis) >> sequence_int_exp.as(:int_exp) >> str(")").as(:close_parenthesis)) }
rule(:sqrt_sequence) { sqrt >> opening_paren >> prefixes_units_int_exp.as(:sqrt) >> closing_paren }
end
end
26 changes: 14 additions & 12 deletions lib/unitsml/parse.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,51 @@ module Unitsml
class Parse < Parslet::Parser
include IntermediateExpRules

rule(:power) { str("^") >> slashed_number_int_exp }
rule(:sqrt) { str("sqrt") }
rule(:power) { str("^") >> slashed_number_int_exp }
rule(:hyphen) { str("-") }
rule(:number) { hyphen.maybe >> match(/[0-9]/).repeat(1) }
rule(:spaces) { match(/\s/).repeat(1) }
rule(:spaces?) { spaces.maybe }

rule(:extender) { (forward_slashes | str("*")).as(:extender) }
rule(:sequence) { single_letter_prefixes >> units | double_letter_prefixes >> units | units }

rule(:opening_paren) { str("(")}
rule(:closing_paren) { str(")")}
rule(:unit_and_power) { units >> power.maybe }
rule(:slashed_number) { (number >> (forward_slashes >> number).maybe).as(:integer) }
rule(:forward_slashes) { str("//") | str("/") }
rule(:dimension_rules) { (sqrt_dimensions | powered_dimensions) >> extended_dimension_rules.maybe }
rule(:powered_dimensions) { dimensions >> power.maybe }

rule(:units) do
@@filtered_units ||= arr_to_expression(Unitsdb.units.filtered, "units")
@@filtered_units ||= arr_to_expression(Unitsdb.units.filtered, "unit")
end

rule(:single_letter_prefixes) do
@@prefixes1 ||= arr_to_expression(Unitsdb.prefixes_by_size(1), "prefixes")
@@prefixes1 ||= arr_to_expression(Unitsdb.prefixes_by_size(1), "prefix")
end

rule(:double_letter_prefixes) do
@@prefixes2 ||= arr_to_expression(Unitsdb.prefixes_by_size(2), "prefixes")
@@prefixes2 ||= arr_to_expression(Unitsdb.prefixes_by_size(2), "prefix")
end

rule(:dimensions) do
@@dimensions ||= arr_to_expression(Unitsdb.dimensions.parsables.keys, "dimensions")
@@dimensions ||= arr_to_expression(Unitsdb.dimensions.parsables.keys, "dimension")
end

rule(:prefixes_units) do
(sqrt_sequence >> extended_prefixed_units.maybe) |
(str("1").as(:units) >> extended_prefixed_units.maybe) |
(str("1").as(:unit) >> extended_prefixed_units.maybe) |
(unit_and_power >> extended_prefixed_units) |
unit_and_power >> (str(")").present? | any.absent?) |
unit_and_power >> (any.absent? | (extender | opening_paren | closing_paren | spaces).present?) |
(double_letter_prefixes >> unit_and_power >> extended_prefixed_units) |
(double_letter_prefixes >> unit_and_power) |
(single_letter_prefixes >> unit_and_power >> extended_prefixed_units) |
(single_letter_prefixes >> unit_and_power)
end

rule(:dimension_rules) do
(sqrt_dimensions >> extended_dimension_rules.maybe) |
(powered_dimensions >> extended_dimension_rules.maybe)
end

rule(:expression) do
prefixes_units_int_exp |
dimension_rules_int_exp |
Expand Down
2 changes: 1 addition & 1 deletion lib/unitsml/prefix.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def ==(object)
end

def prefix_instance
@prefix ||= Unitsdb.prefixes.find_by_symbol_name(prefix_name)
@prefix_instance ||= Unitsdb.prefixes.find_by_symbol_name(prefix_name)
end

def id
Expand Down
Loading
Loading