arrolio 0.1.0 → 0.1.1

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/Rakefile +15 -0
  4. data/TODO.complete/56-generic-adapter-mece-decomposition.md +20 -0
  5. data/TODO.complete/60-adapter-fidelity-footnotes-notes-examples.md +92 -55
  6. data/TODO.complete/70-ttf-font-metrics-parity.md +68 -0
  7. data/TODO.complete/71-cover-layout-parity.md +45 -0
  8. data/TODO.complete/72-table-layout-parity.md +49 -0
  9. data/TODO.complete/73-toc-leaders-parity.md +55 -0
  10. data/TODO.complete/74-svg-image-rendering-parity.md +76 -0
  11. data/TODO.complete/75-mathml-formula-rendering-parity.md +52 -0
  12. data/TODO.complete/76-odd-even-page-templates-parity.md +50 -0
  13. data/TODO.complete/77-text-formatting-parity.md +55 -0
  14. data/TODO.complete/78-bibliography-formatting-parity.md +62 -0
  15. data/TODO.complete/79-line-breaking-parity.md +80 -0
  16. data/TODO.complete/80-parity-diff-harness-in-ci.md +68 -0
  17. data/TODO.complete/81-conditional-style-refinements.md +70 -0
  18. data/TODO.complete/82-semantic-presentation-dedup.md +65 -0
  19. data/TODO.complete/83-nested-list-support.md +74 -0
  20. data/TODO.complete/84-figure-svg-rendering.md +70 -0
  21. data/TODO.complete/85-locality-reference-formatting.md +48 -0
  22. data/TODO.complete/86-list-item-text-overflow.md +80 -0
  23. data/TODO.complete/87-odd-even-page-templates.md +55 -0
  24. data/TODO.complete/88-hyphenation-support.md +52 -0
  25. data/TODO.complete/89-table-rowspan.md +49 -0
  26. data/TODO.complete/90-mathml-stacked-layout.md +65 -0
  27. data/TODO.complete/91-parity-diff-diagnostics.md +50 -0
  28. data/TODO.complete/92-table-cell-height-parity.md +66 -0
  29. data/TODO.complete/93-figure-text-searchability.md +49 -0
  30. data/TODO.complete/94-fo-space-resolution.md +63 -0
  31. data/TODO.complete/95-title-header-placement.md +55 -0
  32. data/TODO.complete/96-pagination-drift-parity.md +517 -0
  33. data/TODO.complete/README.md +58 -38
  34. data/lib/arrolio/config_driven_pipeline.rb +45 -1
  35. data/lib/arrolio/content/document.rb +4 -3
  36. data/lib/arrolio/content/section.rb +3 -0
  37. data/lib/arrolio/content/table.rb +25 -14
  38. data/lib/arrolio/embedded_block_extractor.rb +54 -0
  39. data/lib/arrolio/engine/paged.rb +109 -28
  40. data/lib/arrolio/flavor/manifest.rb +0 -1
  41. data/lib/arrolio/flavor/registry.rb +1 -1
  42. data/lib/arrolio/flowable.rb +21 -0
  43. data/lib/arrolio/flowables/figure_flowable.rb +17 -0
  44. data/lib/arrolio/flowables/footnote_marker_flowable.rb +32 -13
  45. data/lib/arrolio/flowables/group_flowable.rb +57 -0
  46. data/lib/arrolio/flowables/list_flowable.rb +46 -18
  47. data/lib/arrolio/flowables/note_flowable.rb +84 -9
  48. data/lib/arrolio/flowables/page_sequence_start.rb +8 -4
  49. data/lib/arrolio/flowables/positioned_block.rb +55 -0
  50. data/lib/arrolio/flowables/rotated_text.rb +51 -0
  51. data/lib/arrolio/flowables/table_flowable.rb +303 -71
  52. data/lib/arrolio/flowables/text_flowable.rb +67 -11
  53. data/lib/arrolio/flowables/toc_line_flowable.rb +70 -7
  54. data/lib/arrolio/flowables.rb +4 -0
  55. data/lib/arrolio/font/embedder.rb +22 -3
  56. data/lib/arrolio/font_scanner.rb +133 -0
  57. data/lib/arrolio/generic_adapter/document_extraction.rb +101 -0
  58. data/lib/arrolio/generic_adapter/footnote_extraction.rb +81 -0
  59. data/lib/arrolio/generic_adapter/heading_extraction.rb +92 -0
  60. data/lib/arrolio/generic_adapter/inline_run_collection.rb +136 -0
  61. data/lib/arrolio/generic_adapter/list_conversion.rb +70 -0
  62. data/lib/arrolio/generic_adapter/metadata_extraction.rb +46 -0
  63. data/lib/arrolio/generic_adapter/table_conversion.rb +105 -0
  64. data/lib/arrolio/generic_adapter.rb +263 -317
  65. data/lib/arrolio/generic_flow_builder.rb +362 -62
  66. data/lib/arrolio/glyph_measurer.rb +16 -5
  67. data/lib/arrolio/inline_run.rb +2 -1
  68. data/lib/arrolio/layout_spec/page_template.rb +14 -8
  69. data/lib/arrolio/math_ml/inline_run_extractor.rb +272 -0
  70. data/lib/arrolio/math_ml.rb +7 -0
  71. data/lib/arrolio/output/page.rb +5 -4
  72. data/lib/arrolio/output/placed_box.rb +5 -2
  73. data/lib/arrolio/renderer/pdf.rb +131 -32
  74. data/lib/arrolio/style/definition.rb +7 -3
  75. data/lib/arrolio/style/registry.rb +6 -1
  76. data/lib/arrolio/table/auto_layout.rb +19 -10
  77. data/lib/arrolio/table/grid.rb +105 -0
  78. data/lib/arrolio/table.rb +1 -0
  79. data/lib/arrolio/text_layout/knuth_plass/breaker.rb +194 -92
  80. data/lib/arrolio/text_layout/knuth_plass/item_builder.rb +31 -17
  81. data/lib/arrolio/text_layout/knuth_plass.rb +3 -0
  82. data/lib/arrolio/text_layout/line.rb +3 -1
  83. data/lib/arrolio/version.rb +1 -1
  84. data/lib/arrolio.rb +8 -4
  85. data/scripts/parity_check.rb +52 -0
  86. data/scripts/parity_diff.rb +89 -0
  87. data/scripts/xsl_profiles/standoc.yml +8 -2
  88. data/scripts/xsl_to_config.rb +28 -1
  89. metadata +81 -5
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Arrolio
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
data/lib/arrolio.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pdfrb'
4
+ require 'pdfrb/content/operators'
5
+ require 'mml'
4
6
 
