diff -urNp poppler-0.8.4.orig/utils/HtmlOutputDev.cc poppler-0.8.4.simx/utils/HtmlOutputDev.cc
--- poppler-0.8.4.orig/utils/HtmlOutputDev.cc 2008-03-26 15:38:52.000000000 -0400
+++ poppler-0.8.4.simx/utils/HtmlOutputDev.cc 2008-07-24 20:06:05.173967400 -0400
@@ -333,6 +333,15 @@ void HtmlPage::endString() {
curStr = NULL;
}
+static const char *strrstr( const char *s, const char *ss )
+{
+ const char *p = strstr( s, ss );
+ for( const char *pp = p; pp != NULL; pp = strstr( p+1, ss ) ){
+ p = pp;
+ }
+ return p;
+}
+
void HtmlPage::coalesce() {
HtmlString *str1, *str2;
HtmlFont *hfont1, *hfont2;
@@ -402,7 +411,7 @@ void HtmlPage::coalesce() {
str1->htext->insert(0,"",3);
if( hfont1->isItalic() )
str1->htext->insert(0,"",3);
- if( str1->getLink() != NULL ) {
+ if( str1->getLink() != NULL && !xml ) {
GooString *ls = str1->getLink()->getLinkStart();
str1->htext->insert(0, ls);
delete ls;
@@ -495,19 +504,25 @@ void HtmlPage::coalesce() {
}
/* fix and if str1 and str2 differ */
- if( hfont1->isBold() && !hfont2->isBold() )
- str1->htext->append("", 4);
- if( hfont1->isItalic() && !hfont2->isItalic() )
- str1->htext->append("", 4);
- if( !hfont1->isBold() && hfont2->isBold() )
- str1->htext->append("", 3);
+ bool finish_italic = hfont1->isItalic() && !hfont2->isItalic();
+ bool finish_bold = hfont1->isBold() && ( !hfont2->isBold() || finish_italic );
+ if( finish_bold && finish_italic && strrstr( str1->htext->getCString(), "" ) > strrstr( str1->htext->getCString(), "" ) ){
+ str1->htext->append("", 4);
+ finish_italic = false;
+ }
+ if( finish_bold )
+ str1->htext->append("", 4);
+ if( finish_italic )
+ str1->htext->append("", 4);
if( !hfont1->isItalic() && hfont2->isItalic() )
str1->htext->append("", 3);
+ if( ( !hfont1->isBold() || finish_bold ) && hfont2->isBold() )
+ str1->htext->append("", 3);
/* now handle switch of links */
HtmlLink *hlink1 = str1->getLink();
HtmlLink *hlink2 = str2->getLink();
- if( !hlink1 || !hlink2 || !hlink1->isEqualDest(*hlink2) ) {
+ if( !xml && ( !hlink1 || !hlink2 || !hlink1->isEqualDest(*hlink2) ) ) {
if(hlink1 != NULL )
str1->htext->append("");
if(hlink2 != NULL ) {
@@ -531,11 +546,17 @@ void HtmlPage::coalesce() {
delete str2;
} else { // keep strings separate
// printf("no\n");
- if( hfont1->isBold() )
- str1->htext->append("",4);
- if( hfont1->isItalic() )
- str1->htext->append("",4);
- if(str1->getLink() != NULL )
+ GBool finish_bold = hfont1->isBold();
+ GBool finish_italic = hfont1->isItalic();
+ if( finish_bold && finish_italic && strrstr( str1->htext->getCString(), "" ) > strrstr( str1->htext->getCString(), "" ) ){
+ str1->htext->append("", 4);
+ finish_italic = false;
+ }
+ if( finish_bold )
+ str1->htext->append("", 4);
+ if( finish_italic )
+ str1->htext->append("", 4);
+ if(str1->getLink() != NULL && !xml )
str1->htext->append("");
str1->xMin = curX; str1->yMin = curY;
@@ -546,7 +567,7 @@ void HtmlPage::coalesce() {
str1->htext->insert(0,"",3);
if( hfont1->isItalic() )
str1->htext->insert(0,"",3);
- if( str1->getLink() != NULL ) {
+ if( str1->getLink() != NULL && !xml ) {
GooString *ls = str1->getLink()->getLinkStart();
str1->htext->insert(0, ls);
delete ls;
@@ -554,11 +575,17 @@ void HtmlPage::coalesce() {
}
}
str1->xMin = curX; str1->yMin = curY;
- if( hfont1->isBold() )
- str1->htext->append("",4);
- if( hfont1->isItalic() )
- str1->htext->append("",4);
- if(str1->getLink() != NULL )
+ GBool finish_bold = hfont1->isBold();
+ GBool finish_italic = hfont1->isItalic();
+ if( finish_bold && finish_italic && strrstr( str1->htext->getCString(), "" ) > strrstr( str1->htext->getCString(), "" ) ){
+ str1->htext->append("", 4);
+ finish_italic = false;
+ }
+ if( finish_bold )
+ str1->htext->append("", 4);
+ if( finish_italic )
+ str1->htext->append("", 4);
+ if(str1->getLink() != NULL && !xml )
str1->htext->append("");
#if 0 //~ for debugging