isodoc 1.5.0 → 1.5.5

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: 46206b47756f66c1927ca1810020fbe63141a27f6ad000e95b7938f5b2f8cdcc
4
- data.tar.gz: bbce350ccfa6c97bff0c45cccdc15febde0a2c17b1e415fb8132f205ba202d85
3
+ metadata.gz: 8bdc454593acf1b0a4d0a9cc04a6338de5848e3e28b77a3fc22126d8c445f07b
4
+ data.tar.gz: d4e1a7f0db4f38fdb76eaae029a26fda9d04bb43a5d25d03ad82e7956e247c5b
5
5
  SHA512:
6
- metadata.gz: 7679fe14d35c348ffc9fcda332f27bf39e898337ae5c0cd7a8638e74f1d26a77ca528cad7d210b82f546336b80e0115c4131c49d9cec1ae82a8174d34002ead3
7
- data.tar.gz: 20ca1c4d733511fa7f5dc5fe28295c754803b20167e3ae8d39209b1c2d3f63fc064308668a7c23cf834a6a1d93e46ec486931d2c189c0e47210507b32c0291a2
6
+ metadata.gz: fae8cdbb24965be799d0e8bf084dc56c7af1cd303981a3b151f039bc51184dec5792e6537641fad9f0dd5b7098262d961277a5f10a9eb0673e0739775baaaf74
7
+ data.tar.gz: e300abaa10548c18961d1aac9ab111c6cc392821d28d29c6083c2daab4dcef2a7b245858689995f7f0adb6afad35452707a4dbaaf60b63b463bf4f05305a4298
@@ -16,17 +16,17 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '2.6', '2.5', '2.4' ]
19
+ ruby: [ '2.7', '2.6', '2.5', '2.4' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
22
  include:
23
- - ruby: '2.7'
23
+ - ruby: '3.0'
24
24
  os: 'ubuntu-latest'
25
25
  experimental: true
26
- - ruby: '2.7'
26
+ - ruby: '3.0'
27
27
  os: 'windows-latest'
28
28
  experimental: true
29
- - ruby: '2.7'
29
+ - ruby: '3.0'
30
30
  os: 'macos-latest'
31
31
  experimental: true
32
32
  steps:
@@ -35,49 +35,19 @@ jobs:
35
35
  - uses: ruby/setup-ruby@v1
36
36
  with:
37
37
  ruby-version: ${{ matrix.ruby }}
38
+ bundler-cache: true
38
39
 
39
- - uses: actions/cache@v2
40
- with:
41
- path: vendor/bundle
42
- key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
43
- restore-keys: bundle-${{ matrix.os }}-${{ matrix.ruby }}
44
-
45
- - run: bundle config set path 'vendor/bundle'
46
-
47
- - run: bundle install --jobs 4 --retry 3
48
-
49
- - name: Install Inkscape macOS
50
- if: matrix.os == 'macos-latest'
51
- run: |
52
- brew cask install inkscape
53
- inkscape --version
54
-
55
- - name: Install Inkscape Ubuntu
56
- if: matrix.os == 'ubuntu-latest'
57
- run: |
58
- sudo add-apt-repository ppa:inkscape.dev/stable
59
- sudo apt update
60
- sudo apt install inkscape
61
- inkscape --version
62
-
63
- - name: Install Inkscape Windows
64
- if: matrix.os == 'windows-latest'
65
- run: |
66
- choco install --no-progress -y inkscape
67
- inkscape --version
40
+ - uses: metanorma/metanorma-build-scripts/inkscape-setup-action@master
68
41
 
69
42
  - run: bundle exec rake
70
43
 
71
44
  tests-passed:
72
45
  needs: rake
73
46
  runs-on: ubuntu-latest
74
- continue-on-error: true
75
47
  steps:
76
- - name: Trigger tests passed event
77
- uses: Sibz/github-status-action@v1
48
+ - uses: peter-evans/repository-dispatch@v1
78
49
  with:
79
- authToken: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
80
- context: 'tests-passed-successfully'
81
- description: 'Tests passed successfully'
82
- state: 'success'
83
- sha: ${{ github.event.pull_request.head.sha || github.sha }}
50
+ token: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
51
+ repository: ${{ github.repository }}
52
+ event-type: notify
53
+ client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
data/.rubocop.yml CHANGED
@@ -1,10 +1,14 @@
1
1
  # This project follows the Ribose OSS style guide.
2
2
  # https://github.com/riboseinc/oss-guides
3
3
  # All project-specific additions and overrides should be specified in this file.
4
-
5
4
  inherit_from:
6
5
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
6
+
7
+ # local repo-specific modifications
8
+
7
9
  AllCops:
8
- TargetRubyVersion: 2.3
10
+ DisplayCopNames: false
11
+ StyleGuideCopsOnly: false
12
+ TargetRubyVersion: 2.4
9
13
  Rails:
10
14
  Enabled: true
data/isodoc.gemspec CHANGED
@@ -35,7 +35,7 @@ Gem::Specification.new do |spec|
35
35
  spec.add_dependency "uuidtools"
36
36
  spec.add_dependency "html2doc", "~> 1.0.0"
37
37
  spec.add_dependency "liquid", "~> 4"
38
- spec.add_dependency "twitter_cldr"
38
+ spec.add_dependency "twitter_cldr", ">= 6.6.0"
39
39
  spec.add_dependency "roman-numerals"
40
40
  spec.add_dependency "metanorma", "~> 1.2.0"
41
41
  spec.add_dependency "relaton-cli"
@@ -47,7 +47,8 @@ Gem::Specification.new do |spec|
47
47
  spec.add_development_dependency "guard", "~> 2.14"
48
48
  spec.add_development_dependency "guard-rspec", "~> 4.7"
49
49
  spec.add_development_dependency "rspec", "~> 3.6"
50
- spec.add_development_dependency "rubocop", "= 0.54.0"
50
+ spec.add_development_dependency "rubocop", "~> 1.5.2"
51
51
  spec.add_development_dependency "simplecov", "~> 0.15"
52
52
  spec.add_development_dependency "timecop", "~> 0.9"
53
+ spec.add_development_dependency "rexml"
53
54
  end
@@ -12,7 +12,9 @@ module IsoDoc
12
12
  attr_accessor :meta
13
13
 
14
14
  # htmlstylesheet: Generic stylesheet for HTML
15
+ # htmlstylesheet_override: Override stylesheet for HTML
15
16
  # wordstylesheet: Generic stylesheet for Word
17
+ # wordstylesheet_override: Override stylesheet for Word
16
18
  # standardsheet: Stylesheet specific to Standard
17
19
  # header: Header file for Word
18
20
  # htmlcoverpage: Cover page for HTML
@@ -48,6 +50,8 @@ module IsoDoc
48
50
  @tempfile_cache = []
49
51
  @htmlstylesheet_name = options[:htmlstylesheet]
50
52
  @wordstylesheet_name = options[:wordstylesheet]
53
+ @htmlstylesheet_override_name = options[:htmlstylesheet_override]
54
+ @wordstylesheet_override_name = options[:wordstylesheet_override]
51
55
  @standardstylesheet_name = options[:standardstylesheet]
52
56
  @header = options[:header]
53
57
  @htmlcoverpage = options[:htmlcoverpage]
data/lib/isodoc/css.rb CHANGED
@@ -19,6 +19,12 @@ module IsoDoc
19
19
  @htmlstylesheet = generate_css(@htmlstylesheet_name, true)
20
20
  @wordstylesheet = generate_css(@wordstylesheet_name, false)
21
21
  @standardstylesheet = generate_css(@standardstylesheet_name, false)
22
+ if @htmlstylesheet_override_name
23
+ @htmlstylesheet_override = File.open(@htmlstylesheet_override_name)
24
+ end
25
+ if @wordstylesheet_override_name
26
+ @wordstylesheet_override = File.open(@wordstylesheet_override_name)
27
+ end
22
28
  end
23
29
 
24
30
  def default_fonts(_options)
@@ -77,7 +83,6 @@ module IsoDoc
77
83
  # stripwordcss if HTML stylesheet, !stripwordcss if DOC stylesheet
78
84
  def generate_css(filename, stripwordcss)
79
85
  return nil if filename.nil?
80
-
81
86
  filename = precompiled_style_or_original(filename)
82
87
  stylesheet = File.read(filename, encoding: 'UTF-8')
83
88
  stylesheet = populate_template(stylesheet, :word)
@@ -205,5 +205,9 @@ module IsoDoc::Function
205
205
  !(node["format"].split(/,/).include? @format.to_s)
206
206
  out.passthrough node.text
207
207
  end
208
+
209
+ def svg_parse(node, out)
210
+ out << node.to_xml
211
+ end
208
212
  end
209
213
  end
@@ -39,7 +39,7 @@ module IsoDoc::Function
39
39
  "uri[@type = 'citation']"))
40
40
  return href unless url
41
41
  href = suffix_url(url.text)
42
- anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text
42
+ anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text&.strip
43
43
  anchor and href += "##{anchor}"
44
44
  href
45
45
  end
@@ -87,7 +87,7 @@ module IsoDoc::Function
87
87
 
88
88
  def omit_docid_prefix(prefix)
89
89
  return true if prefix.nil? || prefix.empty?
90
- return %w(ISO IEC ITU W3C metanorma).include? prefix
90
+ return %w(ISO IEC IEV ITU W3C csd metanorma rfc-anchor).include? prefix
91
91
  end
92
92
 
93
93
  def date_note_process(b, ref)
@@ -225,6 +225,7 @@ module IsoDoc::Function
225
225
  when "passthrough" then passthrough_parse(node, out)
226
226
  when "amend" then amend_parse(node, out)
227
227
  when "tab" then clausedelimspace(out) # in Presentation XML only
228
+ when "svg" then svg_parse(node, out) # introduced in Presentation XML only
228
229
  else
229
230
  error_parse(node, out)
230
231
  end
@@ -44,12 +44,14 @@ module IsoDoc::HtmlFunction
44
44
  IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert
45
45
  end
46
46
 
47
- def htmlstylesheet
48
- @htmlstylesheet.open
49
- stylesheet = @htmlstylesheet.read
47
+ def htmlstylesheet(file)
48
+ return if file.nil?
49
+ file.open if file.is_a?(Tempfile)
50
+ stylesheet = file.read
50
51
  xml = Nokogiri::XML("<style/>")