5
7
  # Arrolio -- a flavor-agnostic paged-media layout engine.
6
- # Core knows NOTHING about specific document formats (OIML,
7
- # ISO, IEC, BSI). Flavors are loaded on demand:
8
- # require 'arroolio'
9
- # require 'arrolio/oiml' # Load the OIML flavor
8
+ # Core knows NOTHING about specific document formats. Each flavor
9
+ # lives in its own directory (XSL + 3 generated YAML files) outside
10
+ # the gem and is rendered via Arrolio::ConfigDrivenPipeline.
10
11
  module Arrolio
11
12
  autoload :VERSION, 'arrolio/version'
12
13
  autoload :Error, 'arrolio/error'
@@ -36,7 +37,10 @@ module Arrolio
36
37
  autoload :AssetResolver, 'arrolio/asset_resolver'
37
38
  autoload :GenericAdapter, 'arrolio/generic_adapter'
38
39
  autoload :GenericFlowBuilder, 'arrolio/generic_flow_builder'
40
+ autoload :EmbeddedBlockExtractor, 'arrolio/embedded_block_extractor'
39
41
  autoload :ConfigDrivenPipeline, 'arrolio/config_driven_pipeline'
40
42
  autoload :TocBuilder, 'arrolio/toc_builder'
43
+ autoload :FontScanner, 'arrolio/font_scanner'
41
44
  autoload :Composer, 'arrolio/composer'
