isodoc-i18n 1.1.2 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db66af34abba937daa72bbef574be08220618ca75b104c5b1e6275736494e781
4
- data.tar.gz: b94275b875363991d526ea1a83ec3be97bdc93dcd0db16681cee8ba0197a8577
3
+ metadata.gz: 2995acc039a84f2046a7dd94885f6645db44c003e13e3c2d03acc080df6ccf46
4
+ data.tar.gz: 10aaebe352a542028a9e6bf1d69b3e6d1309416a0fc4329aa34053a520bdc982
5
5
  SHA512:
6
- metadata.gz: 16e56e238e36071225875002eeb86959c23ddcf2ae874fa7db18e6893978e4d7105b88964867f8cd331718c975bdea5175845533e6ad045b621b035bff34a3c7
7
- data.tar.gz: 87da9b7308403c25d52f8008177cb0ef62da042df0d58d8f26864678de53b84a925465dd36b9b40e1a106ca8a8406411d515567f1316903d54643cbbc89dc339
6
+ metadata.gz: f9aa2d2786ef223580b0cd832dd08d9821e06553975a369abda5e03b947cff9c5d44ad20ace189937e3707c536ffa99b5090b8cdc8ccf6cbf1dfc429ed0df623
7
+ data.tar.gz: bd0b5bc0c703ae8ffeeeea6d8df3df34d004bc478b4e8e0ec61c450da83b7c1571954e538bd43a3e7af320035496baa96a27e3d6f564dc7ea5afa58c3244638a
data/isodoc-i18n.gemspec CHANGED
@@ -1,6 +1,4 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "isodoc/version"
1
+ require_relative "lib/isodoc/i18n/version"
4
2
 
5
3
  Gem::Specification.new do |spec|
6
4
  spec.name = "isodoc-i18n"
@@ -18,9 +16,11 @@ Gem::Specification.new do |spec|
18
16
 
19
17
  spec.bindir = "bin"
20
18
  spec.require_paths = ["lib"]
21
- spec.files = `git ls-files`.split("\n")
22
- spec.test_files = `git ls-files -- {spec}/*`.split("\n")
23
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features|bin|.github)/}) \
21
+ || f.match(%r{Rakefile|bin/rspec})
22
+ end
23
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
24
24
 
25
25
  spec.add_dependency "htmlentities", "~> 4.3.4"
26
26
  spec.add_dependency "metanorma-utils", "~> 1.4.0"
@@ -36,5 +36,5 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency "simplecov", "~> 0.15"
37
37
  spec.add_development_dependency "timecop", "~> 0.9"
38
38
  spec.add_development_dependency "webmock"
39
- #spec.metadata["rubygems_mfa_required"] = "true"
39
+ # spec.metadata["rubygems_mfa_required"] = "true"
40
40
  end
@@ -1,5 +1,5 @@
1
1
  module IsoDoc
2
2
  class I18n
3
- VERSION = "1.1.2".freeze
3
+ VERSION = "1.1.4".freeze
4
4
  end
5
5
  end
data/lib/isodoc/i18n.rb CHANGED
@@ -2,13 +2,17 @@ require "yaml"
2
2
  require "htmlentities"
3
3
  require "metanorma-utils"
4
4
  require "twitter_cldr"
5
+ require_relative "i18n/version"
5
6
 
6
7
  module IsoDoc
7
8
  class I18n
9
+ Hash.include Metanorma::Utils::Hash
10
+
8
11
  def load_yaml(lang, script, i18nyaml = nil, i18nhash = nil)
9
12
  ret = load_yaml1(lang, script)
10
- return normalise_hash(ret.merge(YAML.load_file(i18nyaml))) if i18nyaml
11
- return normalise_hash(ret.merge(i18nhash)) if i18nhash
13
+ i18nyaml and
14
+ return normalise_hash(ret.deep_merge(YAML.load_file(i18nyaml)))
15
+ i18nhash and return normalise_hash(ret.deep_merge(i18nhash))
12
16
 
13
17
  normalise_hash(ret)
14
18
  end
@@ -118,7 +122,7 @@ module IsoDoc
118
122
  xml.to_xml(encoding: "UTF-8")
119
123
  end
120
124
 
121
- ZH_CHAR = "\\p{Han}|\\p{In CJK Symbols And Punctuation}|"\
125
+ ZH_CHAR = "\\p{Han}|\\p{In CJK Symbols And Punctuation}|" \
122
126
  "\\p{In Halfwidth And Fullwidth Forms}".freeze
