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
////////////////////////////////////////////////////