relaton-iso-bib 0.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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +10 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +78 -0
- data/LICENSE.txt +21 -0
- data/README.adoc +419 -0
- data/README.md +39 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/relaton_iso_bib/editorial_group.rb +95 -0
- data/lib/relaton_iso_bib/ics.rb +25 -0
- data/lib/relaton_iso_bib/iso_bibliographic_item.rb +357 -0
- data/lib/relaton_iso_bib/iso_document_relation.rb +13 -0
- data/lib/relaton_iso_bib/structured_identifier.rb +71 -0
- data/lib/relaton_iso_bib/typed_title_string.rb +32 -0
- data/lib/relaton_iso_bib/version.rb +3 -0
- data/lib/relaton_iso_bib/xml_parser.rb +89 -0
- data/lib/relaton_iso_bib.rb +7 -0
- data/relaton_iso_bib.gemspec +40 -0
- metadata +234 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
module RelatonIsoBib
|
2
|
+
class IsoDocumentRelation < RelatonBib::DocumentRelation
|
3
|
+
# @param builder [Nokogiri::XML::Builder]
|
4
|
+
def to_xml(builder)
|
5
|
+
builder.relation(type: type) do
|
6
|
+
bibitem.to_xml(builder, {})
|
7
|
+
bib_locality.each do |l|
|
8
|
+
l.to_xml builder
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module RelatonIsoBib
|
2
|
+
# Document structured identifier.
|
3
|
+
class StructuredIdentifier
|
4
|
+
# @return [Integer, NilClass]
|
5
|
+
attr_reader :tc_document_number
|
6
|
+
|
7
|
+
# @return [String]
|
8
|
+
attr_reader :project_number
|
9
|
+
|
10
|
+
# @return [Integer, NilClass]
|
11
|
+
attr_reader :part
|
12
|
+
|
13
|
+
# @return [Integer, NilClass]
|
14
|
+
attr_reader :subpart
|
15
|
+
|
16
|
+
# @return [String, NilClass]
|
17
|
+
attr_reader :type
|
18
|
+
|
19
|
+
# @param tc_document_number [Integer, NilClass]
|
20
|
+
# @param project_number [String]
|
21
|
+
# @param part [String, NilClass]
|
22
|
+
# @param subpart [String, NilClass]
|
23
|
+
# @param type [String, NilClass]
|
24
|
+
def initialize(**args)
|
25
|
+
@tc_document_number = args[:tc_document_number]
|
26
|
+
@project_number = args[:project_number]
|
27
|
+
@part = args[:part]
|
28
|
+
@subpart = args[:subpart]
|
29
|
+
@prefix = args[:prefix]
|
30
|
+
@type = args[:type]
|
31
|
+
end
|
32
|
+
|
33
|
+
# in docid manipulations, assume ISO as the default: id-part:year
|
34
|
+
def remove_part
|
35
|
+
@part_number = nil
|
36
|
+
@subpart_number = nil
|
37
|
+
case @type
|
38
|
+
when "Chinese Standard" then @project_number = @project_number.sub(/\.\d+/, "")
|
39
|
+
else
|
40
|
+
@project_number = @project_number.sub(/-\d+/, "")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def remove_date
|
45
|
+
case @type
|
46
|
+
when "Chinese Standard" then @project_number = @project_number.sub(/-[12]\d\d\d/, "")
|
47
|
+
else
|
48
|
+
@project_number = @project_number.sub(/:[12]\d\d\d/, "")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def all_parts
|
53
|
+
@project_number = @project_number + " (all parts)"
|
54
|
+
end
|
55
|
+
|
56
|
+
def id
|
57
|
+
project_number
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param builder [Nokogiri::XML::Builder]
|
61
|
+
def to_xml(builder)
|
62
|
+
xml = builder.structuredidentifier do
|
63
|
+
pn = builder.send "project-number", project_number
|
64
|
+
pn[:part] = part if part
|
65
|
+
pn[:subpart] = subpart if subpart
|
66
|
+
builder.send "tc-document-number", tc_document_number if tc_document_number
|
67
|
+
end
|
68
|
+
xml[:type] = type if type
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module RelatonIsoBib
|
2
|
+
class TypedTitleString < RelatonBib::TypedTitleString
|
3
|
+
TITLE_TYPES = %w[title-main title-intro title-part main].freeze
|
4
|
+
|
5
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
6
|
+
|
7
|
+
# @param type [String]
|
8
|
+
# @param title [RelatonBib::FormattedString, Hash]
|
9
|
+
# @param content [String]
|
10
|
+
# @param language [String]
|
11
|
+
# @param script [String]
|
12
|
+
def initialize(**args)
|
13
|
+
if args[:type] && !TITLE_TYPES.include?(args[:type])
|
14
|
+
raise ArgumentError, %{The type #{args[:type]} is invalid.}
|
15
|
+
end
|
16
|
+
|
17
|
+
unless args[:title] || args[:content]
|
18
|
+
raise ArgumentError, %{Keyword "title" or "content" should be passed.}
|
19
|
+
end
|
20
|
+
|
21
|
+
@type = args[:type]
|
22
|
+
|
23
|
+
if args[:title]
|
24
|
+
@title = args[:title]
|
25
|
+
else
|
26
|
+
fsargs = args.select { |k, _v| %i[content language script format].include? k }
|
27
|
+
@title = RelatonBib::FormattedString.new(fsargs)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
|
3
|
+
module RelatonIsoBib
|
4
|
+
class XMLParser < RelatonBib::XMLParser
|
5
|
+
class << self
|
6
|
+
# Override RelatonBib::XMLParser.form_xml method.
|
7
|
+
# @param xml [String]
|
8
|
+
# @return [RelatonIsoBib::IsoBibliographicItem]
|
9
|
+
def from_xml(xml)
|
10
|
+
doc = Nokogiri::XML(xml)
|
11
|
+
isoitem = doc.at "/bibitem|/bibdata"
|
12
|
+
IsoBibliographicItem.new item_data(isoitem)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# Override RelatonBib::XMLParser.item_data method.
|
18
|
+
# @param isoitem [Nokogiri::XML::Element]
|
19
|
+
# @returtn [Hash]
|
20
|
+
def item_data(isoitem)
|
21
|
+
data = super
|
22
|
+
ext = isoitem.at "./ext"
|
23
|
+
return data unless ext
|
24
|
+
|
25
|
+
data[:type] = ext.at("./doctype")&.text
|
26
|
+
data[:editorialgroup] = fetch_editorialgroup ext
|
27
|
+
data[:ics] = fetch_ics ext
|
28
|
+
data[:structuredidentifier] = fetch_structuredidentifier ext
|
29
|
+
data
|
30
|
+
end
|
31
|
+
|
32
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
33
|
+
|
34
|
+
# @param ext [Nokogiri::XML::Element]
|
35
|
+
# @return [RelatonIsoBib::StructuredIdentifier]
|
36
|
+
def fetch_structuredidentifier(ext)
|
37
|
+
sid = ext.at "./structuredidentifier"
|
38
|
+
pn = sid.at "project-number"
|
39
|
+
tdn = sid.at "tc-document-number"
|
40
|
+
RelatonIsoBib::StructuredIdentifier.new(
|
41
|
+
type: sid[:type], project_number: pn.text, part: pn[:part],
|
42
|
+
subpart: pn[:subpart], tc_document_number: tdn&.text
|
43
|
+
)
|
44
|
+
end
|
45
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
46
|
+
|
47
|
+
# Override RelatonBib::XMLParser.ttitle method.
|
48
|
+
# @param title [Nokogiri::XML::Element]
|
49
|
+
# @return [RelatonIsoBib::TypedTitleString]
|
50
|
+
def ttitle(title)
|
51
|
+
return unless title
|
52
|
+
|
53
|
+
TypedTitleString.new(
|
54
|
+
type: title[:type], content: title.text, language: title[:language],
|
55
|
+
script: title[:script], format: title[:format]
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param item [Nokogiri::XML::Element]
|
60
|
+
# @return [Array<RelatonIsoBib::Ics>]
|
61
|
+
def fetch_ics(ext)
|
62
|
+
ext.xpath("./ics/code").map { |ics| Ics.new ics.text }
|
63
|
+
end
|
64
|
+
|
65
|
+
# @TODO Organization doesn't recreated
|
66
|
+
# @param ext [Nokogiri::XML::Element]
|
67
|
+
# @return [RelatonIsoBib::EditorialGroup]
|
68
|
+
def fetch_editorialgroup(ext)
|
69
|
+
eg = ext.at("./editorialgroup")
|
70
|
+
tc = eg&.xpath("technical_committee")&.map { |t| iso_subgroup(t) }
|
71
|
+
sc = eg&.xpath("subcommittee")&.map { |s| iso_subgroup(s) }
|
72
|
+
wg = eg&.xpath("workgroup")&.map { |w| iso_subgroup(w) }
|
73
|
+
sr = eg&.at "secretariat"
|
74
|
+
EditorialGroup.new(
|
75
|
+
technical_committee: tc, subcommittee: sc, workgroup: wg, secretariat: sr&.text,
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
# @param com [Nokogiri::XML::Element]
|
80
|
+
# @return [RelatonIsoBib::IsoSubgroup]
|
81
|
+
def iso_subgroup(com)
|
82
|
+
return nil if com.nil?
|
83
|
+
|
84
|
+
IsoSubgroup.new(name: com.text, type: com[:type],
|
85
|
+
number: com[:number].to_i)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require "relaton_iso_bib/version"
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "relaton-iso-bib"
|
9
|
+
spec.version = RelatonIsoBib::VERSION
|
10
|
+
spec.authors = ["Ribose Inc."]
|
11
|
+
spec.email = ["open.source@ribose.com"]
|
12
|
+
|
13
|
+
spec.summary = %(RelatonIsoBib: Ruby ISOXMLDOC impementation.)
|
14
|
+
spec.description = %(RelatonIsoBib: Ruby ISOXMLDOC impementation.)
|
15
|
+
spec.homepage = "https://github.com/metanorma/relaton-iso-bib"
|
16
|
+
spec.license = "BSD-2-Clause"
|
17
|
+
|
18
|
+
# Specify which files should be added to the gem when it is released.
|
19
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
end
|
23
|
+
spec.bindir = "exe"
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
+
spec.require_paths = ["lib"]
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
28
|
+
spec.add_development_dependency "pry-byebug"
|
29
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
30
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
+
spec.add_development_dependency 'simplecov'
|
32
|
+
spec.add_development_dependency "equivalent-xml", "~> 0.6"
|
33
|
+
spec.add_development_dependency "ruby-debug-ide"
|
34
|
+
spec.add_development_dependency "debase"
|
35
|
+
|
36
|
+
spec.add_dependency "isoics", "~> 0.1.6"
|
37
|
+
spec.add_dependency "nokogiri", "~> 1.8.4"
|
38
|
+
spec.add_dependency "relaton-bib", "~>0.1.5"
|
39
|
+
spec.add_dependency "ruby_deep_clone", "~> 0.8.0"
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: relaton-iso-bib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ribose Inc.
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-05-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry-byebug
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: equivalent-xml
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.6'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.6'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: ruby-debug-ide
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: debase
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: isoics
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.1.6
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.1.6
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: nokogiri
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 1.8.4
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 1.8.4
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: relaton-bib
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.1.5
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.1.5
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: ruby_deep_clone
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.8.0
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.8.0
|
181
|
+
description: 'RelatonIsoBib: Ruby ISOXMLDOC impementation.'
|
182
|
+
email:
|
183
|
+
- open.source@ribose.com
|
184
|
+
executables: []
|
185
|
+
extensions: []
|
186
|
+
extra_rdoc_files: []
|
187
|
+
files:
|
188
|
+
- ".gitignore"
|
189
|
+
- ".rspec"
|
190
|
+
- ".rubocop.yml"
|
191
|
+
- ".travis.yml"
|
192
|
+
- Gemfile
|
193
|
+
- Gemfile.lock
|
194
|
+
- LICENSE.txt
|
195
|
+
- README.adoc
|
196
|
+
- README.md
|
197
|
+
- Rakefile
|
198
|
+
- bin/console
|
199
|
+
- bin/setup
|
200
|
+
- lib/relaton_iso_bib.rb
|
201
|
+
- lib/relaton_iso_bib/editorial_group.rb
|
202
|
+
- lib/relaton_iso_bib/ics.rb
|
203
|
+
- lib/relaton_iso_bib/iso_bibliographic_item.rb
|
204
|
+
- lib/relaton_iso_bib/iso_document_relation.rb
|
205
|
+
- lib/relaton_iso_bib/structured_identifier.rb
|
206
|
+
- lib/relaton_iso_bib/typed_title_string.rb
|
207
|
+
- lib/relaton_iso_bib/version.rb
|
208
|
+
- lib/relaton_iso_bib/xml_parser.rb
|
209
|
+
- relaton_iso_bib.gemspec
|
210
|
+
homepage: https://github.com/metanorma/relaton-iso-bib
|
211
|
+
licenses:
|
212
|
+
- BSD-2-Clause
|
213
|
+
metadata: {}
|
214
|
+
post_install_message:
|
215
|
+
rdoc_options: []
|
216
|
+
require_paths:
|
217
|
+
- lib
|
218
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
224
|
+
requirements:
|
225
|
+
- - ">="
|
226
|
+
- !ruby/object:Gem::Version
|
227
|
+
version: '0'
|
228
|
+
requirements: []
|
229
|
+
rubyforge_project:
|
230
|
+
rubygems_version: 2.6.12
|
231
|
+
signing_key:
|
232
|
+
specification_version: 4
|
233
|
+
summary: 'RelatonIsoBib: Ruby ISOXMLDOC impementation.'
|
234
|
+
test_files: []
|