diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index 6e5963a..f6596aa 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -211,143 +211,18 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state) void HTMLRenderer::endPage() { close_line(); - process_links(); + + // process links before the page is closed + cur_doc->processLinks(this, pageNum); + // close page html_fout << "" << endl; } -void HTMLRenderer::pre_process() -{ - // we may output utf8 characters, so always use binary - { - /* - * If single-html && !split-pages - * we have to keep the generated css file into a temporary place - * and embed it into the main html later - * - * - * If single-html && split-page - * as there's no place to embed the css file, just leave it alone (into param->dest_dir) - * - * If !single-html - * leave it in param->dest_dir - */ - - auto fn = (param->single_html && (!param->split_pages)) - ? str_fmt("%s/__css", param->tmp_dir.c_str()) - : str_fmt("%s/%s", param->dest_dir.c_str(), param->css_filename.c_str()); - - if(param->single_html && (!param->split_pages)) - add_tmp_file((char*)fn); - - css_path = (char*)fn, - css_fout.open(css_path, ofstream::binary); - fix_stream(css_fout); - } - - // if split-pages is specified, open & close the file in the process loop - // if not, open the file here: - if(!param->split_pages) - { - /* - * If single-html - * we have to keep the html file (for page) into a temporary place - * because we'll have to embed css before it - * - * Otherwise just generate it - */ - auto fn = str_fmt("%s/__pages", param->tmp_dir.c_str()); - add_tmp_file((char*)fn); - - html_path = (char*)fn; - html_fout.open(html_path, ofstream::binary); - fix_stream(html_fout); - } -} - -void HTMLRenderer::post_process() -{ - // close files - html_fout.close(); - css_fout.close(); - - //only when split-page, do we have some work left to do - if(param->split_pages) - return; - - ofstream output((char*)str_fmt("%s/%s", param->dest_dir.c_str(), param->output_filename.c_str())); - fix_stream(output); - - // apply manifest - ifstream manifest_fin((char*)str_fmt("%s/%s", param->data_dir.c_str(), MANIFEST_FILENAME.c_str())); - if(!manifest_fin) - throw "Cannot open the manifest file"; - - bool embed_string = false; - string line; - while(getline(manifest_fin, line)) - { - if(line == "\"\"\"") - { - embed_string = !embed_string; - continue; - } - - if(embed_string) - { - output << line << endl; - continue; - } - - if(line.empty() || line[0] == '#') - continue; - - - if(line[0] == '@') - { - embed_file(output, param->data_dir + "/" + line.substr(1), "", true); - continue; - } - - if(line[0] == '$') - { - if(line == "$css") - { - embed_file(output, css_path, ".css", false); - } - else if (line == "$pages") - { - ifstream fin(html_path, ifstream::binary); - if(!fin) - throw "Cannot open read the pages"; - output << fin.rdbuf(); - } - else - { - cerr << "Warning: unknown line in manifest: " << line << endl; - } - continue; - } - - cerr << "Warning: unknown line in manifest: " << line << endl; - } -} - -void HTMLRenderer::process_links (void) -{ - Links * links = cur_page->getLinks(); - for(int i = 0; i < links->getNumLinks(); ++i) - { - AnnotLink * al = links->getLink(i); - draw_annot_link(al); - } - delete links; -} - /* * Based on pdftohtml from poppler */ -void HTMLRenderer::draw_annot_link (AnnotLink * al) +void HTMLRenderer::processLink(AnnotLink * al) { std::string dest_str; auto action = al->getAction(); @@ -493,6 +368,124 @@ void HTMLRenderer::draw_annot_link (AnnotLink * al) } } + +void HTMLRenderer::pre_process() +{ + // we may output utf8 characters, so always use binary + { + /* + * If single-html && !split-pages + * we have to keep the generated css file into a temporary place + * and embed it into the main html later + * + * + * If single-html && split-page + * as there's no place to embed the css file, just leave it alone (into param->dest_dir) + * + * If !single-html + * leave it in param->dest_dir + */ + + auto fn = (param->single_html && (!param->split_pages)) + ? str_fmt("%s/__css", param->tmp_dir.c_str()) + : str_fmt("%s/%s", param->dest_dir.c_str(), param->css_filename.c_str()); + + if(param->single_html && (!param->split_pages)) + add_tmp_file((char*)fn); + + css_path = (char*)fn, + css_fout.open(css_path, ofstream::binary); + fix_stream(css_fout); + } + + // if split-pages is specified, open & close the file in the process loop + // if not, open the file here: + if(!param->split_pages) + { + /* + * If single-html + * we have to keep the html file (for page) into a temporary place + * because we'll have to embed css before it + * + * Otherwise just generate it + */ + auto fn = str_fmt("%s/__pages", param->tmp_dir.c_str()); + add_tmp_file((char*)fn); + + html_path = (char*)fn; + html_fout.open(html_path, ofstream::binary); + fix_stream(html_fout); + } +} + +void HTMLRenderer::post_process() +{ + // close files + html_fout.close(); + css_fout.close(); + + //only when split-page, do we have some work left to do + if(param->split_pages) + return; + + ofstream output((char*)str_fmt("%s/%s", param->dest_dir.c_str(), param->output_filename.c_str())); + fix_stream(output); + + // apply manifest + ifstream manifest_fin((char*)str_fmt("%s/%s", param->data_dir.c_str(), MANIFEST_FILENAME.c_str())); + if(!manifest_fin) + throw "Cannot open the manifest file"; + + bool embed_string = false; + string line; + while(getline(manifest_fin, line)) + { + if(line == "\"\"\"") + { + embed_string = !embed_string; + continue; + } + + if(embed_string) + { + output << line << endl; + continue; + } + + if(line.empty() || line[0] == '#') + continue; + + + if(line[0] == '@') + { + embed_file(output, param->data_dir + "/" + line.substr(1), "", true); + continue; + } + + if(line[0] == '$') + { + if(line == "$css") + { + embed_file(output, css_path, ".css", false); + } + else if (line == "$pages") + { + ifstream fin(html_path, ifstream::binary); + if(!fin) + throw "Cannot open read the pages"; + output << fin.rdbuf(); + } + else + { + cerr << "Warning: unknown line in manifest: " << line << endl; + } + continue; + } + + cerr << "Warning: unknown line in manifest: " << line << endl; + } +} + void HTMLRenderer::fix_stream (std::ostream & out) { out << hex; diff --git a/src/include/HTMLRenderer.h b/src/include/HTMLRenderer.h index 5fdad05..fee1b9a 100644 --- a/src/include/HTMLRenderer.h +++ b/src/include/HTMLRenderer.h @@ -128,6 +128,8 @@ class HTMLRenderer : public OutputDev virtual void drawImage(GfxState * state, Object * ref, Stream * str, int width, int height, GfxImageColorMap * colorMap, GBool interpolate, int *maskColors, GBool inlineImg); + virtual void processLink(AnnotLink * al); + protected: //////////////////////////////////////////////////// // misc @@ -135,8 +137,6 @@ class HTMLRenderer : public OutputDev void pre_process(); void post_process(); - void process_links (void); - // set flags void fix_stream (std::ostream & out); @@ -145,8 +145,6 @@ class HTMLRenderer : public OutputDev std::string dump_embedded_font (GfxFont * font, long long fn_id); void embed_font(const std::string & filepath, GfxFont * font, FontInfo & info, bool get_metric_only = false); - void draw_annot_link(AnnotLink * al); - //////////////////////////////////////////////////// // manage styles ////////////////////////////////////////////////////