mml 2.3.2 → 2.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +5 -42
  3. data/lib/mml/v2/annotation.rb +4 -0
  4. data/lib/mml/v2/annotation_xml.rb +4 -0
  5. data/lib/mml/v2/arith.rb +88 -0
  6. data/lib/mml/v2/ci.rb +4 -0
  7. data/lib/mml/v2/cn.rb +4 -0
  8. data/lib/mml/v2/constants.rb +60 -0
  9. data/lib/mml/v2/csymbol.rb +4 -0
  10. data/lib/mml/v2/functions.rb +20 -0
  11. data/lib/mml/v2/logic.rb +28 -0
  12. data/lib/mml/v2/mfraction.rb +4 -0
  13. data/lib/mml/v2/mi.rb +4 -0
  14. data/lib/mml/v2/mn.rb +4 -0
  15. data/lib/mml/v2/ms.rb +4 -0
  16. data/lib/mml/v2/relations.rb +36 -0
  17. data/lib/mml/v2/statistics.rb +24 -0
  18. data/lib/mml/v2/vector_calculus.rb +16 -0
  19. data/lib/mml/v2.rb +0 -2
  20. data/lib/mml/v3/arith.rb +88 -0
  21. data/lib/mml/v3/cbytes.rb +4 -0
  22. data/lib/mml/v3/ci.rb +4 -0
  23. data/lib/mml/v3/cn.rb +4 -0
  24. data/lib/mml/v3/constants.rb +60 -0
  25. data/lib/mml/v3/cs.rb +4 -0
  26. data/lib/mml/v3/csymbol.rb +4 -0
  27. data/lib/mml/v3/elementary_functions.rb +108 -0
  28. data/lib/mml/v3/functions.rb +20 -0
  29. data/lib/mml/v3/linear_algebra.rb +24 -0
  30. data/lib/mml/v3/logic.rb +28 -0
  31. data/lib/mml/v3/maligngroup.rb +4 -0
  32. data/lib/mml/v3/malignmark.rb +4 -0
  33. data/lib/mml/v3/mglyph.rb +4 -0
  34. data/lib/mml/v3/mi.rb +4 -0
  35. data/lib/mml/v3/mlabeledtr.rb +4 -0
  36. data/lib/mml/v3/mn.rb +4 -0
  37. data/lib/mml/v3/mo.rb +4 -0
  38. data/lib/mml/v3/mprescripts.rb +4 -0
  39. data/lib/mml/v3/msline.rb +4 -0
  40. data/lib/mml/v3/mspace.rb +4 -0
  41. data/lib/mml/v3/mtable.rb +4 -0
  42. data/lib/mml/v3/mtext.rb +4 -0
  43. data/lib/mml/v3/mtr.rb +4 -0
  44. data/lib/mml/v3/none.rb +4 -0
  45. data/lib/mml/v3/relations.rb +36 -0
  46. data/lib/mml/v3/sets.rb +44 -0
  47. data/lib/mml/v3/statistics.rb +24 -0
  48. data/lib/mml/v3/vector_calculus.rb +16 -0
  49. data/lib/mml/v3.rb +0 -2
  50. data/lib/mml/v4/arith.rb +66 -0
  51. data/lib/mml/v4/calculus.rb +15 -0
  52. data/lib/mml/v4/cbytes.rb +3 -0
  53. data/lib/mml/v4/ci.rb +3 -0
  54. data/lib/mml/v4/cn.rb +3 -0
  55. data/lib/mml/v4/constants.rb +45 -0
  56. data/lib/mml/v4/cs.rb +3 -0
  57. data/lib/mml/v4/csymbol.rb +3 -0
  58. data/lib/mml/v4/elementary_functions.rb +81 -0
  59. data/lib/mml/v4/factorof.rb +3 -0
  60. data/lib/mml/v4/functions.rb +15 -0
  61. data/lib/mml/v4/limit.rb +3 -0
  62. data/lib/mml/v4/linear_algebra.rb +27 -0
  63. data/lib/mml/v4/logic.rb +21 -0
  64. data/lib/mml/v4/maligngroup.rb +3 -0
  65. data/lib/mml/v4/malignmark.rb +3 -0
  66. data/lib/mml/v4/mglyph.rb +3 -0
  67. data/lib/mml/v4/mi.rb +4 -0
  68. data/lib/mml/v4/mlabeledtr.rb +3 -0
  69. data/lib/mml/v4/mn.rb +4 -0
  70. data/lib/mml/v4/mo.rb +3 -0
  71. data/lib/mml/v4/mprescripts.rb +3 -0
  72. data/lib/mml/v4/msline.rb +3 -0
  73. data/lib/mml/v4/mspace.rb +3 -0
  74. data/lib/mml/v4/mtable.rb +3 -0
  75. data/lib/mml/v4/mtext.rb +3 -0
  76. data/lib/mml/v4/mtr.rb +3 -0
  77. data/lib/mml/v4/none.rb +3 -0
  78. data/lib/mml/v4/relations.rb +24 -0
  79. data/lib/mml/v4/sets.rb +39 -0
  80. data/lib/mml/v4/statistics.rb +21 -0
  81. data/lib/mml/v4/tendsto.rb +3 -0
  82. data/lib/mml/v4/vector_calculus.rb +12 -0
  83. data/lib/mml/v4.rb +0 -2
  84. data/lib/mml/version.rb +1 -1
  85. data/lib/mml/versioned_parser.rb +18 -11
  86. data/lib/mml.rb +14 -3
  87. metadata +2 -2
@@ -3,30 +3,51 @@
3
3
  module Mml
4
4
  module V4
5
5
  class Mean < Lutaml::Model::Serializable
6
+ def self.lutaml_default_register
7
+ :mml_v4
8
+ end
6
9
  include Base::Content::Mean
7
10
  end
8
11
 
9
12
  class Sdev < Lutaml::Model::Serializable
13
+ def self.lutaml_default_register
14
+ :mml_v4
15
+ end
10
16
  include Base::Content::Sdev
11
17
  end
12
18
 
13
19
  class Variance < Lutaml::Model::Serializable
20
+ def self.lutaml_default_register
21
+ :mml_v4
22
+ end
14
23
  include Base::Content::Variance
15
24
  end
16
25
 
17
26
  class Median < Lutaml::Model::Serializable
27
+ def self.lutaml_default_register
28
+ :mml_v4
29
+ end
18
30
  include Base::Content::Median
19
31
  end
20
32
 
21
33
  class Mode < Lutaml::Model::Serializable
34
+ def self.lutaml_default_register
35
+ :mml_v4
36
+ end
22
37
  include Base::Content::Mode
23
38
  end
24
39
 
25
40
  class Moment < Lutaml::Model::Serializable
41
+ def self.lutaml_default_register
42
+ :mml_v4
43
+ end
26
44
  include Base::Content::Moment
27
45
  end
28
46
 
29
47
  class Momentabout < Lutaml::Model::Serializable
48
+ def self.lutaml_default_register
49
+ :mml_v4
50
+ end
30
51
  include Base::Content::Momentabout
31
52
  end
32
53
  end
@@ -3,6 +3,9 @@
3
3
  module Mml
4
4
  module V4
5
5
  class Tendsto < Lutaml::Model::Serializable
6
+ def self.lutaml_default_register
7
+ :mml_v4
8
+ end
6
9
  include Base::Content::Tendsto
7
10
  end
8
11
  end
@@ -3,18 +3,30 @@
3
3
  module Mml
4
4
  module V4
5
5
  class Divergence < Lutaml::Model::Serializable
6
+ def self.lutaml_default_register
7
+ :mml_v4
8
+ end
6
9
  include Base::Content::Divergence
7
10
  end
8
11
 
9
12
  class Grad < Lutaml::Model::Serializable
13
+ def self.lutaml_default_register
14
+ :mml_v4
15
+ end
10
16
  include Base::Content::Grad
11
17
  end
12
18
 
13
19
  class Curl < Lutaml::Model::Serializable
20
+ def self.lutaml_default_register
21
+ :mml_v4
22
+ end
14
23
  include Base::Content::Curl
15
24
  end
16
25
 
17
26
  class Laplacian < Lutaml::Model::Serializable
27
+ def self.lutaml_default_register
28
+ :mml_v4
29
+ end
18
30
  include Base::Content::Laplacian
19
31
  end
20
32
  end
data/lib/mml/v4.rb CHANGED
@@ -3,8 +3,6 @@
3
3
  require "lutaml/model"
4
4
  require_relative "versioned_parser"
5
5
 