51
52
  xml.children.first << Nokogiri::XML::Comment.new(xml, "\n#{stylesheet}\n")
52
- @htmlstylesheet.close!
53
+ file.close
54
+ file.unlink if file.is_a?(Tempfile)
53
55
  xml.root.to_s
54
56
  end
55
57
 
@@ -57,7 +59,8 @@ module IsoDoc::HtmlFunction
57
59
  return docxml unless @htmlstylesheet
58
60
  title = docxml.at("//*[local-name() = 'head']/*[local-name() = 'title']")
59
61
  head = docxml.at("//*[local-name() = 'head']")
60
- head << htmlstylesheet
62
+ head << htmlstylesheet(@htmlstylesheet)
63
+ s = htmlstylesheet(@htmlstylesheet_override) and head << s
61
64
  docxml
62
65
  end
63
66
 
@@ -1,3 +1,5 @@
1
+ require "base64"
2
+
1
3
  module IsoDoc
2
4
  class PresentationXMLConvert < ::IsoDoc::Convert
3
5
  def lower2cap(s)
@@ -6,14 +8,24 @@ module IsoDoc
6
8
  end
7
9
 
8
10
  def figure(docxml)
9
- docxml.xpath(ns("//figure")).each do |f|
10
- figure1(f)
11
+ docxml.xpath(ns("//image")).each { |f| svg_extract(f) }
12
+ docxml.xpath(ns("//figure")).each { |f| figure1(f) }
13
+ docxml.xpath(ns("//svgmap")).each do |s|
14
+ if f = s.at(ns("./figure")) then s.replace(f)
15
+ else
16
+ s.remove
17
+ end
11
18
  end
12
19
  end
13
20
 
21
+ def svg_extract(f)
22
+ return unless %r{^data:image/svg\+xml;base64,}.match(f["src"])
23
+ svg = Base64.strict_decode64(f["src"].sub(%r{^data:image/svg\+xml;base64,}, ""))
24
+ f.replace(svg.sub(/<\?xml[^>]*>/, ""))
25
+ end
26
+
14
27
  def figure1(f)
15
- return sourcecode1(f) if f["class"] == "pseudocode" ||
16
- f["type"] == "pseudocode"
28
+ return sourcecode1(f) if f["class"] == "pseudocode" || f["type"] == "pseudocode"
17
29
  return if labelled_ancestor(f) && f.ancestors("figure").empty?
18
30
  return if f.at(ns("./figure")) and !f.at(ns("./name"))
19
31
  lbl = @xrefs.anchor(f['id'], :label, false) or return
@@ -1,4 +1,5 @@
1
1
  require "twitter_cldr"
2
+ require "bigdecimal"
2
3
 
3
4
  module IsoDoc
4
5
  class PresentationXMLConvert < ::IsoDoc::Convert
@@ -10,8 +11,7 @@ module IsoDoc
10
11
  if node["citeas"].nil? && node["bibitemid"]
11
12
  return @xrefs.anchor(node["bibitemid"] ,:xref) || "???"
12
13
  elsif node["target"] && node["droploc"]
13
- return @xrefs.anchor(node["target"], :value) ||
14
- @xrefs.anchor(node["target"], :label) ||
14
+ return @xrefs.anchor(node["target"], :value) || @xrefs.anchor(node["target"], :label) ||
15
15
  @xrefs.anchor(node["target"], :xref) || "???"
16
16
  elsif node["target"] && !/.#./.match(node["target"])
17
17
  linkend = anchor_linkend1(node)
@@ -22,9 +22,8 @@ module IsoDoc
22
22
  def anchor_linkend1(node)
23
23
  linkend = @xrefs.anchor(node["target"], :xref)
24
24
  container = @xrefs.anchor(node["target"], :container, false)
25
- (container && get_note_container_id(node) != container &&
26
- @xrefs.get[node["target"]]) &&
27
- linkend = prefix_container(container, linkend, node["target"])
25
+ (container && get_note_container_id(node) != container && @xrefs.get[node["target"]]) &&
26
+ linkend = prefix_container(container, linkend, node["target"])
28
27
  capitalise_xref(node, linkend)
29
28
  end
30
29
 
@@ -35,13 +34,11 @@ module IsoDoc
35
34
  return linkend if linkend[0,1].match(/\p{Upper}/)
36
35
  prec = nearest_block_parent(node).xpath("./descendant-or-self::text()") &
37
36
  node.xpath("./preceding::text()")
38
- (prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map { |p| p.text }.join)) ?
39
- linkend&.capitalize : linkend
37
+ (prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map { |p| p.text }.join)) ? linkend&.capitalize : linkend
40
38
  end
41
39
 
42
40
  def nearest_block_parent(node)
43
- until %w(p title td th name formula
44
- li dt dd sourcecode pre).include?(node.name)
41
+ until %w(p title td th name formula li dt dd sourcecode pre).include?(node.name)
45
42
  node = node.parent
46
43
  end
47
44
  node
@@ -89,8 +86,7 @@ module IsoDoc
89
86
  def eref_localities0(r, i, target, delim)
90
87
  if r["type"] == "whole" then l10n("#{delim} #{@i18n.wholeoftext}")
91
88
  else
92
- eref_localities1(target, r["type"], r.at(ns("./referenceFrom")),
93
- r.at(ns("./referenceTo")), delim, @lang)
89
+ eref_localities1(target, r["type"], r.at(ns("./referenceFrom")), r.at(ns("./referenceTo")), delim, @lang)
94
90
  end
95
91
  end
96
92
 
@@ -106,8 +102,7 @@ module IsoDoc
106
102
  # TODO: move to localization file
107
103
  def eref_localities1(target, type, from, to, delim, lang = "en")
108
104
  return "" if type == "anchor"
109
- lang == "zh" and
110
- return l10n(eref_localities1_zh(target, type, from, to, delim))
105
+ lang == "zh" and return l10n(eref_localities1_zh(target, type, from, to, delim))
111
106
  ret = delim
112
107
  loc = @i18n.locality[type] || type.sub(/^locality:/, "").capitalize
113
108
  ret += " #{loc}"
@@ -163,23 +158,22 @@ module IsoDoc
163
158
  # TwitterCldr::DataReaders::NumberDataReader.new(locale).symbols
164
159
  def localize_maths(f, locale)
165
160
  f.xpath(".//m:mn", MATHML).each do |x|
166
- num = /\./.match(x.text) ? x.text.to_f : x.text.to_i
161
+ num = BigDecimal(x.text)
167
162
  precision = /\./.match(x.text) ? x.text.sub(/^.*\./, "").size : 0
168
163
  x.children = localized_number(num, locale, precision)
169
164
  end
170
165
  end
171
166
 
172
- # By itself twiiter cldr does not support fraction part digits grouping
167
+ # By itself twitter-cldr does not support fraction part digits grouping
173
168
  # and custom delimeter, will decorate fraction part manually
174
169
  def localized_number(num, locale, precision)
