isodoc-i18n 1.0.6 → 1.1.0

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: 40bf798e8180b8b3014f6822a1ac8e5336728231d1436dbfe74c49fd54326551
4
- data.tar.gz: d41acbc509af8a536d02fc3e4fd0511972b61e8730eb47d43d1520b0efd9e000
3
+ metadata.gz: 71a7b4e2dcb8b00587cc92988c85a99c411444fb8698f8bd067c92a4f90751e2
4
+ data.tar.gz: 6304cf921c57b555ff259b9c1dfad4d7306e726c7f56f08291e4959a188a6181
5
5
  SHA512:
6
- metadata.gz: 16aa8550bf43b723bd10576d86be8a371d7fe88cb4967ccd3a88f295f695a6fce19830b250ad587b6a968fee2f8bd4c11cfa37c34c6d49ff7a15ef4544426fe3
7
- data.tar.gz: 6e0ddd03856d58eed0655f1c978adaec56442eca6c378da15b81c21fd4177be1daf573d157f63da82d21364b7b10c59df726a0cf10cbfe2c87104e25a0e88adb
6
+ metadata.gz: 9de07fcd21fdfd8ba2ab4d758f76952cbfe84075caad216543cd0a6fa2bcf409fab8e71bc71309aa98ed50342727be9a46c5ffc2625c27f987ede80c65e29b18
7
+ data.tar.gz: fff4809002eef23c8d550baed4fb1185f134b99fb7a61733d3413045134b11b1e18eaab54a8787e0e4817601ff9051d67ffc1efc97cfaa589a73320188e70d98
@@ -10,6 +10,6 @@ on:
10
10
 
11
11
  jobs:
12
12
  rake:
13
- uses: metanorma/metanorma-build-scripts/.github/workflows/generic-rake.yml@main
13
+ uses: metanorma/ci/.github/workflows/generic-rake.yml@main
14
14
  secrets:
15
15
  pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -0,0 +1,24 @@
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
3
+ name: release
4
+
5
+ on:
6
+ workflow_dispatch:
7
+ inputs:
8
+ next_version:
9
+ description: |
10
+ Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
11
+ required: true
12
+ default: 'skip'
13
+ push:
14
+ tags: [ v* ]
15
+
16
+ jobs:
17
+ release:
18
+ uses: metanorma/ci/.github/workflows/rubygems-release.yml@main
19
+ with:
20
+ next_version: ${{ github.event.inputs.next_version }}
21
+ secrets:
22
+ rubygems-api-key: ${{ secrets.METANORMA_CI_RUBYGEMS_API_KEY }}
23
+ pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
24
+
data/isodoc-i18n.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
24
24
 
25
25
  spec.add_dependency "htmlentities", "~> 4.3.4"
26
- spec.add_dependency "metanorma-utils", "~> 1.3.0"
26
+ spec.add_dependency "metanorma-utils", "~> 1.4.0"
27
27
  spec.add_dependency "twitter_cldr"
28
28
 
29
29
  spec.add_development_dependency "debug"
data/lib/isodoc/i18n.rb CHANGED
@@ -54,9 +54,10 @@ module IsoDoc
54
54
  @labels[key] = val
55
55
  end
56
56
 
57
- def initialize(lang, script, i18nyaml: nil, i18nhash: nil)
57
+ def initialize(lang, script, locale: nil, i18nyaml: nil, i18nhash: nil)
58
58
  @lang = lang
59
59
  @script = script
60
+ @locale = locale
60
61
  y = load_yaml(lang, script, i18nyaml, i18nhash)
61
62
  @labels = y
62
63
  @labels["language"] = @lang
@@ -66,17 +67,16 @@ module IsoDoc
66
67
  end
67
68
  end
68
69
 
69
- def self.l10n(text, lang = @lang, script = @script)
70
- l10n(text, lang, script)
70
+ def self.l10n(text, lang = @lang, script = @script, locale = @locale)
71
+ l10n(text, lang, script, locale)
71
72
  end