6
- Moxml::Config.default_adapter = Mml::DEFAULT_ADAPTER
7
-
8
6
  require_relative "v4/configuration"
9
7
  require_relative "v4/namespace"
10
8
  require_relative "v4/common_elements"
data/lib/mml/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mml
4
- VERSION = "2.3.2"
4
+ VERSION = "2.3.4"
5
5
  end
@@ -5,7 +5,6 @@ module Mml
5
5
  # Shared parse entrypoint for versioned modules.
6
6
  def parse(input, namespace_exist: true,
7
7
  context: Mml::UNSPECIFIED_CONTEXT, register: nil)
8
- self::Configuration.adapter ||= Mml::DEFAULT_ADAPTER
9
8
  context_id = parse_context_id(context, register)
10
9
  root_class = Lutaml::Model::GlobalContext.resolve_type(
11
10
  :math,
@@ -18,14 +17,6 @@ module Mml
18
17
  )
19
18
  end
20
19
 
21
- # Namespace-less MathML is normalized before handing it to lutaml-model.
22
- def parse_with_no_namespace(input)
23
- adapter = self::Configuration.adapter || Mml::DEFAULT_ADAPTER
24
- Moxml.new(adapter).parse(input).tap do |doc|
25
- doc.root.add_namespace(nil, self::Namespace.uri)
26
- end.to_xml
27
- end
28
-
29
20
  # Version modules keep their own default context id.
30
21
  def parse_context_id(context, register)
31
22
  Mml::ContextOptions.normalize_context_option(
@@ -36,11 +27,27 @@ module Mml
36
27
  )
37
28
  end
38
29
 
39
- # Keep the main parse flow readable by separating namespace normalization.
30
+ # Inject the MathML namespace into the raw XML string before parsing.
31
+ # This avoids a double parse-serialize cycle (previously the code used
32
+ # Moxml to parse → add namespace → serialize → parse again).
33
+ #
34
+ # String-level injection is safe for well-formed MathML: the root element
35
+ # is always <math>. For malformed input, the subsequent from_xml parse will
36
+ # raise a proper error.
40
37
  def xml_input(input, namespace_exist)
41
38
  return input if namespace_exist
42
39
 
43
- parse_with_no_namespace(input)
40
+ inject_namespace(input, self::Namespace.uri)
41
+ end
42
+
43
+ private
44
+
45
+ def inject_namespace(xml_string, namespace_uri)
46
+ # Add xmlns attribute to the <math> root element in the raw XML string.
47
+ # Handles both <math> and <math ...> (with existing attributes).
48
+ xml_string.sub(/<math([\s>])/) do
49
+ "<math xmlns=\"#{namespace_uri}\"#{::Regexp.last_match(1)}"
50
+ end
44
51
  end
45
52
  end
46
53
  end
data/lib/mml.rb CHANGED
@@ -5,10 +5,23 @@ require "lutaml/model"
5
5
  module Mml
6
6
  class Error < StandardError; end
7
7
 
8
- DEFAULT_ADAPTER = RUBY_ENGINE == "opal" ? :oga : :ox
9
8
  SUPPORTED_VERSIONS = [2, 3, 4].freeze
10
9
  UNSPECIFIED_CONTEXT = Object.new.freeze
11
10
 
11
+ # Returns the appropriate XML adapter, respecting the host application's
12
+ # configuration. Opal always uses Oga; CRuby delegates to
13
+ # Lutaml::Model::Config.xml_adapter_type so that users control the adapter
14
+ # from a single configuration point.
15
+ module_function
16
+
17
+ def default_adapter
18
+ if RUBY_ENGINE == "opal"
19
+ :oga
20
+ else
21
+ Lutaml::Model::Config.xml_adapter_type
22
+ end
23
+ end
24
+
12
25
  autoload :Namespace, "mml/namespace"
13
26
  autoload :CommonElements, "mml/common_elements"
14
27
  autoload :ContextOptions, "mml/context_options"
@@ -17,8 +30,6 @@ module Mml
17
30
  autoload :V3, "mml/v3"
18
31
  autoload :V4, "mml/v4"
19
32
 
20
- module_function
21
-
22
33
  def parse(
23
34
  input,
24
35
  namespace_exist: true,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mml
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
4
+ version: 2.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-13 00:00:00.000000000 Z
11
+ date: 2026-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model