123
127
 
124
128
  # note: we can't differentiate comma from enumeration comma 、
@@ -196,13 +200,21 @@ module IsoDoc
196
200
  num.localize(:en)
197
201
  end
198
202
 
203
+ INFLECTIONS = {
204
+ number: "sg",
205
+ case: "nom",
206
+ gender: "masc",
207
+ person: "3rd",
208
+ voice: "act",
209
+ mood: "ind",
210
+ tense: "pres",
211
+ }.freeze
212
+
213
+ INFLECTION_ORDER = %i(voice mood tense number case gender person).freeze
214
+
199
215
  def ordinal_key(term)
200
216
  @labels["ordinal_keys"].each_with_object([]) do |k, m|
201
- m << case k
202
- when "gender" then term["gender"]
203
- when "number" then term["number"] || "sg"
204
- when "case" then term["case"] || "nom"
205
- end
217
+ m << (term[k] || INFLECTIONS[k.to_sym])
206
218
  end.join(".")
207
219
  end
208
220
 
@@ -212,5 +224,18 @@ module IsoDoc
212
224
  else @lang.to_sym
213
225
  end
214
226
  end
227
+
228
+ # can skip category if not present
229
+ def inflect(word, options)
230
+ i = @labels.dig("inflection", word) or return word
231
+ i.is_a? String and return i
232
+
233
+ INFLECTION_ORDER.each do |x|
234
+ infl = options[x] || INFLECTIONS[x]
235
+ i = i[infl] if i[infl]
236
+ i.is_a? String and return i
237
+ end
238
+ word
239
+ end
215
240
  end
216
241
  end
data/lib/isodoc-i18n.rb CHANGED
@@ -1,5 +1 @@
1
- require_relative "isodoc/version"
2
1
  require_relative "isodoc/i18n"
3
-
4
- module IsoDoc
5
- end
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.1.2
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-27 00:00:00.000000000 Z
11
+ date: 2022-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities
@@ -201,26 +201,17 @@ executables: []
201
201
  extensions: []
202
202
  extra_rdoc_files: []
203
203
  files:
204
- - ".github/workflows/rake.yml"
205
- - ".github/workflows/release.yml"
206
204
  - ".hound.yml"
207
205
  - ".rubocop.yml"
208
206
  - CODE_OF_CONDUCT.md
209
207
  - Gemfile
210
208
  - LICENSE
211
209
  - README.adoc
212
- - Rakefile
213
- - bin/rspec
214
210
  - isodoc-i18n.gemspec
215
211
  - lib/isodoc-i18n.rb
216
212
  - lib/isodoc-yaml/i18n-en.yaml
217
213
  - lib/isodoc/i18n.rb
218
- - lib/isodoc/version.rb
219
- - spec/assets/de.yaml
220
- - spec/assets/new.yaml
221
- - spec/assets/zh-Hans.yaml
222
- - spec/isodoc/base_spec.rb
223
- - spec/spec_helper.rb
214
+ - lib/isodoc/i18n/version.rb
224
215
  homepage: https://github.com/metanorma/isodoc-i18n
225
216
  licenses:
226
217
  - BSD-2-Clause
@@ -233,14 +224,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
233
224
  requirements:
234
225
  - - ">="
235
226
  - !ruby/object:Gem::Version
236
- version: 2.5.0
227
+ version: 2.7.0
237
228
  required_rubygems_version: !ruby/object:Gem::Requirement
238
229
  requirements:
239
230
  - - ">="
240
231
  - !ruby/object:Gem::Version
241
232
  version: '0'
242
233
  requirements: []
243
- rubygems_version: 3.1.6
234
+ rubygems_version: 3.3.7
244
235
  signing_key:
245
236
  specification_version: 4
246
237
  summary: isodoc-i18n
