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