Class: IsoDoc::Convert
- Defined in:
- lib/isodoc/css.rb,
lib/isodoc/convert.rb
Direct Known Subclasses
HeadlessHtmlConvert, HtmlConvert, PdfConvert, PresentationXMLConvert, WordConvert, XslfoPdfConvert
Constant Summary
Constants included from Function::Utils
Function::Utils::CLAUSE_ANCESTOR, Function::Utils::DOCTYPE_HDR, Function::Utils::NOKOHEAD, Function::Utils::NOTE_CONTAINER_ANCESTOR
Constants included from Function::Table
Constants included from Function::Section
Function::Section::TERM_CLAUSE
Constants included from Function::Lists
Constants included from Function::Cleanup
Function::Cleanup::FIGURE_WITH_FOOTNOTES
Constants included from Function::Blocks
Function::Blocks::EXAMPLE_TBL_ATTR, Function::Blocks::EXAMPLE_TD_ATTR
Instance Attribute Summary collapse
-
#i18n ⇒ Object
Returns the value of attribute i18n.
-
#meta ⇒ Object
Returns the value of attribute meta.
-
#options ⇒ Object
Returns the value of attribute options.
-
#xrefs ⇒ Object
Returns the value of attribute xrefs.
Instance Method Summary collapse
- #bibitem_lookup(docxml) ⇒ Object
- #convert(input_filename, file = nil, debug = false, output_filename = nil) ⇒ Object
- #convert1(docxml, filename, dir) ⇒ Object
- #convert_init(file, input_filename, debug) ⇒ Object
- #convert_scss(filename, stylesheet, stripwordcss) ⇒ Object
-
#default_file_locations(_options) ⇒ Object
none for this parent gem, but will be populated in child gems which have access to stylesheets &c.
- #default_fonts(_options) ⇒ Object
- #fonts_options ⇒ Object
-
#generate_css(filename, stripwordcss) ⇒ Object
stripwordcss if HTML stylesheet, !stripwordcss if DOC stylesheet.
- #html_doc_path(*file) ⇒ Object
- #i18n_init(lang, script, i18nyaml = nil) ⇒ Object
-
#initialize(options) ⇒ Convert
constructor
htmlstylesheet: Generic stylesheet for HTML htmlstylesheet_override: Override stylesheet for HTML wordstylesheet: Generic stylesheet for Word wordstylesheet_override: Override stylesheet for Word standardsheet: Stylesheet specific to Standard header: Header file for Word htmlcoverpage: Cover page for HTML wordcoverpage: Cover page for Word htmlintropage: Introductory page for HTML wordintropage: Introductory page for Word normalfontsize: Font size for body text smallerfontsize: Font size for smaller than body text monospacefontsize: Font size for monospace font footnotefontsize: Font size for footnotes i18nyaml: YAML file for internationalisation of text ulstyle: list style in Word CSS for unordered lists olstyle: list style in Word CSS for ordered lists bodyfont: font to use for body text headerfont: font to use for header text monospace: font to use for monospace text suppressheadingnumbers: suppress heading numbers for clauses scripts: Scripts file for HTML scripts_override: Override scripts file for HTML scripts_pdf: Scripts file for PDF (not used in XSLT PDF) datauriimage: Encode images in HTML output as data URIs break_up_urls_in_tables: whether to insert spaces in URLs in tables every 40-odd chars sectionsplit: split up HTML output on sections bare: do not insert any prefatory material (coverpage, boilerplate).
- #l10n(expr, lang = @lang, script = @script) ⇒ Object
- #localpath(path) ⇒ Object
- #metadata_init(lang, script, i18n) ⇒ Object
- #middle_clause(_docxml = nil) ⇒ Object
-
#populate_css ⇒ Object
run this after @meta is populated.
-
#precompiled_style_or_original(stylesheet_path) ⇒ Object
Check if already compiled version(.css) exists, if not, return original scss file.
- #scss_fontheader(is_html_css) ⇒ Object
- #target_pdf(node) ⇒ Object
- #tmpimagedir_suffix ⇒ Object
- #xref_init(lang, script, _klass, i18n, options) ⇒ Object
Methods included from ClassUtils
#case_strict, #case_with_markup, #date_range, #liquid, #ns
Methods included from Function::Utils
#attr_code, #cleanup_entities, #date_range, #emf?, #empty2nil, #external_path, #extract_delims, #from_xhtml, #get_clause_id, #get_note_container_id, #header_strip, #header_strip_elem?, #image_localfile, #insert_tab, #labelled_ancestor, #liquid, #noko, #ns, #populate_template, #save_dataimage, #sentence_join, #to_xhtml, #to_xhtml_fragment, #to_xhtml_prep
Methods included from Function::ToWordHtml
#body_attr, #boilerplate, #define_head, #in_sourcecode, #info, #init_dir, #init_file, #make_body, #make_body1, #make_body2, #make_body3, #middle, #note?, #parse, #rel_tmpimagedir, #set_termdomain, #tmpimagedir
Methods included from Function::Terms
#admitted_term_parse, #definition_parse, #deprecated_term_parse, #modification_parse, #para_then_remainder, #term_parse, #termdef_parse, #termdocsource_parse, #termnote_delim, #termnote_parse, #termref_parse
Methods included from Function::Table
#colgroup, #make_tr_attr, #table_attrs, #table_parse, #table_title_parse, #tbody_parse, #tcaption, #tfoot_parse, #thead_parse, #tr_parse
Methods included from Function::Section
#abstract, #acknowledgements, #annex, #annex_attrs, #annex_name, #clause, #clause_attrs, #clause_name, #clause_parse, #clause_parse_subtitle, #clause_parse_title, #clause_parse_title1, #clause_title_depth, #clausedelim, #clausedelimspace, #copyright_parse, #feedback_parse, #foreword, #inline_header_title, #introduction, #is_clause?, #legal_parse, #license_parse, #preface, #preface_block, #scope, #symbols_abbrevs, #symbols_parse, #terms_defs, #terms_parse, #variant_title
Methods included from Function::References
#bibitem_ref_code, #biblio_list, #bibliography, #bibliography_parse, #bibliography_xpath, #bracket_if_num, #date_note_process, #docid_l10n, #docid_prefix, #implicit_reference, #is_standard, #iso_bibitem_entry_attrs, #iso_title, #nonstd_bibitem, #norm_ref, #norm_ref_xpath, #omit_docid_prefix, #pref_ref_code, #prefix_bracketed_ref, #ref_entry_code, #reference_format, #render_identifier, #std_bibitem_entry
Methods included from Function::Lists
#dl_attrs, #dl_parse, #dt_dd?, #dt_parse, #li_parse, #ol_attrs, #ol_depth, #ol_parse, #ol_style, #ul_attrs, #ul_parse
Methods included from Function::Inline
#add_parse, #bookmark_parse, #br_parse, #callout_parse, #del_parse, #em_parse, #eref_parse, #eref_target, #error_parse, #hr_parse, #image_parse, #image_title_parse, #index_parse, #index_xref_parse, #keyword_parse, #link_parse, #no_locality_parse, #origin_parse, #page_break, #pagebreak_parse, #section_break, #smallcap_parse, #stem_parse, #strike_parse, #strong_parse, #sub_parse, #suffix_url, #sup_parse, #termrefelem_parse, #text_parse, #tt_parse, #underline_parse, #xref_parse
Methods included from Function::Form
#form_parse, #input_parse, #label_parse, #option_parse, #select_parse, #text_input, #textarea_parse
Methods included from Function::Cleanup
#admonition_cleanup, #break_up_long_strings, #break_up_long_strings1, #cleanup, #example_cleanup, #figure_aside_process, #figure_cleanup, #figure_get_or_make_dl, #footnote_cleanup, #footnote_reference_format, #inline_header_cleanup, #merge_fnref_into_fn_text, #new_fullcolspan_row, #passthrough_cleanup, #remove_bottom_border, #symbols_cleanup, #table_cleanup, #table_footnote_cleanup, #table_footnote_cleanup_propagate, #table_footnote_reference_format, #table_get_or_make_tfoot, #table_long_strings_cleanup, #table_note_cleanup, #textcleanup
Methods included from Function::Blocks
#admonition_attrs, #admonition_class, #admonition_name, #admonition_name_parse, #admonition_parse, #annotation_parse, #example_div_attr, #example_div_parse, #example_label, #example_parse, #example_table_attr, #example_table_parse, #figure_attrs, #figure_key, #figure_name_parse, #figure_parse, #figure_parse1, #formula_attrs, #formula_parse, #formula_parse1, #formula_where, #keep_style, #middle_admonitions, #middle_title, #note_attrs, #note_delim, #note_p_parse, #note_parse, #note_parse1, #para_attrs, #para_class, #para_parse, #passthrough_parse, #permission_parse, #pre_parse, #pseudocode_attrs, #pseudocode_parse, #quote_attribution, #quote_parse, #recommendation_attr_keyvalue, #recommendation_attr_parse, #recommendation_attributes, #recommendation_attributes1, #recommendation_labels, #recommendation_name, #recommendation_parse, #reqt_attrs, #reqt_component_attrs, #reqt_metadata_node, #requirement_component_parse, #requirement_parse, #requirement_skip_parse, #sourcecode_attrs, #sourcecode_name_parse, #sourcecode_parse, #svg_parse, #toc_parse
Constructor Details
#initialize(options) ⇒ Convert
htmlstylesheet: Generic stylesheet for HTML htmlstylesheet_override: Override stylesheet for HTML wordstylesheet: Generic stylesheet for Word wordstylesheet_override: Override stylesheet for Word standardsheet: Stylesheet specific to Standard header: Header file for Word htmlcoverpage: Cover page for HTML wordcoverpage: Cover page for Word htmlintropage: Introductory page for HTML wordintropage: Introductory page for Word normalfontsize: Font size for body text smallerfontsize: Font size for smaller than body text monospacefontsize: Font size for monospace font footnotefontsize: Font size for footnotes i18nyaml: YAML file for internationalisation of text ulstyle: list style in Word CSS for unordered lists olstyle: list style in Word CSS for ordered lists bodyfont: font to use for body text headerfont: font to use for header text monospace: font to use for monospace text suppressheadingnumbers: suppress heading numbers for clauses scripts: Scripts file for HTML scripts_override: Override scripts file for HTML scripts_pdf: Scripts file for PDF (not used in XSLT PDF) datauriimage: Encode images in HTML output as data URIs break_up_urls_in_tables: whether to insert spaces in URLs in tables
every 40-odd chars
sectionsplit: split up HTML output on sections bare: do not insert any prefatory material (coverpage, boilerplate)
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/isodoc/convert.rb', line 42 def initialize() @libdir ||= File.dirname(__FILE__) # rubocop:disable Lint/DisjunctiveAssignmentInConstructor .merge!(default_fonts()) do |_, old, new| old || new end.merge!(default_file_locations()) do |_, old, new| old || new end @options = @files_to_delete = [] @tempfile_cache = [] @htmlstylesheet_name = [:htmlstylesheet] @wordstylesheet_name = [:wordstylesheet] @htmlstylesheet_override_name = [:htmlstylesheet_override] @wordstylesheet_override_name = [:wordstylesheet_override] @standardstylesheet_name = [:standardstylesheet] @sourcefilename = [:sourcefilename] @header = [:header] @htmlcoverpage = [:htmlcoverpage] @wordcoverpage = [:wordcoverpage] @htmlintropage = [:htmlintropage] @wordintropage = [:wordintropage] @normalfontsize = [:normalfontsize] @smallerfontsize = [:smallerfontsize] @monospacefontsize = [:monospacefontsize] @footnotefontsize = [:footnotefontsize] @scripts = [:scripts] || File.join(File.dirname(__FILE__), "base_style", "scripts.html") @scripts_pdf = [:scripts_pdf] @scripts_override = [:scripts_override] @i18nyaml = [:i18nyaml] @ulstyle = [:ulstyle] @olstyle = [:olstyle] @datauriimage = [:datauriimage] @suppressheadingnumbers = [:suppressheadingnumbers] @break_up_urls_in_tables = [:break_up_urls_in_tables] == "true" @sectionsplit = [:sectionsplit] == "true" @suppressasciimathdup = [:suppressasciimathdup] == "true" @bare = [:bare] @termdomain = "" @termexample = false @note = false @sourcecode = false @footnotes = [] @comments = [] @in_footnote = false @in_comment = false @in_table = false @in_figure = false @seen_footnote = Set.new @c = HTMLEntities.new @openmathdelim = "`" @closemathdelim = "`" @lang = [:language] || "en" @script = [:script] || "Latn" @maxwidth = 1200 @maxheight = 800 @wordToClevels = [:doctoclevels].to_i @wordToClevels = 2 if @wordToClevels.zero? @htmlToClevels = [:htmltoclevels].to_i @htmlToClevels = 2 if @htmlToClevels.zero? @bookmarks_allocated = { "X" => true } @fn_bookmarks = {} @baseassetpath = [:baseassetpath] @aligncrosselements = [:aligncrosselements] end |
Instance Attribute Details
#i18n ⇒ Object
Returns the value of attribute i18n.
11 12 13 |
# File 'lib/isodoc/convert.rb', line 11 def i18n @i18n end |
#meta ⇒ Object
Returns the value of attribute meta.
11 12 13 |
# File 'lib/isodoc/convert.rb', line 11 def @meta end |
#options ⇒ Object
Returns the value of attribute options.
11 12 13 |
# File 'lib/isodoc/convert.rb', line 11 def @options end |
#xrefs ⇒ Object
Returns the value of attribute xrefs.
11 12 13 |
# File 'lib/isodoc/convert.rb', line 11 def xrefs @xrefs end |
Instance Method Details
#bibitem_lookup(docxml) ⇒ Object
134 135 136 137 138 139 |
# File 'lib/isodoc/convert.rb', line 134 def bibitem_lookup(docxml) @bibitems = docxml.xpath(ns("//references/bibitem")) .each_with_object({}) do |b, m| m[b["id"]] = b end end |
#convert(input_filename, file = nil, debug = false, output_filename = nil) ⇒ Object
170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/isodoc/convert.rb', line 170 def convert(input_filename, file = nil, debug = false, output_filename = nil) file = File.read(input_filename, encoding: "utf-8") if file.nil? @openmathdelim, @closemathdelim = extract_delims(file) docxml, filename, dir = convert_init(file, input_filename, debug) result = convert1(docxml, filename, dir) return result if debug output_filename ||= "#{filename}.#{@suffix}" postprocess(result, output_filename, dir) FileUtils.rm_rf dir end |
#convert1(docxml, filename, dir) ⇒ Object
120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/isodoc/convert.rb', line 120 def convert1(docxml, filename, dir) @xrefs.parse docxml bibitem_lookup(docxml) noko do |xml| xml.html **{ lang: @lang.to_s } do |html| html.parent.add_namespace("epub", "http://www.idpf.org/2007/ops") info docxml, nil populate_css html.head { |head| define_head head, filename, dir } make_body(html, docxml) end end.join("\n") end |
#convert_init(file, input_filename, debug) ⇒ Object
158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/isodoc/convert.rb', line 158 def convert_init(file, input_filename, debug) docxml = Nokogiri::XML(file) { |config| config.huge } filename, dir = init_file(input_filename, debug) docxml.root.default_namespace = "" lang = docxml&.at(ns("//bibdata/language"))&.text and @lang = lang script = docxml&.at(ns("//bibdata/script"))&.text and @script = script i18n_init(@lang, @script) (@lang, @script, @i18n) xref_init(@lang, @script, self, @i18n, {}) [docxml, filename, dir] end |
#convert_scss(filename, stylesheet, stripwordcss) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/isodoc/css.rb', line 77 def convert_scss(filename, stylesheet, stripwordcss) require "sassc" require "isodoc/sassc_importer" [File.join(Gem.loaded_specs["isodoc"].full_gem_path, "lib", "isodoc"), File.dirname(filename)].each do |name| SassC.load_paths << name end SassC::Engine.new(scss_fontheader(stripwordcss) + stylesheet, syntax: :scss, importer: SasscImporter) .render end |
#default_file_locations(_options) ⇒ Object
none for this parent gem, but will be populated in child gems which have access to stylesheets &c
48 49 50 |
# File 'lib/isodoc/css.rb', line 48 def default_file_locations() {} end |
#default_fonts(_options) ⇒ Object
38 39 40 41 42 43 44 |
# File 'lib/isodoc/css.rb', line 38 def default_fonts() { bodyfont: "Arial", headerfont: "Arial", monospacefont: "Courier New", } end |
#fonts_options ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/isodoc/css.rb', line 52 def { "bodyfont" => [:bodyfont] || "Arial", "headerfont" => [:headerfont] || "Arial", "monospacefont" => [:monospacefont] || "Courier New", "normalfontsize" => [:normalfontsize], "monospacefontsize" => [:monospacefontsize], "smallerfontsize" => [:smallerfontsize], "footnotefontsize" => [:footnotefontsize], } end |
#generate_css(filename, stripwordcss) ⇒ Object
stripwordcss if HTML stylesheet, !stripwordcss if DOC stylesheet
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/isodoc/css.rb', line 92 def generate_css(filename, stripwordcss) return nil if filename.nil? filename = precompiled_style_or_original(filename) stylesheet = File.read(filename, encoding: "UTF-8") stylesheet = populate_template(stylesheet, :word) stylesheet.gsub!(/(\s|\{)mso-[^:]+:[^;]+;/m, "\\1") if stripwordcss if File.extname(filename) == ".scss" stylesheet = convert_scss(filename, stylesheet, stripwordcss) end Tempfile.open([File.basename(filename, ".*"), "css"], encoding: "utf-8") do |f| f.write(stylesheet) f end end |
#html_doc_path(*file) ⇒ Object
112 113 114 115 116 117 118 |
# File 'lib/isodoc/convert.rb', line 112 def html_doc_path(*file) file.each do |f| ret = File.join(@libdir, File.join("html", f)) File.exist?(ret) and return ret end nil end |
#i18n_init(lang, script, i18nyaml = nil) ⇒ Object
150 151 152 |
# File 'lib/isodoc/convert.rb', line 150 def i18n_init(lang, script, i18nyaml = nil) @i18n = I18n.new(lang, script, i18nyaml || @i18nyaml) end |
#l10n(expr, lang = @lang, script = @script) ⇒ Object
154 155 156 |
# File 'lib/isodoc/convert.rb', line 154 def l10n(expr, lang = @lang, script = @script) @i18n.l10n(expr, lang, script) end |
#localpath(path) ⇒ Object
19 20 21 22 23 24 |
# File 'lib/isodoc/css.rb', line 19 def localpath(path) return path if %r{^[A-Z]:|^/|^file:/}.match?(path) return path unless (@sourcedir || @localdir) && path File.(File.join((@sourcedir || @localdir), path)) end |
#metadata_init(lang, script, i18n) ⇒ Object
141 142 143 |
# File 'lib/isodoc/convert.rb', line 141 def (lang, script, i18n) @meta = Metadata.new(lang, script, i18n) end |
#middle_clause(_docxml = nil) ⇒ Object
183 184 185 186 |
# File 'lib/isodoc/convert.rb', line 183 def middle_clause(_docxml = nil) "//clause[parent::sections][not(@type = 'scope')]"\ "[not(descendant::terms)]" end |
#populate_css ⇒ Object
run this after @meta is populated
27 28 29 30 31 32 33 34 35 36 |
# File 'lib/isodoc/css.rb', line 27 def populate_css @htmlstylesheet = generate_css(localpath(@htmlstylesheet_name), true) @wordstylesheet = generate_css(localpath(@wordstylesheet_name), false) @standardstylesheet = generate_css(localpath(@standardstylesheet_name), false) @htmlstylesheet_override_name and @htmlstylesheet_override = File.open(localpath(@htmlstylesheet_override_name)) @wordstylesheet_override_name and @wordstylesheet_override = File.open(localpath(@wordstylesheet_override_name)) end |
#precompiled_style_or_original(stylesheet_path) ⇒ Object
Check if already compiled version(.css) exists,
if not, return original scss file. During release
we compile scss into css files in order to not depend on scss
6 7 8 9 10 11 12 13 14 15 16 17 |
# File 'lib/isodoc/css.rb', line 6 def precompiled_style_or_original(stylesheet_path) # Already have compiled stylesheet, use it return stylesheet_path if stylesheet_path.nil? || File.extname(stylesheet_path) == ".css" basename = File.basename(stylesheet_path, ".*") compiled_path = File.join(File.dirname(stylesheet_path), "#{basename}.css") return stylesheet_path unless File.file?(compiled_path) compiled_path end |
#scss_fontheader(is_html_css) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/isodoc/css.rb', line 64 def scss_fontheader(is_html_css) b = [:bodyfont] || "Arial" h = [:headerfont] || "Arial" m = [:monospacefont] || "Courier New" ns = [:normalfontsize] || (is_html_css ? "1.0em" : "12.0pt") ms = [:monospacefontsize] || (is_html_css ? "0.8em" : "11.0pt") ss = [:smallerfontsize] || (is_html_css ? "0.9em" : "10.0pt") fs = [:footnotefontsize] || (is_html_css ? "0.9em" : "9.0pt") "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"\ "$normalfontsize: #{ns};\n$monospacefontsize: #{ms};\n"\ "$smallerfontsize: #{ss};\n$footnotefontsize: #{fs};\n" end |
#target_pdf(node) ⇒ Object
188 189 190 191 192 193 194 |
# File 'lib/isodoc/convert.rb', line 188 def target_pdf(node) if /#/.match?(node["target"]) node["target"].sub(/#/, ".pdf#") else "##{node['target']}" end end |
#tmpimagedir_suffix ⇒ Object
108 109 110 |
# File 'lib/isodoc/convert.rb', line 108 def tmpimagedir_suffix "_images" end |
#xref_init(lang, script, _klass, i18n, options) ⇒ Object
145 146 147 148 |
# File 'lib/isodoc/convert.rb', line 145 def xref_init(lang, script, _klass, i18n, ) html = HtmlConvert.new(language: @lang, script: @script) @xrefs = Xref.new(lang, script, html, i18n, ) end |