metanorma-standoc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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