175
- localized = precision == 0 ? num.localize(locale).to_s :
170
+ localized = (precision == 0) ? num.localize(locale).to_s :
176
171
  num.localize(locale).to_decimal.to_s(:precision => precision)
177
172
  twitter_cldr_reader_symbols = twitter_cldr_reader(locale)
178
173
  return localized unless twitter_cldr_reader_symbols[:decimal]
179
174
  integer, fraction = localized.split(twitter_cldr_reader_symbols[:decimal])
180
175
  return localized if fraction.nil? || fraction.length.zero?
181
- [integer, decorate_fraction_part(fraction, locale)].
182
- join(twitter_cldr_reader_symbols[:decimal])
176
+ [integer, decorate_fraction_part(fraction, locale)].join(twitter_cldr_reader_symbols[:decimal])
183
177
  end
184
178
 
185
179
  def decorate_fraction_part(fract, locale)
@@ -229,8 +223,7 @@ module IsoDoc
229
223
  end
230
224
 
231
225
  def variant1(node)
232
- if (!node["lang"] || node["lang"] == @lang) &&
233
- (!node["script"] || node["script"] == @script)
226
+ if (!node["lang"] || node["lang"] == @lang) && (!node["script"] || node["script"] == @script)
234
227
  elsif found_matching_variant_sibling(node)
235
228
  node["remove"] = "true"
236
229
  else
@@ -243,8 +236,7 @@ module IsoDoc
243
236
  foll = node.xpath("./following-sibling::xmlns:variant")
244
237
  found = false
245
238
  (prev + foll).each do |n|
246
- found = true if n["lang"] == @lang &&
247
- (!n["script"] || n["script"] == @script)
239
+ found = true if n["lang"] == @lang && (!n["script"] || n["script"] == @script)
248
240
  end
249
241
  found
250
242
  end
@@ -47,7 +47,7 @@ module IsoDoc
47
47
  end
48
48
 
49
49
  def index(docxml)
50
- docxml.xpath(ns("//index | //index-xref")).each do |f|
50
+ docxml.xpath(ns("//index | //index-xref | //indexsect")).each do |f|
51
51
  f.remove
52
52
  end
53
53
  end
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "1.5.0".freeze
2
+ VERSION = "1.5.5".freeze
3
3
  end
@@ -22,6 +22,12 @@ module IsoDoc::WordFunction
22
22
  end
23
23
  end
24
24
 
25
+ def svg_parse(node, out)
26
+ svg = Base64.strict_encode64(node.to_xml)
27
+ r = node.replace("<img src='data:image/svg+xml;base64,#{svg}' mimetype='image/svg+xml'/>").first
28
+ image_parse(r, out, nil)
29
+ end
30
+
25
31
  def imgsrc(node)
26
32
  ret = svg_to_emf(node) and return ret
27
33
  return node["src"] unless %r{^data:}.match node["src"]
@@ -37,17 +37,27 @@ xmlns:m="http://schemas.microsoft.com/office/2004/12/omml">
37
37
 
38
38
  def toWord(result, filename, dir, header)
39
39
  result = from_xhtml(word_cleanup(to_xhtml(result)))
40
- unless @landscapestyle.empty?
41
- @wordstylesheet&.open
42
- @wordstylesheet&.write(@landscapestyle)
43
- @wordstylesheet&.close
44
- end
40
+ @wordstylesheet = wordstylesheet_update
45
41
  Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet&.path,
46
42
  header_file: header&.path, dir: dir,
47
43
  asciimathdelims: [@openmathdelim, @closemathdelim],
48
44
  liststyles: { ul: @ulstyle, ol: @olstyle })
49
45
  header&.unlink
50
- @wordstylesheet&.unlink
46
+ @wordstylesheet&.unlink if @wordstylesheet&.is_a?(Tempfile)
47
+ end
48
+
49
+ def wordstylesheet_update()
50
+ return if @wordstylesheet.nil?
51
+ f = File.open(@wordstylesheet.path, "a")
52
+ @landscapestyle.empty? or f.write(@landscapestyle)
53
+ if @wordstylesheet_override && @wordstylesheet
54
+ f.write(@wordstylesheet_override.read)
55
+ @wordstylesheet_override.close
56
+ elsif @wordstylesheet_override && !@wordstylesheet
57
+ @wordstylesheet = @wordstylesheet_override
58
+ end
59
+ f.close
60
+ @wordstylesheet
51
61
  end
52
62
 
53
63
  def word_admonition_images(docxml)