@@ -1,15 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- name: rake
4
-
5
- on:
6
- push:
7
- branches: [ master, main ]
8
- tags: [ v* ]
9
- pull_request:
10
-
11
- jobs:
12
- rake:
13
- uses: metanorma/ci/.github/workflows/generic-rake.yml@main
14
- secrets:
15
- pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -1,24 +0,0 @@
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/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task default: :spec
data/bin/rspec DELETED
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # This file was generated by Bundler.
4
- #
5
- # The application 'rspec' is installed as part of a gem, and
6
- # this file is here to facilitate running it.
7
- #
8
-
9
- require "pathname"
10
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
11
- "../../Gemfile", Pathname.new(__FILE__).realpath
12
- )
13
-
14
- require "rubygems"
15
- require "bundler/setup"
16
-
17
- load Gem.bin_path("rspec-core", "rspec")
data/spec/assets/de.yaml DELETED
@@ -1,12 +0,0 @@
1
- ordinal_keys: [gender,number]
2
- SpelloutRules:
3
- m.sg: spellout-ordinal-r
4
- f.sg: spellout-ordinal
5
- n.sg: spellout-ordinal-s
6
- m.pl: spellout-ordinal
7
- f.pl: spellout-ordinal
8
- n.pl: spellout-ordinal
9
- edition: Auflage
10
- inflection:
11
- Auflage:
12
- gender: f
data/spec/assets/new.yaml DELETED
@@ -1,7 +0,0 @@
1
- hash:
2
- key1: val1
3
- key2: val2
4
- arr:
5
- - arr1
6
- - arr2
7
- text: "&#x74;ext2"
@@ -1,7 +0,0 @@
1
- ordinal_keys: []
2
- SpelloutRules: spellout-ordinal
3
- edition: Auflage
4
- inflection:
5
- Auflage:
6
- gender: f
7
-
@@ -1,139 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe IsoDoc::I18n do
4
- it "has a version number" do
5
- expect(IsoDoc::I18n::VERSION).not_to be nil
6
- end
7
-
8
- it "loads language files" do
9
- c = IsoDoc::I18n.new("en", "Latn")
10
- expect(c.text).to eq "text"
11
- expect(c.at).to eq "at"
12
- expect(c.language).to eq "en"
13
- expect(c.script).to eq "Latn"
14
- end
15
-
16
- it "manipulates i18n class" do
17
- c = IsoDoc::I18n.new("en", "Latn")
18
- expect(c.get["text"]).to eq "text"
19
- expect(c.get["fred"]).to be_nil
20
- c.set("fred", "frederic")
21
- expect(c.get["fred"]).to eq "frederic"
22
- end
23
-
24
- it "loads default for missing language files" do
25
- c = IsoDoc::I18n.new("tlh", "Klin")
26
- expect(c.text).to eq "text"
27
- expect(c.at).to eq "at"
28
- expect(c.language).to eq "tlh"
29
- expect(c.script).to eq "Klin"
30
- end
31
-
32
- it "loads language file overrides" do
33
- c = IsoDoc::I18n.new("en", "Latn", i18nyaml: "spec/assets/new.yaml")
34
- expect(c.text).to eq "text2"
35
- expect(c.at).to eq "at"
36
- expect(c.hash.to_s).to be_equivalent_to '{"key1"=>"val1", "key2"=>"val2"}'
37
- expect(c.arr.to_s).to eq '["arr1", "arr2"]'
38
- end
39
-
40
- it "loads language hash overrides" do
41
- c = IsoDoc::I18n.new("en", "Latn",
42
- i18nhash: YAML.load_file("spec/assets/new.yaml"))
43
- expect(c.text).to eq "text2"
44
- expect(c.at).to eq "at"
45
- expect(c.hash.to_s).to be_equivalent_to '{"key1"=>"val1", "key2"=>"val2"}'
46
- expect(c.arr.to_s).to eq '["arr1", "arr2"]'
47
- end
48
-
49
- it "does English localisation" do
50
- c = IsoDoc::I18n.new("en", "Latn")
51
- expect(c.l10n("Code (hello, world.)"))
52
- .to be_equivalent_to "Code (hello, world.)"
53
- expect(c.l10n("<a>Code (he<b>l</b>lo, world.)</a>"))
54
- .to be_equivalent_to "<a>Code (he<b>l</b>lo, world.)</a>"
55
- end
56
-
57
- it "does Chinese localisation" do
58
- c = IsoDoc::I18n.new("zh", "Hans")
59
- expect(c.l10n("Code (hello, world.)"))
60
- .to be_equivalent_to "Code (hello, world.)"
61
- expect(c.l10n("计算机代码 (你好, 世界.)"))
62
- .to be_equivalent_to " 计算机代码(你好,世界。)"
63
- expect(c.l10n("<a>计算机代码</a> (<b>你好,</b> 世界.)"))
64
- .to be_equivalent_to "<a>计算机代码</a> (你好, 世界。)"
65
- end
66
-
67
- it "does Hebrew RTL localisation" do
68
- c = IsoDoc::I18n.new("en", "Hebr")
69
- expect(c.l10n("Code (hello, world.)"))
70
- .to be_equivalent_to "Code (hello, world.)"
71
- expect(c.l10n("Code (hello, world.)", "en", "Latn"))
72
- .to be_equivalent_to "&#x200e;Code (hello, world.)&#x200e;"
73
- c = IsoDoc::I18n.new("en", "Latn")
74
- expect(c.l10n("Code (hello, world.)", "en", "Hebr"))
75
- .to be_equivalent_to "&#x200f;Code (hello, world.)&#x200f;"
76
- end
77
-
78
- it "does Arabic RTL localisation" do
79
- c = IsoDoc::I18n.new("en", "Arab")
80
- expect(c.l10n("Code (hello, world.)"))
81
- .to be_equivalent_to "Code (hello, world.)"
82
- expect(c.l10n("Code (hello, world.)", "en", "Latn"))
83
- .to be_equivalent_to "&#x200e;Code (hello, world.)&#x200e;"
84
- c = IsoDoc::I18n.new("en", "Latn")
85
- expect(c.l10n("Code (hello, world.)", "en", "Arab"))
86
- .to be_equivalent_to "&#x61c;Code (hello, world.)&#x61c;"
87
- end
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
- expect(e.encode(c.l10n("http://xyz a;b"), :hexadecimal))
107
- .to be_equivalent_to "http://xyz a;b"
108
- end
109
-
110
- it "does boolean conjunctions" do
111
- c = IsoDoc::I18n.new("en", "Latn")
112
- expect(c.boolean_conj([], "and")).to eq ""
113
- expect(c.boolean_conj(%w(a), "and")).to eq "a"
114
- expect(c.boolean_conj(%w(a b), "and")).to eq "a and b"
115
- expect(c.boolean_conj(%w(a b c), "and")).to eq "a, b, and c"
116
- expect(c.boolean_conj(%w(a b c d), "and")).to eq "a, b, c, and d"
117
- end
118
-
119
- it "does German ordinals" do
120
- c = IsoDoc::I18n.new("de", "Latn", i18nyaml: "spec/assets/de.yaml")
121
- term = c.inflection[c.edition]
122
- expect(c.inflect_ordinal(5, term, "SpelloutRules"))
123
- .to eq "fünfte"
124
- end
125
-
126
- it "does Chinese ordinals" do
127
- c = IsoDoc::I18n.new("zh", "Hans", i18nyaml: "spec/assets/zh-Hans.yaml")
128
- term = c.inflection[c.edition]
129
- expect(c.inflect_ordinal(5, term, "SpelloutRules"))
130
- .to eq "第五"
131
- end
132
-
133
- it "does Klingon ordinals" do
134
- c = IsoDoc::I18n.new("tlh", "Hans", i18nyaml: "spec/assets/zh-Hans.yaml")
135
- term = c.inflection[c.edition]
136
- expect(c.inflect_ordinal(5, term, "SpelloutRules"))
137
- .to eq "fifth"
138
- end
139
- end
data/spec/spec_helper.rb DELETED
@@ -1,36 +0,0 @@
1
- require "simplecov"
2
- SimpleCov.start do
3
- add_filter "/spec/"
4
- end
5
-
6
- require "bundler/setup"
7
- require "isodoc-i18n"
8
- require "rspec/matchers"
9
- require "equivalent-xml"
10
- require "rexml/document"
11
-
12
- RSpec.configure do |config|
13
- # Enable flags like --only-failures and --next-failure
14
- config.example_status_persistence_file_path = ".rspec_status"
15
-
16
- # Disable RSpec exposing methods globally on `Module` and `main`
17
- config.disable_monkey_patching!
18
-
19
- config.expect_with :rspec do |c|
20
- c.syntax = :expect
21
- end
22
- end
23
-
24
- def xmlpp(xml)
25
- s = ""
26
- f = REXML::Formatters::Pretty.new(2)
27
- f.compact = true
28
- f.write(REXML::Document.new(xml), s)
29
- s
30
- end
31
-
32
- def metadata(hash)
33
- hash.sort.to_h.delete_if do |_k, v|
34
- v.nil? || (v.respond_to?(:empty?) && v.empty?)
35
- end
36
- end