bool HyphDictionaryList::open(lString16 hyphDirectory, bool clear) { CRLog::info("HyphDictionaryList::open(%s)", LCSTR(hyphDirectory) ); if (clear) { _list.clear(); addDefault(); } if ( hyphDirectory.empty() ) return true; //LVAppendPathDelimiter( hyphDirectory ); LVContainerRef container; LVStreamRef stream; if ( (hyphDirectory.endsWith("/") || hyphDirectory.endsWith("\\")) && LVDirectoryExists(hyphDirectory) ) { container = LVOpenDirectory( hyphDirectory.c_str(), L"*.*" ); } else if ( LVFileExists(hyphDirectory) ) { stream = LVOpenFileStream( hyphDirectory.c_str(), LVOM_READ ); if ( !stream.isNull() ) container = LVOpenArchieve( stream ); } if ( !container.isNull() ) { int len = container->GetObjectCount(); int count = 0; CRLog::info("%d items found in hyph directory", len); for ( int i=0; i<len; i++ ) { const LVContainerItemInfo * item = container->GetObjectInfo( i ); lString16 name = item->GetName(); lString16 suffix; HyphDictType t = HDT_NONE; if ( name.endsWith(".pdb") ) { suffix = "_hyphen_(Alan).pdb"; t = HDT_DICT_ALAN; } else if ( name.endsWith(".pattern") ) { suffix = ".pattern"; t = HDT_DICT_TEX; } else continue; lString16 filename = hyphDirectory + name; lString16 id = name; lString16 title = name; if ( title.endsWith( suffix ) ) title.erase( title.length() - suffix.length(), suffix.length() ); _list.add( new HyphDictionary( t, title, id, filename ) ); count++; } CRLog::info("%d dictionaries added to list", _list.length()); return true; } else { CRLog::info("no hyphenation dictionary items found in hyph directory %s", LCSTR(hyphDirectory)); } return false; }
void onToken(char token) { // 4,5: font-family: // 6,7: font-weight: // 8,9: font-style: //10,11: src: // 10 11 12 13 // src : url ( //CRLog::trace("state==%d: %c ", _state, token); switch (token) { case ':': if (_state < 2) { _state = 0; } else if (_state == 4 || _state == 6 || _state == 8 || _state == 10) { _state++; } else if (_state != 3) { _state = 2; } break; case ';': if (_state < 2) { _state = 0; } else if (_state != 3) { _state = 2; } break; case '{': if (_state == 1) { _state = 2; // inside @font { _face.clear(); _italic = false; _bold = false; _url.clear(); } else _state = 3; // inside other { break; case '}': if (_state == 2) { if (!_url.empty()) { // CRLog::trace("@font { face: %s; bold: %s; italic: %s; url: %s", _face.c_str(), _bold ? "yes" : "no", // _italic ? "yes" : "no", LCSTR(_url)); _fontList.add(_url, _face, _bold, _italic); } } _state = 0; break; case '(': if (_state == 12) { _state = 13; } else { if (_state > 3) _state = 2; } break; } }
void processLine(lString16 & line) { if (line.lastChar()=='\r' || line.lastChar()=='\n') line.erase(line.length()-1, 1); if (state == 0) { // if (line.startsWith(lString16("%"))) { fprintf(out, "%s\n", LCSTR(line)); return; } if (line.startsWith(lString16("\\patterns{"))) { start(); return; } } else { lString16 word; for (int i=0; i<=line.length(); i++) { lChar16 ch = (i<line.length()) ? line[i] : 0; if (ch == '}') break; if (ch==' ' || ch=='\t' || ch=='%' || ch==0) { if (!word.empty()) { addPattern(word); word.clear(); } if (ch!=' ' && ch!='\t') break; } else { word.append(1, ch); } } } }
bool V3DocViewWin::loadSettings( lString16 filename ) { _settingsFileName = filename; LVStreamRef stream = LVOpenFileStream( filename.c_str(), LVOM_READ ); if ( stream.isNull() ) { _docview->propsUpdateDefaults( _props ); _docview->propsApply( _props ); _wm->getScreen()->setFullUpdateInterval(_props->getIntDef(PROP_DISPLAY_FULL_UPDATE_INTERVAL, 1)); _wm->getScreen()->setTurboUpdateEnabled(_props->getIntDef(PROP_DISPLAY_TURBO_UPDATE_MODE, 0)); //setAccelerators( _wm->getAccTables().get(lString16("main"), _props) ); return false; } if ( _props->loadFromStream( stream.get() ) ) { _props->setIntDef(PROP_FILE_PROPS_FONT_SIZE, 26); _docview->propsUpdateDefaults( _props ); _docview->propsApply( _props ); _wm->getScreen()->setFullUpdateInterval(_props->getIntDef(PROP_DISPLAY_FULL_UPDATE_INTERVAL, 1)); _wm->getScreen()->setTurboUpdateEnabled(_props->getIntDef(PROP_DISPLAY_TURBO_UPDATE_MODE, 0)); setAccelerators( _wm->getAccTables().get(lString16("main"), _props) ); return true; } _docview->propsUpdateDefaults( _props ); _docview->propsApply( _props ); _wm->getScreen()->setFullUpdateInterval(_props->getIntDef(PROP_DISPLAY_FULL_UPDATE_INTERVAL, 1)); _wm->getScreen()->setTurboUpdateEnabled(_props->getIntDef(PROP_DISPLAY_TURBO_UPDATE_MODE, 0)); //setAccelerators( _wm->getAccTables().get(lString16("main"), _props) ); return false; }
static lString8 encodeText(lString16 text16) { if (text16.empty()) return lString8::empty_str; lString8 text = UnicodeToUtf8(text16); lString8 buf; for (int i=0; i<text.length(); i++) { char ch = text[i]; switch (ch) { case '\\': buf << "\\\\"; break; case '\n': buf << "\\n"; break; case '\r': buf << "\\r"; break; case '\t': buf << "\\t"; break; default: buf << ch; break; } } return buf; }
void addPattern(lString16 pattern) { if (pattern[0] == '.') pattern[0] = ' '; if (pattern[pattern.length()-1] == '.') pattern[pattern.length()-1] = ' '; fprintf(out, " <pattern>%s</pattern>\n", LCSTR(pattern)); }
bool TexHyph::load( lString16 fileName ) { LVStreamRef stream = LVOpenFileStream( fileName.c_str(), LVOM_READ ); if ( stream.isNull() ) return false; return load( stream ); }
WordWithRanges( const lString16 & w, const lString8 & enc, const ldomWord & range ) : word( w ), encoded( enc ) { wordLower = w; wordLower.lowercase(); ranges.add( range ); }
bool V3DocViewWin::loadHistory( lString16 filename ) { CRLog::trace("V3DocViewWin::loadHistory( %s )", UnicodeToUtf8(filename).c_str()); _historyFileName = filename; LVStreamRef stream = LVOpenFileStream( filename.c_str(), LVOM_READ ); return loadHistory( stream ); }
bool ReaderViewNative::loadDocument( lString16 filename ) { CRLog::info("Loading document %s", LCSTR(filename)); bool res = _docview->LoadDocument(filename.c_str()); CRLog::info("Document %s is loaded %s", LCSTR(filename), (res?"successfully":"with error")); return res; }
bool V3DocViewWin::loadDictConfig( lString16 filename ) { LVStreamRef stream = LVOpenFileStream( filename.c_str(), LVOM_READ ); if ( !stream.isNull() ) { _dictConfig = filename; return true; } return false; }
static void splitFName( lString16 pathname, lString16 & path, lString16 & name ) { // int spos = -1; for ( spos=pathname.length()-1; spos>=0; spos-- ) { lChar16 ch = pathname[spos]; if ( ch=='\\' || ch=='/' ) { break; } } if ( spos>=0 ) { path = pathname.substr( 0, spos+1 ); name = pathname.substr( spos+1, pathname.length()-spos-1 ); } else { path.clear(); name = pathname; } }
static void SetFieldValue( char * dst, lString16 src ) { *dst = 0; if ( src.empty() ) return; lString8 utf8 = UnicodeToUtf8( src ); strncpy( dst, utf8.c_str(), MAX_PROPERTY_LEN-1); dst[MAX_PROPERTY_LEN-1] = 0; }
bool SearchDialog::findText( lString16 pattern, int origin, bool reverse, bool caseInsensitive ) { if ( pattern.empty() ) return false; if ( pattern!=_lastPattern && origin==1 ) origin = 0; _lastPattern = pattern; LVArray<ldomWord> words; lvRect rc; _docview->getDocView()->GetPos( rc ); int pageHeight = rc.height(); int start = -1; int end = -1; if ( reverse ) { // reverse if ( origin == 0 ) { // from end current page to first page end = rc.bottom; } else if ( origin == -1 ) { // from last page to end of current page start = rc.bottom; } else { // origin == 1 // from prev page to first page end = rc.top; } } else { // forward if ( origin == 0 ) { // from current page to last page start = rc.top; } else if ( origin == -1 ) { // from first page to current page end = rc.top; } else { // origin == 1 // from next page to last start = rc.bottom; } } CRLog::debug("CRViewDialog::findText: Current page: %d .. %d", rc.top, rc.bottom); CRLog::debug("CRViewDialog::findText: searching for text '%s' from %d to %d origin %d", LCSTR(pattern), start, end, origin ); if ( _docview->getDocView()->getDocument()->findText( pattern, caseInsensitive, reverse, start, end, words, 200, pageHeight ) ) { CRLog::debug("CRViewDialog::findText: pattern found"); _docview->getDocView()->clearSelection(); _docview->getDocView()->selectWords( words ); ldomMarkedRangeList * ranges = _docview->getDocView()->getMarkedRanges(); if ( ranges ) { if ( ranges->length()>0 ) { int pos = ranges->get(0)->start.y; _docview->getDocView()->SetPos(pos); } } return true; } CRLog::debug("CRViewDialog::findText: pattern not found"); return false; }
bool V3DocViewWin::loadDocument( lString16 filename ) { if ( !_docview->LoadDocument( filename.c_str() ) ) { CRLog::error("V3DocViewWin::loadDocument( %s ) - failed!", UnicodeToUtf8(filename).c_str() ); return false; } //_docview->swapToCache(); _docview->restorePosition(); return true; }
TexPattern( const lString16 &s ) : next( NULL ) { memset( word, 0, sizeof(word) ); memset( attr, '0', sizeof(attr) ); attr[sizeof(attr)-1] = 0; int n = 0; for ( int i=0; i<(int)s.length() && n<MAX_PATTERN_SIZE; i++ ) { lChar16 ch = s[i]; if ( ch>='0' && ch<='9' ) { attr[n] = (char)ch; // if (n>0) // attr[n-1] = (char)ch; } else { word[n++] = ch; } if (i==(int)s.length()-1) attr[n+1] = 0; } }
bool setManglingKey(lString16 key) { if (key.startsWith(lString16(L"urn:uuid:"))) key = key.substr(9); _fontManglingKey.clear(); _fontManglingKey.reserve(16); lUInt8 b = 0; int n = 0; for (int i=0; i<key.length(); i++) { int d = hexDigit(key[i]); if (d>=0) { b = (b << 4) | d; if (++n > 1) { _fontManglingKey.add(b); n = 0; b = 0; } } } return _fontManglingKey.length() == 16; }
static void putTagValue( LVStream * stream, int level, const char * tag, lString16 value ) { for ( int i=0; i<level; i++ ) *stream << " "; *stream << "<" << tag; if ( value.empty() ) { *stream << "/>\r\n"; } else { *stream << ">" << UnicodeToUtf8( value ).c_str() << "</" << tag << ">\r\n"; } }
bool V3DocViewWin::loadDefaultCover( lString16 filename ) { LVImageSourceRef cover = LVCreateFileCopyImageSource( filename.c_str() ); if ( !cover.isNull() ) { _docview->setDefaultCover( cover ); return true; } else { IMAGE_SOURCE_FROM_BYTES(defCover, cr3_def_cover_gif); _docview->setDefaultCover( defCover ); return false; } }
bool V3DocViewWin::saveHistory( lString16 filename ) { crtrace log; if ( filename.empty() ) filename = _historyFileName; if ( filename.empty() ) { CRLog::info("Cannot write history file - no file name specified"); return false; } CRLog::debug("Exporting bookmarks to %s", UnicodeToUtf8(_bookmarkDir).c_str()); _docview->exportBookmarks(_bookmarkDir); //use default filename _historyFileName = filename; log << "V3DocViewWin::saveHistory(" << filename << ")"; LVStreamRef stream = LVOpenFileStream( filename.c_str(), LVOM_WRITE ); if ( !stream ) { lString16 path16 = LVExtractPath( filename ); lString8 path = UnicodeToLocal( path16 ); #ifdef _WIN32 if ( !CreateDirectoryW( path16.c_str(), NULL ) ) { CRLog::error("Cannot create directory %s", path.c_str() ); } else { stream = LVOpenFileStream( filename.c_str(), LVOM_WRITE ); } #else path.erase( path.length()-1, 1 ); CRLog::warn("Cannot create settings file, trying to create directory %s", path.c_str()); if ( mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) ) { CRLog::error("Cannot create directory %s", path.c_str() ); } else { stream = LVOpenFileStream( filename.c_str(), LVOM_WRITE ); } #endif } if ( stream.isNull() ) { CRLog::error("Error while creating history file %s - position will be lost", UnicodeToUtf8(filename).c_str() ); return false; } return saveHistory( stream ); }
bool V3DocViewWin::saveSettings( lString16 filename ) { crtrace log; if ( filename.empty() ) filename = _settingsFileName; if ( filename.empty() ) return false; _settingsFileName = filename; log << "V3DocViewWin::saveSettings(" << filename << ")"; LVStreamRef stream = LVOpenFileStream( filename.c_str(), LVOM_WRITE ); if ( !stream ) { lString16 path16 = LVExtractPath( filename ); lString8 path = UnicodeToLocal( path16 ); #ifdef _WIN32 if ( !CreateDirectoryW( path16.c_str(), NULL ) ) { CRLog::error("Cannot create directory %s", path.c_str() ); } else { stream = LVOpenFileStream( filename.c_str(), LVOM_WRITE ); } #else path.erase( path.length()-1, 1 ); CRLog::warn("Cannot create settings file, trying to create directory %s", path.c_str()); if ( mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) ) { CRLog::error("Cannot create directory %s", path.c_str() ); } else { stream = LVOpenFileStream( filename.c_str(), LVOM_WRITE ); } #endif } if ( stream.isNull() ) { lString8 fn = UnicodeToUtf8( filename ); CRLog::error("Cannot open settings file %s for write", fn.c_str() ); return false; } return _props->saveToStream( stream.get() ); }
static void findImagesFromDirectory( lString16 dir, lString16Collection & files ) { LVAppendPathDelimiter(dir); if ( !LVDirectoryExists(dir) ) return; LVContainerRef cont = LVOpenDirectory(dir.c_str()); if ( !cont.isNull() ) { for ( int i=0; i<cont->GetObjectCount(); i++ ) { const LVContainerItemInfo * item = cont->GetObjectInfo(i); if ( !item->IsContainer() ) { lString16 name = item->GetName(); name.lowercase(); if ( name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".gif") || name.endsWith(".jpeg") ) { files.add(dir + item->GetName()); } } } } }
bool ReaderViewNative::saveHistory( lString16 filename ) { if ( !filename.empty() ) historyFileName = filename; if ( historyFileName.empty() ) return false; if ( _docview->isDocumentOpened() ) { CRLog::debug("ReaderViewNative::saveHistory() : saving position"); _docview->savePosition(); } CRLog::info("Trying to save history to file %s", LCSTR(historyFileName)); CRFileHist * hist = _docview->getHistory(); LVStreamRef stream = LVOpenFileStream(historyFileName.c_str(), LVOM_WRITE); if ( stream.isNull() ) { CRLog::error("Cannot create file %s for writing", LCSTR(historyFileName)); return false; } if ( _docview->isDocumentOpened() ) _docview->savePosition(); return hist->saveToStream( stream.get() ); }
//TODO: place TinyDictionary to separate file CRTinyDict::CRTinyDict( const lString16& config ) { lString16 path = config; LVAppendPathDelimiter( path ); LVContainerRef dir = LVOpenDirectory( config.c_str() ); if ( !dir ) dir = LVOpenDirectory( LVExtractPath(config).c_str() ); if ( !dir.isNull() ) { int count = dir->GetSize(); lString16 indexExt(".index"); for ( int i=0; i<count; i++ ) { const LVContainerItemInfo * item = dir->GetObjectInfo( i ); if ( !item->IsContainer() ) { lString16 name = item->GetName(); if ( name.endsWith( indexExt ) ) { lString16 nameBase = name.substr( 0, name.length() - indexExt.length() ); lString16 name1 = nameBase + ".dict"; lString16 name2 = nameBase + ".dict.dz"; lString16 dataName; int index = -1; for ( int n=0; n<count; n++ ) { const LVContainerItemInfo * item2 = dir->GetObjectInfo( n ); if ( !item2->IsContainer() ) { if ( item2->GetName() == name1 || item2->GetName() == name2 ) { index = n; dataName = item2->GetName(); break; } } } if ( index>=0 ) { // found pair dicts.add(UnicodeToUtf8(path + name).c_str(), UnicodeToUtf8(path + dataName).c_str()); } } } } } CRLog::info( "%d dictionaries opened", dicts.length() ); }
bool ReaderViewNative::loadHistory( lString16 filename ) { CRFileHist * hist = _docview->getHistory(); if ( !filename.empty() ) historyFileName = filename; historyFileName = filename; if ( historyFileName.empty() ) { CRLog::error("No history file name specified"); return false; } CRLog::info("Trying to load history from file %s", LCSTR(historyFileName)); LVStreamRef stream = LVOpenFileStream(historyFileName.c_str(), LVOM_READ); if ( stream.isNull() ) { CRLog::error("Cannot open file %s", LCSTR(historyFileName)); return false; } bool res = hist->loadFromStream( stream ); if ( res ) CRLog::info("%d items found", hist->getRecords().length()); else CRLog::error("Cannot read history file content"); return res; }
/// load stylesheet from file, with processing of import bool LVLoadStylesheetFile( lString16 pathName, lString8 & css ) { LVStreamRef file = LVOpenFileStream( pathName.c_str(), LVOM_READ ); if ( file.isNull() ) return false; lString8 txt = UnicodeToUtf8( LVReadTextFile( file ) ); lString8 txt2; const char * s = txt.c_str(); lString8 import_file; if ( LVProcessStyleSheetImport( s, import_file ) ) { lString16 importFilename = LVMakeRelativeFilename( pathName, Utf8ToUnicode(import_file) ); //lString8 ifn = UnicodeToLocal(importFilename); //const char * ifns = ifn.c_str(); if ( !importFilename.empty() ) { LVStreamRef file2 = LVOpenFileStream( importFilename.c_str(), LVOM_READ ); if ( !file2.isNull() ) txt2 = UnicodeToUtf8( LVReadTextFile( file2 ) ); } } if ( !txt2.empty() ) txt2 << "\r\n"; css = txt2 + s; return !css.empty(); }
bool matchWord( const lString16 & prefix ) { if ( prefix.empty() ) return false; return word.startsWithNoCase( prefix ); }
virtual const lChar16 * GetName() const { return _name.c_str(); }
int LVDocFormatFromExtension(lString16 &pathName) { if (pathName.endsWith(".fb2")) return doc_format_fb2; if (pathName.endsWith(".txt") || pathName.endsWith(".tcr") || pathName.endsWith(".pml")) return doc_format_txt; if (pathName.endsWith(".rtf")) return doc_format_rtf; if (pathName.endsWith(".epub")) return doc_format_epub; if (pathName.endsWith(".htm") || pathName.endsWith(".html") || pathName.endsWith(".shtml") || pathName.endsWith(".xhtml")) return doc_format_html; if (pathName.endsWith(".txt.bmk")) return doc_format_txt_bookmark; if (pathName.endsWith(".chm")) return doc_format_chm; if (pathName.endsWith(".doc")) return doc_format_doc; if (pathName.endsWith(".pdb") || pathName.endsWith(".prc") || pathName.endsWith(".mobi") || pathName.endsWith(".azw")) return doc_format_pdb; return doc_format_none; }
void addPropLine( lString8 & buf, const char * description, const lString16 & value ) { if ( !value.empty() ) { buf << "<tr><td>" << description << "</td><td>" << UnicodeToUtf8(value).c_str() << "</td></tr>\n"; } }