HtmlLinks.cc 3.49 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//========================================================================
//
// 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
//
17 18 19
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
20
// Copyright (C) 2008 Boris Toloknov <tlknv@yandex.ru>
Albert Astals Cid's avatar
Albert Astals Cid committed
21
// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
22
// Copyright (C) 2013 Julien Nabet <serval2412@yahoo.fr>
23 24 25 26 27 28
//
// 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
//
//========================================================================

29 30
#include "HtmlLinks.h"

Boris Toloknov's avatar
Boris Toloknov committed
31 32
extern GBool xml;

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
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(){
Albert Astals Cid's avatar
Albert Astals Cid committed
61
 delete dest;
62 63 64 65 66 67 68 69 70 71 72 73
}

GBool HtmlLink::isEqualDest(const HtmlLink& x) const{
  return (!strcmp(dest->getCString(), x.dest->getCString()));
}

GBool HtmlLink::inLink(double xmin,double ymin,double xmax,double ymax) const {
  double y=(ymin+ymax)/2;
  if (y>Ymax) return gFalse;
  return (y>Ymin)&&(xmin<Xmax)&&(xmax>Xmin);
 }
  
Boris Toloknov's avatar
Boris Toloknov committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
static GooString* EscapeSpecialChars( GooString* s )
{
    GooString* tmp = NULL;
    for( int i = 0, j = 0; i < s->getLength(); i++, j++ ){
        const char *replace = NULL;
        switch ( s->getChar(i) ){
	        case '"': replace = "&quot;";  break;
	        case '&': replace = "&amp;";  break;
	        case '<': replace = "&lt;";  break;
	        case '>': replace = "&gt;";  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;
}

99
GooString* HtmlLink::getLinkStart() {
Boris Toloknov's avatar
Boris Toloknov committed
100 101 102 103
  GooString *res = new GooString("<a href=\"");
  GooString *d = xml ? EscapeSpecialChars(dest) : dest;
  res->append( d );
  if( d != dest ) delete d;
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
  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(){
Albert Astals Cid's avatar
Albert Astals Cid committed
122
  accu=new std::vector<HtmlLink>();
123 124 125 126 127 128 129 130 131
}

HtmlLinks::~HtmlLinks(){
  delete accu;
  accu=NULL; 
}

GBool HtmlLinks::inLink(double xmin,double ymin,double xmax,double ymax,int& p)const {
  
132
  for(std::vector<HtmlLink>::iterator i=accu->begin();i!=accu->end();++i){
133 134 135 136 137 138 139 140 141
    if (i->inLink(xmin,ymin,xmax,ymax)) {
        p=(i - accu->begin());
        return 1;
    }
   }
  return 0;
}

HtmlLink* HtmlLinks::getLink(int i) const{
Albert Astals Cid's avatar
Albert Astals Cid committed
142
  return &(*accu)[i];
143 144
}