mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-10-04 19:21:40 +00:00
155 lines
3.2 KiB
C++
155 lines
3.2 KiB
C++
|
/*
|
||
|
* Misc functions
|
||
|
*
|
||
|
*
|
||
|
* by WangLu
|
||
|
* 2012.08.10
|
||
|
*/
|
||
|
|
||
|
#include <istream>
|
||
|
#include <ostream>
|
||
|
#include <cmath>
|
||
|
#include <cstdarg>
|
||
|
#include <vector>
|
||
|
|
||
|
#include <GfxState.h>
|
||
|
#include <GfxFont.h>
|
||
|
#include <CharTypes.h>
|
||
|
#include <GlobalParams.h>
|
||
|
#include <Object.h>
|
||
|
|
||
|
// for mkdir
|
||
|
#include <sys/stat.h>
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
#include "util.h"
|
||
|
|
||
|
using std::cerr;
|
||
|
using std::endl;
|
||
|
using std::string;
|
||
|
|
||
|
bool isLegalUnicode(Unicode u)
|
||
|
{
|
||
|
/*
|
||
|
if((u == 9) || (u == 10) || (u == 13))
|
||
|
return true;
|
||
|
*/
|
||
|
|
||
|
if(u <= 31)
|
||
|
return false;
|
||
|
|
||
|
if((u >= 127) && (u <= 159))
|
||
|
return false;
|
||
|
|
||
|
if((u >= 0xd800) && (u <= 0xdfff))
|
||
|
return false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
Unicode map_to_private(CharCode code)
|
||
|
{
|
||
|
Unicode private_mapping = (Unicode)(code + 0xE000);
|
||
|
if(private_mapping > 0xF8FF)
|
||
|
{
|
||
|
private_mapping = (Unicode)((private_mapping - 0xF8FF) + 0xF0000);
|
||
|
if(private_mapping > 0xFFFFD)
|
||
|
{
|
||
|
private_mapping = (Unicode)((private_mapping - 0xFFFFD) + 0x100000);
|
||
|
if(private_mapping > 0x10FFFD)
|
||
|
{
|
||
|
cerr << "Warning: all private use unicode are used" << endl;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return private_mapping;
|
||
|
}
|
||
|
|
||
|
Unicode unicode_from_font (CharCode code, GfxFont * font)
|
||
|
{
|
||
|
if(!font->isCIDFont())
|
||
|
{
|
||
|
char * cname = dynamic_cast<Gfx8BitFont*>(font)->getCharName(code);
|
||
|
// may be untranslated ligature
|
||
|
if(cname)
|
||
|
{
|
||
|
Unicode ou = globalParams->mapNameToUnicode(cname);
|
||
|
|
||
|
if(isLegalUnicode(ou))
|
||
|
return ou;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return map_to_private(code);
|
||
|
}
|
||
|
|
||
|
Unicode check_unicode(Unicode * u, int len, CharCode code, GfxFont * font)
|
||
|
{
|
||
|
if(len == 0)
|
||
|
return map_to_private(code);
|
||
|
|
||
|
if(len == 1)
|
||
|
{
|
||
|
if(isLegalUnicode(*u))
|
||
|
return *u;
|
||
|
}
|
||
|
|
||
|
return unicode_from_font(code, font);
|
||
|
}
|
||
|
|
||
|
void outputUnicodes(std::ostream & out, const Unicode * u, int uLen)
|
||
|
{
|
||
|
for(int i = 0; i < uLen; ++i)
|
||
|
{
|
||
|
switch(u[i])
|
||
|
{
|
||
|
case '&':
|
||
|
out << "&";
|
||
|
break;
|
||
|
case '\"':
|
||
|
out << """;
|
||
|
break;
|
||
|
case '\'':
|
||
|
out << "'";
|
||
|
break;
|
||
|
case '<':
|
||
|
out << "<";
|
||
|
break;
|
||
|
case '>':
|
||
|
out << ">";
|
||
|
break;
|
||
|
default:
|
||
|
{
|
||
|
char buf[4];
|
||
|
auto n = mapUTF8(u[i], buf, 4);
|
||
|
out.write(buf, n);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const char * base64stream::base64_encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
|
|
||
|
void create_directories(string path)
|
||
|
{
|
||
|
size_t idx = path.rfind('/');
|
||
|
if(idx != string::npos)
|
||
|
{
|
||
|
create_directories(path.substr(0, idx));
|
||
|
}
|
||
|
|
||
|
int r = ::mkdir(path.c_str(), S_IRWXU);
|
||
|
if(r != 0)
|
||
|
{
|
||
|
if(errno == EEXIST)
|
||
|
{
|
||
|
struct stat stat_buf;
|
||
|
if((::stat(path.c_str(), &stat_buf) == 0) && S_ISDIR(stat_buf.st_mode))
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
throw string("Cannot create directory: ") + path;
|
||
|
}
|
||
|
}
|
||
|
|