pubid-core 1.15.8 → 1.15.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5c31d4deef63e50446985a9cb117bbadfa57e80fc26c32a3350ab48da0c28cf
4
- data.tar.gz: c65ab12c6d8536dd373e6081ecd726b064a79df590cf585731f15dc4f1a88af8
3
+ metadata.gz: 9ee18d5ea661ba3c87383873d963bb0ec1c90fa682dfbf324f1af363a15c6a5f
4
+ data.tar.gz: 922cfb88f6e81323c9f8be88a8e7bf09e96ac438de16ffb50aa80f39106d89b0
5
5
  SHA512:
6
- metadata.gz: 89290bcf1072622aabe37cd9921e7bde25957b69b3f17c7dd460063887962f6d759d5a5e7d3b580eafd776f3999c4b7728c42a11b72ee47cb8af0333cfdbe755
7
- data.tar.gz: 35cd0cb46c87e39c1c0d4a01c85c83ab36850607de001d92ff9fc16d52fe54eccd8f1b8ee32d1e7db1ba6df96a539697a05b739bb5f2cde03c0e530ff2631f30
6
+ metadata.gz: 3d5ea2932415a5f336f7e29dcd3199ee6e7b8593a0d87f11685be119131989683af38e07e39a49e2d9199320bb583d245b3f59102c27901c1faa119c0bcea21d
7
+ data.tar.gz: 4ac1d13c7b2ff1422352b57f692b77f4bb061727381f02b69bfeb2a479fb85b016183a2dc379488da96e9a082e6da9f09a9b14a76fb18a827933571226de4bbb
data/README.adoc CHANGED
@@ -29,6 +29,26 @@ pubid.to_h
29
29
  => { publisher: "ISO", number: 1, year: 1999 }
30
30
  ----
31
31
 
32
+ === Annotated rendering
33
+
34
+ Use `to_s(annotated: true)` to produce HTML output where each semantic component
35
+ is wrapped in a `<span>` tag with a CSS class. This is useful for styling
36
+ individual parts of an identifier in web UIs.
37
+
38
+ [source,ruby]
39
+ ----
40
+ pubid = Identifier.parse("ISO 1234-1:2013")
41
+ pubid.to_s(annotated: true)
42
+ => '<span class="publisher">ISO</span> <span class="docnumber">1234</span>-<span class="part">1</span>:<span class="year">2013</span>'
43
+ ----
44
+
45
+ Available CSS classes: `publisher`, `docnumber`, `part`, `year`, `edition`,
46
+ `amendment`, `corrigendum`, `language`, `doctype`, `stage`, `iteration`,
47
+ `addendum`.
48
+
49
+ The `annotated:` option can be combined with other `to_s` options such as
50
+ `format:` and `lang:`.
51
+
32
52
  === Using #new_edition_of? to compare identifiers
33
53
 
34
54
  [source,ruby]
@@ -103,8 +103,9 @@ module Pubid::Core
103
103
  end
104
104
 
105
105
  # Render identifier using default renderer
106
- def to_s
107
- self.class.get_renderer_class.new(to_h(deep: false)).render
106
+ # @param annotated [Boolean] wrap semantic components in <span> tags
107
+ def to_s(annotated: false)
108
+ self.class.get_renderer_class.new(to_h(deep: false)).render(annotated: annotated)
108
109
  end
109
110
 
110
111
  def exclude(*args)
@@ -1,3 +1,5 @@
1
+ require "set"
2
+
1
3
  module Pubid::Core::Renderer
2
4
  class Base
3
5
  attr_accessor :params
@@ -10,10 +12,58 @@ module Pubid::Core::Renderer
10
12
  "es" => "S",
11
13
  }.freeze
12
14
 
15
+ SEMANTIC_CLASSES = {
16
+ publisher: "publisher",
17
+ number: "docnumber",
18
+ part: "part",
19
+ year: "year",
20
+ edition: "edition",
21
+ amendments: "amendment",
22
+ corrigendums: "corrigendum",
23
+ language: "language",
24
+ typed_stage: "doctype",
25
+ stage: "stage",
26
+ iteration: "iteration",
27
+ addendum: "addendum",
28
+ }.freeze
29
+
30
+ SEPARATOR_CHARS = Set.new(["-", ":", "/", " ", ",", "."]).freeze
31
+
13
32
  def initialize(params)
14
33
  @params = params
15
34
  end
16
35
 
36
+ # Wraps rendered value in a <span> tag with a semantic CSS class.
37
+ # Leading/trailing separator characters are preserved outside the span.
38
+ # @param key [Symbol] parameter key (e.g. :publisher, :number)
39
+ # @param rendered_value [String] the rendered string value
40
+ # @return [String] annotated or original value
41
+ def annotate_value(key, rendered_value)
42
+ css_class = SEMANTIC_CLASSES[key]
43
+ return rendered_value if css_class.nil?
44
+
45
+ str = rendered_value.to_s
46
+ return str if str.empty?
47
+
48
+ # Extract leading separators
49
+ leading = ""
50
+ while !str.empty? && SEPARATOR_CHARS.include?(str[0])
51
+ leading << str[0]
52
+ str = str[1..]
53
+ end
54
+
55
+ # Extract trailing separators
56
+ trailing = ""
57
+ while !str.empty? && SEPARATOR_CHARS.include?(str[-1])
58
+ trailing = str[-1] + trailing
59
+ str = str[0..-2]
60
+ end
61
+
62
+ return rendered_value if str.empty?
63
+
64
+ "#{leading}<span class=\"#{css_class}\">#{str}</span>#{trailing}"
65
+ end
66
+
17
67
  # Prerender parameters and store in @prerendered_params
18
68
  # @param opts [Hash] options for render method, eg. { with_language_code: :single, with_date: true }
19
69
  # @return [Renderer::Base] self
@@ -33,11 +83,13 @@ module Pubid::Core::Renderer
33
83
  def prerender_params(params, opts)
34
84
  params.map do |key, value|
35
85
  next unless value
36
- if respond_to?("render_#{key}")
37
- [key, send("render_#{key}", value, opts, params)]
38
- else
39
- [key, value]
40
- end
86
+ rendered = if respond_to?("render_#{key}")
87
+ send("render_#{key}", value, opts, params)
88
+ else
89
+ value
90
+ end
91
+ rendered = annotate_value(key, rendered) if opts[:annotated] && rendered
92
+ [key, rendered]
41
93
  end.compact.to_h
42
94
  end
43
95
 
@@ -78,8 +130,8 @@ module Pubid::Core::Renderer
78
130
  # Render identifier
79
131
  # @param with_date [Boolean] include year in output
80
132
  # @param with_language_code [:iso,:single] render document language as 2-letter ISO 639-1 language code or single code
81
- def render(with_date: true, with_language_code: :iso, **args)
82
- render_base_identifier(**args.merge({ with_date: with_date, with_language_code: with_language_code})) + @prerendered_params[:language].to_s
133
+ def render(with_date: true, with_language_code: :iso, annotated: false, **args)
134
+ render_base_identifier(**args.merge({ with_date: with_date, with_language_code: with_language_code, annotated: annotated})) + @prerendered_params[:language].to_s
83
135
  end
84
136
 
85
137
  def render_identifier(params)
@@ -1,5 +1,5 @@
1
1
  module Pubid
2
2
  module Core
3
- VERSION = "1.15.8".freeze
3
+ VERSION = "1.15.9".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubid-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.8
4
+ version: 1.15.9
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-03-19 00:00:00.000000000 Z
11
+ date: 2026-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet