metanorma-plugin-glossarist 0.1.8 → 0.2.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: 12c432cfc7a1397fe5a88e961db51aa103712a0a81bc1eca871e073774c60fbe
4
- data.tar.gz: a8d24f1c847b536dae718dc96ba559a8f5e83f8213c6a9490b3f173a3b88e881
3
+ metadata.gz: a817c5969de17ce761956773dce8a9aeb2dee7e2c1bde5f3970783438dd008a1
4
+ data.tar.gz: 2cbc4ca6b683be306731443ab4ca1d8930b97a2bad8a1c0588d8c12d54b27d80
5
5
  SHA512:
6
- metadata.gz: 7acd13849a68c375d9113a8a93dc4abe55df7d6c9a72f3aeb1fbd10f0b3c8e746c2f06f203fe85718f6e5306132211fac8fea044fe346350e9abd6914958ce4e
7
- data.tar.gz: 4dd925541b2181f9301b838eb1c4b5c2a52b7e7e458334b25956c18ee1511b10d4c18f0b58680e6ab8087323978851d8f3ed2afee7241fc089fb38e22ae62abd
6
+ metadata.gz: 5f37a8fd2db74f26be2868893eeac5ad65f5014e15f7748ff21975747c864f5d52d14a66bd1263d3be1a608a6032564b2db2a13045222a642a1308a7ad7d5637
7
+ data.tar.gz: c9b4b823a8e9ba4167d37b7f4d8a4d3c51c27af9cb5d411b35d3690dce50206ef1b682ccbe7bd0cb03fed06a1d977252cb3bc24222ccd570a909196f64c015a5
data/Gemfile CHANGED
@@ -1,4 +1,9 @@
1
+ Encoding.default_external = Encoding::UTF_8
2
+ Encoding.default_internal = Encoding::UTF_8
3
+
1
4
  source "https://rubygems.org"
5
+ git_source(:github) { |repo| "https://github.com/#{repo}" }
2
6
 
3
- # Specify your gem's dependencies in metanorma-plugin-glossarist.gemspec
4
7
  gemspec