45
+ autoload :MathML, 'arrolio/math_ml'
42
46
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'arrolio'
4
+ require 'fileutils'
5
+
6
+ module ParityCheck
7
+ REFERENCE = File.expand_path('~/src/mn/mn-samples-oiml/_site/documents/r060/1/document.pdf')
8
+ FIXTURE = File.expand_path('~/src/mn/mn-samples-oiml/_site/documents/r060/1/document.presentation.xml')
9
+ SOURCE_DIR = File.expand_path('~/src/mn/mn-samples-oiml/sources/r060/1')
10
+ FLAVOR_DIR = File.expand_path('../flavors/oiml', __dir__)
11
+ OUTPUT = File.expand_path('../tmp/parity_check.pdf', __dir__)
12
+
13
+ def self.run
14
+ unless File.exist?(REFERENCE) && File.exist?(FIXTURE)
15
+ warn 'OIML fixture or reference PDF not found. Skipping parity check.'
16
+ warn " Reference: #{REFERENCE}" unless File.exist?(REFERENCE)
17
+ warn " Fixture: #{FIXTURE}" unless File.exist?(FIXTURE)
18
+ return
19
+ end
20
+
21
+ FileUtils.mkdir_p(File.dirname(OUTPUT))
22
+ xml = File.read(FIXTURE)
23
+ Arrolio::ConfigDrivenPipeline.render(
24
+ xml,
25
+ io: OUTPUT,
26
+ flavor_dir: FLAVOR_DIR,
27
+ input_path: FIXTURE,
28
+ extra_image_dirs: [SOURCE_DIR]
29
+ )
30
+
31
+ require 'arrolio/harness'
32
+ diff = Arrolio::Harness::PdfDiff.new(OUTPUT, REFERENCE)
33
+ result = diff.call
34
+
35
+ puts "Overall similarity: #{(result.overall_similarity * 100).round(2)}%"
36
+ puts "Our pages: #{result.ours_pages}, Reference pages: #{result.theirs_pages}"
37
+ puts ''
38
+ result.per_page.each do |page|
39
+ pct = (page.similarity * 100).round(1)
40
+ status = if page.similarity > 0.5 then 'OK'
41
+ elsif page.similarity > 0.1 then 'PARTIAL'
42
+ else 'LOW'
43
+ end
44
+ puts " Page #{page.number}: #{pct}% [#{status}]"
45
+ end
46
+ puts ''
47
+ puts 'Target: > 50% overall similarity'
48
+ result.overall_similarity
49
+ end
50
+ end
51
+
52
+ ParityCheck.run
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Parity diff diagnostics: shows per-page text differences between
5
+ # our rendered PDF and the reference PDF.
6
+ #
7
+ # Usage:
8
+ # bundle exec ruby scripts/parity_diff.rb # all pages
9
+ # bundle exec ruby scripts/parity_diff.rb 5 # page 5 only
10
+ # bundle exec ruby scripts/parity_diff.rb 19 20 21 # pages 19-21
11
+
12
+ require 'arrolio'
13
+ require 'fileutils'
14
+
15
+ module ParityDiff
16
+ OURS = File.expand_path('tmp/parity_check.pdf', Dir.pwd)
17
+ REFERENCE = File.expand_path('~/src/mn/mn-samples-oiml/_site/documents/r060/1/document.pdf')
18
+ FIXTURE = File.expand_path('~/src/mn/mn-samples-oiml/_site/documents/r060/1/document.presentation.xml')
19
+ SOURCE_DIR = File.expand_path('~/src/mn/mn-samples-oiml/sources/r060/1')
20
+ FLAVOR_DIR = File.expand_path('flavors/oiml', Dir.pwd)
21
+
22
+ def self.run(pages = nil)
23
+ render_ours unless File.exist?(OURS)
24
+ unless File.exist?(OURS) && File.exist?(REFERENCE)
25
+ warn 'PDFs not found. Run parity:check first.'
26
+ return
27
+ end
28
+
29
+ ours_pages = page_count(OURS)
30
+ ref_pages = page_count(REFERENCE)
31
+ target_pages = pages&.map(&:to_i) || (1..[ours_pages, ref_pages].max).to_a
32
+
33
+ target_pages.each do |page_num|
34
+ puts '=' * 70
35
+ puts "PAGE #{page_num}"
36
+ puts '=' * 70
37
+ ours_text = extract_text(OURS, page_num)
38
+ ref_text = extract_text(REFERENCE, page_num)
39
+ show_diff(ours_text, ref_text)
40
+ puts ''
41
+ end
42
+ end
43
+
44
+ def self.render_ours
45
+ require 'arrolio/config_driven_pipeline'
46
+ xml = File.read(FIXTURE)
47
+ FileUtils.mkdir_p(File.dirname(OURS))
48
+ Arrolio::ConfigDrivenPipeline.render(
49
+ xml, io: OURS, flavor_dir: FLAVOR_DIR,
50
+ input_path: FIXTURE, extra_image_dirs: [SOURCE_DIR]
51
+ )
52
+ end
53
+
54
+ def self.page_count(pdf)
55
+ `pdftotext "#{pdf}" - 2>/dev/null`.scan("\f").length + 1
56
+ rescue StandardError
57
+ 0
58
+ end
59
+
60
+ def self.extract_text(pdf, page)
61
+ `pdftotext -f #{page} -l #{page} "#{pdf}" - 2>/dev/null`
62
+ .delete("\f").strip
63
+ end
64
+
65
+ def self.show_diff(ours, ref)
66
+ our_lines = ours.split("\n")
67
+ ref_lines = ref.split("\n")
68
+ max_lines = [our_lines.length, ref_lines.length].max
69
+
70
+ max_lines.times do |i|
71
+ our_line = our_lines[i] || ''
72
+ ref_line = ref_lines[i] || ''
73
+
74
+ if our_line == ref_line
75
+ puts " #{our_line}"
76
+ elsif our_line.empty?
77
+ puts "+ #{ref_line}" # missing from ours
78
+ elsif ref_line.empty?
79
+ puts "- #{our_line}" # extra in ours
80
+ else
81
+ puts "~ OURS: #{our_line}"
82
+ puts " REF: #{ref_line}"
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ pages = ARGV.empty? ? nil : ARGV
89
+ ParityDiff.run(pages)
@@ -85,6 +85,9 @@ skip_metadata_elements:
85
85
  - referenceTo
