/* * Copyright (C) 2004-2012 Geometer Plus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ #include #include #include #include "FormatPlugin.h" #include "../library/Book.h" bool FormatPlugin::detectEncodingAndLanguage(Book &book, ZLInputStream &stream, bool force) { std::string language = book.language(); std::string encoding = book.encoding(); if (!force && !encoding.empty() && !language.empty()) { return true; } bool detected = false; PluginCollection &collection = PluginCollection::Instance(); if (language.empty()) { language = collection.DefaultLanguageOption.value(); } if (encoding.empty()) { encoding = collection.DefaultEncodingOption.value(); } if (collection.LanguageAutoDetectOption.value() && stream.open()) { static const int BUFSIZE = 65536; char *buffer = new char[BUFSIZE]; const std::size_t size = stream.read(buffer, BUFSIZE); stream.close(); shared_ptr info = ZLLanguageDetector().findInfo(buffer, size); delete[] buffer; if (!info.isNull()) { detected = true; if (!info->Language.empty()) { language = info->Language; } encoding = info->Encoding; if (encoding == "US-ASCII" || encoding == "ISO-8859-1") { encoding = "windows-1252"; } } } book.setEncoding(encoding); book.setLanguage(language); return detected; } bool FormatPlugin::detectLanguage(Book &book, ZLInputStream &stream, const std::string &encoding, bool force) { std::string language = book.language(); if (!force && !language.empty()) { return true; } bool detected = false; PluginCollection &collection = PluginCollection::Instance(); if (language.empty()) { language = collection.DefaultLanguageOption.value(); } if (collection.LanguageAutoDetectOption.value() && stream.open()) { static const int BUFSIZE = 65536; char *buffer = new char[BUFSIZE]; const std::size_t size = stream.read(buffer, BUFSIZE); stream.close(); shared_ptr info = ZLLanguageDetector().findInfoForEncoding(encoding, buffer, size, -20000); delete[] buffer; if (!info.isNull()) { if (!info->Language.empty()) { detected = true; language = info->Language; } } } book.setLanguage(language); return detected; } const std::string &FormatPlugin::tryOpen(const ZLFile&) const { static const std::string EMPTY = ""; return EMPTY; } shared_ptr FormatPlugin::coverImage(const ZLFile &file) const { return 0; }