ucode 0.1.1 → 0.2.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/TODO.extract-code-chart/01-pdf-fetch-validation.md +80 -0
- data/TODO.extract-code-chart/02-block-name-resolver.md +68 -0
- data/TODO.extract-code-chart/03-codechart-namespace.md +82 -0
- data/TODO.extract-code-chart/04-codechart-extractor.md +154 -0
- data/TODO.extract-code-chart/05-provenance-and-sidecar.md +147 -0
- data/TODO.extract-code-chart/06-codechart-writer.md +134 -0
- data/TODO.extract-code-chart/07-codechart-cli.md +135 -0
- data/TODO.extract-code-chart/08-specs.md +87 -0
- data/lib/ucode/audit/reference_factory.rb +66 -0
- data/lib/ucode/audit.rb +1 -0
- data/lib/ucode/cli.rb +134 -16
- data/lib/ucode/code_chart/extractor.rb +122 -0
- data/lib/ucode/code_chart/provenance.rb +81 -0
- data/lib/ucode/code_chart/sidecar.rb +52 -0
- data/lib/ucode/code_chart/writer.rb +128 -0
- data/lib/ucode/code_chart.rb +39 -0
- data/lib/ucode/commands/audit.rb +0 -1
- data/lib/ucode/commands/build.rb +4 -0
- data/lib/ucode/commands/canonical_build.rb +2 -3
- data/lib/ucode/commands/fetch.rb +12 -14
- data/lib/ucode/commands/glyphs.rb +25 -67
- data/lib/ucode/commands/lookup.rb +11 -11
- data/lib/ucode/commands/parse.rb +7 -5
- data/lib/ucode/commands/release.rb +0 -1
- data/lib/ucode/commands/universal_set.rb +10 -14
- data/lib/ucode/coordinator/indices.rb +38 -2
- data/lib/ucode/error.rb +11 -0
- data/lib/ucode/fetch/code_charts.rb +1 -1
- data/lib/ucode/fetch/http.rb +84 -14
- data/lib/ucode/glyphs/pipeline.rb +106 -0
- data/lib/ucode/glyphs.rb +1 -0
- data/lib/ucode/parsers/blocks.rb +34 -0
- data/lib/ucode/repo/aggregate_writer.rb +60 -298
- data/lib/ucode/repo/writers/blocks_writer.rb +73 -0
- data/lib/ucode/repo/writers/enums_writer.rb +38 -0
- data/lib/ucode/repo/writers/indexes_writer.rb +53 -0
- data/lib/ucode/repo/writers/manifest_writer.rb +78 -0
- data/lib/ucode/repo/writers/named_sequences_writer.rb +47 -0
- data/lib/ucode/repo/writers/planes_writer.rb +82 -0
- data/lib/ucode/repo/writers/relationships_writer.rb +71 -0
- data/lib/ucode/repo/writers/scripts_writer.rb +54 -0
- data/lib/ucode/repo/writers.rb +20 -0
- data/lib/ucode/repo.rb +1 -0
- data/lib/ucode/version.rb +1 -1
- data/lib/ucode.rb +3 -0
- data/ucode.gemspec +56 -0
- metadata +31 -5
- data/Gemfile.lock +0 -406
- data/lib/ucode/commands/audit/reference_builder.rb +0 -64
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pathname"
|
|
4
|
+
require "ucode/repo/atomic_writes"
|
|
5
|
+
|
|
6
|
+
module Ucode
|
|
7
|
+
module Repo
|
|
8
|
+
module Writers
|
|
9
|
+
# Writes one file per named sequence under
|
|
10
|
+
# `output/named_sequences/<slug>.json`. Empty input writes nothing.
|
|
11
|
+
#
|
|
12
|
+
# One of the eight per-concern writers split out from
|
|
13
|
+
# AggregateWriter — see Candidate 5 of the 2026-06-29 review.
|
|
14
|
+
class NamedSequencesWriter
|
|
15
|
+
include AtomicWrites
|
|
16
|
+
|
|
17
|
+
# @param output_root [Pathname]
|
|
18
|
+
# @param named_sequences [Array<Ucode::Models::NamedSequence>]
|
|
19
|
+
def initialize(output_root:, named_sequences:)
|
|
20
|
+
@output_root = output_root
|
|
21
|
+
@named_sequences = named_sequences
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Integer] number of named-sequence files written
|
|
25
|
+
def write
|
|
26
|
+
return 0 if @named_sequences.nil? || @named_sequences.empty?
|
|
27
|
+
|
|
28
|
+
dir = Pathname(@output_root).join("named_sequences")
|
|
29
|
+
@named_sequences.sum do |ns|
|
|
30
|
+
path = dir.join("#{slug_for(ns)}.json")
|
|
31
|
+
write_atomic(path, ns.to_json(pretty: true)) ? 1 : 0
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
# Slug derived from the name: downcase, non-alphanumerics → "_".
|
|
38
|
+
def slug_for(named_sequence)
|
|
39
|
+
named_sequence.name
|
|
40
|
+
.downcase
|
|
41
|
+
.gsub(/[^a-z0-9]+/, "_")
|
|
42
|
+
.gsub(/^_+|_+$/, "")
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "ucode/repo/atomic_writes"
|
|
4
|
+
require "ucode/repo/paths"
|
|
5
|
+
|
|
6
|
+
module Ucode
|
|
7
|
+
module Repo
|
|
8
|
+
module Writers
|
|
9
|
+
# Writes `output/planes/<n>.json` for every plane (0..16).
|
|
10
|
+
#
|
|
11
|
+
# One of the eight per-concern writers split out from
|
|
12
|
+
# AggregateWriter — see Candidate 5 of the 2026-06-29 review.
|
|
13
|
+
class PlanesWriter
|
|
14
|
+
include AtomicWrites
|
|
15
|
+
|
|
16
|
+
# Static metadata for the 17 Unicode planes. Planes 4–13 are
|
|
17
|
+
# unassigned in Unicode 17; their entries use placeholder names.
|
|
18
|
+
PLANE_TABLE = {
|
|
19
|
+
0 => ["Basic Multilingual Plane", "BMP"],
|
|
20
|
+
1 => ["Supplementary Multilingual Plane", "SMP"],
|
|
21
|
+
2 => ["Supplementary Ideographic Plane", "SIP"],
|
|
22
|
+
3 => ["Tertiary Ideographic Plane", "TIP"],
|
|
23
|
+
4 => ["Unassigned Plane 4", "—"],
|
|
24
|
+
5 => ["Unassigned Plane 5", "—"],
|
|
25
|
+
6 => ["Unassigned Plane 6", "—"],
|
|
26
|
+
7 => ["Unassigned Plane 7", "—"],
|
|
27
|
+
8 => ["Unassigned Plane 8", "—"],
|
|
28
|
+
9 => ["Unassigned Plane 9", "—"],
|
|
29
|
+
10 => ["Unassigned Plane 10", "—"],
|
|
30
|
+
11 => ["Unassigned Plane 11", "—"],
|
|
31
|
+
12 => ["Unassigned Plane 12", "—"],
|
|
32
|
+
13 => ["Unassigned Plane 13", "—"],
|
|
33
|
+
14 => ["Supplementary Special-purpose Plane", "SSP"],
|
|
34
|
+
15 => ["Supplementary Private Use Area-A", "SPUA-A"],
|
|
35
|
+
16 => ["Supplementary Private Use Area-B", "SPUA-B"],
|
|
36
|
+
}.freeze
|
|
37
|
+
private_constant :PLANE_TABLE
|
|
38
|
+
|
|
39
|
+
# @param output_root [Pathname]
|
|
40
|
+
# @param blocks [Array<Ucode::Models::Block>]
|
|
41
|
+
def initialize(output_root:, blocks:)
|
|
42
|
+
@output_root = output_root
|
|
43
|
+
@blocks = blocks
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [Integer] number of plane files written (always 17
|
|
47
|
+
# when the directory is reachable; one per plane number)
|
|
48
|
+
def write
|
|
49
|
+
plane_block_ids = group_block_ids_by_plane
|
|
50
|
+
count = 0
|
|
51
|
+
(0..16).each do |n|
|
|
52
|
+
path = Paths.plane_metadata_path(@output_root, n)
|
|
53
|
+
count += 1 if write_atomic(path, plane_payload(n, plane_block_ids[n] || []))
|
|
54
|
+
end
|
|
55
|
+
count
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def group_block_ids_by_plane
|
|
61
|
+
@blocks.each_with_object(Hash.new { |h, k| h[k] = [] }) do |block, h|
|
|
62
|
+
h[block.plane_number] << block.id
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def plane_payload(plane_number, block_ids)
|
|
67
|
+
name, abbrev = PLANE_TABLE.fetch(plane_number)
|
|
68
|
+
range_first = plane_number * 0x10000
|
|
69
|
+
range_last = range_first + 0xFFFF
|
|
70
|
+
to_pretty_json(
|
|
71
|
+
"number" => plane_number,
|
|
72
|
+
"name" => name,
|
|
73
|
+
"abbrev" => abbrev,
|
|
74
|
+
"range_first" => range_first,
|
|
75
|
+
"range_last" => range_last,
|
|
76
|
+
"block_ids" => block_ids,
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pathname"
|
|
4
|
+
require "ucode/coordinator"
|
|
5
|
+
require "ucode/repo/atomic_writes"
|
|
6
|
+
require "ucode/repo/paths"
|
|
7
|
+
|
|
8
|
+
module Ucode
|
|
9
|
+
module Repo
|
|
10
|
+
module Writers
|
|
11
|
+
# Writes one file per relationship table under
|
|
12
|
+
# `output/relationships/`. The set of tables is enumerated by
|
|
13
|
+
# `Coordinator::Indices#each_relationship` (see Candidate 1 of the
|
|
14
|
+
# 2026-06-29 review).
|
|
15
|
+
#
|
|
16
|
+
# One of the eight per-concern writers split out from
|
|
17
|
+
# AggregateWriter — see Candidate 5 of the 2026-06-29 review.
|
|
18
|
+
class RelationshipsWriter
|
|
19
|
+
include AtomicWrites
|
|
20
|
+
|
|
21
|
+
# @param output_root [Pathname]
|
|
22
|
+
# @param indices [Ucode::Coordinator::Indices]
|
|
23
|
+
def initialize(output_root:, indices:)
|
|
24
|
+
@output_root = output_root
|
|
25
|
+
@indices = indices
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [Integer] number of relationship files written
|
|
29
|
+
def write
|
|
30
|
+
@indices.each_relationship.sum do |slug, records|
|
|
31
|
+
write_relationship_file(slug, records)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def write_relationship_file(slug, records)
|
|
38
|
+
return 0 if records.nil? || records.empty?
|
|
39
|
+
|
|
40
|
+
path = Pathname(@output_root).join("relationships", "#{slug}.json")
|
|
41
|
+
write_atomic(path, relationship_payload(records)) ? 1 : 0
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# records is Hash<Integer, Record>, Hash<Integer, Array<Record>>,
|
|
45
|
+
# Hash<String, Record>, or Hash<String, Array<Record>>.
|
|
46
|
+
def relationship_payload(records)
|
|
47
|
+
payload = records.each_with_object({}) do |(key, value), h|
|
|
48
|
+
h[key_to_cp_id(key)] = serialize_value(value)
|
|
49
|
+
end
|
|
50
|
+
to_pretty_json(payload)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Integer codepoint keys are formatted as "U+XXXX"; string id
|
|
54
|
+
# keys (cjk_radicals, standardized_variants) pass through.
|
|
55
|
+
def key_to_cp_id(key)
|
|
56
|
+
key.is_a?(Integer) ? Paths.cp_id(key) : key
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def serialize_value(value)
|
|
60
|
+
return value.map { |v| serialize_one(v) } if value.is_a?(Array)
|
|
61
|
+
|
|
62
|
+
serialize_one(value)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def serialize_one(record)
|
|
66
|
+
record.to_yaml_hash
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "ucode/repo/atomic_writes"
|
|
4
|
+
require "ucode/repo/paths"
|
|
5
|
+
|
|
6
|
+
module Ucode
|
|
7
|
+
module Repo
|
|
8
|
+
module Writers
|
|
9
|
+
# Writes `output/scripts/<code>.json` for every assigned script.
|
|
10
|
+
#
|
|
11
|
+
# One of the eight per-concern writers split out from
|
|
12
|
+
# AggregateWriter — see Candidate 5 of the 2026-06-29 review.
|
|
13
|
+
class ScriptsWriter
|
|
14
|
+
include AtomicWrites
|
|
15
|
+
|
|
16
|
+
# @param output_root [Pathname]
|
|
17
|
+
# @param scripts [Array<Ucode::Models::Script>] from
|
|
18
|
+
# Coordinator::Indices
|
|
19
|
+
# @param script_codepoint_ids [Hash{String => Array<String>}]
|
|
20
|
+
# ISO 15924 code → cp_id list, accumulated during the
|
|
21
|
+
# streaming pass
|
|
22
|
+
def initialize(output_root:, scripts:, script_codepoint_ids:)
|
|
23
|
+
@output_root = output_root
|
|
24
|
+
@scripts = scripts
|
|
25
|
+
@script_codepoint_ids = script_codepoint_ids
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [Integer] number of script files written
|
|
29
|
+
def write
|
|
30
|
+
count = 0
|
|
31
|
+
@scripts.group_by(&:code).each do |code, ranges|
|
|
32
|
+
next if code.nil? || code.empty?
|
|
33
|
+
|
|
34
|
+
path = Paths.script_metadata_path(@output_root, code)
|
|
35
|
+
count += 1 if write_atomic(path, script_payload(code, ranges))
|
|
36
|
+
end
|
|
37
|
+
count
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def script_payload(code, ranges)
|
|
43
|
+
to_pretty_json(
|
|
44
|
+
"code" => code,
|
|
45
|
+
"name" => ranges.first&.name,
|
|
46
|
+
"range_first" => ranges.map(&:range_first).min,
|
|
47
|
+
"range_last" => ranges.map(&:range_last).max,
|
|
48
|
+
"codepoint_ids" => (@script_codepoint_ids[code] || []),
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ucode
|
|
4
|
+
module Repo
|
|
5
|
+
# Per-concern writer classes, one per output file kind. Each
|
|
6
|
+
# conforms to the `#write → Integer` interface (returns the count
|
|
7
|
+
# of files written). Composed by AggregateWriter#flush — adding a
|
|
8
|
+
# new aggregate = one writer class + one line in AggregateWriter.
|
|
9
|
+
module Writers
|
|
10
|
+
autoload :PlanesWriter, "ucode/repo/writers/planes_writer"
|
|
11
|
+
autoload :BlocksWriter, "ucode/repo/writers/blocks_writer"
|
|
12
|
+
autoload :ScriptsWriter, "ucode/repo/writers/scripts_writer"
|
|
13
|
+
autoload :IndexesWriter, "ucode/repo/writers/indexes_writer"
|
|
14
|
+
autoload :RelationshipsWriter, "ucode/repo/writers/relationships_writer"
|
|
15
|
+
autoload :EnumsWriter, "ucode/repo/writers/enums_writer"
|
|
16
|
+
autoload :NamedSequencesWriter, "ucode/repo/writers/named_sequences_writer"
|
|
17
|
+
autoload :ManifestWriter, "ucode/repo/writers/manifest_writer"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/ucode/repo.rb
CHANGED
|
@@ -18,6 +18,7 @@ module Ucode
|
|
|
18
18
|
autoload :AtomicWrites, "ucode/repo/atomic_writes"
|
|
19
19
|
autoload :CodepointWriter, "ucode/repo/codepoint_writer"
|
|
20
20
|
autoload :AggregateWriter, "ucode/repo/aggregate_writer"
|
|
21
|
+
autoload :Writers, "ucode/repo/writers"
|
|
21
22
|
autoload :BuildReportAccumulator, "ucode/repo/build_report_accumulator"
|
|
22
23
|
autoload :BuildReportWriter, "ucode/repo/build_report_writer"
|
|
23
24
|
autoload :BuildValidator, "ucode/repo/build_validator"
|
data/lib/ucode/version.rb
CHANGED
data/lib/ucode.rb
CHANGED
|
@@ -30,11 +30,13 @@ module Ucode
|
|
|
30
30
|
autoload :DatabaseMissingError, "ucode/error"
|
|
31
31
|
autoload :DatabaseSchemaError, "ucode/error"
|
|
32
32
|
autoload :UnknownVersionError, "ucode/error"
|
|
33
|
+
autoload :UnknownBlockError, "ucode/error"
|
|
33
34
|
autoload :GlyphError, "ucode/error"
|
|
34
35
|
autoload :PdfRenderError, "ucode/error"
|
|
35
36
|
autoload :GridDetectionError, "ucode/error"
|
|
36
37
|
autoload :LastResortMissingError, "ucode/error"
|
|
37
38
|
autoload :EmbeddedFontsMissingError, "ucode/error"
|
|
39
|
+
autoload :CodeChartNotFoundError, "ucode/error"
|
|
38
40
|
|
|
39
41
|
# Infrastructure
|
|
40
42
|
autoload :Cache, "ucode/cache"
|
|
@@ -54,6 +56,7 @@ module Ucode
|
|
|
54
56
|
autoload :Repo, "ucode/repo"
|
|
55
57
|
autoload :Glyphs, "ucode/glyphs"
|
|
56
58
|
autoload :Audit, "ucode/audit"
|
|
59
|
+
autoload :CodeChart, "ucode/code_chart"
|
|
57
60
|
autoload :Site, "ucode/site"
|
|
58
61
|
autoload :Commands, "ucode/commands"
|
|
59
62
|
autoload :Cli, "ucode/cli"
|
data/ucode.gemspec
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/ucode/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "ucode"
|
|
7
|
+
spec.version = Ucode::VERSION
|
|
8
|
+
spec.authors = ["Ribose Inc."]
|
|
9
|
+
spec.email = ["open.source@ribose.com"]
|
|
10
|
+
|
|
11
|
+
spec.summary = "Unicode Character Database toolkit — lookup, dataset, glyphs, site"
|
|
12
|
+
spec.description = <<~DESC
|
|
13
|
+
ucode turns the Unicode Character Database (UCD) text files and the official
|
|
14
|
+
Unicode Code Charts into a structured, browsable dataset. For every assigned
|
|
15
|
+
codepoint it produces a JSON document with full UCD properties, the
|
|
16
|
+
human-curated relationships from NamesList.txt, Unihan readings, and
|
|
17
|
+
machine-computed references; an SVG of the official glyph vector-extracted
|
|
18
|
+
from the Code Charts; and a Vitepress site for browsing Plane, Block,
|
|
19
|
+
and Character.
|
|
20
|
+
DESC
|
|
21
|
+
|
|
22
|
+
spec.homepage = "https://github.com/fontist/ucode"
|
|
23
|
+
spec.license = "BSD-2-Clause"
|
|
24
|
+
spec.required_ruby_version = ">= 3.2.0"
|
|
25
|
+
|
|
26
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
27
|
+
spec.metadata["source_code_uri"] = "https://github.com/fontist/ucode"
|
|
28
|
+
spec.metadata["changelog_uri"] = "https://github.com/fontist/ucode/blob/main/CHANGELOG.md"
|
|
29
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
|
30
|
+
|
|
31
|
+
spec.files = Dir.chdir(__dir__) do
|
|
32
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
33
|
+
f == __FILE__ ||
|
|
34
|
+
f.start_with?(".") ||
|
|
35
|
+
f.start_with?("spec/") ||
|
|
36
|
+
f.start_with?("benchmark/") ||
|
|
37
|
+
f.start_with?("TODO.impl/") ||
|
|
38
|
+
f.start_with?("docs/") ||
|
|
39
|
+
f.start_with?("site/")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
spec.bindir = "exe"
|
|
44
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
45
|
+
spec.require_paths = ["lib"]
|
|
46
|
+
|
|
47
|
+
spec.add_dependency "base64"
|
|
48
|
+
spec.add_dependency "fontisan", "~> 0.2"
|
|
49
|
+
spec.add_dependency "fontist", "~> 3.0"
|
|
50
|
+
spec.add_dependency "logger"
|
|
51
|
+
spec.add_dependency "lutaml-model", "~> 0.8"
|
|
52
|
+
spec.add_dependency "nokogiri", "~> 1.16"
|
|
53
|
+
spec.add_dependency "rubyzip", "~> 2.3"
|
|
54
|
+
spec.add_dependency "sqlite3", "~> 2.0"
|
|
55
|
+
spec.add_dependency "thor", "~> 1.3"
|
|
56
|
+
end
|
metadata
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ucode
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.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-06-30 00:00:00.000000000 Z
|
|
11
12
|
dependencies:
|
|
12
13
|
- !ruby/object:Gem::Dependency
|
|
13
14
|
name: base64
|
|
@@ -153,9 +154,16 @@ files:
|
|
|
153
154
|
- CHANGELOG.md
|
|
154
155
|
- CLAUDE.md
|
|
155
156
|
- Gemfile
|
|
156
|
-
- Gemfile.lock
|
|
157
157
|
- README.md
|
|
158
158
|
- Rakefile
|
|
159
|
+
- TODO.extract-code-chart/01-pdf-fetch-validation.md
|
|
160
|
+
- TODO.extract-code-chart/02-block-name-resolver.md
|
|
161
|
+
- TODO.extract-code-chart/03-codechart-namespace.md
|
|
162
|
+
- TODO.extract-code-chart/04-codechart-extractor.md
|
|
163
|
+
- TODO.extract-code-chart/05-provenance-and-sidecar.md
|
|
164
|
+
- TODO.extract-code-chart/06-codechart-writer.md
|
|
165
|
+
- TODO.extract-code-chart/07-codechart-cli.md
|
|
166
|
+
- TODO.extract-code-chart/08-specs.md
|
|
159
167
|
- TODO.full/00-README.md
|
|
160
168
|
- TODO.full/01-panglyph-vision.md
|
|
161
169
|
- TODO.full/02-panglyph-repo-bootstrap.md
|
|
@@ -282,6 +290,7 @@ files:
|
|
|
282
290
|
- lib/ucode/audit/library_aggregator.rb
|
|
283
291
|
- lib/ucode/audit/library_auditor.rb
|
|
284
292
|
- lib/ucode/audit/plane_aggregator.rb
|
|
293
|
+
- lib/ucode/audit/reference_factory.rb
|
|
285
294
|
- lib/ucode/audit/registry.rb
|
|
286
295
|
- lib/ucode/audit/release.rb
|
|
287
296
|
- lib/ucode/audit/release/emitter.rb
|
|
@@ -294,6 +303,11 @@ files:
|
|
|
294
303
|
- lib/ucode/audit/universal_set_reference.rb
|
|
295
304
|
- lib/ucode/cache.rb
|
|
296
305
|
- lib/ucode/cli.rb
|
|
306
|
+
- lib/ucode/code_chart.rb
|
|
307
|
+
- lib/ucode/code_chart/extractor.rb
|
|
308
|
+
- lib/ucode/code_chart/provenance.rb
|
|
309
|
+
- lib/ucode/code_chart/sidecar.rb
|
|
310
|
+
- lib/ucode/code_chart/writer.rb
|
|
297
311
|
- lib/ucode/commands.rb
|
|
298
312
|
- lib/ucode/commands/audit.rb
|
|
299
313
|
- lib/ucode/commands/audit/browser_command.rb
|
|
@@ -301,7 +315,6 @@ files:
|
|
|
301
315
|
- lib/ucode/commands/audit/compare_command.rb
|
|
302
316
|
- lib/ucode/commands/audit/font_command.rb
|
|
303
317
|
- lib/ucode/commands/audit/library_command.rb
|
|
304
|
-
- lib/ucode/commands/audit/reference_builder.rb
|
|
305
318
|
- lib/ucode/commands/block_feed.rb
|
|
306
319
|
- lib/ucode/commands/build.rb
|
|
307
320
|
- lib/ucode/commands/cache.rb
|
|
@@ -357,6 +370,7 @@ files:
|
|
|
357
370
|
- lib/ucode/glyphs/pdf2svg_renderer.rb
|
|
358
371
|
- lib/ucode/glyphs/pdf_fetcher.rb
|
|
359
372
|
- lib/ucode/glyphs/pdftocairo_renderer.rb
|
|
373
|
+
- lib/ucode/glyphs/pipeline.rb
|
|
360
374
|
- lib/ucode/glyphs/real_fonts.rb
|
|
361
375
|
- lib/ucode/glyphs/real_fonts/block_coverage.rb
|
|
362
376
|
- lib/ucode/glyphs/real_fonts/cmap_cache.rb
|
|
@@ -499,6 +513,15 @@ files:
|
|
|
499
513
|
- lib/ucode/repo/build_validator.rb
|
|
500
514
|
- lib/ucode/repo/codepoint_writer.rb
|
|
501
515
|
- lib/ucode/repo/paths.rb
|
|
516
|
+
- lib/ucode/repo/writers.rb
|
|
517
|
+
- lib/ucode/repo/writers/blocks_writer.rb
|
|
518
|
+
- lib/ucode/repo/writers/enums_writer.rb
|
|
519
|
+
- lib/ucode/repo/writers/indexes_writer.rb
|
|
520
|
+
- lib/ucode/repo/writers/manifest_writer.rb
|
|
521
|
+
- lib/ucode/repo/writers/named_sequences_writer.rb
|
|
522
|
+
- lib/ucode/repo/writers/planes_writer.rb
|
|
523
|
+
- lib/ucode/repo/writers/relationships_writer.rb
|
|
524
|
+
- lib/ucode/repo/writers/scripts_writer.rb
|
|
502
525
|
- lib/ucode/site.rb
|
|
503
526
|
- lib/ucode/site/config_emitter.rb
|
|
504
527
|
- lib/ucode/site/generator.rb
|
|
@@ -517,6 +540,7 @@ files:
|
|
|
517
540
|
- lib/ucode/version.rb
|
|
518
541
|
- lib/ucode/version_resolver.rb
|
|
519
542
|
- schema/block-feed.output.schema.yml
|
|
543
|
+
- ucode.gemspec
|
|
520
544
|
homepage: https://github.com/fontist/ucode
|
|
521
545
|
licenses:
|
|
522
546
|
- BSD-2-Clause
|
|
@@ -525,6 +549,7 @@ metadata:
|
|
|
525
549
|
source_code_uri: https://github.com/fontist/ucode
|
|
526
550
|
changelog_uri: https://github.com/fontist/ucode/blob/main/CHANGELOG.md
|
|
527
551
|
rubygems_mfa_required: 'true'
|
|
552
|
+
post_install_message:
|
|
528
553
|
rdoc_options: []
|
|
529
554
|
require_paths:
|
|
530
555
|
- lib
|
|
@@ -539,7 +564,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
539
564
|
- !ruby/object:Gem::Version
|
|
540
565
|
version: '0'
|
|
541
566
|
requirements: []
|
|
542
|
-
rubygems_version: 3.
|
|
567
|
+
rubygems_version: 3.5.22
|
|
568
|
+
signing_key:
|
|
543
569
|
specification_version: 4
|
|
544
570
|
summary: Unicode Character Database toolkit — lookup, dataset, glyphs, site
|
|
545
571
|
test_files: []
|