86
86
  - origin
87
87
  - source
88
+ - xref
89
+ - eref
90
+ - identifier
88
91
 
89
92
  skip_elements:
90
93
  - title
@@ -146,6 +149,8 @@ metadata_fields:
146
149
  docnumber: docnumber
147
150
  edition: edition
148
151
  revision_date: version/revision-date
152
+ version_text: version
153
+ part_number: bibdata/ext/structuredidentifier/project-number/@part
149
154
  title: "title[@type='main']"
150
155
  title_intro: "title[@type='title-intro']"
151
156
  title_main: "title[@type='title-main']"
@@ -162,9 +167,10 @@ cover_fields:
162
167
  - title_main
163
168
  - title_complementary
164
169
  - title_part
170
+ - title_part_prefix
165
171
 
166
172
  style_overrides:
167
- body_margin_bottom: 8
173
+ body_margin_bottom: 0
168
174
  strong_font_name: "Times New Roman Bold"
169
175
  em_font_name: "Times New Roman Italic"
170
176
  identifier_font_name: "Times New Roman Italic"
@@ -215,4 +221,4 @@ cover_content:
215
221
  source: "{{docidentifier}} {{edition}}"
216
222
  style: cover_label
217
223
 
218
- header_template: "{{docidentifier}}: {{edition}}"
224
+ header_template: "{{docidentifier}}: {{revision_date}}"
@@ -14,6 +14,9 @@ module XslConfigGenerator
14
14
  end
15
15
 
16
16
  class Builder
17
+ # Border/padding allowance added to the XSL row min-height.
18
+ ROW_ALLOWANCE = 1.92
19
+
17
20
  def initialize(xsl_path, output_dir, profile_path)
18
21
  @xsl_path = File.expand_path(xsl_path)
19
22
  @output_dir = File.expand_path(output_dir)
@@ -76,8 +79,11 @@ module XslConfigGenerator
76
79
 
77
80
  def text_styles
78
81
  o = @profile['style_overrides'] || {}
82
+ body_style = style_from('root-style', 'clause_style')
83
+ body_style['margin_bottom'] = o['body_margin_bottom'] || 8
84
+ body_style['line_break'] = o['body_line_break'] if o['body_line_break']
79
85
  {
80
- 'body' => style_from('root-style', 'clause_style').merge('margin_bottom' => o['body_margin_bottom'] || 8),
86
+ 'body' => body_style,
81
87
  **heading_styles,
82
88
  'note' => style_from('note-style').merge('parent' => 'body'),
83
89
  'termnote' => style_from('termnote-style').merge('parent' => 'body'),
@@ -110,6 +116,26 @@ module XslConfigGenerator
110
116
  }
111
117
  end
112
118
 
119
+ # Row geometry extracted from the flavor XSL: table-row-style's
120
+ # min-height (e.g. 8.3mm) plus ROW_ALLOWANCE, the border/padding
121
+ # allowance measured against mn2pdf output (the rendered pitch is
122
+ # ~1.9pt above the bare min-height). Cell padding and footnote
123
+ # size default to values calibrated against the reference PDF.
124
+ def table_geometry
125
+ min_height = @attribute_sets.dig('table-row-style', 'min-height')
126
+ min_height_mm = min_height&.gsub(/[^\d.]/, '')
127
+ min_row_height = if min_height_mm
128
+ ((min_height_mm.to_f * 2.83464567) + ROW_ALLOWANCE).round(2)
129
+ else
130
+ 0.0
131
+ end
132
+ {
133
+ 'min_row_height' => min_row_height,
134
+ 'cell_padding' => 3.3,
135
+ 'footnote_font_size' => 9.0
136
+ }
137
+ end
138
+
113
139
  def table_styles
