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.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -2
- data/Rakefile +15 -0
- data/TODO.complete/56-generic-adapter-mece-decomposition.md +20 -0
- data/TODO.complete/60-adapter-fidelity-footnotes-notes-examples.md +92 -55
- data/TODO.complete/70-ttf-font-metrics-parity.md +68 -0
- data/TODO.complete/71-cover-layout-parity.md +45 -0
- data/TODO.complete/72-table-layout-parity.md +49 -0
- data/TODO.complete/73-toc-leaders-parity.md +55 -0
- data/TODO.complete/74-svg-image-rendering-parity.md +76 -0
- data/TODO.complete/75-mathml-formula-rendering-parity.md +52 -0
- data/TODO.complete/76-odd-even-page-templates-parity.md +50 -0
- data/TODO.complete/77-text-formatting-parity.md +55 -0
- data/TODO.complete/78-bibliography-formatting-parity.md +62 -0
- data/TODO.complete/79-line-breaking-parity.md +80 -0
- data/TODO.complete/80-parity-diff-harness-in-ci.md +68 -0
- data/TODO.complete/81-conditional-style-refinements.md +70 -0
- data/TODO.complete/82-semantic-presentation-dedup.md +65 -0
- data/TODO.complete/83-nested-list-support.md +74 -0
- data/TODO.complete/84-figure-svg-rendering.md +70 -0
- data/TODO.complete/85-locality-reference-formatting.md +48 -0
- data/TODO.complete/86-list-item-text-overflow.md +80 -0
- data/TODO.complete/87-odd-even-page-templates.md +55 -0
- data/TODO.complete/88-hyphenation-support.md +52 -0
- data/TODO.complete/89-table-rowspan.md +49 -0
- data/TODO.complete/90-mathml-stacked-layout.md +65 -0
- data/TODO.complete/91-parity-diff-diagnostics.md +50 -0
- data/TODO.complete/92-table-cell-height-parity.md +66 -0
- data/TODO.complete/93-figure-text-searchability.md +49 -0
- data/TODO.complete/94-fo-space-resolution.md +63 -0
- data/TODO.complete/95-title-header-placement.md +55 -0
- data/TODO.complete/96-pagination-drift-parity.md +517 -0
- data/TODO.complete/README.md +58 -38
- data/lib/arrolio/config_driven_pipeline.rb +45 -1
- data/lib/arrolio/content/document.rb +4 -3
- data/lib/arrolio/content/section.rb +3 -0
- data/lib/arrolio/content/table.rb +25 -14
- data/lib/arrolio/embedded_block_extractor.rb +54 -0
- data/lib/arrolio/engine/paged.rb +109 -28
- data/lib/arrolio/flavor/manifest.rb +0 -1
- data/lib/arrolio/flavor/registry.rb +1 -1
- data/lib/arrolio/flowable.rb +21 -0
- data/lib/arrolio/flowables/figure_flowable.rb +17 -0
- data/lib/arrolio/flowables/footnote_marker_flowable.rb +32 -13
- data/lib/arrolio/flowables/group_flowable.rb +57 -0
- data/lib/arrolio/flowables/list_flowable.rb +46 -18
- data/lib/arrolio/flowables/note_flowable.rb +84 -9
- data/lib/arrolio/flowables/page_sequence_start.rb +8 -4
- data/lib/arrolio/flowables/positioned_block.rb +55 -0
- data/lib/arrolio/flowables/rotated_text.rb +51 -0
- data/lib/arrolio/flowables/table_flowable.rb +303 -71
- data/lib/arrolio/flowables/text_flowable.rb +67 -11
- data/lib/arrolio/flowables/toc_line_flowable.rb +70 -7
- data/lib/arrolio/flowables.rb +4 -0
- data/lib/arrolio/font/embedder.rb +22 -3
- data/lib/arrolio/font_scanner.rb +133 -0
- data/lib/arrolio/generic_adapter/document_extraction.rb +101 -0
- data/lib/arrolio/generic_adapter/footnote_extraction.rb +81 -0
- data/lib/arrolio/generic_adapter/heading_extraction.rb +92 -0
- data/lib/arrolio/generic_adapter/inline_run_collection.rb +136 -0
- data/lib/arrolio/generic_adapter/list_conversion.rb +70 -0
- data/lib/arrolio/generic_adapter/metadata_extraction.rb +46 -0
- data/lib/arrolio/generic_adapter/table_conversion.rb +105 -0
- data/lib/arrolio/generic_adapter.rb +263 -317
- data/lib/arrolio/generic_flow_builder.rb +362 -62
- data/lib/arrolio/glyph_measurer.rb +16 -5
- data/lib/arrolio/inline_run.rb +2 -1
- data/lib/arrolio/layout_spec/page_template.rb +14 -8
- data/lib/arrolio/math_ml/inline_run_extractor.rb +272 -0
- data/lib/arrolio/math_ml.rb +7 -0
- data/lib/arrolio/output/page.rb +5 -4
- data/lib/arrolio/output/placed_box.rb +5 -2
- data/lib/arrolio/renderer/pdf.rb +131 -32
- data/lib/arrolio/style/definition.rb +7 -3
- data/lib/arrolio/style/registry.rb +6 -1
- data/lib/arrolio/table/auto_layout.rb +19 -10
- data/lib/arrolio/table/grid.rb +105 -0
- data/lib/arrolio/table.rb +1 -0
- data/lib/arrolio/text_layout/knuth_plass/breaker.rb +194 -92
- data/lib/arrolio/text_layout/knuth_plass/item_builder.rb +31 -17
- data/lib/arrolio/text_layout/knuth_plass.rb +3 -0
- data/lib/arrolio/text_layout/line.rb +3 -1
- data/lib/arrolio/version.rb +1 -1
- data/lib/arrolio.rb +8 -4
- data/scripts/parity_check.rb +52 -0
- data/scripts/parity_diff.rb +89 -0
- data/scripts/xsl_profiles/standoc.yml +8 -2
- data/scripts/xsl_to_config.rb +28 -1
- metadata +81 -5
data/lib/arrolio/version.rb
CHANGED
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
|
|
7
|
-
#
|
|
8
|
-
#
|
|
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:
|
|
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}}: {{
|
|
224
|
+
header_template: "{{docidentifier}}: {{revision_date}}"
|
data/scripts/xsl_to_config.rb
CHANGED
|
@@ -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' =>
|
|
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.
|
|
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:
|
|
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.
|
|
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.
|
|
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:
|
|
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: []
|