# frozen_string_literal: true
module Plurimath
module Math
module Function
class BinaryFunction < Core
attr_accessor :parameter_one, :parameter_two, :hide_function_name
def initialize(parameter_one = nil, parameter_two = nil)
@parameter_one = parameter_one
@parameter_two = parameter_two
Utility.validate_left_right(variables.map { |var| get(var) })
end
def to_asciimath(options:)
"#{class_name}#{wrapped(parameter_one, options: options)}#{wrapped(parameter_two, options: options)}"
end
def ==(object)
object.class == self.class &&
object.parameter_one == parameter_one &&
object.parameter_two == parameter_two
end
def to_mathml_without_math_tag(intent, options:)
mrow_tag = Utility.ox_element("mrow")
mo_tag = Utility.ox_element("mo") << invert_unicode_symbols.to_s
first_value = parameter_one&.to_mathml_without_math_tag(intent, options: options) if parameter_one
second_value = parameter_two&.to_mathml_without_math_tag(intent, options: options) if parameter_two
Utility.update_nodes(
mrow_tag,
[
first_value,
mo_tag,
second_value,
],
)
end
def to_latex(options:)
first_value = latex_wrapped(parameter_one, options: options) if parameter_one
second_value = latex_wrapped(parameter_two, options: options) if parameter_two
"\\#{class_name}#{first_value}#{second_value}"
end
def to_html(options:)
first_value = "#{parameter_one.to_html(options: options)}" if parameter_one
second_value = "#{parameter_two.to_html(options: options)}" if parameter_two
"#{first_value}#{second_value}"
end
def to_omml_without_math_tag(display_style, options:)
r_tag = Utility.ox_element("r", namespace: "m")
Utility.update_nodes(r_tag, [parameter_one.insert_t_tag(display_style, options: options)]) if parameter_one
Utility.update_nodes(r_tag, [parameter_two.insert_t_tag(display_style, options: options)]) if parameter_two
[r_tag]
end
def any_value_exist?
!(parameter_one.nil? || parameter_two.nil?)
end
def all_values_exist?
!(parameter_one.nil? && parameter_two.nil?)
end
def to_asciimath_math_zone(spacing, last = false, _, options:)
parameters = self.class::FUNCTION
new_spacing = gsub_spacing(spacing, last)
new_arr = ["#{spacing}\"#{to_asciimath(options: options)}\" #{parameters[:name]}\n"]
ascii_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ " , array: new_arr, options: options })
ascii_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ " , array: new_arr, options: options })
new_arr
end
def to_latex_math_zone(spacing, last = false, _, options:)
parameters = self.class::FUNCTION
new_spacing = gsub_spacing(spacing, last)
new_arr = ["#{spacing}\"#{to_latex(options: options)}\" #{parameters[:name]}\n"]
latex_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ " , array: new_arr, options: options })
latex_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ " , array: new_arr, options: options })
new_arr
end
def to_mathml_math_zone(spacing, last = false, _, options:)
parameters = self.class::FUNCTION
new_spacing = gsub_spacing(spacing, last)
new_arr = ["#{spacing}\"#{dump_mathml(self, options: options)}\" #{parameters[:name]}\n"]
mathml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ ", array: new_arr, options: options })
mathml_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ ", array: new_arr, options: options })
new_arr
end
def to_omml_math_zone(spacing, last = false, _, display_style:, options:)
parameters = self.class::FUNCTION
new_spacing = gsub_spacing(spacing, last)
new_arr = ["#{spacing}\"#{dump_omml(self, display_style, options: options)}\" #{parameters[:name]}\n"]
omml_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ ", array: new_arr, display_style: display_style, options: options })
omml_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ ", array: new_arr, display_style: display_style, options: options })
new_arr
end
def to_unicodemath_math_zone(spacing, last = false, _, options:)
parameters = self.class::FUNCTION
new_spacing = gsub_spacing(spacing, last)
new_arr = ["#{spacing}\"#{to_unicodemath(options: options)}\" #{parameters[:name]}\n"]
unicodemath_fields_to_print(parameter_one, { spacing: new_spacing, field_name: parameters[:first_value], additional_space: "| |_ " , array: new_arr, options: options })
unicodemath_fields_to_print(parameter_two, { spacing: new_spacing, field_name: parameters[:second_value], additional_space: " |_ " , array: new_arr, options: options })
new_arr
end
protected
def latex_wrapped(field, options:)
latex = field.to_latex(options: options)
if field.validate_function_formula
"{ \\left ( #{latex} \\right ) }"
else
"{#{latex}}"
end
end
def wrapped(field, options:)
return "" unless field
"(#{field.to_asciimath(options: options)})"
end
def underover(display_style, options:)
return r_element(class_name, rpr_tag: false) unless all_values_exist?
first_value = Symbols::Symbol.new(class_name)
if !display_style
power_base = PowerBase.new(first_value, parameter_one, parameter_two)
return power_base.to_omml_without_math_tag(display_style, options: options)
end
overset = Overset.new(first_value, parameter_two)
return Array(overset.to_omml_without_math_tag(display_style, options: options)) unless parameter_one
underset = Underset.new(overset, parameter_one)
Array(underset.to_omml_without_math_tag(display_style, options: options))
end
end
end
end
end