72
73
 
73
- # TODO: move to localization file
74
74
  # function localising spaces and punctuation.
75
75
  # Not clear if period needs to be localised for zh
76
- def l10n(text, lang = @lang, script = @script)
77
- if lang == "zh" && script == "Hans" then l10n_zh(text)
78
- else bidiwrap(text, lang, script)
79
- end
76
+ def l10n(text, lang = @lang, script = @script, locale = @locale)
77
+ lang == "zh" && script == "Hans" and text = l10n_zh(text)
78
+ lang == "fr" && text = l10n_fr(text, locale || "FR")
79
+ bidiwrap(text, lang, script)
80
80
  end
81
81
 
82
82
  def bidiwrap(text, lang, script)
@@ -107,23 +107,51 @@ module IsoDoc
107
107
  xml.to_xml.gsub(/<b>/, "").gsub("</b>", "").gsub(/<\?[^>]+>/, "")
108
108
  end
109
109
 
110
+ def l10n_fr(text, locale)
111
+ xml = Nokogiri::HTML::DocumentFragment.parse(text)
112
+ xml.traverse do |n|
113
+ next unless n.text?
114
+
115
+ n.replace(cleanup_entities(l10n_fr1(n.text, locale), is_xml: false))
116
+ end
117
+ xml.to_xml
118
+ end
119
+
110
120
  ZH_CHAR = "\\p{Han}|\\p{In CJK Symbols And Punctuation}|"\
111
121
  "\\p{In Halfwidth And Fullwidth Forms}".freeze
112
122
 
113
123
  # note: we can't differentiate comma from enumeration comma 、
114
124
  def l10_zh1(text)
125
+ l10n_zh_remove_space(l10n_zh_punct(text))
126
+ end
127
+
128
+ def l10n_zh_punct(text)
115
129
  ["::", ",,", ".。", "))", "]】", "::", ";;", "??", "!!"].each do |m|
