relaton-un 1.2.0 → 1.5.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 +4 -4
- data/.github/workflows/ubuntu.yml +1 -0
- data/.rubocop.yml +2 -2
- data/README.adoc +23 -10
- data/grammars/isodoc.rng +136 -21
- data/grammars/un.rng +7 -0
- data/lib/relaton_un/editorialgroup.rb +13 -0
- data/lib/relaton_un/hash_converter.rb +1 -0
- data/lib/relaton_un/hit.rb +3 -7
- data/lib/relaton_un/hit_collection.rb +30 -15
- data/lib/relaton_un/session.rb +32 -10
- data/lib/relaton_un/un_bibliographic_item.rb +43 -9
- data/lib/relaton_un/version.rb +1 -1
- data/lib/relaton_un/xml_parser.rb +19 -10
- data/relaton_un.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15db68b8fb83679317777adb635ce62c56044b7685f9b0c7e94bb0040c66fbf7
|
4
|
+
data.tar.gz: 5b4eff35e67ad989f8b8c3ffd1cf5a72b974c6ee18605b585b72acdc57cf48da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24a85da74d47286a193e3b56fc912de77ddeb912a0a2c8c0b0bd575542dd99d67badb818e171491c2c1704c8336f81a3a9c03b39de2ed63e5044ab1df88a0220
|
7
|
+
data.tar.gz: ce0b55e34ff5c2876dbf6c09d9dfa88b09e8c1d497453f48db48e8af0660e679ec932d103937cb85df0ef4d368fc36db12acc20fa1a3d3e7ecad30466123b7cd
|
data/.rubocop.yml
CHANGED
data/README.adoc
CHANGED
@@ -25,9 +25,10 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
=== Search for a standard using keywords
|
27
27
|
|
28
|
-
[source]
|
28
|
+
[source,ruby]
|
29
29
|
----
|
30
30
|
require 'relaton_un'
|
31
|
+
=> true
|
31
32
|
|
32
33
|
hits = RelatonUn::UnBibliography.search("TRADE/CEFACT/2004/32")
|
33
34
|
=> <RelatonUn::HitCollection:0x007fc4e6ec2018 @ref=TRADE/CEFACT/2004/32 @fetched=false>
|
@@ -39,23 +40,23 @@ item = hits[0].fetch
|
|
39
40
|
|
40
41
|
=== XML serialization
|
41
42
|
|
42
|
-
[source]
|
43
|
+
[source,ruby]
|
43
44
|
----
|
44
45
|
item.to_xml
|
45
|
-
=>
|
46
|
+
=> "<bibitem id="TRADE/CEFACT/2004/32" type="standard">
|
46
47
|
<title type="main" format="text/plain" language="en" script="Latn">SECRETARIAT REVIEW OF UN/LOCODE, 19 DECEMBER 2003 / SUBMITTED BY THE SECRETARIAT</title>
|
47
48
|
<uri type="pdf">https://documents-dds-ny.un.org/doc/UNDOC/GEN/G04/306/83/pdf/G0430683.pdf?OpenElement</uri>
|
48
49
|
<uri type="word">https://documents-dds-ny.un.org/doc/UNDOC/GEN/G04/306/83/doc/G0430683.DOC?OpenElement</uri>
|
49
50
|
<docidentifier type="UN">TRADE/CEFACT/2004/32</docidentifier>
|
50
51
|
<docnumber>TRADE/CEFACT/2004/32</docnumber>
|
51
52
|
...
|
52
|
-
</bibitem>
|
53
|
+
</bibitem>"
|
53
54
|
----
|
54
55
|
With argument `bibdata: true` it ouputs XML wrapped by `bibdata` element and adds flavour `ext` element.
|
55
|
-
[source]
|
56
|
+
[source,ruby]
|
56
57
|
----
|
57
58
|
item.to_xml bibdata: true
|
58
|
-
=>
|
59
|
+
=> "<bibdata type="standard">
|
59
60
|
<fetched>2020-03-13</fetched>
|
60
61
|
<title type="main" format="text/plain" language="en" script="Latn">SECRETARIAT REVIEW OF UN/LOCODE, 19 DECEMBER 2003 / SUBMITTED BY THE SECRETARIAT</title>
|
61
62
|
<uri type="pdf">https://documents-dds-ny.un.org/doc/UNDOC/GEN/G04/306/83/pdf/G0430683.pdf?OpenElement</uri>
|
@@ -63,11 +64,23 @@ item.to_xml bibdata: true
|
|
63
64
|
<docidentifier type="UN">TRADE/CEFACT/2004/32</docidentifier>
|
64
65
|
<docnumber>TRADE/CEFACT/2004/32</docnumber>
|
65
66
|
...
|
66
|
-
|
67
|
+
<ext>
|
68
|
+
<editorialgroup>
|
69
|
+
<committee>Committee on Trade</committee>
|
70
|
+
<committee>Centre for Trade Facilitation and Electronic Business</committee>
|
71
|
+
</editorialgroup>
|
72
|
+
<distribution>general</distribution>
|
73
|
+
<session>
|
74
|
+
<number>10</number>
|
75
|
+
<agenda-id>12</agenda-id>
|
76
|
+
</session>
|
77
|
+
<job_number>G0430683</job_number>
|
78
|
+
</ext>
|
79
|
+
</bibdata>"
|
67
80
|
----
|
68
81
|
|
69
82
|
=== Get code, and year
|
70
|
-
[source]
|
83
|
+
[source,ruby]
|
71
84
|
----
|
72
85
|
RelatonUn::UnBibliography.get "UN TRADE/CEFACT/2004/32"
|
73
86
|
[relaton-un] ("UN TRADE/CEFACT/2004/32") fetching...
|
@@ -77,7 +90,7 @@ RelatonUn::UnBibliography.get "UN TRADE/CEFACT/2004/32"
|
|
77
90
|
----
|
78
91
|
|
79
92
|
=== Create bibliographic item from XML
|
80
|
-
[source]
|
93
|
+
[source,ruby]
|
81
94
|
----
|
82
95
|
RelatonUn::XMLParser.from_xml File.read('spec/fixtures/un_bib.xml')
|
83
96
|
=> #<RelatonUn::UnBibliographicItem:0x007fdc5e7ab678
|
@@ -85,7 +98,7 @@ RelatonUn::XMLParser.from_xml File.read('spec/fixtures/un_bib.xml')
|
|
85
98
|
----
|
86
99
|
|
87
100
|
=== Create bibliographic item from YAML
|
88
|
-
[source]
|
101
|
+
[source,ruby]
|
89
102
|
----
|
90
103
|
hash = YAML.load_file 'spec/fixtures/un_bib.yaml'
|
91
104
|
=> {"id"=>"TRADE/CEFACT/2004/32",
|
data/grammars/isodoc.rng
CHANGED
@@ -43,7 +43,9 @@
|
|
43
43
|
<define name="xref">
|
44
44
|
<element name="xref">
|
45
45
|
<attribute name="target">
|
46
|
-
<data type="
|
46
|
+
<data type="string">
|
47
|
+
<param name="pattern">\i\c*|\c+#\c+</param>
|
48
|
+
</data>
|
47
49
|
</attribute>
|
48
50
|
<optional>
|
49
51
|
<attribute name="type">
|
@@ -61,6 +63,11 @@
|
|
61
63
|
</choice>
|
62
64
|
</attribute>
|
63
65
|
</optional>
|
66
|
+
<optional>
|
67
|
+
<attribute name="droploc">
|
68
|
+
<data type="boolean"/>
|
69
|
+
</attribute>
|
70
|
+
</optional>
|
64
71
|
<text/>
|
65
72
|
</element>
|
66
73
|
</define>
|
@@ -578,6 +585,8 @@
|
|
578
585
|
<ref name="ol"/>
|
579
586
|
<ref name="dl"/>
|
580
587
|
<ref name="formula"/>
|
588
|
+
<ref name="quote"/>
|
589
|
+
<ref name="sourcecode"/>
|
581
590
|
</choice>
|
582
591
|
</oneOrMore>
|
583
592
|
</element>
|
@@ -661,6 +670,16 @@
|
|
661
670
|
</choice>
|
662
671
|
</attribute>
|
663
672
|
</optional>
|
673
|
+
<optional>
|
674
|
+
<attribute name="valign">
|
675
|
+
<choice>
|
676
|
+
<value>top</value>
|
677
|
+
<value>middle</value>
|
678
|
+
<value>bottom</value>
|
679
|
+
<value>baseline</value>
|
680
|
+
</choice>
|
681
|
+
</attribute>
|
682
|
+
</optional>
|
664
683
|
<choice>
|
665
684
|
<zeroOrMore>
|
666
685
|
<choice>
|
@@ -697,6 +716,16 @@
|
|
697
716
|
</choice>
|
698
717
|
</attribute>
|
699
718
|
</optional>
|
719
|
+
<optional>
|
720
|
+
<attribute name="valign">
|
721
|
+
<choice>
|
722
|
+
<value>top</value>
|
723
|
+
<value>middle</value>
|
724
|
+
<value>bottom</value>
|
725
|
+
<value>baseline</value>
|
726
|
+
</choice>
|
727
|
+
</attribute>
|
728
|
+
</optional>
|
700
729
|
<choice>
|
701
730
|
<zeroOrMore>
|
702
731
|
<choice>
|
@@ -834,6 +863,13 @@
|
|
834
863
|
</define>
|
835
864
|
<define name="standard-document">
|
836
865
|
<element name="standard-document">
|
866
|
+
<attribute name="version"/>
|
867
|
+
<attribute name="type">
|
868
|
+
<choice>
|
869
|
+
<value>semantic</value>
|
870
|
+
<value>presentation</value>
|
871
|
+
</choice>
|
872
|
+
</attribute>
|
837
873
|
<ref name="bibdata"/>
|
838
874
|
<optional>
|
839
875
|
<ref name="boilerplate"/>
|
@@ -855,7 +891,7 @@
|
|
855
891
|
<oneOrMore>
|
856
892
|
<choice>
|
857
893
|
<ref name="content"/>
|
858
|
-
<ref name="
|
894
|
+
<ref name="abstract"/>
|
859
895
|
<ref name="foreword"/>
|
860
896
|
<ref name="introduction"/>
|
861
897
|
<ref name="acknowledgements"/>
|
@@ -922,6 +958,9 @@
|
|
922
958
|
<optional>
|
923
959
|
<attribute name="script"/>
|
924
960
|
</optional>
|
961
|
+
<optional>
|
962
|
+
<attribute name="type"/>
|
963
|
+
</optional>
|
925
964
|
<optional>
|
926
965
|
<attribute name="obligation">
|
927
966
|
<choice>
|
@@ -961,9 +1000,6 @@
|
|
961
1000
|
</define>
|
962
1001
|
<define name="content-subsection">
|
963
1002
|
<element name="clause">
|
964
|
-
<optional>
|
965
|
-
<attribute name="type"/>
|
966
|
-
</optional>
|
967
1003
|
<ref name="Content-Section"/>
|
968
1004
|
</element>
|
969
1005
|
</define>
|
@@ -992,6 +1028,9 @@
|
|
992
1028
|
</choice>
|
993
1029
|
</attribute>
|
994
1030
|
</optional>
|
1031
|
+
<optional>
|
1032
|
+
<attribute name="type"/>
|
1033
|
+
</optional>
|
995
1034
|
<optional>
|
996
1035
|
<ref name="section-title"/>
|
997
1036
|
</optional>
|
@@ -1011,9 +1050,6 @@
|
|
1011
1050
|
</define>
|
1012
1051
|
<define name="clause">
|
1013
1052
|
<element name="clause">
|
1014
|
-
<optional>
|
1015
|
-
<attribute name="type"/>
|
1016
|
-
</optional>
|
1017
1053
|
<ref name="Clause-Section"/>
|
1018
1054
|
</element>
|
1019
1055
|
</define>
|
@@ -1042,18 +1078,24 @@
|
|
1042
1078
|
</choice>
|
1043
1079
|
</attribute>
|
1044
1080
|
</optional>
|
1081
|
+
<optional>
|
1082
|
+
<attribute name="type"/>
|
1083
|
+
</optional>
|
1045
1084
|
<optional>
|
1046
1085
|
<ref name="section-title"/>
|
1047
1086
|
</optional>
|
1048
1087
|
<group>
|
1049
|
-
<
|
1050
|
-
<
|
1051
|
-
<
|
1052
|
-
|
1053
|
-
|
1054
|
-
<
|
1055
|
-
|
1056
|
-
|
1088
|
+
<choice>
|
1089
|
+
<group>
|
1090
|
+
<zeroOrMore>
|
1091
|
+
<ref name="BasicBlock"/>
|
1092
|
+
</zeroOrMore>
|
1093
|
+
<zeroOrMore>
|
1094
|
+
<ref name="note"/>
|
1095
|
+
</zeroOrMore>
|
1096
|
+
</group>
|
1097
|
+
<ref name="amend"/>
|
1098
|
+
</choice>
|
1057
1099
|
<zeroOrMore>
|
1058
1100
|
<choice>
|
1059
1101
|
<ref name="clause-subsection"/>
|
@@ -1180,6 +1222,9 @@
|
|
1180
1222
|
<optional>
|
1181
1223
|
<attribute name="script"/>
|
1182
1224
|
</optional>
|
1225
|
+
<optional>
|
1226
|
+
<attribute name="type"/>
|
1227
|
+
</optional>
|
1183
1228
|
<optional>
|
1184
1229
|
<attribute name="obligation">
|
1185
1230
|
<choice>
|
@@ -1447,11 +1492,6 @@
|
|
1447
1492
|
</optional>
|
1448
1493
|
</element>
|
1449
1494
|
</define>
|
1450
|
-
<define name="preface_abstract">
|
1451
|
-
<element name="abstract">
|
1452
|
-
<ref name="Basic-Section"/>
|
1453
|
-
</element>
|
1454
|
-
</define>
|
1455
1495
|
<define name="term-clause">
|
1456
1496
|
<element name="clause">
|
1457
1497
|
<optional>
|
@@ -1501,4 +1541,79 @@
|
|
1501
1541
|
<ref name="CitationType"/>
|
1502
1542
|
</element>
|
1503
1543
|
</define>
|
1544
|
+
<define name="amend">
|
1545
|
+
<element name="amend">
|
1546
|
+
<optional>
|
1547
|
+
<attribute name="id">
|
1548
|
+
<data type="ID"/>
|
1549
|
+
</attribute>
|
1550
|
+
</optional>
|
1551
|
+
<attribute name="change">
|
1552
|
+
<choice>
|
1553
|
+
<value>add</value>
|
1554
|
+
<value>modify</value>
|
1555
|
+
<value>delete</value>
|
1556
|
+
</choice>
|
1557
|
+
</attribute>
|
1558
|
+
<optional>
|
1559
|
+
<attribute name="path"/>
|
1560
|
+
</optional>
|
1561
|
+
<optional>
|
1562
|
+
<attribute name="path_end"/>
|
1563
|
+
</optional>
|
1564
|
+
<optional>
|
1565
|
+
<attribute name="title"/>
|
1566
|
+
</optional>
|
1567
|
+
<optional>
|
1568
|
+
<element name="location">
|
1569
|
+
<zeroOrMore>
|
1570
|
+
<ref name="locality"/>
|
1571
|
+
</zeroOrMore>
|
1572
|
+
</element>
|
1573
|
+
</optional>
|
1574
|
+
<zeroOrMore>
|
1575
|
+
<ref name="autonumber"/>
|
1576
|
+
</zeroOrMore>
|
1577
|
+
<optional>
|
1578
|
+
<element name="description">
|
1579
|
+
<zeroOrMore>
|
1580
|
+
<ref name="BasicBlock"/>
|
1581
|
+
</zeroOrMore>
|
1582
|
+
</element>
|
1583
|
+
</optional>
|
1584
|
+
<optional>
|
1585
|
+
<element name="newcontent">
|
1586
|
+
<zeroOrMore>
|
1587
|
+
<ref name="BasicBlock"/>
|
1588
|
+
</zeroOrMore>
|
1589
|
+
</element>
|
1590
|
+
</optional>
|
1591
|
+
<optional>
|
1592
|
+
<element name="description">
|
1593
|
+
<zeroOrMore>
|
1594
|
+
<ref name="BasicBlock"/>
|
1595
|
+
</zeroOrMore>
|
1596
|
+
</element>
|
1597
|
+
</optional>
|
1598
|
+
</element>
|
1599
|
+
</define>
|
1600
|
+
<define name="autonumber">
|
1601
|
+
<element name="autonumber">
|
1602
|
+
<attribute name="type">
|
1603
|
+
<choice>
|
1604
|
+
<value>requirement</value>
|
1605
|
+
<value>recommendation</value>
|
1606
|
+
<value>permission</value>
|
1607
|
+
<value>table</value>
|
1608
|
+
<value>figure</value>
|
1609
|
+
<value>admonition</value>
|
1610
|
+
<value>formula</value>
|
1611
|
+
<value>sourcecode</value>
|
1612
|
+
<value>example</value>
|
1613
|
+
<value>note</value>
|
1614
|
+
</choice>
|
1615
|
+
</attribute>
|
1616
|
+
<text/>
|
1617
|
+
</element>
|
1618
|
+
</define>
|
1504
1619
|
</grammar>
|
data/grammars/un.rng
CHANGED
@@ -340,6 +340,13 @@
|
|
340
340
|
</define>
|
341
341
|
<define name="un-standard">
|
342
342
|
<element name="un-standard">
|
343
|
+
<attribute name="version"/>
|
344
|
+
<attribute name="type">
|
345
|
+
<choice>
|
346
|
+
<value>semantic</value>
|
347
|
+
<value>presentation</value>
|
348
|
+
</choice>
|
349
|
+
</attribute>
|
343
350
|
<ref name="bibdata"/>
|
344
351
|
<optional>
|
345
352
|
<ref name="boilerplate"/>
|
@@ -10,6 +10,11 @@ module RelatonUn
|
|
10
10
|
@committee = committee
|
11
11
|
end
|
12
12
|
|
13
|
+
# @return [true]
|
14
|
+
def presence?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
13
18
|
# @param builder [Nokogiri::XML::Builder]
|
14
19
|
def to_xml(builder)
|
15
20
|
builder.editorialgroup do |b|
|
@@ -21,5 +26,13 @@ module RelatonUn
|
|
21
26
|
def to_hash
|
22
27
|
single_element_array(committee.map { |c| { "committee" => c } })
|
23
28
|
end
|
29
|
+
|
30
|
+
# @param prefix [String]
|
31
|
+
# @return [String]
|
32
|
+
def to_asciibib(prefix)
|
33
|
+
pref = prefix.empty? ? prefix : prefix + "."
|
34
|
+
pref += "editorialgroup"
|
35
|
+
committee.map { |c| "#{pref}.committee:: #{c}\n" }.join
|
36
|
+
end
|
24
37
|
end
|
25
38
|
end
|
data/lib/relaton_un/hit.rb
CHANGED
@@ -59,7 +59,7 @@ module RelatonUn
|
|
59
59
|
# rubocop:disable Metrics/MethodLength
|
60
60
|
|
61
61
|
# @return [RelatonUn::UnBibliographicItem]
|
62
|
-
def un_bib_item
|
62
|
+
def un_bib_item # rubocop:disable Metrics/AbcSize
|
63
63
|
UnBibliographicItem.new(
|
64
64
|
type: "standard",
|
65
65
|
fetched: Date.today.to_s,
|
@@ -75,6 +75,7 @@ module RelatonUn
|
|
75
75
|
distribution: fetch_distribution,
|
76
76
|
editorialgroup: fetch_editorialgroup,
|
77
77
|
classification: fetch_classification,
|
78
|
+
job_number: hit[:job_number]
|
78
79
|
)
|
79
80
|
end
|
80
81
|
# rubocop:enable Metrics/MethodLength
|
@@ -88,11 +89,6 @@ module RelatonUn
|
|
88
89
|
|
89
90
|
# @return [Array<RelatonBib::TypedTitleString>]
|
90
91
|
def fetch_title
|
91
|
-
# fs = RelatonBib::FormattedString.new(
|
92
|
-
# content: hit[:title], language: "en", script: "Latn",
|
93
|
-
# )
|
94
|
-
# [RelatonBib::TypedTitleString.new(type: "main", title: fs)]
|
95
|
-
# [{ title_main: hit[:title], language: "en", script: "Latn" }]
|
96
92
|
RelatonBib::TypedTitleString.from_string hit[:title], "en", "Latn"
|
97
93
|
end
|
98
94
|
|
@@ -135,7 +131,7 @@ module RelatonUn
|
|
135
131
|
def fetch_editorialgroup
|
136
132
|
tc = hit[:ref].match(/^[\S]+/).to_s.split(/\/|-/).reduce([]) do |m, v|
|
137
133
|
if BODY[v] then m << BODY[v]
|
138
|
-
elsif v
|
134
|
+
elsif v.match? /(AC|C|CN|CONF|GC|SC|Sub|WG).\d+|PC/ then m << v
|
139
135
|
else m
|
140
136
|
end
|
141
137
|
end.uniq
|
@@ -6,18 +6,23 @@ require "http-cookie"
|
|
6
6
|
module RelatonUn
|
7
7
|
# Page of hit collection.
|
8
8
|
class HitCollection < RelatonBib::HitCollection
|
9
|
-
AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X
|
10
|
-
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
9
|
+
AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) "\
|
10
|
+
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
|
11
11
|
DOMAIN = "https://documents.un.org"
|
12
|
-
BOUNDARY = "----
|
12
|
+
BOUNDARY = "----WebKitFormBoundaryVarT9Z7AFUzw2lma"
|
13
13
|
|
14
14
|
# @param text [String] reference to search
|
15
15
|
def initialize(text)
|
16
16
|
super
|
17
17
|
@uri = URI.parse DOMAIN
|
18
18
|
@jar = HTTP::CookieJar.new
|
19
|
-
@http = Net::HTTP.new @uri.host, @uri.port
|
19
|
+
@http = Net::HTTP.new @uri.host, @uri.port # , "localhost", "8000"
|
20
20
|
@http.use_ssl = true
|
21
|
+
# @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
22
|
+
# @http.cert_store = OpenSSL::X509::Store.new
|
23
|
+
# ca_file = "/Users/andrej/Library/Preferences/httptoolkit/ca.pem"
|
24
|
+
# @http.cert_store.set_default_paths
|
25
|
+
# @http.cert_store.add_file ca_file
|
21
26
|
@http.read_timeout = 120
|
22
27
|
if (form_resp = get_page)
|
23
28
|
doc = Nokogiri::HTML page_resp(form_resp, text).body
|
@@ -48,19 +53,21 @@ module RelatonUn
|
|
48
53
|
# @param form [Nokogiri::HTML::Document]
|
49
54
|
# @param text [String]
|
50
55
|
# @return [Array<String>]
|
51
|
-
def form_data(form, text)
|
56
|
+
def form_data(form, text) # rubocop:disable Metrics/CyclomaticComplexity
|
52
57
|
fd = form.xpath(
|
53
|
-
"//input[@type!='radio']"
|
54
|
-
"//input[@type='radio'][@checked]"
|
55
|
-
"//select[@name!='view:_id1:_id2:cbLang']"
|
56
|
-
"//textarea"
|
58
|
+
"//input[@type!='radio']|"\
|
59
|
+
"//input[@type='radio'][@checked]|"\
|
60
|
+
"//select[@name!='view:_id1:_id2:cbLang']|"\
|
61
|
+
"//textarea"
|
57
62
|
).reduce([]) do |m, i|
|
58
63
|
v = case i[:name]
|
59
64
|
when "view:_id1:_id2:txtSymbol" then text
|
65
|
+
when "view:_id1:_id2:rgTrunc" then "R"
|
60
66
|
when "view:_id1:_id2:cbType" then "FP"
|
61
67
|
when "view:_id1:_id2:cbSort" then "R"
|
62
68
|
when "$$xspsubmitid" then "view:_id1:_id2:_id130"
|
63
|
-
when "$$xspsubmitscroll" then "0|
|
69
|
+
when "$$xspsubmitscroll" then "0|102"
|
70
|
+
when "view:_id1" then "view:_id1"
|
64
71
|
else i[:value]
|
65
72
|
end
|
66
73
|
m << %{--#{BOUNDARY}}
|
@@ -77,7 +84,7 @@ module RelatonUn
|
|
77
84
|
form = Nokogiri::HTML form_resp.body
|
78
85
|
req = Net::HTTP::Post.new form.at("//form")[:action]
|
79
86
|
set_headers req
|
80
|
-
req["Content-Type"] = "multipart/form-data
|
87
|
+
req["Content-Type"] = "multipart/form-data; boundary=#{BOUNDARY}"
|
81
88
|
req.body = form_data(form, text).join("\r\n")
|
82
89
|
resp = @http.request req
|
83
90
|
get_page URI.parse(resp["location"]).request_uri
|
@@ -91,7 +98,7 @@ module RelatonUn
|
|
91
98
|
|
92
99
|
# @param item [Nokogiri::XML::Element]
|
93
100
|
# @return [Hash]
|
94
|
-
def hit_data(item)
|
101
|
+
def hit_data(item) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
95
102
|
en = item.at("//span[.='ENGLISH']/../..")
|
96
103
|
{
|
97
104
|
ref: item.at("div/div/a")&.text&.sub("\u00A0", ""),
|
@@ -103,7 +110,8 @@ module RelatonUn
|
|
103
110
|
link: link(en),
|
104
111
|
session: session(item),
|
105
112
|
agenda: agenda(item),
|
106
|
-
distribution: distribution(item)
|
113
|
+
distribution: distribution(item),
|
114
|
+
job_number: job_number(item),
|
107
115
|
}
|
108
116
|
end
|
109
117
|
|
@@ -155,18 +163,25 @@ module RelatonUn
|
|
155
163
|
item.at("//label[.='Distribution:']/following-sibling::span")&.text
|
156
164
|
end
|
157
165
|
|
166
|
+
def job_number(item)
|
167
|
+
item.at("//span[contains(@id, 'cfJobNumE')]")&.text
|
168
|
+
end
|
169
|
+
|
158
170
|
# rubocop:disable Metrics/MethodLength
|
159
171
|
|
160
172
|
# @param req [Net::HTTP::Get, Net::HTTP::Post]
|
161
|
-
def set_headers(req)
|
173
|
+
def set_headers(req) # rubocop:disable Metrics/AbcSize
|
162
174
|
set_cookie req
|
163
175
|
req["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,"\
|
164
|
-
"image/webp,image/apng,*/*;q=0.8,application/signed-exchange;
|
176
|
+
"image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;"\
|
177
|
+
"v=b3;q=0.9"
|
165
178
|
req["Accept-Encoding"] = "gzip, deflate, br"
|
179
|
+
req["Accept-Language"] = "en-US;q=0.8,en;q=0.7"
|
166
180
|
req["Cache-Control"] = "max-age=0"
|
167
181
|
req["Connection"] = "keep-alive"
|
168
182
|
req["Origin"] = "https://documents.un.org"
|
169
183
|
req["Referer"] = "https://documents.un.org/prod/ods.nsf/home.xsp"
|
184
|
+
req["Sec-Fetch-Dest"] = "document"
|
170
185
|
req["Sec-Fetch-Mode"] = "navigate"
|
171
186
|
req["Sec-Fetch-Site"] = "same-origin"
|
172
187
|
req["Sec-Fetch-User"] = "?1"
|
data/lib/relaton_un/session.rb
CHANGED
@@ -3,7 +3,7 @@ module RelatonUn
|
|
3
3
|
include RelatonBib
|
4
4
|
|
5
5
|
# @return [String, NilClass]
|
6
|
-
attr_reader :session_number, :
|
6
|
+
attr_reader :session_number, :collaborator, :agenda_id, :item_footnote
|
7
7
|
|
8
8
|
# @return [Date, NilClass]
|
9
9
|
attr_reader :session_date
|
@@ -16,7 +16,7 @@ module RelatonUn
|
|
16
16
|
# @param item_number [Array<String>]
|
17
17
|
# @pqrqm item_name [Array<String>]
|
18
18
|
# @pqrqm subitem_name [Array<String>]
|
19
|
-
# @param
|
19
|
+
# @param collaborator [String]
|
20
20
|
# @param agenda_id [String]
|
21
21
|
# @param item_footnote [String]
|
22
22
|
def initialize(**args)
|
@@ -25,12 +25,12 @@ module RelatonUn
|
|
25
25
|
@item_number = args.fetch(:item_number, [])
|
26
26
|
@item_name = args.fetch(:item_name, [])
|
27
27
|
@subitem_name = args.fetch(:subitem_name, [])
|
28
|
-
@
|
28
|
+
@collaborator = args[:collaborator]
|
29
29
|
@agenda_id = args[:agenda_id]
|
30
30
|
@item_footnote = args[:item_footnote]
|
31
31
|
end
|
32
32
|
|
33
|
-
# rubocop:disable Metrics/AbcSize
|
33
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize
|
34
34
|
|
35
35
|
# @param [Nokogiri::XML::Builder]
|
36
36
|
def to_xml(builder)
|
@@ -40,26 +40,48 @@ module RelatonUn
|
|
40
40
|
item_number.each { |n| b.send "item-number", n }
|
41
41
|
item_name.each { |n| b.send "item-name", n }
|
42
42
|
subitem_name.each { |n| b.send "subitem-name", n }
|
43
|
-
b.
|
43
|
+
b.collaborator collaborator if collaborator
|
44
44
|
b.send "agenda-id", agenda_id if agenda_id
|
45
45
|
b.send "item-footnote", item_footnote if item_footnote
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
# rubocop:disable Metrics/
|
49
|
+
# rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength
|
50
50
|
# @return [Hash]
|
51
51
|
def to_hash
|
52
52
|
hash = {}
|
53
53
|
hash["session_number"] = session_number if session_number
|
54
54
|
hash["session_date"] = session_date.to_s if session_date
|
55
|
-
|
55
|
+
if item_number.any?
|
56
|
+
hash["item_number"] = single_element_array(item_number)
|
57
|
+
end
|
56
58
|
hash["item_name"] = single_element_array(item_name) if item_name.any?
|
57
|
-
|
58
|
-
|
59
|
+
if subitem_name.any?
|
60
|
+
hash["subitem_name"] = single_element_array(subitem_name)
|
61
|
+
end
|
62
|
+
hash["collaborator"] = collaborator if collaborator
|
59
63
|
hash["agenda_id"] = agenda_id if agenda_id
|
60
64
|
hash["item_footnote"] = item_footnote if item_footnote
|
61
65
|
hash
|
62
66
|
end
|
63
|
-
# rubocop:enable Metrics/
|
67
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
68
|
+
|
69
|
+
# @param prefix [String]
|
70
|
+
# @return [String]
|
71
|
+
def to_asciibib(prefix = "")
|
72
|
+
pref = prefix.empty? ? prefix : prefix + "."
|
73
|
+
pref += "session"
|
74
|
+
out = ""
|
75
|
+
out += "#{pref}.session_number:: #{session_number}\n" if session_number
|
76
|
+
out += "#{pref}.session_date:: #{session_date}\n" if session_date
|
77
|
+
item_number.each { |n| out += "#{pref}.item_number:: #{n}\n" }
|
78
|
+
item_name.each { |n| out += "#{pref}.item_name:: #{n}\n" }
|
79
|
+
subitem_name.each { |n| out += "#{pref}.subitem_name:: #{n}\n" }
|
80
|
+
out += "#{pref}.collaborator:: #{collaborator}\n" if collaborator
|
81
|
+
out += "#{pref}.agenda_id:: #{agenda_id}\n" if agenda_id
|
82
|
+
out += "#{pref}.item_footnote:: #{item_footnote}\n" if item_footnote
|
83
|
+
out
|
84
|
+
end
|
85
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
|
64
86
|
end
|
65
87
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module RelatonUn
|
2
2
|
class UnBibliographicItem < RelatonBib::BibliographicItem
|
3
|
+
include RelatonBib
|
4
|
+
|
3
5
|
TYPES = %w[
|
4
6
|
recommendation plenary addendum communication corrigendum reissue agenda
|
5
7
|
budgetary sec-gen-notes expert-report resolution
|
@@ -12,37 +14,69 @@ module RelatonUn
|
|
12
14
|
attr_reader :session
|
13
15
|
|
14
16
|
# @return [String, NilClass]
|
15
|
-
attr_reader :distribution
|
17
|
+
attr_reader :distribution, :job_number
|
18
|
+
|
19
|
+
# @return [Array<String>]
|
20
|
+
attr_reader :submissionlanguage
|
16
21
|
|
17
22
|
# @param session [RelatonUn::Session, NilClass]
|
18
|
-
# @param distribution [String]
|
23
|
+
# @param distribution [String, nil]
|
24
|
+
# @param job_number [String, nil]
|
19
25
|
def initialize(**args)
|
20
26
|
if args[:distribution] && !DISTRIBUTIONS.has_value?(args[:distribution])
|
21
|
-
warn "[relaton-un] WARNING: invalid distribution:
|
27
|
+
warn "[relaton-un] WARNING: invalid distribution: "\
|
28
|
+
"#{args[:distribution]}"
|
22
29
|
end
|
30
|
+
@submissionlanguage = args.delete :submissionlanguage
|
23
31
|
@distribution = args.delete :distribution
|
24
32
|
@session = args.delete :session
|
33
|
+
@job_number = args.delete :job_number
|
25
34
|
super **args
|
26
|
-
# @doctype = args[:doctype]
|
27
35
|
end
|
28
36
|
|
29
|
-
# @param
|
30
|
-
# @
|
31
|
-
|
32
|
-
|
37
|
+
# @param opts [Hash]
|
38
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
39
|
+
# @option opts [Boolean] :bibdata
|
40
|
+
# @option opts [String] :lang language
|
41
|
+
# @return [String] XML
|
42
|
+
def to_xml(**opts) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
43
|
+
super **opts do |b|
|
33
44
|
b.ext do
|
45
|
+
b.doctype doctype if doctype
|
46
|
+
submissionlanguage&.each { |sl| b.submissionlanguage sl }
|
34
47
|
editorialgroup&.to_xml b
|
48
|
+
ics&.each { |i| i.to_xml b }
|
35
49
|
b.distribution distribution if distribution
|
36
50
|
session&.to_xml b if session
|
51
|
+
b.job_number job_number if job_number
|
37
52
|
end
|
38
53
|
end
|
39
54
|
end
|
40
55
|
|
41
56
|
# @return [Hash]
|
42
|
-
def to_hash
|
57
|
+
def to_hash # rubocop:disable Metrics/AbcSize
|
43
58
|
hash = super
|
59
|
+
if submissionlanguage&.any?
|
60
|
+
hash["submissionlanguage"] = single_element_array submissionlanguage
|
61
|
+
end
|
62
|
+
hash["distribution"] = distribution if distribution
|
44
63
|
hash["session"] = session.to_hash if session
|
64
|
+
hash["job_number"] = job_number if job_number
|
45
65
|
hash
|
46
66
|
end
|
67
|
+
|
68
|
+
# @param prefix [String]
|
69
|
+
# @return [String]
|
70
|
+
def to_asciibib(prefix = "") # rubocop:disable Metrics/AbcSize
|
71
|
+
pref = prefix.empty? ? prefix : prefix + "."
|
72
|
+
out = super
|
73
|
+
submissionlanguage.each do |sl|
|
74
|
+
out += "#{pref}submissionlanguage:: #{sl}\n"
|
75
|
+
end
|
76
|
+
out += "#{pref}distribution:: #{distribution}\n" if distribution
|
77
|
+
out += session.to_asciibib prefix if session
|
78
|
+
out += "#{pref}job_number:: #{job_number}\n" if job_number
|
79
|
+
out
|
80
|
+
end
|
47
81
|
end
|
48
82
|
end
|
data/lib/relaton_un/version.rb
CHANGED
@@ -13,28 +13,31 @@ module RelatonUn
|
|
13
13
|
# @return [Hash]
|
14
14
|
def item_data(item)
|
15
15
|
data = super
|
16
|
-
|
17
|
-
data
|
16
|
+
ext = item.at "./ext"
|
17
|
+
return data unless ext
|
18
|
+
|
19
|
+
data[:submissionlanguage] = fetch_submissionlanguage ext
|
20
|
+
data[:session] = fetch_session ext
|
21
|
+
data[:distribution] = ext.at("distribution")&.text
|
22
|
+
data[:job_number] = ext.at("job_number")&.text
|
18
23
|
data
|
19
24
|
end
|
20
25
|
|
21
26
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
22
27
|
|
23
|
-
# @param
|
28
|
+
# @param ext [Nokogiri::XML::Element]
|
24
29
|
# @return [RelatonUn::Session]
|
25
|
-
def fetch_session(
|
26
|
-
session =
|
27
|
-
return unless session
|
28
|
-
|
30
|
+
def fetch_session(ext) # rubocop:disable Metrics/CyclomaticComplexity
|
31
|
+
session = ext.at "./session"
|
29
32
|
RelatonUn::Session.new(
|
30
33
|
session_number: session.at("number")&.text,
|
31
34
|
session_date: session.at("session-date")&.text,
|
32
35
|
item_number: session.xpath("item-number").map(&:text),
|
33
36
|
item_name: session.xpath("item-name").map(&:text),
|
34
37
|
subitem_name: session.xpath("subitem-name").map(&:text),
|
35
|
-
|
38
|
+
collaborator: session.at("collaborator")&.text,
|
36
39
|
agenda_id: session.at("agenda-id")&.text,
|
37
|
-
item_footnote: session.at("item-footnote")&.text
|
40
|
+
item_footnote: session.at("item-footnote")&.text
|
38
41
|
)
|
39
42
|
end
|
40
43
|
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
@@ -45,9 +48,15 @@ module RelatonUn
|
|
45
48
|
eg = ext.at("./editorialgroup")
|
46
49
|
return unless eg
|
47
50
|
|
48
|
-
committee = eg
|
51
|
+
committee = eg.xpath("committee").map &:text
|
49
52
|
EditorialGroup.new committee
|
50
53
|
end
|
54
|
+
|
55
|
+
# @param ext [Nokogiri::XML::Element]
|
56
|
+
# @return [Array<String>]
|
57
|
+
def fetch_submissionlanguage(ext)
|
58
|
+
ext.xpath("./submissionlanguage").map(&:text)
|
59
|
+
end
|
51
60
|
end
|
52
61
|
end
|
53
62
|
end
|
data/relaton_un.gemspec
CHANGED
@@ -43,7 +43,7 @@ Gem::Specification.new do |spec|
|
|
43
43
|
|
44
44
|
spec.add_dependency "faraday"
|
45
45
|
spec.add_dependency "http-cookie"
|
46
|
-
spec.add_dependency "relaton-bib", "~> 1.
|
46
|
+
spec.add_dependency "relaton-bib", "~> 1.5.0"
|
47
47
|
spec.add_dependency "unf_ext", ">= 0.0.7.7"
|
48
48
|
end
|
49
49
|
# rubocop:enable Metrics/BlockLength
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relaton-un
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: debase
|
@@ -156,14 +156,14 @@ dependencies:
|
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: 1.
|
159
|
+
version: 1.5.0
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: 1.
|
166
|
+
version: 1.5.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: unf_ext
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -223,7 +223,7 @@ licenses:
|
|
223
223
|
metadata:
|
224
224
|
homepage_uri: https://github.com/relaton/relaton-un
|
225
225
|
source_code_uri: https://github.com/relaton/relaton-un
|
226
|
-
post_install_message:
|
226
|
+
post_install_message:
|
227
227
|
rdoc_options: []
|
228
228
|
require_paths:
|
229
229
|
- lib
|
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
239
|
version: '0'
|
240
240
|
requirements: []
|
241
241
|
rubygems_version: 3.0.6
|
242
|
-
signing_key:
|
242
|
+
signing_key:
|
243
243
|
specification_version: 4
|
244
244
|
summary: 'RelatonIso: retrieve CC Standards for bibliographic use using the IsoBibliographicItem
|
245
245
|
model'
|