Class: IsoDoc::Convert
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.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
- #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) ⇒ Object
-
#default_file_locations(_options) ⇒ Object
none for this parent gem, but will be populated in child gems which have access to stylesheets &c; e.g.
- #default_fonts(_options) ⇒ Object
- #fonts_options ⇒ Object
- #generate_css(filename, stripwordcss) ⇒ Object
- #html_doc_path(*file) ⇒ Object
- #i18n_init(lang, script, i18nyaml = nil) ⇒ Object
-
#initialize(options) ⇒ Convert
constructor
htmlstylesheet: Generic stylesheet for HTML wordstylesheet: Generic 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 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_pdf: Scripts file for PDF datauriimage: Encode images in HTML output as data URIs.
- #l10n(x, lang = @lang, script = @script) ⇒ Object
- #metadata_init(lang, script, i18n) ⇒ Object
- #middle_clause ⇒ 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 ⇒ Object
- #tmpimagedir_suffix ⇒ Object
- #xref_init(lang, script, _klass, i18n, options) ⇒ Object
Methods included from ClassUtils
Methods included from Function::Utils
#attr_code, #date_range, #empty2nil, #extract_delims, #from_xhtml, #get_clause_id, #get_note_container_id, #header_strip, #image_localfile, #insert_tab, #labelled_ancestor, #liquid, #noko, #ns, #populate_template, #save_dataimage, #sentence_join, #to_xhtml, #to_xhtml_fragment
Methods included from Function::ToWordHtml
#body_attr, #boilerplate, #define_head, #in_sourcecode, #info, #init_file, #make_body, #make_body1, #make_body2, #make_body3, #middle, #middle_admonitions, #middle_title, #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
#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_title, #clausedelim, #clausedelimspace, #copyright_parse, #feedback_parse, #foreword, #inline_header_title, #introduction, #legal_parse, #license_parse, #preface, #scope, #symbols_abbrevs, #symbols_parse, #terms_defs, #terms_parse
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, #format_ref, #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
#bookmark_parse, #br_parse, #callout_parse, #concept_parse, #em_parse, #eref_parse, #eref_target, #error_parse, #found_matching_variant_sibling, #hr_parse, #image_parse, #image_title_parse, #index_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, #variant_parse, #xref_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_reference_format, #table_get_or_make_tfoot, #table_long_strings_cleanup, #table_note_cleanup, #termref_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, #formula_attrs, #formula_parse, #formula_parse1, #formula_where, #keep_style, #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
Constructor Details
#initialize(options) ⇒ Convert
htmlstylesheet: Generic stylesheet for HTML wordstylesheet: Generic 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 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_pdf: Scripts file for PDF datauriimage: Encode images in HTML output as data URIs
30 31 32 33 34 35 36 37 38 39 40 41 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 |
# File 'lib/isodoc/convert.rb', line 30 def initialize() @libdir ||= File.dirname(__FILE__) .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] @standardstylesheet_name = [:standardstylesheet] @header = [:header] @htmlcoverpage = [:htmlcoverpage] @wordcoverpage = [:wordcoverpage] @htmlintropage = [:htmlintropage] @wordintropage = [:wordintropage] @scripts = [:scripts] @scripts_pdf = [:scripts_pdf] @i18nyaml = [:i18nyaml] @ulstyle = [:ulstyle] @olstyle = [:olstyle] @datauriimage = [:datauriimage] @suppressheadingnumbers = [:suppressheadingnumbers] @break_up_urls_in_tables = [:break_up_urls_in_tables] == 'true' @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 = {} end |
Instance Attribute Details
#i18n ⇒ Object
Returns the value of attribute i18n.
10 11 12 |
# File 'lib/isodoc/convert.rb', line 10 def i18n @i18n end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
9 10 11 |
# File 'lib/isodoc/convert.rb', line 9 def @options end |
Instance Method Details
#convert(input_filename, file = nil, debug = false, output_filename = nil) ⇒ Object
233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/isodoc/convert.rb', line 233 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
191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/isodoc/convert.rb', line 191 def convert1(docxml, filename, dir) @xrefs.parse 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
221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/isodoc/convert.rb', line 221 def convert_init(file, input_filename, debug) docxml = Nokogiri::XML(file) 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) ⇒ Object
160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/isodoc/convert.rb', line 160 def convert_scss(filename, stylesheet) 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 + 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; e.g.
htmlstylesheet: html_doc_path("htmlstyle.scss"),
htmlcoverpage: html_doc_path("html_rsd_titlepage.html"),
htmlintropage: html_doc_path("html_rsd_intro.html"),
scripts: html_doc_path("scripts.html"),
wordstylesheet: html_doc_path("wordstyle.scss"),
standardstylesheet: html_doc_path("rsd.scss"),
header: html_doc_path("header.html"),
wordcoverpage: html_doc_path("word_rsd_titlepage.html"),
wordintropage: html_doc_path("word_rsd_intro.html"),
ulstyle: l3
olstyle: l2
133 134 135 |
# File 'lib/isodoc/convert.rb', line 133 def default_file_locations() {} end |
#default_fonts(_options) ⇒ Object
110 111 112 113 114 115 116 |
# File 'lib/isodoc/convert.rb', line 110 def default_fonts() { bodyfont: 'Arial', headerfont: 'Arial', monospacefont: 'Courier' } end |
#fonts_options ⇒ Object
137 138 139 140 141 142 143 |
# File 'lib/isodoc/convert.rb', line 137 def { 'bodyfont' => [:bodyfont] || 'Arial', 'headerfont' => [:headerfont] || 'Arial', 'monospacefont' => [:monospacefont] || 'Courier' } end |
#generate_css(filename, stripwordcss) ⇒ Object
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/isodoc/convert.rb', line 174 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) end Tempfile.open([File.basename(filename, '.*'), 'css'], encoding: 'utf-8') do |f| f.write(stylesheet) f end end |
#html_doc_path(*file) ⇒ Object
152 153 154 155 156 157 158 |
# File 'lib/isodoc/convert.rb', line 152 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
213 214 215 |
# File 'lib/isodoc/convert.rb', line 213 def i18n_init(lang, script, i18nyaml = nil) @i18n = I18n.new(lang, script, i18nyaml || @i18nyaml) end |
#l10n(x, lang = @lang, script = @script) ⇒ Object
217 218 219 |
# File 'lib/isodoc/convert.rb', line 217 def l10n(x, lang = @lang, script = @script) @i18n.l10n(x, lang, script) end |
#metadata_init(lang, script, i18n) ⇒ Object
204 205 206 |
# File 'lib/isodoc/convert.rb', line 204 def (lang, script, i18n) @meta = Metadata.new(lang, script, i18n) end |
#middle_clause ⇒ Object
245 246 247 248 |
# File 'lib/isodoc/convert.rb', line 245 def middle_clause "//clause[parent::sections][not(@type = 'scope')]"\ '[not(descendant::terms)]' end |
#populate_css ⇒ Object
run this after @meta is populated
100 101 102 103 104 |
# File 'lib/isodoc/convert.rb', line 100 def populate_css @htmlstylesheet = generate_css(@htmlstylesheet_name, true) @wordstylesheet = generate_css(@wordstylesheet_name, false) @standardstylesheet = generate_css(@standardstylesheet_name, false) 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
86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/isodoc/convert.rb', line 86 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 ⇒ Object
145 146 147 148 149 150 |
# File 'lib/isodoc/convert.rb', line 145 def scss_fontheader b = [:bodyfont] || 'Arial' h = [:headerfont] || 'Arial' m = [:monospacefont] || 'Courier' "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n" end |
#tmpimagedir_suffix ⇒ Object
106 107 108 |
# File 'lib/isodoc/convert.rb', line 106 def tmpimagedir_suffix '_images' end |
#xref_init(lang, script, _klass, i18n, options) ⇒ Object
208 209 210 211 |
# File 'lib/isodoc/convert.rb', line 208 def xref_init(lang, script, _klass, i18n, ) html = HtmlConvert.new(language: @lang, script: @script) @xrefs = Xref.new(lang, script, html, i18n, ) end |