116
130
  text = text.gsub(/(?<=#{ZH_CHAR})#{Regexp.quote m[0]}/, m[1])
131
+ text = text.gsub(/^#{Regexp.quote m[0]}/, m[1])
117
132
  end
118
133
  ["((", "[【"].each do |m|
119
134
  text = text.gsub(/#{Regexp.quote m[0]}(?=#{ZH_CHAR})/, m[1])
120
135
  end
136
+ text
137
+ end
138
+
139
+ def l10n_zh_remove_space(text)
121
140
  text.gsub(/(?<=#{ZH_CHAR}) (?=#{ZH_CHAR})/o, "")
122
141
  .gsub(/(?<=\d) (?=#{ZH_CHAR})/o, "")
123
142
  .gsub(/(?<=#{ZH_CHAR}) (?=\d)/o, "")
124
143
  .gsub(/(?<=#{ZH_CHAR}) (?=[A-Za-z](#{ZH_CHAR}|$))/o, "")
125
144
  end
126
145
 
146
+ def l10n_fr1(text, locale)
147
+ text = text.gsub(/(?<=\p{Alnum})([»›;?!])/, "\u202f\\1")
148
+ text = text.gsub(/^([»›;?!])/, "\u202f\\1")
149
+ text = text.gsub(/([«‹])/, "\\1\u202f")
150
+ colonsp = locale == "CH" ? "\u202f" : "\u00a0"
151
+ text = text.gsub(/(?<=\p{Alnum})(:)/, "#{colonsp}\\1")
152
+ text.gsub(/^(:)/, "#{colonsp}\\1")
153
+ end
154
+
127
155
  def boolean_conj(list, conn)
128
156
  case list.size
129
157
  when 0 then ""
@@ -1,5 +1,5 @@
1
1
  module IsoDoc
2
2
  class I18n
3
- VERSION = "1.0.6".freeze
3
+ VERSION = "1.1.0".freeze
4
4
  end
5
5
  end
@@ -38,7 +38,8 @@ RSpec.describe IsoDoc::I18n do
38
38
  end
39
39
 
40
40
  it "loads language hash overrides" do
41
- c = IsoDoc::I18n.new("en", "Latn", i18nhash: YAML.load_file("spec/assets/new.yaml"))
41
+ c = IsoDoc::I18n.new("en", "Latn",
42
+ i18nhash: YAML.load_file("spec/assets/new.yaml"))
42
43
  expect(c.text).to eq "text2"
43
44
  expect(c.at).to eq "at"
44
45
  expect(c.hash.to_s).to be_equivalent_to '{"key1"=>"val1", "key2"=>"val2"}'
@@ -85,6 +86,25 @@ RSpec.describe IsoDoc::I18n do
85
86
  .to be_equivalent_to "&#x61c;Code (hello, world.)&#x61c;"
86
87
  end
87
88
 
89
+ it "does French localisation" do
90
+ e = HTMLEntities.new
91
+ c = IsoDoc::I18n.new("fr", "Latn")
92
+ expect(e.encode(c.l10n("Code; «code» and: code!"), :hexadecimal))
93
+ .to be_equivalent_to "Code&#x202f;; &#xab;&#x202f;code&#x202f;&#xbb; "\
94
+ "and&#xa0;: code&#x202f;!"
95
+ expect(e.encode(c.l10n("Code; &#xab;code&#xbb; and: code!"), :hexadecimal))
96
+ .to be_equivalent_to "Code&#x202f;; &#xab;&#x202f;code&#x202f;&#xbb; "\
97
+ "and&#xa0;: code&#x202f;!"
98
+ c = IsoDoc::I18n.new("fr", "Latn", locale: "FR")
99
+ expect(e.encode(c.l10n("Code; «code» and: code!"), :hexadecimal))
100
+ .to be_equivalent_to "Code&#x202f;; &#xab;&#x202f;code&#x202f;&#xbb; "\
101
+ "and&#xa0;: code&#x202f;!"
102
+ c = IsoDoc::I18n.new("fr", "Latn", locale: "CH")
103
+ expect(e.encode(c.l10n("Code; «code» and: code!"), :hexadecimal))
104
+ .to be_equivalent_to "Code&#x202f;; &#xab;&#x202f;code&#x202f;&#xbb; "\
105
+ "and&#x202f;: code&#x202f;!"
106
+ end
107
+
88
108
  it "does boolean conjunctions" do
89
109
  c = IsoDoc::I18n.new("en", "Latn")
90
110
  expect(c.boolean_conj([], "and")).to eq ""
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc-i18n
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-16 00:00:00.000000000 Z
11
+ date: 2022-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.3.0
33
+ version: 1.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.3.0
40
+ version: 1.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: twitter_cldr
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -202,6 +202,7 @@ extensions: []
202
202
  extra_rdoc_files: []
203
203
  files:
204
204
  - ".github/workflows/rake.yml"
205
+ - ".github/workflows/release.yml"
205
206
  - ".hound.yml"
206
207
  - ".rubocop.yml"
207
208
  - CODE_OF_CONDUCT.md
@@ -224,7 +225,7 @@ homepage: https://github.com/metanorma/isodoc-i18n
224
225
  licenses:
225
226
  - BSD-2-Clause
226
227
  metadata: {}
227
- post_install_message:
228
+ post_install_message:
228
229
  rdoc_options: []
229
230
  require_paths:
230
231
  - lib
@@ -239,8 +240,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
240
  - !ruby/object:Gem::Version
240
241
  version: '0'
241
242
  requirements: []
242
- rubygems_version: 3.3.16
243
- signing_key:
243
+ rubygems_version: 3.1.6
244
+ signing_key:
244
245
  specification_version: 4
245
246
  summary: isodoc-i18n
246
247
  test_files: []