metanorma-standoc 0.0.1

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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +4 -0
  3. data/.gitignore +11 -0
  4. data/.hound.yml +3 -0
  5. data/.oss-guides.rubocop.yml +1077 -0
  6. data/.rubocop.ribose.yml +66 -0
  7. data/.rubocop.tb.yml +650 -0
  8. data/.rubocop.yml +15 -0
  9. data/.travis.yml +21 -0
  10. data/CODE_OF_CONDUCT.md +46 -0
  11. data/Gemfile +7 -0
  12. data/LICENSE +25 -0
  13. data/Makefile +39 -0
  14. data/README.adoc +9 -0
  15. data/Rakefile +6 -0
  16. data/bin/rspec +18 -0
  17. data/docs/customisation.adoc +178 -0
  18. data/docs/guidance.adoc +436 -0
  19. data/docs/htmloutput.adoc +115 -0
  20. data/docs/quickstart.adoc +375 -0
  21. data/lib/asciidoctor/standoc/base.rb +198 -0
  22. data/lib/asciidoctor/standoc/biblio.rng +836 -0
  23. data/lib/asciidoctor/standoc/blocks.rb +190 -0
  24. data/lib/asciidoctor/standoc/cleanup.rb +247 -0
  25. data/lib/asciidoctor/standoc/cleanup_block.rb +193 -0
  26. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +78 -0
  27. data/lib/asciidoctor/standoc/cleanup_ref.rb +125 -0
  28. data/lib/asciidoctor/standoc/converter.rb +55 -0
  29. data/lib/asciidoctor/standoc/front.rb +121 -0
  30. data/lib/asciidoctor/standoc/inline.rb +134 -0
  31. data/lib/asciidoctor/standoc/isodoc.rng +1059 -0
  32. data/lib/asciidoctor/standoc/lists.rb +87 -0
  33. data/lib/asciidoctor/standoc/macros.rb +95 -0
  34. data/lib/asciidoctor/standoc/ref.rb +187 -0
  35. data/lib/asciidoctor/standoc/section.rb +159 -0
  36. data/lib/asciidoctor/standoc/table.rb +61 -0
  37. data/lib/asciidoctor/standoc/utils.rb +121 -0
  38. data/lib/asciidoctor/standoc/validate.rb +65 -0
  39. data/lib/asciidoctor/standoc/validate_section.rb +42 -0
  40. data/lib/asciidoctor/standoc/version.rb +5 -0
  41. data/lib/metanorma-standoc.rb +9 -0
  42. data/lib/metanorma/standoc.rb +7 -0
  43. data/lib/metanorma/standoc/processor.rb +40 -0
  44. data/metanorma-standoc.gemspec +47 -0
  45. data/spec/asciidoctor-standoc/base_spec.rb +271 -0
  46. data/spec/asciidoctor-standoc/blocks_spec.rb +469 -0
  47. data/spec/asciidoctor-standoc/cleanup_spec.rb +760 -0
  48. data/spec/asciidoctor-standoc/inline_spec.rb +162 -0
  49. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +332 -0
  50. data/spec/asciidoctor-standoc/lists_spec.rb +190 -0
  51. data/spec/asciidoctor-standoc/macros_spec.rb +111 -0
  52. data/spec/asciidoctor-standoc/refs_spec.rb +606 -0
  53. data/spec/asciidoctor-standoc/section_spec.rb +310 -0
  54. data/spec/asciidoctor-standoc/table_spec.rb +307 -0
  55. data/spec/asciidoctor-standoc/validate_spec.rb +133 -0
  56. data/spec/assets/header.html +7 -0
  57. data/spec/assets/html.css +2 -0
  58. data/spec/assets/htmlcover.html +4 -0
  59. data/spec/assets/htmlintro.html +5 -0
  60. data/spec/assets/i18n.yaml +2 -0
  61. data/spec/assets/iso.headless.html +33 -0
  62. data/spec/assets/iso.xml +8 -0
  63. data/spec/assets/rice_image1.png +0 -0
  64. data/spec/assets/scripts.html +3 -0
  65. data/spec/assets/std.css +2 -0
  66. data/spec/assets/word.css +2 -0
  67. data/spec/assets/wordcover.html +3 -0
  68. data/spec/assets/wordintro.html +4 -0
  69. data/spec/examples/103_01_02.html +247 -0
  70. data/spec/examples/english.yaml +69 -0
  71. data/spec/examples/iso_123_.xml +45 -0
  72. data/spec/examples/iso_123_all_parts.xml +45 -0
  73. data/spec/examples/iso_123_no_year_note.xml +46 -0
  74. data/spec/examples/iso_124_.xml +41 -0
  75. data/spec/examples/iso_216_.xml +47 -0
  76. data/spec/examples/iso_iec_12382_.xml +48 -0
  77. data/spec/examples/rice.adoc +715 -0
  78. data/spec/examples/rice.preview.html +1877 -0
  79. data/spec/examples/rice.sh +4 -0
  80. data/spec/examples/rice_images/rice_image1.png +0 -0
  81. data/spec/examples/rice_images/rice_image2.png +0 -0
  82. data/spec/examples/rice_images/rice_image3_1.png +0 -0
  83. data/spec/examples/rice_images/rice_image3_2.png +0 -0
  84. data/spec/examples/rice_images/rice_image3_3.png +0 -0
  85. data/spec/metanorma/processor_spec.rb +70 -0
  86. data/spec/spec_helper.rb +198 -0
  87. metadata +370 -0