114
140
  o = @profile['style_overrides'] || {}
115
141
  {
@@ -222,6 +248,7 @@ module XslConfigGenerator
222
248
  'xsl_templates' => @templates.select { |template| template['name'] },
223
249
  'page_sequences' => page_sequences,
224
250
  'cover_content' => @profile['cover_content'] || [],
251
+ 'table' => table_geometry,
225
252
  'section' => {
226
253
  'heading_style' => '{{title_style_id}}',
227
254
  'body_style' => '{{style_id}}',
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arrolio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-08-29 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: fontisan
@@ -29,6 +30,34 @@ dependencies:
29
30
  - - "<"
30
31
  - !ruby/object:Gem::Version
31
32
  version: '1.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: fontist
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: mml
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.4'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.4'
32
61
  - !ruby/object:Gem::Dependency
33
62
  name: nokogiri
34
63
  requirement: !ruby/object:Gem::Requirement
@@ -49,14 +78,14 @@ dependencies:
49
78
  requirements:
50
79
  - - "~>"
51
80
  - !ruby/object:Gem::Version
52
- version: 0.3.0
81
+ version: '0.7'
53
82
  type: :runtime
54
83
  prerelease: false
55
84
  version_requirements: !ruby/object:Gem::Requirement
56
85
  requirements:
57
86
  - - "~>"
58
87
  - !ruby/object:Gem::Version
59
- version: 0.3.0
88
+ version: '0.7'
60
89
  - !ruby/object:Gem::Dependency
61
90
  name: rexml
62
91
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +197,33 @@ files:
168
197
  - TODO.complete/63-purge-hardcoded-vocabulary-from-generic-core.md
169
198
  - TODO.complete/64-selector-driven-adapter-specs.md
170
199
  - TODO.complete/66-semantic-content-types.md
200
+ - TODO.complete/70-ttf-font-metrics-parity.md
201
+ - TODO.complete/71-cover-layout-parity.md
202
+ - TODO.complete/72-table-layout-parity.md
203
+ - TODO.complete/73-toc-leaders-parity.md
204
+ - TODO.complete/74-svg-image-rendering-parity.md
205
+ - TODO.complete/75-mathml-formula-rendering-parity.md
206
+ - TODO.complete/76-odd-even-page-templates-parity.md
207
+ - TODO.complete/77-text-formatting-parity.md
208
+ - TODO.complete/78-bibliography-formatting-parity.md
209
+ - TODO.complete/79-line-breaking-parity.md
210
+ - TODO.complete/80-parity-diff-harness-in-ci.md
211
+ - TODO.complete/81-conditional-style-refinements.md
212
+ - TODO.complete/82-semantic-presentation-dedup.md
213
+ - TODO.complete/83-nested-list-support.md
214
+ - TODO.complete/84-figure-svg-rendering.md
215
+ - TODO.complete/85-locality-reference-formatting.md
216
+ - TODO.complete/86-list-item-text-overflow.md
217
+ - TODO.complete/87-odd-even-page-templates.md
218
+ - TODO.complete/88-hyphenation-support.md
219
+ - TODO.complete/89-table-rowspan.md
220
+ - TODO.complete/90-mathml-stacked-layout.md
221
+ - TODO.complete/91-parity-diff-diagnostics.md
222
+ - TODO.complete/92-table-cell-height-parity.md
223
+ - TODO.complete/93-figure-text-searchability.md
224
+ - TODO.complete/94-fo-space-resolution.md
225
+ - TODO.complete/95-title-header-placement.md
226
+ - TODO.complete/96-pagination-drift-parity.md
171
227
  - TODO.complete/README.md
172
228
  - TODO.implementation/01-foundation.md
173
229
  - TODO.implementation/02-content-contract.md
@@ -281,6 +337,7 @@ files:
281
337
  - lib/arrolio/content/table.rb
282
338
  - lib/arrolio/content/term_entry.rb
283
339
  - lib/arrolio/data_dir.rb
340
+ - lib/arrolio/embedded_block_extractor.rb
284
341
  - lib/arrolio/engine.rb
285
342
  - lib/arrolio/engine/cross_reference_registry.rb
286
343
  - lib/arrolio/engine/paged.rb
@@ -291,13 +348,17 @@ files:
291
348
  - lib/arrolio/flow_context.rb
292
349
  - lib/arrolio/flowable.rb
293
350
  - lib/arrolio/flowables.rb
351
+ - lib/arrolio/flowables/figure_flowable.rb
294
352
  - lib/arrolio/flowables/footnote_marker_flowable.rb
353
+ - lib/arrolio/flowables/group_flowable.rb
295
354
  - lib/arrolio/flowables/heading_flowable.rb
296
355
  - lib/arrolio/flowables/image_flowable.rb
297
356
  - lib/arrolio/flowables/list_flowable.rb
298
357
  - lib/arrolio/flowables/note_flowable.rb
299
358
  - lib/arrolio/flowables/page_break.rb
300
359
  - lib/arrolio/flowables/page_sequence_start.rb
360
+ - lib/arrolio/flowables/positioned_block.rb
361
+ - lib/arrolio/flowables/rotated_text.rb
301
362
  - lib/arrolio/flowables/spacer.rb
302
363
  - lib/arrolio/flowables/table_flowable.rb
303
364
  - lib/arrolio/flowables/text_flowable.rb
@@ -312,8 +373,16 @@ files:
312
373
  - lib/arrolio/font_metrics/afm_metrics.rb
313
374
  - lib/arrolio/font_metrics/registry.rb
314
375
  - lib/arrolio/font_metrics/true_type_metrics.rb
376
+ - lib/arrolio/font_scanner.rb
315
377
  - lib/arrolio/frame.rb
316
378
  - lib/arrolio/generic_adapter.rb
379
+ - lib/arrolio/generic_adapter/document_extraction.rb
380
+ - lib/arrolio/generic_adapter/footnote_extraction.rb
381
+ - lib/arrolio/generic_adapter/heading_extraction.rb
382
+ - lib/arrolio/generic_adapter/inline_run_collection.rb
383
+ - lib/arrolio/generic_adapter/list_conversion.rb
384
+ - lib/arrolio/generic_adapter/metadata_extraction.rb
385
+ - lib/arrolio/generic_adapter/table_conversion.rb
317
386
  - lib/arrolio/generic_flow_builder.rb
318
387
  - lib/arrolio/glyph_measurer.rb
319
388
  - lib/arrolio/harness.rb
@@ -330,6 +399,8 @@ files:
330
399
  - lib/arrolio/layout_spec/region.rb
331
400
  - lib/arrolio/layout_spec/scale_length.rb
332
401
  - lib/arrolio/logger.rb
402
+ - lib/arrolio/math_ml.rb
403
+ - lib/arrolio/math_ml/inline_run_extractor.rb
333
404
  - lib/arrolio/output.rb
334
405
  - lib/arrolio/output/page.rb
335
406
  - lib/arrolio/output/placed_box.rb
@@ -349,6 +420,7 @@ files:
349
420
  - lib/arrolio/style/registry.rb
350
421
  - lib/arrolio/table.rb
351
422
  - lib/arrolio/table/auto_layout.rb
423
+ - lib/arrolio/table/grid.rb
352
424
  - lib/arrolio/text_direction.rb
353
425
  - lib/arrolio/text_layout.rb
354
426
  - lib/arrolio/text_layout/break_opportunity.rb
@@ -362,6 +434,8 @@ files:
362
434
  - lib/arrolio/version.rb
363
435
  - lib/arrolio/writing_mode.rb
364
436
  - script/smoke.rb
437
+ - scripts/parity_check.rb
438
+ - scripts/parity_diff.rb
365
439
  - scripts/write_content_extras.py
366
440
  - scripts/xsl_profiles/standoc.yml
367
441
  - scripts/xsl_to_config.rb
@@ -374,6 +448,7 @@ metadata:
374
448
  changelog_uri: https://github.com/arrolio/arrolio/blob/main/CHANGELOG.md
375
449
  bug_tracker_uri: https://github.com/arrolio/arrolio/issues
376
450
  rubygems_mfa_required: 'true'
451
+ post_install_message:
377
452
  rdoc_options: []
378
453
  require_paths:
379
454
  - lib
@@ -388,7 +463,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
388
463
  - !ruby/object:Gem::Version
389
464
  version: '0'
390
465
  requirements: []
391
- rubygems_version: 4.0.16
466
+ rubygems_version: 3.5.22
467
+ signing_key:
392
468
  specification_version: 4
393
469
  summary: FOP-like paged layout engine for Ruby — renders to PDF via Pdfrb
394
470
  test_files: []