8
+
9
+ eval_gemfile("Gemfile.devel") rescue nil
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Metanorma::Plugin::Glossarist
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/metanorma/plugin/glossarist`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Metanorma plugin that allows you to access data from the glossarist dataset inside a Metanorma document.
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,271 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ In order to use the macros in Metanorma, add the gem gem `metanorma-plugin-glossarist` in your Gemfile.
24
+
25
+ ## Available Macros
26
+
27
+ Currently, there are 6 macros available for this plugin and all of them support all [Liquid syntax expressions](https://shopify.github.io/liquid/basics/introduction/), including:
28
+
29
+ - Loading Dataset
30
+ - `:glossarist-dataset: <dataset name>:<dataset path>`
31
+ - `[glossarist,<dataset path>, [filters], <dataset name>]`
32
+ - Rendering a single term from loaded dataset `glossarist::render[<dataset name>, <term>]`
33
+ - Rendering all terms from loaded dataset `glossarist::import[<dataset name>]`
34
+ - Rendering bibliography for a single term in the dataset `glossarist::render_bibliography_entry[<dataset name>, <term>]`
35
+ - Rendering bibliography for all terms in the dataset`glossarist::render_bibliography[<dataset name>]`
36
+
37
+ ### Loading Dataset
38
+
39
+ There are 2 ways of loading a dataset
40
+ 1. Global syntax `:glossarist-dataset: <dataset name>:<dataset path>`
41
+ 2. Block syntax `[glossarist,<dataset path>, [filters], <dataset name>]`
42
+
43
+ ### Global syntax `:glossarist-dataset: <dataset name>:<dataset path>`
44
+
45
+ This will load the glossarist data from `<dataset path>` into `<dataset name>` which can be used anywhere in the document after this line.
46
+
47
+ #### Example
48
+
49
+ Suppose we have a term named `foobar` in our dataset with the definition `The term foobar is used as metasyntactic variables and placeholder names in computer programming`
50
+
51
+ ```adoc
52
+ :glossarist-dataset: dataset:./path/to/glossarist-dataset
53
+
54
+ === Section 1
55
+ {{ dataset['foobar']['eng'].definition[0].content }}
56
+ ```
57
+
58
+ this will output
59
+
60
+ ```adoc
61
+ === Section 1
62
+ The term foobar is used as metasyntactic variables and placeholder names in computer programming
63
+ ```
64
+
65
+ ### Block syntax`[glossarist,<dataset path>, [filters], <dataset name>]`
66
+
67
+ This will load the glossarist data from `<dataset path>` into `<dataset name>` which can be used in the given block. Filters are optional and can be used to filter and/or sort the loaded concepts from the glossarist dataset multiple filters can be added by separating them with a semicolon `;`. Filter can be added by adding `filter='<filters to apply>;<another filter>'`
68
+
69
+ Available filters are:
70
+ - `sort_by:<field name>`: will sort the dataset in ascending order of the given field values e.g `sort_by:term` will sort concepts in ascending order based on the term.
71
+ - `<field name>:<values>`: will only load a concept if the value of the given field name is equal to the given value e.g `group=foo` will only load a concept if it has a group named `foo` or `lang=ara` will only load Arabic translations for all concepts.
72
+
73
+ #### Example
74
+
75
+ Suppose we have the following terms in our dataset
76
+
77
+ | Name | Definition | Groups |
78
+ | ----- | ----- | ----- |
79
+ | foo | The term foo is used as metasyntactic variables and placeholder names in computer programming | foo |
80
+ | bar | The term bar is used as metasyntactic variables and placeholder names in computer programming | foo, bar |
81
+ | baz | The term baz is used as metasyntactic variables and placeholder names in computer programming | baz |
82
+
83
+ ```adoc
84
+ === Definitions
85
+ [glossarist, /path/to/glossarist-dataset, dataset]
86
+ ----
87
+ {%- for concept in dataset -%}
88
+ ==== {{ concept.term }}
89
+
90
+ {{ concept.eng.definition[0].content }}
91
+ {%- endfor -%}
92
+ ----
93
+ ```
94
+
95
+ this will output
96
+
97
+ ```adoc
98
+ === Section 1
99
+
100
+ ==== foo
101
+
102
+ The term foo is used as metasyntactic variables and placeholder names in computer programming
103
+
104
+ ==== bar
105
+
106
+ The term bar is used as metasyntactic variables and placeholder names in computer programming
107
+
108
+ ==== baz
109
+
110
+ The term baz is used as metasyntactic variables and placeholder names in computer programming
111
+ ```
112
+
113
+ Applying sorting and filtering by group
114
+
115
+ ```adoc
116
+ === Definitions
117
+ [glossarist, /path/to/glossarist-dataset, filter='group=foo;sort_by=term', dataset]
118
+ ----
119
+ {%- for concept in dataset -%}
120
+ ==== {{ concept.term }}
121
+
122
+ {{ concept.eng.definition[0].content }}
123
+ {%- endfor -%}
124
+ ----
125
+ ```
126
+
127
+ this will output
128
+
129
+ ```adoc
130
+ === Section 1
131
+
132
+ ==== bar
133
+
134
+ The term bar is used as metasyntactic variables and placeholder names in computer programming
135
+
136
+ ==== foo
137
+
138
+ The term foo is used as metasyntactic variables and placeholder names in computer programming
139
+ ```
140
+
141
+ ### Rendering a single term from loaded dataset
142
+
143
+ This can be used to render a single concept from the loaded dataset. See [Loading Dataset](#loading-dataset) to load a dataset.
144
+ This will use the [default template for rendering concepts](#default-template-for-rendering-concepts)
145
+
146
+ #### Syntax
147
+
148
+ `glossarist::render[<dataset name>, <term>]`
149
+
150
+ #### Example
151
+
152
+ Suppose we have a term named `foobar` in our dataset with the definition `The term foobar is used as metasyntactic variables and placeholder names in computer programming`
153
+
154
+ ```adoc
155
+ :glossarist-dataset: dataset:./path/to/glossarist-dataset
156
+
157
+ === Section
158
+ glossarist::render[dataset, foobar]
159
+ ```
160
+
161
+ then the output will be
162
+
163
+ ```adoc
164
+ === Section
165
+ ==== entity
166
+ concrete or abstract thing that exists, did exist, or can possibly exist, including associations among these things
167
+ ```
168
+
169
+ ### Rendering all terms from loaded dataset
170
+
171
+ This will render all the concepts from the [loaded dataset](#loading-dataset) using [default template for rendering concepts](#default-template-for-rendering-concepts)
172
+
173
+ #### Syntax
174
+
175
+ `glossarist::import[<dataset name>]`
176
+
177
+
178
+ ### Rendering bibliography for a single term in the dataset
179
+
180
+ This will render a bibliography for a single term in the [loaded dataset](#loading-dataset) using the [default template for bibliography](#default-template-for-bibliography)
181
+
182
+ #### Syntax
183
+
184
+ `glossarist::render_bibliography_entry[<dataset name>, <term>]`
185
+
186
+ #### Example
187
+
188
+ Suppose we have a concept `foo` with the ref `ISO/TS 14812:2022`, then we can render the bibliography for this like
189
+
190
+ ```adoc
191
+ :glossarist-dataset: dataset:./path/to/glossarist-dataset
192
+
193
+ glossarist::render_bibliography_entry[dataset, foo]
194
+ ```
195
+
196
+ then the output will be
197
+
198
+ ```adoc
199
+ * [[[ISO_TS_14812_2022,ISO/TS 14812:2022]]]
200
+ ```
201
+
202
+ ### Rendering bibliography for all terms in the dataset
203
+
204
+ This will render all the bibliographies for the given dataset
205
+
206
+ #### Syntax
207
+
208
+ `glossarist::render_bibliography[<dataset name>]`
209
+
210
+ #### Example
211
+
212
+ Suppose we have following concepts in dataset
213
+
214
+ - `foo` with ref `ISO/TS 14812:2022`
215
+ - `bar` with ref `ISO/TS 14812:2023`
216
+
217
+ then we can render the bibliography for this like
218
+
219
+ ```adoc
220
+ :glossarist-dataset: dataset:./path/to/glossarist-dataset
221
+
222
+ glossarist::render_bibliography[dataset]
223
+ ```
224
+
225
+ then the output will be
226
+
227
+ ```adoc
228
+ * [[[ISO_TS_14812_2022,ISO/TS 14812:2022]]]
229
+ * [[[ISO_TS_14812_2023,ISO/TS 14812:2023]]]
230
+ ```
231
+
232
+
233
+ ### Default template for rendering concepts
234
+
235
+ ```adoc
236
+ ==== {{ concept.term }}
237
+ <type>:[designation for the type]
238
+
239
+ {{ dataset[<concept name>]['eng'].definition[0].content }}
240
+
241
+ {% for example in <dataset name>[<concept name>]['eng'].examples %}
242
+ [example]
243
+ {{ example.content }}
244
+
245
+ {% endfor %}
246
+
247
+ {% for note in <dataset name>[<concept name>]['eng'].notes %}
248
+ [NOTE]
249
+ ====
250
+ {{ note.content }}
251
+ ====
252
+
253
+ {% endfor %}
254
+
255
+ {% for source in <dataset name>[<concept name>]['eng'].sources %}
256
+ [.source]
257
+ <<{{ source.origin.ref | replace: ' ', '_' | replace: '/', '_' | replace: ':', '_' }},{{ source.origin.clause }}>>
258
+
259
+ {% endfor %}
260
+ ```
261
+
262
+ #### Example
263
+
264
+ ```adoc
265
+ ==== foobar
266
+ admitted:[E]
267
+
268
+ The term foobar is used as metasyntactic variables and placeholder names in computer programming
269
+
270
+ [example]
271
+ example for the term
272
+
273
+ [NOTE]
274
+ ====
275
+ note for the term
276
+ ====
277
+
278
+ [.source]
279
+ <<ISO_TS_14812_2022,foo_bar_id>>
280
+ ```
281
+
282
+ ### Default template for bibliography
283
+
284
+ ```adoc
285
+ * [[[{{ source.origin.ref | replace: ' ', '_' | replace: '/', '_' | replace: ':', '_' }},{{ source.origin.clause }},{{source.origin.ref}}]]]
286
+ ```
287
+
26
288
 
27
289
  ## Development
28
290
 
@@ -32,25 +32,20 @@ module Liquid
32
32
 
33
33
  def filtered_concepts(concepts_collection, filters)
34
34
  concept_filters = filters.dup
35
- language_filter = concept_filters.delete('lang')
36
- sort_filter = concept_filters.delete('sort_by')
37
- group_filter = concept_filters.delete('group')
35
+ language_filter = concept_filters.delete("lang")
36
+ sort_filter = concept_filters.delete("sort_by")
37
+ group_filter = concept_filters.delete("group")
38
38
 
39
39
  concepts = concepts_collection.map do |concept|
40
40
  filtered_concept = concept.to_h["data"]
41
41
  filtered_concept["term"] = concept.default_designation
42
42
 
43
43
  filtered_concept = filtered_concept.merge(
44
- extract_localized_concepts(
45
- concept,
46
- language_filter,
47
- ),
44
+ extract_localized_concepts(concept, language_filter),
48
45
  )
49
46
 
50
47
  if retain_concept?(filtered_concept, concept_filters)
51
48
  filtered_concept
52
- else
53
- nil
54
49
  end
55
50
  end.compact
56
51
 
@@ -62,13 +57,13 @@ module Liquid
62
57
  localized_concepts = {}
63
58
 
64
59
  if !languages || languages.empty?
65
- concept.localized_concepts.each do |lang, localized_concept_uuid|
60
+ concept.localized_concepts.each do |lang, _localized_concept_uuid|
66
61
  localized_concepts[lang] = concept.localizations[lang].to_h["data"]
67
62
  end
68
63
  else
69
64
  languages.split(",").each do |lang|
70
- localization = concept.localizations[lang]&.to_h&.dig("data")
71
- localized_concepts[lang] = localization if localization
65
+ localization = concept.localizations[lang]&.to_h&.dig("data") and
66
+ localized_concepts[lang] = localization
72
67
  end
73
68
  end
74
69
 
@@ -81,10 +76,8 @@ module Liquid
81
76
  if fields.last.start_with?("start_with")
82
77
  value = fields.last.gsub(/start_with\(([^\)]*)\)/, '\1')
83
78
  fields = fields[0..-2]
84
-
85
- unless filtered_concept.dig(*fields).start_with?(value)
79
+ filtered_concept.dig(*fields).start_with?(value) or
86
80
  return false
87
- end
88
81
  elsif filtered_concept.dig(*fields) != value
89
82
  return false
90
83
  end
@@ -96,7 +89,9 @@ module Liquid
96
89
  def apply_sort_filter(concepts, sort_by)
97
90
  return concepts unless sort_by
98
91
 
99
- concepts.sort_by { |concept| concept.dig(*extract_nested_field_names(sort_by)) }
92
+ concepts.sort_by do |concept|
93
+ concept.dig(*extract_nested_field_names(sort_by))
94
+ end
100
95
  end
101
96
 
102
97
  def apply_group_filter(concepts, groups)
@@ -113,7 +108,7 @@ module Liquid
113
108
  name.split(".").map do |field|
114
109
  field_name = field.strip
115
110
 
116
- field_name.match(/^\d+$/) ? field_name.to_i : field_name
111
+ /^\d+$/.match?(field_name) ? field_name.to_i : field_name
117
112
  end
118
113
  end
119
114
 
@@ -65,7 +65,7 @@ module Metanorma
65
65
  end
66
66
 
67
67
  def process(document, reader)
68
- input_lines = reader.readlines.to_enum
68
+ input_lines = reader.lines.to_enum
69
69
 
70
70
  file_system = ::Liquid::LocalFileSystem.new(
71
71
  relative_file_path(document, ""),
@@ -74,9 +74,8 @@ module Metanorma
74
74
  @config[:file_system] = file_system
75
75
 
76
76
  processed_doc = prepare_document(document, input_lines)
77
- Asciidoctor::Reader.new(
78
- processed_doc.to_s.split("\n"),
79
- )
77
+ Asciidoctor::PreprocessorReader.new(document,
78
+ processed_doc.to_s.split("\n"))
80
79
  end
81
80
 
82
81
  private
@@ -176,7 +175,7 @@ module Metanorma
176
175
  liquid_doc.add_content(
177
176
  dataset.concepts.map do |concept_name, _concept|
178
177
  concept_template(context_name, concept_name)
179
- end.join("\n")
178
+ end.join("\n"),
180
179
  )
181
180
  end
182
181
 
@@ -187,7 +186,7 @@ module Metanorma
187
186
  liquid_doc.add_content(
188
187
  dataset.concepts.map do |_concept_name, concept|
189
188
  concept_bibliography(concept)
190
- end.compact.sort.join("\n")
189
+ end.compact.sort.join("\n"),
191
190
  )
192
191
  end
193
192
 
@@ -196,7 +195,7 @@ module Metanorma
196
195
  concept = @datasets[dataset_name][concept_name]
197
196
 
198
197
  liquid_doc.add_content(
199
- concept_bibliography(concept)
198
+ concept_bibliography(concept),
200
199
  )
201
200
  end
202
201
 
@@ -206,7 +205,7 @@ module Metanorma
206
205
 
207
206
  next if @rendered_bibliographies[ref]
208
207
 
209
- @rendered_bibliographies[ref] = ref.gsub(/[ \/:]/, '_')
208
+ @rendered_bibliographies[ref] = ref.gsub(/[ \/:]/, "_")
210
209
  "* [[[#{@rendered_bibliographies[ref]},#{ref}]]]"
211
210
  end.compact.join("\n")
212
211
 
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  module Plugin
3
3
  module Glossarist
4
- VERSION = "0.1.8"
4
+ VERSION = "0.2.0".freeze
5
5
  end
6
6
  end
7
7
  end
@@ -1,4 +1,4 @@
1
- require_relative 'lib/metanorma/plugin/glossarist/version'
1
+ require_relative "lib/metanorma/plugin/glossarist/version"
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "metanorma-plugin-glossarist"
@@ -14,8 +14,10 @@ Gem::Specification.new do |spec|
14
14
 
15
15
  # Specify which files should be added to the gem when it is released.
16
16
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
19
21
  end
20
22
  spec.bindir = "exe"
21
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-plugin-glossarist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-29 00:00:00.000000000 Z
11
+ date: 2024-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor