diff --git a/lib/all.css b/lib/all.css
index 6af0e9a..7b4a82f 100644
--- a/lib/all.css
+++ b/lib/all.css
@@ -22,7 +22,6 @@
white-space:pre;
}
.l > ._ {
- display:inline-block;
color:transparent;
}
::selection{
diff --git a/src/HTMLRenderer.h b/src/HTMLRenderer.h
index ba0f6f0..5ef408c 100644
--- a/src/HTMLRenderer.h
+++ b/src/HTMLRenderer.h
@@ -161,9 +161,14 @@ class HTMLRenderer : public OutputDev
////////////////////////////////////////////////////
// state tracking
////////////////////////////////////////////////////
+ // check updated states, and determine new_line_stauts
+ // make sure this function can be called several times consecutively without problem
void check_state_change(GfxState * state);
- void reset_state_track();
- void prepare_line(); // close current span or div if necessary, according to new_line_status
+ // reset all ***_changed flags
+ void reset_state_change();
+ // prepare the line context, (close old tags, open new tags)
+ // make sure the current HTML style consistent with PDF
+ void prepare_line(GfxState * state);
void close_line();
diff --git a/src/HTMLRenderer/export.cc b/src/HTMLRenderer/export.cc
index 3d81c3a..3236ef2 100644
--- a/src/HTMLRenderer/export.cc
+++ b/src/HTMLRenderer/export.cc
@@ -148,6 +148,9 @@ void HTMLRenderer::export_color (long long color_id, const GfxRGB * rgb)
void HTMLRenderer::export_whitespace (long long ws_id, double ws_width)
{
- allcss_fout << format("._%|1$x|{width:%2%px;}") % ws_id % ws_width << endl;
+ if(ws_width > 0)
+ allcss_fout << format("._%|1$x|{display:inline-block;width:%2%px;}") % ws_id % ws_width << endl;
+ else
+ allcss_fout << format("._%|1$x|{display:inline;margin-left:%2%px;}") % ws_id % ws_width << endl;
}
diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc
index 074e588..422538c 100644
--- a/src/HTMLRenderer/general.cc
+++ b/src/HTMLRenderer/general.cc
@@ -182,7 +182,7 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state)
draw_scale = 1.0;
draw_tx = draw_ty = 0;
- reset_state_track();
+ reset_state_change();
}
void HTMLRenderer::endPage() {
diff --git a/src/HTMLRenderer/image.cc b/src/HTMLRenderer/image.cc
index 6174ddb..03188dd 100644
--- a/src/HTMLRenderer/image.cc
+++ b/src/HTMLRenderer/image.cc
@@ -55,7 +55,8 @@ void HTMLRenderer::drawImage(GfxState * state, Object * ref, Stream * str, int w
close_line();
- double * ctm = state->getCTM();
+ double ctm[6];
+ memcpy(ctm, state->getCTM(), sizeof(ctm));
ctm[4] = ctm[5] = 0.0;
html_fout << format("") % image_count % install_transform_matrix(ctm) % state->getCurX() % state->getCurY() % width % height << endl;
diff --git a/src/HTMLRenderer/state.cc b/src/HTMLRenderer/state.cc
index f7a31e8..4edae4d 100644
--- a/src/HTMLRenderer/state.cc
+++ b/src/HTMLRenderer/state.cc
@@ -89,7 +89,7 @@ void HTMLRenderer::check_state_change(GfxState * state)
}
// text position
- // we've been tracking the text position positively in update... function
+ // we've been tracking the text position positively in the update*** functions
if(all_changed || text_pos_changed)
{
need_recheck_position = true;
@@ -224,9 +224,48 @@ void HTMLRenderer::check_state_change(GfxState * state)
}
}
- prepare_line();
+ reset_state_change();
+}
- // TODO: move the following to prepare_line ??
+void HTMLRenderer::reset_state_change()
+{
+ all_changed = false;
+
+ rise_changed = false;
+ text_pos_changed = false;
+
+ font_changed = false;
+ ctm_changed = false;
+ text_mat_changed = false;
+ hori_scale_changed = false;
+
+ letter_space_changed = false;
+ word_space_changed = false;
+
+ color_changed = false;
+}
+void HTMLRenderer::prepare_line(GfxState * state)
+{
+ // close old tags when necessary
+ if((line_status == LineStatus::NONE) || (new_line_status == LineStatus::NONE))
+ {
+ //pass
+ }
+ else if(new_line_status == LineStatus::DIV)
+ {
+ close_line();
+ }
+ else
+ {
+ assert(new_line_status == LineStatus::SPAN);
+ if(line_status == LineStatus::SPAN)
+ html_fout << "";
+ else
+ assert(line_status == LineStatus::DIV);
+ // don't change line_status
+ }
+
+ // open new tags when necessary
if(line_status == LineStatus::NONE)
{
new_line_status = LineStatus::DIV;
@@ -250,20 +289,10 @@ void HTMLRenderer::check_state_change(GfxState * state)
{
// don't close a pending span here, keep the styling
- if(target > param->h_eps)
- {
- double w;
- auto wid = install_whitespace(target, w);
- html_fout << format(" ") % wid;
- draw_tx += w / draw_scale;
- }
- else
- {
- // shift left
- // TODO, create a class for this
- html_fout << format("") % target;
- draw_tx += target / draw_scale;
- }
+ double w;
+ auto wid = install_whitespace(target, w);
+ html_fout << format("%2%") % wid % (target > 0 ? " " : "");
+ draw_tx += w / draw_scale;
}
}
@@ -311,48 +340,12 @@ void HTMLRenderer::check_state_change(GfxState * state)
line_status = new_line_status;
}
- reset_state_track();
-
-}
-
-void HTMLRenderer::reset_state_track()
-{
- all_changed = false;
-
- rise_changed = false;
- text_pos_changed = false;
-
- font_changed = false;
- ctm_changed = false;
- text_mat_changed = false;
- hori_scale_changed = false;
-
- letter_space_changed = false;
- word_space_changed = false;
-
- color_changed = false;
-}
-void HTMLRenderer::prepare_line()
-{
- if((line_status == LineStatus::NONE) || (new_line_status == LineStatus::NONE))
- return;
-
- if(new_line_status == LineStatus::DIV)
- {
- close_line();
- }
- else
- {
- assert(new_line_status == LineStatus::SPAN);
- if(line_status == LineStatus::SPAN)
- html_fout << "";
- else
- assert(line_status == LineStatus::DIV);
- // don't change line_status
- }
}
void HTMLRenderer::close_line()
{
+ if(line_status == LineStatus::NONE)
+ return;
+
if(line_status == LineStatus::SPAN)
html_fout << "";
else
diff --git a/src/HTMLRenderer/text.cc b/src/HTMLRenderer/text.cc
index bcbf84a..a5cc07f 100644
--- a/src/HTMLRenderer/text.cc
+++ b/src/HTMLRenderer/text.cc
@@ -155,6 +155,7 @@ void HTMLRenderer::drawString(GfxState * state, GooString * s)
// see if the line has to be closed due to state change
check_state_change(state);
+ prepare_line(state);
// Now ready to output
// get the unicodes