@@ -0,0 +1,61 @@
1
+ module Asciidoctor
2
+ module Standoc
3
+ module Table
4
+ def table_attrs(node)
5
+ { id: Utils::anchor_or_uuid(node),
6
+ headerrows: node.attr("headerrows") }
7
+ end
8
+
9
+ def table(node)
10
+ @table_fn_number = "a"
11
+ noko do |xml|
12
+ xml.table **attr_code(table_attrs(node)) do |xml_table|
13
+ table_name(node, xml_table)
14
+ %i(head body foot).reject do |tblsec|
15
+ node.rows[tblsec].empty?
16
+ end
17
+ table_head_body_and_foot node, xml_table
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def table_name(node, xml_table)
25
+ if node.title?
26
+ xml_table.name node.title
27
+ end
28
+ end
29
+
30
+ def table_cell1(cell, thd)
31
+ if cell.style == :asciidoc
32
+ thd << cell.content
33
+ else
34
+ thd << cell.text
35
+ end
36
+ end
37
+
38
+ def table_cell(c, xml_tr, tblsec)
39
+ cell_attributes = { id: c.id, colspan: c.colspan,
40
+ rowspan: c.rowspan, align: c.attr("halign") }
41
+ cell_tag = "td"
42
+ cell_tag = "th" if tblsec == :head || c.style == :header
43
+ xml_tr.send cell_tag, **attr_code(cell_attributes) do |thd|
44
+ table_cell1(c, thd)
45
+ end
46
+ end
47
+
48
+ def table_head_body_and_foot(node, xml)
49
+ %i(head body foot).reject { |s| node.rows[s].empty? }.each do |s|
50
+ xml.send "t#{s}" do |xml_tblsec|
51
+ node.rows[s].each do |row|
52
+ xml_tblsec.tr do |xml_tr|
53
+ row.each { |cell| table_cell(cell, xml_tr, s) }
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,121 @@
1
+ require "date"
2
+ require "nokogiri"
3
+ require "htmlentities"
4
+ require "json"
5
+ require "pathname"
6
+ require "open-uri"
7
+ require "uuidtools"
8
+ require "pp"
9
+
10
+ module Asciidoctor
11
+ module Standoc
12
+ module Utils
13
+ class << self
14
+ def anchor_or_uuid(node = nil)
15
+ uuid = UUIDTools::UUID.random_create
16
+ node.nil? || node.id.nil? || node.id.empty? ? "_" + uuid : node.id
17
+ end
18
+
19
+ def current_location(n)
20
+ return "Line #{n.lineno}" if n.respond_to?(:lineno) &&
21
+ !n.lineno.nil? && !n.lineno.empty?
22
+ return "Line #{n.line}" if n.respond_to?(:line) &&
23
+ !n.line.nil?
24
+ return "ID #{n.id}" if n.respond_to?(:id) && !n.id.nil?
25
+ while !n.nil? &&
26
+ (!n.respond_to?(:level) || n.level.positive?) &&
27
+ (!n.respond_to?(:context) || n.context != :section)
28
+ n = n.parent
29
+ return "Section: #{n.title}" if n&.respond_to?(:context) &&
30
+ n&.context == :section
31
+ end
32
+ "??"
33
+ end
34
+
35
+ def warning(node, msg, text)
36
+ return if @novalid
37
+ warntext = "asciidoctor: WARNING"\
38
+ "(#{current_location(node)}): #{msg}"
39
+ warntext += ": #{text}" if text
40
+ warn warntext
41
+ end
42
+
43
+ def flatten_rawtext_lines(node, result)
44
+ node.lines.each do |x|
45
+ if node.respond_to?(:context) && (node.context == :literal ||
46
+ node.context == :listing)
47
+ result << x.gsub(/</, "&lt;").gsub(/>/, "&gt;")
48
+ else
49
+ # strip not only HTML <tag>, and Asciidoc xrefs <<xref>>
50
+ result << x.gsub(/<[^>]*>+/, "")
51
+ end
52
+ end
53
+ result
54
+ end
55
+
56
+ # if node contains blocks, flatten them into a single line;
57
+ # and extract only raw text
58
+ def flatten_rawtext(node)
59
+ result = []
60
+ if node.respond_to?(:blocks) && node.blocks?
61
+ node.blocks.each { |b| result << flatten_rawtext(b) }
62
+ elsif node.respond_to?(:lines)
63
+ result = flatten_rawtext_lines(node, result)
64
+ elsif node.respond_to?(:text)
65
+ result << node.text.gsub(/<[^>]*>+/, "")
66
+ else
67
+ result << node.content.gsub(/<[^>]*>+/, "")
68
+ end
69
+ result.reject(&:empty?)
70
+ end
71
+ end
72
+
73
+ def convert(node, transform = nil, opts = {})
74
+ transform ||= node.node_name
75
+ opts.empty? ? (send transform, node) : (send transform, node, opts)
76
+ end
77
+
78
+ def document_ns_attributes(_doc)
79
+ nil
80
+ end
81
+
82
+ NOKOHEAD = <<~HERE.freeze
83
+ <!DOCTYPE html SYSTEM
84
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
85
+ <html xmlns="http://www.w3.org/1999/xhtml">
86
+ <head> <title></title> <meta charset="UTF-8" /> </head>
87
+ <body> </body> </html>
88
+ HERE
89
+
90
+ # block for processing XML document fragments as XHTML,
91
+ # to allow for HTMLentities
92
+ def noko(&block)
93
+ doc = ::Nokogiri::XML.parse(NOKOHEAD)
94
+ fragment = doc.fragment("")
95
+ ::Nokogiri::XML::Builder.with fragment, &block
96
+ fragment.to_xml(encoding: "US-ASCII").lines.map do |l|
97
+ l.gsub(/\s*\n/, "")
98
+ end
99
+ end
100
+
101
+ def attr_code(attributes)
102
+ attributes = attributes.reject { |_, val| val.nil? }.map
103
+ attributes.map do |k, v|
104
+ [k, (v.is_a? String) ? HTMLEntities.new.decode(v) : v]
105
+ end.to_h
106
+ end
107
+
108
+ # if the contents of node are blocks, output them to out;
109
+ # else, wrap them in <p>
110
+ def wrap_in_para(node, out)
111
+ if node.blocks? then out << node.content
112
+ else
113
+ out.p { |p| p << node.content }
114
+ end
115
+ end
116
+
117
+ SUBCLAUSE_XPATH = "//clause[ancestor::clause or ancestor::annex or "\
118
+ "ancestor::introduction]".freeze
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,65 @@
1
+ require "asciidoctor/standoc/utils"
2
+ require_relative "./validate_section.rb"
3
+ require "nokogiri"
4
+ require "jing"
5
+ require "pp"
6
+ require "iev"
7
+
8
+ module Asciidoctor
9
+ module Standoc
10
+ module Validate
11
+
12
+ SOURCELOCALITY = ".//locality[@type = 'clause']/referenceFrom".freeze
13
+
14
+ def iev_validate(xmldoc)
15
+ xmldoc.xpath("//term").each do |t|
16
+ /^IEV($|\s|:)/.match(t&.at(".//origin/@citeas")&.text) or next
17
+ pref = t.xpath("./preferred").inject([]) { |m, x| m << x&.text&.downcase }
18
+ locality = t.xpath(SOURCELOCALITY)&.text or next
19
+ iev = @iev.fetch(locality, xmldoc&.at("//language")&.text || "en") or next
20
+ pref.include?(iev.downcase) or
21
+ warn %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}")
22
+ end
23
+ end
24
+
25
+ def content_validate(doc)
26
+ section_validate(doc)
27
+ iev_validate(doc.root)
28
+ end
29
+
30
+ def schema_validate(doc, filename)
31
+ File.open(".tmp.xml", "w:UTF-8") { |f| f.write(doc.to_xml) }
32
+ begin
33
+ errors = Jing.new(filename).validate(".tmp.xml")
34
+ rescue Jing::Error => e
35
+ abort "what what what #{e}"
36
+ end
37
+ warn "Valid!" if errors.none?
38
+ errors.each do |error|
39
+ warn "#{error[:message]} @ #{error[:line]}:#{error[:column]}"
40
+ end
41
+ end
42
+
43
+ # RelaxNG cannot cope well with wildcard attributes. So we strip
44
+ # any attributes from FormattedString instances (which can contain
45
+ # xs:any markup, and are signalled with @format) before validation.
46
+ def formattedstr_strip(doc)
47
+ doc.xpath("//*[@format]").each do |n|
48
+ n.elements.each do |e|
49
+ e.traverse do |e1|
50
+ next unless e1.element?
51
+ e1.each { |k, _v| e.delete(k) }
52
+ end
53
+ end
54
+ end
55
+ doc
56
+ end
57
+
58
+ def validate(doc)
59
+ content_validate(doc)
60
+ schema_validate(formattedstr_strip(doc.dup),
61
+ File.join(File.dirname(__FILE__), "isodoc.rng"))
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,42 @@
1
+ require "nokogiri"
2
+
3
+ module Asciidoctor
4
+ module Standoc
5
+ module Validate
6
+ def section_validate(doc)
7
+ sourcecode_style(doc.root)
8
+ asset_style(doc.root)
9
+ end
10
+
11
+ def sourcecode_style(root)
12
+ root.xpath("//sourcecode").each do |x|
13
+ callouts = x.elements.select { |e| e.name == "callout" }
14
+ annotations = x.elements.select { |e| e.name == "annotation" }
15
+ if callouts.size != annotations.size
16
+ warn "#{x['id']}: mismatch of callouts and annotations"
17
+ end
18
+ end
19
+ end
20
+
21
+ def style_warning(node, msg, text)
22
+ return if @novalid
23
+ w = "ISO style: WARNING (#{Utils::current_location(node)}): #{msg}"
24
+ w += ": #{text}" if text
25
+ warn w
26
+ end
27
+
28
+ def asset_title_style(root)
29
+ root.xpath("//figure[image][not(title)]").each do |node|
30
+ style_warning(node, "Figure should have title", nil)
31
+ end
32
+ root.xpath("//table[not(title)]").each do |node|
33
+ style_warning(node, "Table should have title", nil)
34
+ end
35
+ end
36
+
37
+ def asset_style(root)
38
+ asset_title_style(root)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,5 @@
1
+ module Metanorma
2
+ module Standoc
3
+ VERSION = "0.0.1".freeze
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ require "asciidoctor" unless defined? Asciidoctor::Converter
2
+ require_relative "asciidoctor/standoc/converter"
3
+ require_relative "asciidoctor/standoc/version"
4
+ require "asciidoctor/extensions"
5
+
6
+ if defined? Metanorma
7
+ require_relative "metanorma/standoc"
8
+ Metanorma::Registry.instance.register(Metanorma::Standoc::Processor)
9
+ end
@@ -0,0 +1,7 @@
1
+ require_relative "./standoc/processor"
2
+
3
+ module Metanorma
4
+ module Standoc
5
+
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ require "metanorma/processor"
2
+
3
+ module Metanorma
4
+ module Standoc
5
+ class Processor < Metanorma::Processor
6
+
7
+ def initialize
8
+ @short = :standoc
9
+ @input_format = :asciidoc
10
+ @asciidoctor_backend = :standoc
11
+ end
12
+
13
+ def output_formats
14
+ super.merge(
15
+ html: "html",
16
+ doc: "doc"
17
+ )
18
+ end
19
+
20
+ def version
21
+ "Asciidoctor::Standoc #{Metanorma::Standoc::VERSION}/IsoDoc #{IsoDoc::VERSION}"
22
+ end
23
+
24
+ def input_to_isodoc(file)
25
+ Metanorma::Input::Asciidoc.new.process(file, @asciidoctor_backend)
26
+ end
27
+
28
+ def output(isodoc_node, outname, format, options={})
29
+ case format
30
+ when :html
31
+ IsoDoc::HtmlConvert.new(options).convert(outname, isodoc_node)
32
+ when :doc
33
+ IsoDoc::WordConvert.new(options).convert(outname, isodoc_node)
34
+ else
35
+ super
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "asciidoctor/standoc/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "metanorma-standoc"
9
+ spec.version = Metanorma::Standoc::VERSION
10
+ spec.authors = ["Ribose Inc."]
11
+ spec.email = ["open.source@ribose.com"]
12
+
13
+ spec.summary = "metanorma-standoc realises standards following the Metanorma standoc model"
14
+ spec.description = <<~DESCRIPTION
15
+ metanorma-standoc realises standards following the Metanorma standoc model
16
+
17
+ This gem is in active development.
18
+ DESCRIPTION
19
+
20
+ spec.homepage = "https://github.com/riboseinc/metanorma-standoc"
21
+ spec.license = "BSD-2-Clause"
22
+
23
+ spec.bindir = "bin"
24
+ spec.require_paths = ["lib"]
25
+ spec.files = `git ls-files`.split("\n")
26
+ spec.test_files = `git ls-files -- {spec}/*`.split("\n")
27
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
28
+
29
+ spec.add_dependency "asciidoctor", "~> 1.5.7"
30
+ spec.add_dependency "ruby-jing"
31
+ spec.add_dependency "isodoc", ">= 0.8"
32
+ spec.add_dependency "iev", "~> 0.2.0"
33
+ spec.add_dependency "relaton", "~> 0.1.3"
34
+
35
+ spec.add_development_dependency "bundler", "~> 1.15"
36
+ spec.add_development_dependency "byebug"
37
+ spec.add_development_dependency "equivalent-xml", "~> 0.6"
38
+ spec.add_development_dependency "guard", "~> 2.14"
39
+ spec.add_development_dependency "guard-rspec", "~> 4.7"
40
+ spec.add_development_dependency "rake", "~> 12.0"
41
+ spec.add_development_dependency "rspec", "~> 3.6"
42
+ spec.add_development_dependency "rubocop", "~> 0.50"
43
+ spec.add_development_dependency "simplecov", "~> 0.15"
44
+ spec.add_development_dependency "timecop", "~> 0.9"
45
+ spec.add_development_dependency "metanorma", "~> 0.2.6"
46
+ spec.add_development_dependency "isobib", "~> 0.2.0"
47
+ end
@@ -0,0 +1,271 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Asciidoctor::Standoc do
4
+ it "has a version number" do
5
+ expect(Metanorma::Standoc::VERSION).not_to be nil
6
+ end
7
+
8
+ it "processes a blank document" do
9
+ expect(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).to be_equivalent_to <<~"OUTPUT"
10
+ #{ASCIIDOC_BLANK_HDR}
11
+ INPUT
12
+ #{BLANK_HDR}
13
+ <sections/>
14
+ </standard-document>
15
+ OUTPUT
16
+ end
17
+
18
+ it "converts a blank document" do
19
+ system "rm -f test.doc"
20
+ expect(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).to be_equivalent_to <<~"OUTPUT"
21
+ = Document title
22
+ Author
23
+ :docfile: test.adoc
24
+ :novalid:
25
+ INPUT
26
+ #{BLANK_HDR}
27
+ <sections/>
28
+ </standard-document>
29
+ OUTPUT
30
+ expect(File.exist?("test.doc")).to be true
31
+ expect(File.exist?("htmlstyle.css")).to be false
32
+ end
33
+
34
+ it "processes default metadata" do
35
+ expect(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).to be_equivalent_to <<~'OUTPUT'
36
+ = Document title
37
+ Author
38
+ :docfile: test.adoc
39
+ :nodoc:
40
+ :novalid:
41
+ :docnumber: 1000
42
+ :partnumber: 1
43
+ :edition: 2
44
+ :revdate: 2000-01-01
45
+ :draft: 3.4
46
+ :technical-committee: TC
47
+ :technical-committee-number: 1
48
+ :technical-committee-type: A
49
+ :subcommittee: SC
50
+ :subcommittee-number: 2
51
+ :subcommittee-type: B
52
+ :workgroup: WG
53
+ :workgroup-number: 3
54
+ :workgroup-type: C
55
+ :secretariat: SECRETARIAT
56
+ :copyright-year: 2001
57
+ :docstage: 10
58
+ :docsubstage: 20
59
+ :iteration: 3
60
+ :language: en
61
+ :title-intro-en: Introduction
62
+ :title-main-en: Main Title -- Title
63
+ :title-part-en: Title Part
64
+ :title-intro-fr: Introduction Française
65
+ :title-main-fr: Titre Principal
66
+ :title-part-fr: Part du Titre
67
+ :library-ics: 1,2,3
68
+ INPUT
69
+ <?xml version="1.0" encoding="UTF-8"?>
70
+ <standard-document xmlns="http://riboseinc.com/isoxml">
71
+ <bibdata type="article">
72
+
73
+ <docidentifier>
74
+ <project-number part="1"> 1000</project-number>
75
+ </docidentifier>
76
+ <language>en</language>
77
+ <script>Latn</script>
78
+ <status format="plain">published</status>
79
+ <copyright>
80
+ <from>2001</from>
81
+ </copyright>
82
+ <editorialgroup>
83
+ <technical-committee number="1" type="A">TC</technical-committee>
84
+ </editorialgroup>
85
+ <ics>
86
+ <code>1</code>
87
+ </ics>
88
+ <ics>
89
+ <code>2</code>
90
+ </ics>
91
+ <ics>
92
+ <code>3</code>
93
+ </ics>
94
+ </bibdata><version>
95
+ <edition>2</edition>
96
+ <revision-date>2000-01-01</revision-date>
97
+ <draft>3.4</draft>
98
+ </version>
99
+ <sections/>
100
+ </standard-document>
101
+ OUTPUT
102
+ end
103
+
104
+
105
+ it "processes complex metadata" do
106
+ expect(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)).to be_equivalent_to <<~'OUTPUT'
107
+ = Document title
108
+ Author
109
+ :docfile: test.adoc
110
+ :nodoc:
111
+ :novalid:
112
+ :docnumber: 1000
113
+ :partnumber: 1-1
114
+ :tc-docnumber: 2000
115
+ :language: el
116
+ :script: Grek
117
+ :publisher: IEC,IETF,ISO
118
+ INPUT
119
+ <?xml version="1.0" encoding="UTF-8"?>
120
+ <standard-document xmlns="http://riboseinc.com/isoxml">
121
+ <bibdata type="article">
122
+
123
+ <docidentifier>
124
+ <project-number part="1" subpart="1">ISO/IEC/IETF 1000</project-number>
125
+ </docidentifier>
126
+ <contributor>
127
+ <role type="author"/>
128
+ <organization>
129
+ <name>IEC</name>
130
+ </organization>
131
+ </contributor>
132
+ <contributor>
133
+ <role type="author"/>
134
+ <organization>
135
+ <name>IETF</name>
136
+ </organization>
137
+ </contributor>
138
+ <contributor>
139
+ <role type="author"/>
140
+ <organization>
141
+ <name>ISO</name>
142
+ </organization>
143
+ </contributor>
144
+ <contributor>
145
+ <role type="publisher"/>
146
+ <organization>
147
+ <name>IEC</name>
148
+ </organization>
149
+ </contributor>
150
+ <contributor>
151
+ <role type="publisher"/>
152
+ <organization>
153
+ <name>IETF</name>
154
+ </organization>
155
+ </contributor>
156
+ <contributor>
157
+ <role type="publisher"/>
158
+ <organization>
159
+ <name>ISO</name>
160
+ </organization>
161
+ </contributor>
162
+ <language>el</language>
163
+ <script>Grek</script>
164
+ <status format="plain">published</status>
165
+ <copyright>
166
+ <from>2018</from>
167
+ <owner>
168
+ <organization>
169
+ <name>IEC</name>
170
+ </organization>
171
+ </owner>
172
+ </copyright>
173
+ <copyright>
174
+ <from>2018</from>
175
+ <owner>
176
+ <organization>
177
+ <name>IETF</name>
178
+ </organization>
179
+ </owner>
180
+ </copyright>
181
+ <copyright>
182
+ <from>2018</from>
183
+ <owner>
184
+ <organization>
185
+ <name>ISO</name>
186
+ </organization>
187
+ </owner>
188
+ </copyright>
189
+ <editorialgroup>
190
+ <technical-committee/>
191
+ </editorialgroup>
192
+ </bibdata>
193
+ <sections/>
194
+ </standard-document>
195
+ OUTPUT
196
+ end
197
+
198
+ it "reads scripts into blank HTML document" do
199
+ system "rm -f test.html"
200
+ Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
201
+ = Document title
202
+ Author
203
+ :docfile: test.adoc
204
+ :novalid:
205
+ INPUT
206
+ html = File.read("test.html", encoding: "utf-8")
207
+ expect(html).to match(%r{<script>})
208
+ end
209
+
210
+ it "uses default fonts" do
211
+ system "rm -f test.html"
212
+ Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
213
+ = Document title
214
+ Author
215
+ :docfile: test.adoc
216
+ :novalid:
217
+ INPUT
218
+ html = File.read("test.html", encoding: "utf-8")
219
+ expect(html).to match(%r[\.Sourcecode[^{]+\{[^{]+font-family: "Courier New", monospace;]m)
220
+ expect(html).to match(%r[blockquote[^{]+\{[^{]+font-family: "Cambria", serif;]m)
221
+ expect(html).to match(%r[\.h2Annex[^{]+\{[^{]+font-family: "Cambria", serif;]m)
222
+ end
223
+
224
+ it "uses default fonts for alt doc" do
225
+ system "rm -f test_alt.html"
226
+ Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
227
+ = Document title
228
+ Author
229
+ :docfile: test.adoc
230
+ :novalid:
231
+ INPUT
232
+ html = File.read("test_alt.html", encoding: "utf-8")
233
+ expect(html).to match(%r[\.Sourcecode[^{]+\{[^{]+font-family: "Space Mono", monospace;]m)
234
+ expect(html).to match(%r[blockquote[^{]+\{[^{]+font-family: "Lato", sans-serif;]m)
235
+ expect(html).to match(%r[\.h2Annex[^{]+\{[^{]+font-family: "Lato", sans-serif;]m)
236
+ end
237
+
238
+ it "uses Chinese fonts" do
239
+ system "rm -f test.html"
240
+ Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
241
+ = Document title
242
+ Author
243
+ :docfile: test.adoc
244
+ :novalid:
245
+ :script: Hans
246
+ INPUT
247
+ html = File.read("test.html", encoding: "utf-8")
248
+ expect(html).to match(%r[\.Sourcecode[^{]+\{[^{]+font-family: "Courier New", monospace;]m)
249
+ expect(html).to match(%r[blockquote[^{]+\{[^{]+font-family: "SimSun", serif;]m)
250
+ expect(html).to match(%r[\.h2Annex[^{]+\{[^{]+font-family: "SimHei", sans-serif;]m)
251
+ end
252
+
253
+ it "uses specified fonts" do
254
+ system "rm -f test.html"
255
+ Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)
256
+ = Document title
257
+ Author
258
+ :docfile: test.adoc
259
+ :novalid:
260
+ :script: Hans
261
+ :body-font: Zapf Chancery
262
+ :header-font: Comic Sans
263
+ :monospace-font: Andale Mono
264
+ INPUT
265
+ html = File.read("test.html", encoding: "utf-8")
266
+ expect(html).to match(%r[\.Sourcecode[^{]+\{[^{]+font-family: Andale Mono;]m)
267
+ expect(html).to match(%r[blockquote[^{]+\{[^{]+font-family: Zapf Chancery;]m)
268
+ expect(html).to match(%r[\.h2Annex[^{]+\{[^{]+font-family: Comic Sans;]m)
269
+ end
270
+
271
+ end