| //======================================================================== |
| // |
| // This file comes from pdftohtml project |
| // http://pdftohtml.sourceforge.net |
| // |
| // Copyright from: |
| // Gueorgui Ovtcharov |
| // Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/> |
| // Mikhail Kruk <meshko@cs.brandeis.edu> |
| // |
| //======================================================================== |
| |
| //======================================================================== |
| // |
| // Modified under the Poppler project - http://poppler.freedesktop.org |
| // |
| // All changes made under the Poppler project to this file are licensed |
| // under GPL version 2 or later |
| // |
| // Copyright (C) 2008 Boris Toloknov <tlknv@yandex.ru> |
| // Copyright (C) 2010 Albert Astals Cid <aacid@kde.org> |
| // Copyright (C) 2013 Julien Nabet <serval2412@yahoo.fr> |
| // |
| // To see a description of the changes please see the Changelog file that |
| // came with your tarball or type make ChangeLog if you are building from git |
| // |
| //======================================================================== |
| |
| #include "HtmlLinks.h" |
| |
| extern bool xml; |
| |
| HtmlLink::HtmlLink(const HtmlLink& x){ |
| Xmin=x.Xmin; |
| Ymin=x.Ymin; |
| Xmax=x.Xmax; |
| Ymax=x.Ymax; |
| dest=new GooString(x.dest); |
| } |
| |
| HtmlLink::HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString * _dest) |
| { |
| if (xmin < xmax) { |
| Xmin=xmin; |
| Xmax=xmax; |
| } else { |
| Xmin=xmax; |
| Xmax=xmin; |
| } |
| if (ymin < ymax) { |
| Ymin=ymin; |
| Ymax=ymax; |
| } else { |
| Ymin=ymax; |
| Ymax=ymin; |
| } |
| dest=new GooString(_dest); |
| } |
| |
| HtmlLink::~HtmlLink(){ |
| delete dest; |
| } |
| |
| bool HtmlLink::isEqualDest(const HtmlLink& x) const{ |
| return (!strcmp(dest->c_str(), x.dest->c_str())); |
| } |
| |
| bool HtmlLink::inLink(double xmin,double ymin,double xmax,double ymax) const { |
| double y=(ymin+ymax)/2; |
| if (y>Ymax) return false; |
| return (y>Ymin)&&(xmin<Xmax)&&(xmax>Xmin); |
| } |
| |
| static GooString* EscapeSpecialChars( GooString* s ) |
| { |
| GooString* tmp = nullptr; |
| for( int i = 0, j = 0; i < s->getLength(); i++, j++ ){ |
| const char *replace = nullptr; |
| switch ( s->getChar(i) ){ |
| case '"': replace = """; break; |
| case '&': replace = "&"; break; |
| case '<': replace = "<"; break; |
| case '>': replace = ">"; break; |
| default: continue; |
| } |
| if( replace ){ |
| if( !tmp ) tmp = new GooString( s ); |
| if( tmp ){ |
| tmp->del( j, 1 ); |
| int l = strlen( replace ); |
| tmp->insert( j, replace, l ); |
| j += l - 1; |
| } |
| } |
| } |
| return tmp ? tmp : s; |
| } |
| |
| GooString* HtmlLink::getLinkStart() { |
| GooString *res = new GooString("<a href=\""); |
| GooString *d = xml ? EscapeSpecialChars(dest) : dest; |
| res->append( d ); |
| if( d != dest ) delete d; |
| res->append("\">"); |
| return res; |
| } |
| |
| /*GooString* HtmlLink::Link(GooString* content){ |
| //GooString* _dest=new GooString(dest); |
| GooString *tmp=new GooString("<a href=\""); |
| tmp->append(dest); |
| tmp->append("\">"); |
| tmp->append(content); |
| tmp->append("</a>"); |
| //delete _dest; |
| return tmp; |
| }*/ |
| |
| |
| |
| HtmlLinks::HtmlLinks(){ |
| accu=new std::vector<HtmlLink>(); |
| } |
| |
| HtmlLinks::~HtmlLinks(){ |
| delete accu; |
| accu=nullptr; |
| } |
| |
| bool HtmlLinks::inLink(double xmin,double ymin,double xmax,double ymax,int& p)const { |
| |
| for(std::vector<HtmlLink>::iterator i=accu->begin();i!=accu->end();++i){ |
| if (i->inLink(xmin,ymin,xmax,ymax)) { |
| p=(i - accu->begin()); |
| return 1; |
| } |
| } |
| return 0; |
| } |
| |
| HtmlLink* HtmlLinks::getLink(int i) const{ |
| return &(*accu)[i]; |
| } |
| |