cb2bib-1.4.9/0000755000175000017500000000000012045520051012570 5ustar rusconirusconicb2bib-1.4.9/c2bscripts/0000755000175000017500000000000012045517740014661 5ustar rusconirusconicb2bib-1.4.9/c2bscripts/c2bciter0000644000175000017500000000127512045517740016306 0ustar rusconirusconi#!/bin/sh #------------------------------------------------------------------------------- # c2bciter -- Wrapper for calling cb2Bib Citer # cb2Bib Tools # Copyright (C) 2004-2012 by Pere Constans # constans@molspaces.com # # Copyright (C) 2009 by Filippo Rusconi # rusconi@mnhn.fr # # June 2009: # - Make use of the "$@" argument instead of problematic "$1". # # See the LICENSE file that comes with this distribution #------------------------------------------------------------------------------- # Usage: c2bciter [dirname1 [dirname2 ... ]] # c2bciter [filename1.bib [filename2.bib ... ]] #------------------------------------------------------------------------------- cb2bib --citer "$@" cb2bib-1.4.9/c2bscripts/c2bciter.desktop0000644000175000017500000000055312045517740017754 0ustar rusconirusconi[Desktop Entry] Comment=Bibliographic Reference Citation Tool Comment[ca]=Eina bibliogràfica per escriure citacions Exec=cb2bib --citer %F GenericName=Reference Citation Tool GenericName[ca]=Eina per citacions bibliogràfiques Icon=cb2bib MimeType=text/x-bibtex; Name=c2bCiter Path=/usr/bin StartupNotify=false Terminal=false Categories=Office; Type=Application cb2bib-1.4.9/c2bscripts/cb2bib.desktop0000644000175000017500000000055612045517740017405 0ustar rusconirusconi[Desktop Entry] Comment=Bibliographic Reference Extracting Tool Comment[ca]=Eina per extreure referències bibliogràfiques Exec=cb2bib --bibedit %F GenericName=Reference Extracting Tool GenericName[ca]=Eina per extreure referències Icon=cb2bib MimeType=text/x-bibtex; Name=cb2Bib Path=/usr/bin StartupNotify=true Terminal=false Categories=Office; Type=Application cb2bib-1.4.9/c2bscripts/c2bimport.desktop0000644000175000017500000000061312045517740020155 0ustar rusconirusconi[Desktop Entry] Comment=Donwload reference to cb2Bib Comment[ca]=Importa referència al cb2Bib Exec=cb2bib --import %f GenericName=cb2Bib Import Reference GenericName[ca]=Importa referència al cb2Bib Icon=cb2bib MimeType=text/x-bibtex;application/x-download;application/bibtex; Name=c2bImport Path=/usr/bin NoDisplay=false StartupNotify=false Terminal=false Categories=Office; Type=Application cb2bib-1.4.9/c2bscripts/c2bimport0000644000175000017500000000147312045517740016512 0ustar rusconirusconi#!/bin/sh #------------------------------------------------------------------------------- # c2bimport -- Script for calling cb2Bib in "Download Reference to cb2Bib" mode # cb2Bib Tools # Copyright (C) 2004-2012 by Pere Constans # constans@molspaces.com # # Copyright (C) 2009 by Filippo Rusconi # rusconi@mnhn.fr # # June 2009: # - Make use of quoted "$1" argument instead of $1. # # See the LICENSE file that comes with this distribution #------------------------------------------------------------------------------- # Usage: c2bimport tmp_imported_reference_file #------------------------------------------------------------------------------- if test "$#" != 1; then cat < Added xml libs) QT += xml } else { exists($$[QT_INSTALL_HEADERS]/QtWebKit/qwebview.h) { message(Using Qt > 4.4 --> Added webkit libs) QT += webkit CONFIG += use_webkit } } cb2bib-1.4.9/c2btools/0000755000175000017500000000000012045520051014317 5ustar rusconirusconicb2bib-1.4.9/c2btools/med2bib0000755000175000017500000000520112045517740015562 0ustar rusconirusconi#!/bin/sh #------------------------------------------------------------------------------- # med2bib -- Script to convert PUBMED format to BibTeX # cb2Bib Tools # # Copyright (C) 2009 by Filippo Rusconi # rusconi@mnhn.fr # # Based on previous work by # Pere Constans # constans@molspaces.com # # See LICENSE file that comes with this distribution # # Usage: med2bib input_med output_bib #------------------------------------------------------------------------------- # Using med2xml and xml2bib utilities from: # http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Init variables #------------------------------------------------------------------------------- # Modify accordingly #med2xml=/usr/local/bin/med2xml #xml2bib=/usr/local/bin/xml2bib med2xml=med2xml xml2bib=xml2bib med2xml_flags="-u" xml2bib_flags="-sd -b" #------------------------------------------------------------------------------- # Immediately check that the needed programs are there: "${med2xml}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program med2xml (suite bibutils) is required." echo "Set it in your path, and/or modify $0 accordingly." echo "Ending processing." exit 1 fi "${xml2bib}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program xml2bib (suite bibutils) is required." echo "Set it in your path, and/or modify $0 accordingly." echo "Ending processing." exit 1 fi # Make sure we trap errors (we put that after the tests above because # we need the tests to fail, in case, without exiting immediately). set -e # Getting filenames from command line echo "cb2Bib Tools: Script to convert PUBMED-XML format to BibTeX" echo "" echo "It uses external package bibutils from" echo "http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html" echo "" if test "$#" != 2; then cat < c2b_tmp.xml "${xml2bib}" $xml2bib_flags c2b_tmp.xml | sed 's%^ISSUE=%NUMBER=%g' > c2b_tmp.bib # Clean up cd "${work_dir}" cp "${tmp_dir}"/c2b_tmp.bib "$bib" rm -rf "${tmp_dir}" echo "" echo "$0 ended." cb2bib-1.4.9/c2btools/bib2pdf0000755000175000017500000000631612045517740015576 0ustar rusconirusconi#!/bin/sh #------------------------------------------------------------------------------- # bib2pdf -- Script to convert BibTeX files to PDF # cb2Bib Tools # # Copyright (C) 2005-2012 by Pere Constans # constans@molspaces.com # # Improvements and modifications: # Copyright (C) 2009 by Filippo Rusconi # rusconi@mnhn.fr # # May/June 2009: # - Added checks to ensure that the used commands are available on # system. # - Make use of mktemp to create a temp directory. # # See LICENSE file that comes with this distribution # # Usage: bib2pdf input_bib output_pdf #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Init variables #------------------------------------------------------------------------------- # Modify accordingly, by choosing either pdflatex or latex+dvipdfm #latexCmd=pdflatex latexCmd=latex ; dvi2pdfCmd=dvipdfm bibtexCmd=bibtex #------------------------------------------------------------------------------- # Immediately check that the needed programs are there: "${latexCmd}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program ${latexCmd} (LaTeX software) is required." echo "Ending processing." exit 1 fi "${bibtexCmd}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program ${bibtexCmd} (BibTeX software) is required." echo "Ending processing." exit 1 fi # Special case with dvi2pdf: if [ "x${dvi2pdfCmd}" != "x" ] then "${dvi2pdfCmd}" --version | head -n2 | grep dvipdfm > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program ${dvi2pdfCmd} (LaTeX software) is required." echo "Ending processing." exit 1 fi fi # Make sure we trap errors (we put that after the tests above because # we need the tests to fail, in case, without exiting immediately). set -e # Getting filenames from command line echo "cb2Bib Tools: Script to convert BibTeX to PDF" if test "$#" != 2; then cat < "${tmp_dir}"/c2b_tmp.tex < /dev/null 2>&1 "${bibtexCmd}" c2b_tmp "${latexCmd}" $latex_flags c2b_tmp > /dev/null 2>&1 "${latexCmd}" $latex_flags c2b_tmp if [ "x${dvi2pdfCmd}" != "x" ] then "${dvi2pdfCmd}" c2b_tmp > /dev/null 2>&1 fi # Make sure we trap errors. set -e # Clean up cd "${work_dir}" cp "${tmp_dir}"/c2b_tmp.pdf "$pdf" rm -rf "${tmp_dir}" echo "$0 ended." cb2bib-1.4.9/c2btools/isi2bib0000755000175000017500000000545512045517740015614 0ustar rusconirusconi#!/bin/sh #------------------------------------------------------------------------------- # isi2bib -- Script to convert ISI format to BibTeX # cb2Bib Tools # # Copyright (C) 2005-2012 by Pere Constans # constans@molspaces.com # # Improvements and modifications: # Copyright (C) 2009 by Filippo Rusconi # rusconi@mnhn.fr # # May/June 2009: # - Added checks to ensure that the used commands are available on # system. # - Make use of mktemp to create a temp directory. # # See LICENSE file that comes with this distribution # # Usage: isi2bib input_isi output_bib #------------------------------------------------------------------------------- # Using isi2xml and xml2bib utilities from: # http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Init variables #------------------------------------------------------------------------------- # Modify accordingly #isi2xml=/usr/local/bin/isi2xml #xml2bib=/usr/local/bin/xml2bib isi2xml=isi2xml xml2bib=xml2bib isi2xml_flags="-u" xml2bib_flags="-sd -b" #------------------------------------------------------------------------------- # Immediately check that the needed programs are there: "${isi2xml}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program ris2xml (suite bibutils) is required." echo "Set it in your path, and/or modify $0 accordingly." echo "Ending processing." exit 1 fi "${xml2bib}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program xml2bib (suite bibutils) is required." echo "Set it in your path, and/or modify $0 accordingly." echo "Ending processing." exit 1 fi # Make sure we trap errors (we put that after the tests above because # we need the tests to fail, in case, without exiting immediately). set -e # Getting filenames from command line echo "cb2Bib Tools: Script to convert ISI format to BibTeX" echo "" echo "It uses external package bibutils from" echo "http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html" echo "" if test "$#" != 2; then cat < c2b_tmp.xml "${xml2bib}" $xml2bib_flags c2b_tmp.xml | sed 's%^ISSUE=%NUMBER=%g' > c2b_tmp.bib # Clean up cd "${work_dir}" cp "${tmp_dir}"/c2b_tmp.bib "$bib" rm -rf "${tmp_dir}" echo "" echo "$0 ended." cb2bib-1.4.9/c2btools/ris2bib0000755000175000017500000000546112045517740015622 0ustar rusconirusconi#!/bin/sh #------------------------------------------------------------------------------- # ris2bib -- Script to convert RIS format to BibTeX # cb2Bib Tools # # Copyright (C) 2005-2012 by Pere Constans # constans@molspaces.com # # Improvements and modifications: # Copyright (C) 2009 by Filippo Rusconi # rusconi@mnhn.fr # # May/June 2009: # - Added checks to ensure that the used commands are available on # system. # - Make use of mktemp to create a temp directory. # # See LICENSE file that comes with this distribution # # Usage: ris2bib input_ris output_bib #------------------------------------------------------------------------------- # Using ris2xml and xml2bib utilities from: # http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Init variables #------------------------------------------------------------------------------- # Modify accordingly #ris2xml=/usr/local/bin/ris2xml #xml2bib=/usr/local/bin/xml2bib ris2xml=ris2xml xml2bib=xml2bib ris2xml_flags="-u" xml2bib_flags="-sd -b" #------------------------------------------------------------------------------- # Immediately check that the needed programs are there: "${ris2xml}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program ris2xml (suite bibutils) is required." echo "Set it in your path, and/or modify $0 accordingly." echo "Ending processing." exit 1 fi "${xml2bib}" --version > /dev/null 2>&1 if [ "$?" != "0" ] then echo "Program xml2bib (suite bibutils) is required." echo "Set it in your path, and/or modify $0 accordingly." echo "Ending processing." exit 1 fi # Make sure we trap errors (we put that after the tests above because # we need the tests to fail, in case, without exiting immediately). set -e # Getting filenames from command line echo "cb2Bib Tools: Script to convert RIS format to BibTeX" echo "" echo "It uses external package bibutils from" echo "http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html" echo "" if test "$#" != 2; then cat < c2b_tmp.xml "${xml2bib}" ${xml2bib_flags} c2b_tmp.xml | sed 's%^ISSUE=%NUMBER=%g' > c2b_tmp.bib # Clean up cd "${work_dir}" cp "${tmp_dir}"/c2b_tmp.bib "$bib" rm -rf "${tmp_dir}" echo "" echo "$0 ended." cb2bib-1.4.9/src/0000755000175000017500000000000012045520050013356 5ustar rusconirusconicb2bib-1.4.9/src/c2bReferenceList.ui0000644000175000017500000001072512045517740017057 0ustar rusconirusconi Pere Constans c2bReferenceList 0 0 738 153 0 0 References 0 2 Clear filter :/icons/icons/clear_left.png:/icons/icons/clear_left.png Filter Author and Title ... :/icons/icons/filter.png:/icons/icons/filter.png QToolButton::InstantPopup QFrame::HLine QFrame::Sunken Qt::Horizontal true QFrame::Raised true QAbstractItemView::ExtendedSelection false true 6 0 1 2 3 4 5 0 0 true false c2bComboBox QComboBox
c2bComboBox.h
clearB clicked() comboFilter clearEditText() 735 152 548 151
cb2bib-1.4.9/src/findDialog.h0000644000175000017500000000250212045520050015566 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * findDialog is adapted from Qt Designer * Copyright (C) 2001 Trolltech AS. All rights reserved. ***************************************************************************/ #ifndef FINDDIALOG_H #define FINDDIALOG_H #include "ui_findDialog.h" #include #include class QPlainTextEdit; class QTextEdit; class findDialog : public QDialog { Q_OBJECT public: findDialog(QWidget* parentw = 0); ~findDialog(); QAction* findAction; QAction* findNextAction; QAction* findPreviousAction; public slots: int exec(); void findNext(); void findPrevious(); void findText(); void setEditor(QPlainTextEdit* editor); void setEditor(QTextEdit* editor); void show(); private slots: void accept(); private: QPointer _editor; QString m_find_pattern; Ui::findDialog ui; bool findText(const QString& pattern, bool do_forward = true, bool do_case_sensitive = false, bool do_whole_words = false); bool m_find_case; bool m_find_words; void init(); }; #endif cb2bib-1.4.9/src/c2b/0000755000175000017500000000000012045520050014024 5ustar rusconirusconicb2bib-1.4.9/src/c2b/bibSearcher.cpp0000644000175000017500000004563712045520050016760 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "bibSearcher.h" #include "bibParser.h" #include "settings.h" #include /** \page c2bsearch Search BibTeX files for references \section descrip Description - Search pattern \n Patterns and composite patterns can be either \htmlonly approximate strings, \endhtmlonly strings, regular expressions, or wildcard filters. Patterns admit Unicode characters. The scope of each pattern can be the reference as a whole or be focused on a particular reference field. The fields year, file, and journal are treated specifically. The field year has the qualifiers Exact, Newer, and Older. The field file can optionally refer to either the filename or the contents of such a file. Finally, for journal, the input pattern is duplicated to the, if available, journal fullname, and they two are checked against the journal actual field contents and, if available, its expanded contents. For example, typing 'ijqc' retrieves all references with journal being 'Int. J. Quantum Chem.'. Or, typing 'chemistry' retrieves any of 'J. Math. Chem.', 'J. Phys. Chem.', etc. This expansion is not performed when the pattern scope is set to all. - Search scope \n By default, searches are performed on the current BibTeX output file. If Scan all BibTeX files is checked the search will extend to all BibTeX files, extension .bib, present in the current directory. It might be therefore convenient to group all reference files in one common directory, or have them linked to that directory. When Scan linked documents is checked, and one or more pattern scope is all or file, the contents of the file in file is converted to text and scanned for that given pattern. See \ref c2bconf_utilities section to configure the external to text converter. - Search modifier \n \htmlonly The cb2Bib converts TeX encoded characters to Unicode when parsing the references. This permits, for instance, for the pattern 'Møller' to retrieve either 'Møller' or 'M{\o}ller', without regard to how the BibTeX reference is written. By checking Simplify source, the reference and the converted PDF files are simplified to plain Ascii. Thus, the pattern '\bMoller\b' will hit any of 'Møller', 'M{\o}ller', or 'Moller'. Additionally, all non-word characters are removed, preserving only the Ascii, word structure of the source. Note that source simplification is only performed for the patterns whose scope is all or file contents, and that and so far, the cb2Bib has only a subset of such conversions. Implemented TeX to Unicode conversions can be easily checked by entering a reference. The Unicode to Ascii letter-only conversion, on the other hand, is the one that the cb2Bib also uses to write the reference IDs and, hence, the renaming of dropped files. The cb2Bib can also understand minor sub and superscript formatting. For instance, the pattern 'H2O' will retrieve 'H2O' from a BibTeX string 'H$_{2}$O'. \endhtmlonly \section notes Notes - The cb2Bib uses an internal cache to speed up the search of linked files. By default data is stored as current_file.bib.c2b. It might be more convenient, however, to setup a temporary directory out of the user data backup directories. See Search In Files Cache Directory in \ref c2bconf_files. When a linked file is processed for the first time, the cb2Bib does several string manipulations, such as removing end of line hyphenations. This process is time consuming for very large files. - The approximate string search is described in reference \htmlonly http://arxiv.org/abs/0705.0751v1. \endhtmlonly It reduces the chance of missing a hit due to transcription and decoding errors in the document files. Approximate string is also a form of serendipitous information retrieval.

 

*/ /** Top level driver for searching BibTeX files */ bibSearcher::bibSearcher(bibParser* bp, QObject* parento) : QObject(parento), _bpP(bp), _do_search_similar(false) { clear(); } /** Top level driver for searching BibTeX files. Specialized constructor for searching repeated or similar references. */ bibSearcher::bibSearcher(bibParser* bp, const QString& bib_dir, QObject* parento) : QObject(parento), _bpP(bp), _do_search_similar(true) { // Retrieve (any_author(approximate) AND any_title(approximate)) OR citeidName(exact) clear(); setSearchScope(bib_dir, bib_dir, true, false); setSimplifySource(false); setBoolean(true); const QString type(searchPattern::type(searchPattern::ApproximateString)); addPattern(false, false, type, "all", QChar(), _bpP->currentReference().anyAuthor()); addPattern(false, false, type, "all", QChar(), _bpP->currentReference().anyTitle()); _do_search_similar_citeid = _bpP->currentReference().citeidName; if (_do_search_similar_citeid.isEmpty()) _do_search_similar_citeid = '@'; } bibSearcher::bibSearcher() : _bpP(0), _do_search_similar(false) { clear(); } void bibSearcher::addPattern(bool Not, bool caseSensitive, const QString& patternType, const QString& scope, const QChar& yearScope, const QString& pattern) { if (pattern.trimmed().isEmpty()) return; _patterns.append(searchPattern(Not, caseSensitive, patternType, scope, yearScope, pattern)); if (!_scopes.contains(scope)) _scopes.append(scope); } void bibSearcher::exec() { if (_patterns.count() == 0 && !_do_search_similar) return; qSort(_patterns); _include_documents = _include_documents && (_scopes.contains("all") || _scopes.contains("file")); if (_include_documents && !_scopes.contains("file")) _scopes.append("file"); _scopes.removeAll("all"); QString and_or; if (_boolean_and) and_or = ".AND."; else and_or = ".OR."; for (int i = 0; i < _patterns.count(); ++i) { const searchPattern& pattern = _patterns.at(i); _log_string += tr("% Pattern%1: %2%3\n").arg(i + 1).arg(and_or).arg(pattern.toString()); } // Search In Files const QStringList flist(_all_bibtex_files ? c2bUtils::filesInDir(_bibtex_dir, QStringList() << "*.bib") : c2bUtils::filesInDir(_bibtex_file, QStringList() << "*.bib")); for (int i = 0; i < flist.count(); ++i) { search(flist.at(i)); if (_aborted) { clear(); _error_counter = -1; return; } } // Search Done _log_string += tr("% Scanned References: %1 BibTeX Files: %2 Linked Files: %3\n"). arg(_reference_counter).arg(_bibtex_counter).arg(_document_counter); if (_include_documents) _documents.unload(); if (_hits_map.count() == 0) return; _hits_string = "\n\n" + QStringList(_hits_map.keys()).join("\n\n") + "\n\n"; _log_string += tr("% Total Unique Hits: %1\n").arg(_hits_map.count()); } QString bibSearcher::searchDocumentKeyword(const QString& bibtexfn, const QString& documentfn, const QString& keyword) { bibSearcher bs; QString exc; bs._documents.load(bibtexfn, documentContents::Raw); if (bs._documents.setCurrent(documentfn)) { QString p(keyword); p.replace(QRegExp("\\W"), ".{0,5}"); p.replace("s", ".?"); p = "\\b" + p + "\\w*\\b"; bs.addPattern(false, false, searchPattern::type(searchPattern::RegularExpression), "all", QChar(), p); QString document(bs._documents.current().text()); c2bUtils::stripDiacritics(document); if (bs._patterns.at(0).matches(document)) { exc = c2bUtils::fileToString(":/htm/htm/excerpts.html"); exc.replace("GET_EXCERPTS_TITLE", keyword); exc.replace("GET_EXCERPTS", bs.excerpts(document).mid(20)); } } bs._documents.unload(); return exc; } void bibSearcher::abort() { _aborted = true; } void bibSearcher::clear() { _aborted = false; _all_bibtex_files = false; _bibtex_counter = 0; _bibtex_dir.clear(); _bibtex_file.clear(); _boolean_and = true; _do_search_similar_citeid.clear(); _document_counter = 0; _error_counter = 0; _hits_map.clear(); _hits_string.clear(); _include_documents = false; _log_string = "% cb2Bib " + C2B_VERSION + " / BibTeX Search Log\n"; _patterns.clear(); _reference_counter = 0; _scopes.clear(); _simplify_source = false; } void bibSearcher::search(const QString& bib_file) { _bibtex_counter++; QString bib_file_contents; QFile file(bib_file); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { _error_counter++; _log_string += tr("% [cb2bib] Unable to open the file %1 for reading. Error: '%2'.\n").arg(bib_file).arg(file.errorString()); return; } QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); bib_file_contents = stream.readAll(); _log_string += tr("% Scanning file %1\n").arg(bib_file.trimmed()); if (_include_documents) { if (_simplify_source) _documents.load(bib_file, documentContents::Simplified); else _documents.load(bib_file, documentContents::Raw); } const int hits(_hits_map.count()); bibReference ref; _bpP->initReferenceParsing(bib_file, _scopes, &ref); while (_bpP->referencesIn(bib_file_contents, &ref)) { _reference_counter++; if (_do_search_similar) searchSimilarReferences(bib_file, ref); else searchReference(bib_file, ref); QCoreApplication::processEvents(); if (_aborted) return; } _log_string += tr("% File %1. Hits: %2\n").arg(bib_file.trimmed()).arg(_hits_map.count() - hits); } void bibSearcher::searchReference(const QString& bib_file, const bibReference& ref) { const bool include_document(_include_documents && _documents.setCurrent(ref.value("file"), &_document_counter, &_log_string, &_error_counter)); // Initialize composite search bool hit(_boolean_and); // Composite search for (int i = 0; i < _patterns.count(); ++i) { const searchPattern& pattern = _patterns.at(i); const searchPattern::modifiers& modifier = pattern.modifier(); bool ihit(false); if (modifier.scope == "year") { int istr(ref.value(modifier.scope).toInt()); int jstr(modifier.string.toInt()); if (modifier.yearScope == '=') ihit = istr == jstr; else if (modifier.yearScope == '>') ihit = istr >= jstr; else if (modifier.yearScope == '<') ihit = istr <= jstr; } else if (modifier.scope == "all") { if (_simplify_source) ihit = pattern.matches(c2bUtils::toAscii(ref.unicodeReference, c2bUtils::FromBibTeX)); else ihit = pattern.matches(ref.unicodeReference); if (!ihit) if (include_document) ihit = pattern.matches(_documents.current()); } else if (modifier.scope == "journal") { const QString pattern_full(_bpP->fullJournal(modifier.string)); const QString j_orig(ref.value(modifier.scope)); const QString j_full(_bpP->fullJournal(j_orig)); ihit = j_full == pattern_full || pattern.matches(j_orig) || pattern.matches(j_full); } else if (modifier.scope == "file" && include_document) ihit = pattern.matches(_documents.current()); else ihit = pattern.matches(ref.value(modifier.scope)); if (modifier.NOT) ihit = !ihit; if (_boolean_and) { hit = hit && ihit; if (!hit) break; } else { hit = hit || ihit; if (hit) break; } } if (hit) if (!_hits_map.contains(ref.rawReference)) { if (include_document) _hits_map.insert(ref.rawReference, location(bib_file, ref) + excerpts(_documents.current().text())); else _hits_map.insert(ref.rawReference, location(bib_file, ref)); } } void bibSearcher::searchSimilarReferences(const QString& bib_file, const bibReference& ref) { if (ref.citeidName == _do_search_similar_citeid) { if (!_hits_map.contains(ref.rawReference)) _hits_map.insert(ref.rawReference, location(bib_file, ref)); return; } if (_patterns.count() == 0) return; // Initialize composite search bool hit(_boolean_and); // Composite search for (int i = 0; i < _patterns.count(); ++i) { const searchPattern& pattern = _patterns.at(i); hit = hit && pattern.matches(ref.unicodeReference); if (!hit) break; } if (hit) if (!_hits_map.contains(ref.rawReference)) _hits_map.insert(ref.rawReference, location(bib_file, ref)); } const QString bibSearcher::excerpts(const QString& contents) const { const int max_excerpts(25); const int max_unmerged_excerpts(max_excerpts + 10); QMap exc_endpos; for (int i = 0; i < _patterns.count(); ++i) { const searchPattern& pattern(_patterns.at(i)); const searchPattern::modifiers& modifier(pattern.modifier()); if (modifier.NOT) continue; if (modifier.scope != "all" && modifier.scope != "file") continue; int n_excerpts(0); int pos(0); while (pos >= 0) { pos = pattern.indexIn(contents, pos); if (pos > -1) { if (++n_excerpts > max_unmerged_excerpts) break; exc_endpos.insert(pos, qMax(pos + pattern.matchedLength(), exc_endpos.value(pos))); pos += pattern.matchedLength(); } } } if (exc_endpos.isEmpty()) return QString(); // Merge QList i_pos = exc_endpos.keys(); int pos0(i_pos.at(0)); for (int i = 1; i < i_pos.count(); ++i) { const int posi(i_pos.at(i)); if (exc_endpos.value(pos0) < posi) pos0 = posi; else { const int endposi(exc_endpos.value(posi)); exc_endpos.remove(posi); exc_endpos.insert(pos0, endposi); } } i_pos = exc_endpos.keys(); const int context_length(75); QString exc; QRegExp lead_truncated_words("^.*\\s(?=\\w)"); lead_truncated_words.setMinimal(true); QRegExp tail_truncated_words("\\W+\\w+\\W*$"); tail_truncated_words.setMinimal(true); bool item_begins(true); bool item_complete; const int items(qMin(i_pos.count(), max_excerpts)); for (int i = 0; i < items; ++i) { const int pos(i_pos.at(i)); const int length(exc_endpos.value(pos) - pos); const QString match("" + c2bUtils::toHtmlString(contents.mid(pos, length)) + ""); if (item_begins) { QString pre_match(contents.mid(pos - context_length, context_length)); pre_match.remove(lead_truncated_words); pre_match = c2bUtils::toHtmlString(pre_match); exc += "• ..." + pre_match + match; } else exc += match; if (i + 1 == items) item_complete = true; else item_complete = exc_endpos.value(pos) + (2 * context_length) < i_pos.at(i + 1); if (item_complete) { QString post_match(contents.mid(pos + length, context_length)); post_match.remove(tail_truncated_words); post_match = c2bUtils::toHtmlString(post_match); exc += post_match + "... "; item_begins = true; } else { exc += contents.mid(pos + length, i_pos.at(i + 1) - pos - length); item_begins = false; } } exc = "

" + exc; if (i_pos.count() >= max_excerpts) exc += tr("

Found more than %1 occurrences.").arg(max_excerpts); return exc; } const QString bibSearcher::highlight(const QString& abstract) const { if (abstract.isEmpty()) return abstract; QMap endpos; for (int i = 0; i < _patterns.count(); ++i) { const searchPattern& pattern = _patterns.at(i); const searchPattern::modifiers& modifier = pattern.modifier(); if (modifier.NOT) continue; if (modifier.scope != "all" && modifier.scope != "abstract") continue; int pos(0); while (pos >= 0) { pos = pattern.indexIn(abstract, pos); if (pos > -1) { endpos.insert(pos, qMax(pos + pattern.matchedLength(), endpos.value(pos))); pos += pattern.matchedLength(); } } } if (endpos.isEmpty()) return c2bUtils::toHtmlString(abstract); // Merge QList i_pos = endpos.keys(); int pos0(i_pos.at(0)); for (int i = 1; i < i_pos.count(); ++i) { const int posi(i_pos.at(i)); if (endpos.value(pos0) < posi) pos0 = posi; else { const int endposi(endpos.value(posi)); endpos.remove(posi); endpos.insert(pos0, endposi); } } i_pos = endpos.keys(); QString hla; int npos(0); for (int i = 0; i < i_pos.count(); ++i) { const int pos(i_pos.at(i)); const int length(endpos.value(pos) - pos); hla += c2bUtils::toHtmlString(abstract.mid(npos, pos - npos)) + "" + c2bUtils::toHtmlString(abstract.mid(pos, length)) + ""; npos = endpos.value(pos); } hla += c2bUtils::toHtmlString(abstract.mid(npos, abstract.length() - npos)); return hla; } const QString bibSearcher::location(const QString& fn, const bibReference& ref) const { const QString at("" "\"action\""); return at.arg(ref.citeidName).arg(fn).arg(ref.positionValue); } cb2bib-1.4.9/src/c2b/pubmedXml.h0000644000175000017500000000156112045520050016135 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef PUBMEDXML_H #define PUBMEDXML_H #include "bibReference.h" #include class pubmedXml : public QXmlStreamReader { public: pubmedXml(const QString& xml); inline ~pubmedXml() {} inline bibReference reference() const { return _reference; } private: bibReference _reference; bool reading(const QString& tag); void readAuthors(); void readField(const QString& field); void readJournal(); void readKeywords(); void readReference(); }; #endif cb2bib-1.4.9/src/c2b/network.h0000644000175000017500000000643512045520050015676 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef NETWORK_H #define NETWORK_H #include #include #include #include #include /** cb2Bib Network file copy/move @author Pere Constans */ class network : public QObject { Q_OBJECT public: network(QObject* parento = 0); inline ~network() {} enum Action {Copy, Move}; void getFile(const QString& source, const QString& destination, const Action action = Copy, QObject* receiver = 0, const char* callback = 0, const bool overwrite = false); void headFile(const QString& source, QObject* receiver = 0, const char* callback = 0); inline const QString destinationFilename() const { return _destination_filename; } inline const QString sourceFilename() const { return _source_filename; } inline const QString errorString() const { return _request_error_string; } inline const QString mimetypeString() const { return _file_mimetype_string; } inline static Action actionType(const QString& action) { return action == "move" ? Move : Copy; } signals: void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); void proxyAuthenticationRequired(const QNetworkProxy& proxy, QAuthenticator* auth); void requestFinished(bool succeeded); public slots: void cancelDownload(); private: QByteArray _fetch_url_query; QFile _destination_file; QNetworkAccessManager* _fetcher; QNetworkAccessManager::Operation _fetch_operation; QNetworkReply* _current_reply; QProcess* _fetcher_client; QString FmClientCopyArg; QString FmClientCopyBin; QString FmClientMoveArg; QString FmClientMoveBin; QString _destination_filename; QString _file_mimetype_string; QString _request_error_string; QString _source_filename; bool FmClient; bool _is_fetching; bool _request_succeeded; bool checkDestination(); const int _max_redirections; int _redirection_count; void _emit_request_finished(bool succeeded); void _fetch(const QUrl& url); void _fetch_c2b(const Action action, const QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation); void _fetch_client(const Action action); void _head(const QUrl& url); void getFilePrivate(const Action action); void headFilePrivate(); inline void setup(const QString& source, const QString& destination = QString()) { _destination_filename = destination; _source_filename = source; _file_mimetype_string.clear(); _request_error_string.clear(); _is_fetching = true; _redirection_count = 0; } private slots: void _client_finished(int exitCode, QProcess::ExitStatus exitStatus); void _emit_request_finished(); void _fetch_finished(); void _fetch_ready_read(); void _head_finished(); void loadSettings(); void logError(); }; #endif cb2bib-1.4.9/src/c2b/cb2bib_parameters.h0000644000175000017500000000662112045520050017550 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef CB2BIB_PARAMETERS_H #define CB2BIB_PARAMETERS_H #include #ifdef C2B_USE_QMAKE const QString C2B_DATA_DIR("/usr/share/cb2bib"); #else #include "cb2bib_conf_parameters.h" #endif const int C2B_MESSAGE_TIME(6000); const QString C2B_APPLICATION("cb2Bib"); const QString C2B_CITE_ID_PATTERN("<><><>"); const QString C2B_DOCUMENT_ID_PATTERN("<>"); const QString C2B_FIND_REPLACE_LIST( "Corresponding Author Contact Information||ScienceDirect alt tag^e" "E-mail The Corresponding Author||ScienceDirect alt tag^e" "small pi, Greek|$\\pi$|ScienceDirect alt tag^e" "{sect}||PNAS - Author String^e" "{dagger}||PNAS - Author String"); const QString C2B_ICON_ABOUT_B_BACK("back_cb2bib_32.png"); const QString C2B_ICON_ABOUT_B("cb2bib.png"); const QString C2B_ICON_CONNECT_B("connect_established.png"); const QString C2B_ICON_DIR(":/icons/icons/"); const QString C2B_ICON_DISCONNECT_B("connect_no.png"); const QString C2B_ICON_VIEWBIB_B("viewbib.png"); const QString C2B_ICON_VIEWC2B_B("viewcb.png"); const QString C2B_ORGANIZATION("MOLspaces"); const QString C2B_VERSION("1.4.9"); // File Manager Client #ifdef Q_WS_X11 const QString C2B_FM_CLIENT_COPY_ARG("copy"); const QString C2B_FM_CLIENT_COPY_BIN("kfmclient"); const QString C2B_FM_CLIENT_MOVE_ARG("move"); const QString C2B_FM_CLIENT_MOVE_BIN("kfmclient"); #endif #ifdef Q_WS_MACX const QString C2B_FM_CLIENT_COPY_ARG(""); const QString C2B_FM_CLIENT_COPY_BIN(""); const QString C2B_FM_CLIENT_MOVE_ARG(""); const QString C2B_FM_CLIENT_MOVE_BIN(""); #endif #ifdef Q_WS_WIN const QString C2B_FM_CLIENT_COPY_ARG(""); const QString C2B_FM_CLIENT_COPY_BIN(""); const QString C2B_FM_CLIENT_MOVE_ARG(""); const QString C2B_FM_CLIENT_MOVE_BIN(""); #endif // To text converter #ifdef Q_WS_X11 const QString C2B_METADATAPARSER_EXIFTOOL_BIN("exiftool"); const QString C2B_BIBSEARCHER_PDF2TXT_BIN("pdftotext"); const QString C2B_PDFIMPORT_PDF2TXT_BIN("pdftotext"); #endif #ifdef Q_WS_MACX const QString C2B_METADATAPARSER_EXIFTOOL_BIN("exiftool"); const QString C2B_BIBSEARCHER_PDF2TXT_BIN("pdftotext"); const QString C2B_PDFIMPORT_PDF2TXT_BIN("pdftotext"); #endif #ifdef Q_WS_WIN const QString C2B_METADATAPARSER_EXIFTOOL_BIN("C:\\Windows\\exiftool.exe"); const QString C2B_PDFIMPORT_PDF2TXT_BIN("C:\\Program Files\\xpdf-3.02-win32\\pdftotext.exe"); const QString C2B_BIBSEARCHER_PDF2TXT_BIN("C:\\Program Files\\xpdf-3.02-win32\\pdftotext.exe"); #endif // BibTeX postprocessing #ifdef Q_WS_X11 const QString C2B_POSTPROCESS_BIBTEX_BIN("c2btools/bib2pdf"); const QString C2B_POSTPROCESS_BIBTEX_ARG("%finput %foutput"); const QString C2B_POSTPROCESS_BIBTEX_EXT("bib.pdf"); #endif #ifdef Q_WS_MACX const QString C2B_POSTPROCESS_BIBTEX_BIN("c2btools/bib2pdf"); const QString C2B_POSTPROCESS_BIBTEX_ARG("%finput %foutput"); const QString C2B_POSTPROCESS_BIBTEX_EXT("bib.pdf"); #endif #ifdef Q_WS_WIN const QString C2B_POSTPROCESS_BIBTEX_BIN("c2btools\\bib2end.bat"); const QString C2B_POSTPROCESS_BIBTEX_ARG("%finput %foutput"); const QString C2B_POSTPROCESS_BIBTEX_EXT("end"); #endif #endif cb2bib-1.4.9/src/c2b/bibReference.h0000644000175000017500000000447212045520050016557 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef BIBREFERENCE_H #define BIBREFERENCE_H #include "cb2bib_utilities.h" #include #include #include typedef QHash::const_iterator bibReferenceIterator; /** Basic class for a bibliographic reference @author Pere Constans */ class bibReference : public QHash { public: inline bibReference() : positionValue(0), pos(0) {} void clearFields() { pos = 0; bib_fieldList.clear(); _bib_fields_nb_re.clear(); _bib_fields_re.clear(); } void clearReference() { positionValue = 0; citeidName.clear(); typeName.clear(); rawReference.clear(); unicodeReference.clear(); QHash::clear(); } /** Fallback for authors */ inline const QString anyAuthor() const { const QString v(value("author")); if (v.isEmpty()) return value("editor"); return v; } /** Fallback for titles */ inline const QString anyTitle() const { const QString v(value("title")); if (v.isEmpty()) { const QString v1(value("booktitle")); if (v1.isEmpty()) return QFileInfo(value("file")).fileName(); return v1; } return v; } /** Fallback for journal */ inline const QString anyJournal() const { QString v(value("journal")); if (v.isEmpty()) if (typeName == "inproceedings") { v = value("booktitle"); c2bUtils::cleanTitle(v, true); } return v; } QString citeidName; QString rawReference; QString typeName; QString unicodeReference; int positionValue; private: QList _bib_fields_nb_re; QList _bib_fields_re; QStringList bib_fieldList; int pos; friend class coreBibParser; }; #endif cb2bib-1.4.9/src/c2b/htm/0000755000175000017500000000000012045517740014630 5ustar rusconirusconicb2bib-1.4.9/src/c2b/htm/reference_list.html0000644000175000017500000000011012045517740020477 0ustar rusconirusconi


    GET_REFERENCES
cb2bib-1.4.9/src/c2b/htm/tex2html_jsmath_head.html0000644000175000017500000000104612045517740021615 0ustar rusconirusconi GET_JSMATH_MACROScb2bib-1.4.9/src/c2b/htm/tex2html.css0000644000175000017500000000564112045517740017117 0ustar rusconirusconi/* cb2Bib Annote CSS */ /* general */ body { background-color: #C4C4B7; border-color: #72726A; border-style: solid; border-width: 1px; color: black; margin: 1px; padding-left: 25px; padding-right: 25px; padding-top: 25px; } h1 { background-color: #818B93; border-color: black; border-style: solid; border-width: 1px; color: #E3E3E3; font-family: sans-serif; font-size: 120%; padding-left: 10px; } h2 { color: #602020; font-family: sans-serif; font-size: 110%; padding-left: 10px; } h3 { color: #602020; font-family: sans-serif; font-size: 100%; font-style: italic; padding-left: 10px; } a { color: #293747; font-size: 100%; text-decoration: underline; } p { padding-right: 20px; text-indent: 20px; } pre { background-color: #AEAEA3; border-color: #72726A; border-style: solid; border-width: 1px; font-family: monospace; font-size: 80%; padding: 10px; } ul li { list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAJCAYAAADkZNYtAAAABGdBTUEAANbY1E9YMgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMCBQ5B7ky4rkAAAFHSURBVBjTTcoxasJQAIDhPy8JlfCKGpe+LIUuQhAnN0FEikcodOvSnqCLV+lYEA/QCi4GnERyhE5FsGoCDgZ9oMnr0pZ+8G+/xQ+lVLXVaj31+/378/lsOY5jJpPJaDabvWRZtuMfv9PpjKIoMkmSmDRNzXa7NdPp1LTb7RHgA9iACILgcTAYPFerVbTWaK3Z7XbkeU69Xm/M5/OvLMtiAbjNZvPO8zy01uz3+7+01nieR6PRuANcB3CVUje1Wg0pJa7rYts2eZ5zOp0olUoEQXDzO4skSVa+719JKXPLsizbtjHGACCEEJvNZgUIARSLxWK8Xq+RUtrlcllIKUWlUhFSSrFcLonjeAwUABdA2O12J3Ecm8PhYLTW5ng8miiKTBiGb0AIXFiAAC6VUqHv+w+9Xu/WcZzroig+h8Phe5qmr8AHkH0DzH6Pqv7Vyi4AAAAASUVORK5CYII=); padding-right: 100px; text-indent: 15px; } /* header */ .header { vertical-align: middle; } /* footer */ .footer { color: black; font-family: arial, sans-serif; font-size: 70%; } .footer td { padding: 10px; padding-left: 5px; padding-right: 5px; } .footer a { color: #293747; font-weight: bold; text-decoration: underline; } /* index */ .index { background-color: #AEAEA3; border-color: #72726A; border-style: solid; border-width: 1px; font-family: sans-serif; font-size: 80%; } .index a { color: #293747; font-weight: bold; text-decoration: none; } .index a:hover { color: #E3E3E3; font-weight: bold; text-decoration: none; } .index ul li { list-style-image: none; } /* abstract */ #abstract { background-color: #AEAEA3; border-color: #72726A; border-style: solid; border-width: 1px; font-size: 95%; font-style: italic; padding-bottom: 10px; padding-left: 50px; padding-right: 70px; padding-top: 10px; text-indent: 20px; } /* citations */ .citations { font-size: 80%; } .citations a { text-decoration: none; } .citations a:active { color: #602020; text-decoration: none; } /* references */ .references { font-size: 80%; font-family: sans-serif; padding-right: 50px; } .references a { color: black; text-decoration: none; } .references a:link { color: #293747; font-weight: bold; text-decoration: none; } .references a:visited { color: #293747; font-weight: bold; text-decoration: none; } /* math */ .math { visibility: hidden; } #math { font-size: 110%; } cb2bib-1.4.9/src/c2b/htm/tex2html_index.html0000644000175000017500000000005712045517740020456 0ustar rusconirusconi
%1

cb2bib-1.4.9/src/c2b/htm/tex2html.html0000644000175000017500000000215112045517740017264 0ustar rusconirusconi GET_CSS GET_TITLEGET_JSMATH_HEAD

GET_TITLE



GET_INDEX GET_HTML GET_REFERENCES
cb2bib-1.4.9/src/c2b/htm/reference_item.html0000644000175000017500000000037312045517740020475 0ustar rusconirusconi
  • GET_REFERENCE_AUTHOR GET_REFERENCE_TITLE. GET_REFERENCE_SOURCE GET_REFERENCE_VOLUMEGET_REFERENCE_PAGES GET_REFERENCE_YEAR
  • cb2bib-1.4.9/src/c2b/authorString.h0000644000175000017500000001305712045520050016674 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef AUTHORSTRING_H #define AUTHORSTRING_H #include "cb2bib_utilities.h" #include #include #include namespace author { static const QString double_initials("(Al|Ch|Kh|Md|Th|Xh|Ya|Yu|Zs)"); static const QString prefixes("(da|de|dal|del|der|di|do|du|dos|el|la|le|lo|van|vande|von|zur)"); static const QString name("(?:\\w[-'\\w]{1,})"); static const QString initials("(?:\\s*-{0,1}\\b\\w\\b\\.{0,1}){1,3}"); static const QString reversed_romance_name("(?:\\w[-'\\w]{1,})\\s+(?:\\w[-'\\w]{1,}),\\s*(?:\\w[-'\\w]{1,}|" + initials + ')'); static const QRegExp reversed_name_rx('^' + name + ','); // Cases 'n1 n2, n3', 'n1 n2, n3 and n4 n5, n6', 'n1 n2, n3 and n4, n5 n6' are necessarily reverse order static const QRegExp reversed_romance_name_rx("^(?:" + reversed_romance_name + '|' + reversed_romance_name + " and " + reversed_romance_name + '|' + reversed_romance_name + " and (?:\\w[-'\\w]{1,}),\\s*(?:\\w[-'\\w]{1,}|\\w[-'\\w]{1,} \\w[-'\\w]{1,}|" + initials + "))$"); // simplifyString static const QRegExp simplify_string_rx1(QString("%1(?=\\w)").arg(QChar(8217))); static const QRegExp simplify_string_rx2(QRegExp("\'(?!\\w)")); static const QRegExp simplify_string_rx3(QRegExp("\\d\\d+")); static const QRegExp simplify_string_rx4(QRegExp("\\d(?=\\s\\w\\w)")); static const QRegExp simplify_string_rx5(QRegExp("\\d[\\*,;][a-z]\\b")); static const QRegExp simplify_string_rx6(QRegExp("\\d")); static const QRegExp simplify_string_rx7(QRegExp("[^-',;:\\|/&\\.\\s\\w]")); inline QString& simplifyString(QString& author, const bool full = false) { if (full) // Characters | and : are used for the encoder { author.replace('|', ' '); author.replace(':', ' '); } author.replace(simplify_string_rx1, "\'"); // Normalize apostrophe author.remove(simplify_string_rx2); // Remove spurious apostrophes author.replace(simplify_string_rx3, "/"); // Break dates, addresses, etc, but remove from author's foot notes. author.replace(simplify_string_rx4, ","); // Help no-separator designs, and also break zip codes. author.replace(simplify_string_rx5, " "); author.remove(simplify_string_rx6); // Better remove if no conflict. It will help to not confuse with chemical formula. author.replace(simplify_string_rx7, " "); author = c2bUtils::simplifyString(author); return author; } extern QString fromMedline(const QString& author); struct unifier { unifier(); QString& unifyNames(QString& author); QRegExp unifier_rx1; QRegExp unifier_rx2; QRegExp unifier_rx3; QRegExp unifier_rx4; QRegExp unifier_rx5; QRegExp unifier_rx6; QRegExp unifier_rx7; }; /** Implementation of author field extraction P. Constans. A Simple Extraction Procedure for Bibliographical Author Field. arXiv:0902.0755v1, 2009. */ struct encoder { encoder() {} encoder(const QString& str) { encode(str); } QString code; QString decoded(const int position, const int length) const; QStringList fragments; unifier as_unifier; void clear() { code.clear(); fragments.clear(); } void encode(const QString& raw); void scape(const int pos, const int length, const QChar c = ' ') { const int pos0(qMax(pos, 0)); const int posn(qMin(pos0 + length, code.length())); for (int i = pos0; i < posn; ++i) if (code.at(i) != 'L') code[i] = c; } void scapePattern(const QString& pattern, const QChar c = ' ') { QRegExp rx(pattern, Qt::CaseSensitive); rx.setMinimal(true); rx.setPatternSyntax(QRegExp::RegExp2); if (!rx.isValid()) exit(6); int pos(0); while (pos > -1) { pos = rx.indexIn(code, pos); if (pos > -1) { scape(pos, rx.matchedLength(), c); pos += rx.matchedLength(); } } } inline static bool hasUpper(const QString& str) { for (int i = 0; i < str.length(); i++) if (str.at(i).isLetter()) if (str.at(i).category() == QChar::Letter_Uppercase) return true; return false; } inline static bool isCapitalName(const QString& w) { return c2bUtils::isUpperCaseString(w, qMax(0, w.lastIndexOf('_', -5))); // Skip prefixes and suffixes } inline static bool isSeparator(const QString& w) { return (w == "and") || (w == "&"); } static bool isAdparticle(const QString& w); static bool isInitial(const QString& w); static bool isName(const QString& w); static bool isPlainWord(const QString& w); }; } // namespace author class authorString { public: authorString(); inline ~authorString() {} QString toBibTeX(const QString& author, bool full_form = false); private: QString processFirstMiddle(const QString& first_middle) const; static QString capitalize(const QString& name); static bool containLowerCaseLetter(const QString& author); static bool containUpperCaseLetter(const QString& author); static bool isReverseOrder(const QString& author); QString _author_string; author::unifier as_unifier; bool _full_form; }; #endif cb2bib-1.4.9/src/c2b/c2blib.qrc0000644000175000017500000000102512045517740015702 0ustar rusconirusconi htm/reference_item.html htm/reference_list.html htm/tex2html.css htm/tex2html.html htm/tex2html_index.html htm/tex2html_jsmath_head.html txt/prefixes.txt txt/suffixes.txt txt/triads.txt txt/word_prefix_lexicon.txt cb2bib-1.4.9/src/c2b/posTagger.cpp0000644000175000017500000000712312045520050016466 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "posTagger.h" #include "cb2bib_utilities.h" #include "settings.h" posTagger::posTagger() : _period('.'), _space(' '), _pos_a("A"), _pos_g("G"), _pos_n("N"), _pos_o("O"), _pos_r("R"), _pos_s("S"), _suffix_able("able"), _suffix_ae("ae"), _suffix_al("al"), _suffix_apostrophes("'s"), _suffix_ar("ar"), _suffix_ed("ed"), _suffix_ful("ful"), _suffix_ic("ic"), _suffix_ics("ics"), _suffix_ing("ing"), _suffix_is("is"), _suffix_ive("ive"), _suffix_lent("lent"), _suffix_less("less"), _suffix_like("like"), _suffix_ly("ly"), _suffix_ous("ous"), _suffix_s("s"), _suffix_ss("ss"), _suffix_us("us") {} bool posTagger::loadLexicon() { const QString lexfn(settings::instance()->fileName("cb2Bib/PosLexiconFile")); QFile lexf(lexfn); if (!lexf.open(QIODevice::ReadOnly | QIODevice::Text)) { c2bUtils::warn(QObject::tr("Could not open POS lexicon file %1 for reading").arg(lexfn)); return false; } QTextStream lex(&lexf); lex.setCodec("UTF-8"); lex.setAutoDetectUnicode(true); const QChar comment('#'); QString line; while (!lex.atEnd()) { line = lex.readLine(); if (line.isEmpty() || line.startsWith(comment)) continue; const int n(line.toInt()); for (int i = 0; i < n; ++i) _sentence_patterns.insert(lex.readLine(), QString()); break; } while (!lex.atEnd()) { line = lex.readLine(); if (line.isEmpty() || line.startsWith(comment)) continue; const int n(line.toInt()); const QString tag(lex.readLine()); for (int i = 0; i < n; ++i) _lexicon.insert(lex.readLine(), tag); } lexf.close(); return _sentence_patterns.size() > 0 && _lexicon.size() > 0; } QString posTagger::tagged(const QString& text) const { const QStringList words(text.split(_space, QString::SkipEmptyParts)); const int nw(words.count()); QString t(_period); for (int i = 0; i < nw; ++i) { const QString& w(words.at(i)); if (_lexicon.contains(w)) t += _lexicon.value(w) + _period; else t += ruletag(w) + _period; } return t; } QString posTagger::ruletag(const QString& word) const { if (word.length() < 3) return _pos_s; if (word.endsWith(_suffix_ed) || word.endsWith(_suffix_ar) || word.endsWith(_suffix_ive) || word.endsWith(_suffix_able) || word.endsWith(_suffix_ic) || word.endsWith(_suffix_al) || word.endsWith(_suffix_ous) || word.endsWith(_suffix_lent) || word.endsWith(_suffix_like) || word.endsWith(_suffix_ful) || word.endsWith(_suffix_less)) return _pos_a; if (word.endsWith(_suffix_ing)) return _pos_g; if (word.endsWith(_suffix_ly)) return _pos_r; if (word.endsWith(_suffix_ss) || word.endsWith(_suffix_is) || word.endsWith(_suffix_ics) || word.endsWith(_suffix_apostrophes) || word.endsWith(_suffix_us)) return _pos_n; if (word.endsWith(_suffix_ae)) return _pos_o; if (word.endsWith(_suffix_s)) return _pos_o; return _pos_n; } cb2bib-1.4.9/src/c2b/collectionIndex.cpp0000644000175000017500000014065012045520050017661 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "collectionIndex.h" #include "bibParser.h" #include "cb2bib_utilities.h" #include "documentCache.h" #include "documentParser.h" #include "posTagger.h" #include "settings.h" #include #include // Tunable parameters static const int _document_length_threshold(100000); static const int _in_long_document_sentence_repetition(3); static const int _in_short_document_sentence_repetition(2); static const int _inter_document_sentence_repetition(3); #define C2B_DEBUG_COLLECTIONINDEX 0 class reversedsorting { public: inline reversedsorting() {} inline bool operator()(const QString& si, const QString& sj) const { const int li(si.length()); const int lj(sj.length()); const QChar* a = si.unicode() + li - 1; const QChar* b = sj.unicode() + lj - 1; int cl(qMin(li, lj)); while (cl-- > 0) { if (*a == *b) { --a; --b; } else return *a < *b; } return li < lj; } }; class ussorting { public: inline ussorting() : ss(' '), us('_') {} inline bool operator()(const QString& si, const QString& sj) { QString ssi(si); QString ssj(sj); return ssi.replace(us, ss) < ssj.replace(us, ss); } const QChar ss; const QChar us; }; collectionIndex::collectionIndex(bibParser* bp) : _out(*(new QTextStream(stdout))), _bpP(bp), _space_char(QChar(' ')), _nerrors(0), _settingsP(settings::instance()) {} collectionIndex::~collectionIndex() { delete &_out; } int collectionIndex::index(const QString& dir) { const unsigned long start_time(clock()); _nerrors = 0; _keysentences.clear(); const QString bibtexdir(dir.isEmpty() ? QDir::toNativeSeparators(QFileInfo(_settingsP->fileName("cb2Bib/BibTeXFile")).path()) : QDir::toNativeSeparators(dir)); _out << QObject::tr("Indexing references from directory %1...").arg(bibtexdir) << endl; bibReference reference; documentCache dc; int documentid(0); QStringList documents; QStringList documentfns; const QStringList bibtexfns(c2bUtils::filesInDir(bibtexdir, QStringList() << "*.bib")); if (bibtexfns.count() == 0) { ++_nerrors; _out << QObject::tr("Error: No BibTeX files at %1").arg(bibtexdir) << endl; return _nerrors; } const QStringList fields(QStringList() << "file" << "journal" << "title" << "booktitle"); int nfailures(0); for (int i = 0; i < bibtexfns.count(); ++i) { const QString bibtexfn(bibtexfns.at(i)); _out << QObject::tr("Indexing %1...").arg(bibtexfn) << endl; const QString bibtex(c2bUtils::fileToString(bibtexfn)); dc.load(bibtexfn, documentContents::Raw); _bpP->initReferenceParsing(bibtexfn, fields, &reference); while (_bpP->referencesIn(bibtex, &reference)) { QString docfn(reference.value("file")); if (docfn.isEmpty()) continue; docfn = QDir::cleanPath(docfn); const QString journal(reference.value("journal")); QString title(reference.anyTitle()); c2bUtils::cleanTitle(title, true); if (dc.setCurrent(docfn)) setKeySentences(documentid++, preprocessedText(journal, dc.current().text())); else ++nfailures; documents.append(title); documentfns.append(docfn); } dc.unload(); } if (nfailures > 0) { _out << QObject::tr("Warning: %1 documents could not be converted to text. Check search converter is set.").arg(nfailures) << endl; _out << QObject::tr(" Refresh cache by running a prove search including document contents.") << endl; } _out << QObject::tr("done") << endl; digestKeySentences(); cleanupKeySentences(); analyzeKeySentences(); #if C2B_DEBUG_COLLECTIONINDEX for (int i = 0; i < documents.count(); ++i) { QStringList sentences(_document_sentences.values(i)); qSort(sentences); _out << i << " " << documents.at(i) << ':' << endl; for (int j = 0; j < sentences.count(); ++j) _out << " " << sentences.at(j) << endl; } #endif const QString cache_dir(_settingsP->fileName("cb2Bib/CacheDirectory")); const QString documentslfn(QDir::toNativeSeparators(cache_dir + "/documents.lc2b")); QFile documentslf(QDir::cleanPath(documentslfn)); if (documentslf.open(QIODevice::WriteOnly)) { _out << QObject::tr("Writing %1...").arg(documentslfn) << endl; QDataStream stream(&documentslf); stream << documentfns.count(); for (int i = 0; i < documentfns.count(); ++i) stream << documentfns.at(i); documentslf.close(); } else { ++_nerrors; _out << QObject::tr("Error: %1 can not be written").arg(documentslfn) << endl; } const QString documentsifn(QDir::toNativeSeparators(cache_dir + "/documents.ic2b")); QFile documentsif(documentsifn); if (documentsif.open(QIODevice::WriteOnly)) { _out << QObject::tr("Writing %1...").arg(documentsifn) << endl; QDataStream stream(&documentsif); for (int i = 0; i < documents.count(); ++i) { QList sentenceids(_document_sentenceids.values(i)); qSort(sentenceids); stream << sentenceids.count(); for (int j = 0; j < sentenceids.count(); ++j) stream << sentenceids.at(j); } documentsif.close(); } else { ++_nerrors; _out << QObject::tr("Error: %1 can not be written").arg(documentsifn) << endl; } _out << QObject::tr("done") << endl; const double time = double(clock() - start_time) / double(CLOCKS_PER_SEC); _out << QObject::tr("Indexing CPU time: %1s").arg(time) << endl; return _nerrors; } void collectionIndex::setKeySentences(const int documentid, const QString& text) { QHash docsentences; documentParser dp(text, 7); while (dp.parses()) { if (dp.nlength() < 4 * dp.nwords()) continue; const QStringRef s(dp.subsentence()); docsentences.insert(s, 1 + docsentences.value(s)); } const int dsr(text.length() < _document_length_threshold ? _in_short_document_sentence_repetition : _in_long_document_sentence_repetition); for (QHash::const_iterator si = docsentences.constBegin(); si != docsentences.constEnd(); ++si) { const QStringRef& s(si.key()); const int& n(si.value()); if (n < dsr) continue; const QString ss(s.toString()); if (!isValidKeySentence(ss)) continue; if (_keysentences.contains(ss)) _keysentences[ss].update(documentid); else _keysentences.insert(ss, KeysentenceData(documentid)); } } void collectionIndex::analyzeKeySentences() { _out << QObject::tr("Analysing keyword sentences...") << endl; posTagger pt; if (!pt.loadLexicon()) { ++_nerrors; _out << QObject::tr("Error: cb2Bib POS lexicon could not be loaded; check Configure Files") << endl; return; } QStringList validlist; #if C2B_DEBUG_COLLECTIONINDEX QStringList taggedvalidlist; #endif for (QHash::const_iterator si = _keysentences.constBegin(); si != _keysentences.constEnd(); ++si) { const QString& s(si.key()); const KeysentenceData& sdata(si.value()); if (sdata.ndocuments < _inter_document_sentence_repetition) continue; const QString pts(pt.tagged(s)); if (pt.contains(pts)) { validlist.append(s); #if C2B_DEBUG_COLLECTIONINDEX taggedvalidlist.append(pts + " " + s); #endif for (int j = 0; j < sdata.documents.count(); ++j) _document_sentences.insert(sdata.documents.at(j), s); } } ussorting uss; qSort(validlist.begin(), validlist.end(), uss); const QString cache_dir(_settingsP->fileName("cb2Bib/CacheDirectory")); const QString sentenceslfn(QDir::toNativeSeparators(QDir::cleanPath(cache_dir + "/sentences.lc2b"))); QFile sentenceslf(sentenceslfn); if (sentenceslf.open(QIODevice::WriteOnly)) { _out << QObject::tr("Writing %1...").arg(sentenceslfn) << endl; QDataStream stream(&sentenceslf); stream << validlist.count(); const QChar hs('-'); const QChar us('_'); const QString ss("\\1 "); QRegExp aprx(author::prefixes + '_', Qt::CaseSensitive); for (int i = 0; i < validlist.count(); ++i) { QString v(validlist.at(i)); v.replace(aprx, ss); stream << v.replace(us, hs); } sentenceslf.close(); } else { ++_nerrors; _out << QObject::tr("Error: %1 can not be written").arg(sentenceslfn) << endl; } const QString sentencesifn(QDir::toNativeSeparators(QDir::cleanPath(cache_dir + "/sentences.ic2b"))); QFile sentencesif(sentencesifn); if (sentencesif.open(QIODevice::WriteOnly)) { _out << QObject::tr("Writing %1...").arg(sentencesifn) << endl; QDataStream stream(&sentencesif); for (int i = 0; i < validlist.count(); ++i) { const QString& s(validlist.at(i)); const KeysentenceData& sdata(_keysentences.value(s)); QList dl(sdata.documents); qSort(dl); stream << dl.count(); for (int j = 0; j < dl.count(); ++j) stream << dl.at(j); } sentencesif.close(); } else { ++_nerrors; _out << QObject::tr("Error: %1 can not be written").arg(sentencesifn) << endl; } for (int i = 0; i < validlist.count(); ++i) { const QString& s(validlist.at(i)); const KeysentenceData& sdata(_keysentences.value(s)); for (int j = 0; j < sdata.documents.count(); ++j) _document_sentenceids.insert(sdata.documents.at(j), i); } #if C2B_DEBUG_COLLECTIONINDEX qSort(taggedvalidlist); for (int i = 0; i < taggedvalidlist.count(); ++i) _out << taggedvalidlist.at(i) << endl; #endif _out << QObject::tr("Raw keyword sentences: ") << _keysentences.size() << endl; _out << QObject::tr("Keyword sentences: ") << validlist.count() << endl; _out << QObject::tr("done") << endl; } void collectionIndex::cleanupKeySentences() { _out << QObject::tr("Cleaning keyword sentences...") << endl; QStringList keysentenceskeys; for (QHash::const_iterator si = _keysentences.constBegin(); si != _keysentences.constEnd(); ++si) { const int& v(si.value().ndocuments); if (v < _inter_document_sentence_repetition) continue; keysentenceskeys.append(si.key()); } const int nkeysentenceskeys(keysentenceskeys.count()); qSort(keysentenceskeys); for (int i = 0; i < nkeysentenceskeys - 1; ++i) { const QString& si(keysentenceskeys.at(i)); const QString& sj(keysentenceskeys.at(i + 1)); if (sj.startsWith(si) && _keysentences.value(si).ndocuments == _keysentences.value(sj).ndocuments) _keysentences[si].ndocuments = 0; } reversedsorting rs; qSort(keysentenceskeys.begin(), keysentenceskeys.end(), rs); for (int i = 0; i < nkeysentenceskeys - 1; ++i) { const QString& si(keysentenceskeys.at(i)); const QString& sj(keysentenceskeys.at(i + 1)); if (sj.endsWith(si) && _keysentences.value(si).ndocuments == _keysentences.value(sj).ndocuments) _keysentences[si].ndocuments = 0; } _out << QObject::tr("done") << endl; } void collectionIndex::digestKeySentences() { _out << QObject::tr("Digesting keyword sentences...") << endl; const QChar hyphen('_'); const QString coordination_and(" and "); const QString coordination_in(" in "); const QString coordination_of(" of "); const QString coordination_on(" on "); const QString coordination_or(" or "); const QRegExp trailing_ae("ae\\b"); const QRegExp trailing_ches("ches\\b"); const QRegExp trailing_dices("dices\\b"); const QRegExp trailing_ices("ices\\b"); const QRegExp trailing_ies("ies\\b"); const QRegExp trailing_is("is\\b"); const QRegExp trailing_us("us\\b"); const QRegExp trailing_s("s\\b"); const QRegExp trailing_ss("ss\\b"); const QRegExp trailing_sses("sses\\b"); const QRegExp trailing_ap("'\\b"); const QRegExp trailing_aps("'s\\b"); for (QHash::iterator si = _keysentences.begin(); si != _keysentences.end(); ++si) { if (si.value().ndocuments == 0) continue; const QString& s(si.key()); KeysentenceData* ksdndmax(&si.value()); int ndmax(ksdndmax->ndocuments); // Unify hyphenation if (s.contains(hyphen)) { QString sp(s); sp.remove(hyphen); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); sp = s; sp.replace(hyphen, _space_char); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } // Unify simple coordinations if (s.count(coordination_and) == 1) { const QStringList p(s.split(coordination_and, QString::SkipEmptyParts)); const QString sp(p.at(1) + coordination_and + p.at(0)); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } else if (s.count(coordination_or) == 1) { const QStringList p(s.split(coordination_or, QString::SkipEmptyParts)); const QString sp(p.at(1) + coordination_or + p.at(0)); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } else if (s.count(coordination_of) == 1) { const QStringList p(s.split(coordination_of, QString::SkipEmptyParts)); const QString sp(p.at(1) + _space_char + p.at(0)); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } else if (s.count(coordination_on) == 1) { const QStringList p(s.split(coordination_on, QString::SkipEmptyParts)); const QString sp(p.at(1) + _space_char + p.at(0)); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } else if (s.count(coordination_in) == 1) { const QStringList p(s.split(coordination_in, QString::SkipEmptyParts)); const QString sp(p.at(1) + _space_char + p.at(0)); if (_keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } // Unify genitives if (s.contains(trailing_aps) || s.contains(trailing_ap)) { QString sp(s); sp.remove(trailing_aps); sp.remove(trailing_ap); if (s.length() != sp.length() && _keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } // Unify number if (s.contains(trailing_s) || s.contains(trailing_ae)) { QString sp(s); sp.replace(trailing_dices, "dex"); sp.replace(trailing_ices, "ix"); sp.replace(trailing_ae, "a"); sp.replace(trailing_ies, "y"); sp.replace(trailing_ches, "ch"); sp.replace(trailing_ss, "sss"); sp.replace(trailing_us, "uss"); sp.replace(trailing_aps, "'ss"); sp.replace(trailing_sses, "sss"); sp.replace(trailing_is, "iss"); sp.remove(trailing_s); if (s.length() != sp.length() && _keysentences.contains(sp)) ksdndmax = _digest_sentence(&_keysentences[sp], ksdndmax, &ndmax); } ksdndmax->ndocuments = ksdndmax->documents.count(); } _out << QObject::tr("done") << endl; } collectionIndex::KeysentenceData* collectionIndex::_digest_sentence(KeysentenceData* ksd, KeysentenceData* ksdndmax, int* ndmax) const { if (ksd->ndocuments > *ndmax) { // Transfer from ksdndmax *ndmax = ksd->ndocuments; const int nd(ksdndmax->documents.count()); for (int i = 0; i < nd; ++i) { const int& did(ksdndmax->documents.at(i)); if (!ksd->documents.contains(did)) ksd->documents.append(did); } ksdndmax->ndocuments = 0; return ksd; } else { // Transfer to ksdndmax const int nd(ksd->documents.count()); for (int i = 0; i < nd; ++i) { const int& did(ksd->documents.at(i)); if (!ksdndmax->documents.contains(did)) ksdndmax->documents.append(did); } ksd->ndocuments = 0; return ksdndmax; } } bool collectionIndex::isValidKeySentence(const QString& text) const { const ushort fc(text.at(0).unicode()); if (fc == 39) return false; if (fc == 95) return false; if (fc == 97) { if (text.startsWith(QLatin1String("a "))) return false; if (text.startsWith(QLatin1String("ability "))) return false; if (text.startsWith(QLatin1String("able "))) return false; if (text.startsWith(QLatin1String("about "))) return false; if (text.startsWith(QLatin1String("above "))) return false; if (text.startsWith(QLatin1String("academy of "))) return false; if (text.startsWith(QLatin1String("according "))) return false; if (text.startsWith(QLatin1String("acknowledgment "))) return false; if (text.startsWith(QLatin1String("across "))) return false; if (text.startsWith(QLatin1String("added "))) return false; if (text.startsWith(QLatin1String("advances in "))) return false; if (text.startsWith(QLatin1String("after "))) return false; if (text.startsWith(QLatin1String("agreement "))) return false; if (text.startsWith(QLatin1String("all ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("along "))) return false; if (text.startsWith(QLatin1String("also "))) return false; if (text.startsWith(QLatin1String("although "))) return false; if (text.startsWith(QLatin1String("among "))) return false; if (text.startsWith(QLatin1String("an "))) return false; if (text.startsWith(QLatin1String("and "))) return false; if (text.startsWith(QLatin1String("annals of "))) return false; if (text.startsWith(QLatin1String("any ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("are "))) return false; if (text.startsWith(QLatin1String("as "))) return false; if (text.startsWith(QLatin1String("at "))) return false; if (text.startsWith(QLatin1String("author "))) return false; if (text.startsWith(QLatin1String("author's "))) return false; if (text.startsWith(QLatin1String("authors "))) return false; } if (fc == 98) { if (text.startsWith(QLatin1String("based on "))) return false; if (text.startsWith(QLatin1String("be "))) return false; if (text.startsWith(QLatin1String("been "))) return false; if (text.startsWith(QLatin1String("before "))) return false; if (text.startsWith(QLatin1String("between "))) return false; if (text.startsWith(QLatin1String("both "))) return false; if (text.startsWith(QLatin1String("but "))) return false; if (text.startsWith(QLatin1String("by "))) return false; } if (fc == 99) { if (text.startsWith(QLatin1String("calculated ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("calculations "))) return false; if (text.startsWith(QLatin1String("can "))) return false; if (text.startsWith(QLatin1String("cannot "))) return false; if (text.startsWith(QLatin1String("capable "))) return false; if (text.startsWith(QLatin1String("carried "))) return false; if (text.startsWith(QLatin1String("case "))) return false; if (text.startsWith(QLatin1String("chapter "))) return false; if (text.startsWith(QLatin1String("chapters "))) return false; if (text.startsWith(QLatin1String("college of "))) return false; if (text.startsWith(QLatin1String("come "))) return false; if (text.startsWith(QLatin1String("conference on "))) return false; if (text.startsWith(QLatin1String("contribution from "))) return false; if (text.startsWith(QLatin1String("corresponding "))) return false; if (text.startsWith(QLatin1String("could "))) return false; if (text.startsWith(QLatin1String("current "))) return false; if (text.startsWith(QLatin1String("currently "))) return false; } if (fc == 100) { if (text.startsWith(QLatin1String("data "))) return false; if (text.startsWith(QLatin1String("de "))) return false; if (text.startsWith(QLatin1String("department "))) return false; if (text.startsWith(QLatin1String("depicted "))) return false; if (text.startsWith(QLatin1String("depicts "))) return false; if (text.startsWith(QLatin1String("der "))) return false; if (text.startsWith(QLatin1String("described "))) return false; if (text.startsWith(QLatin1String("detailed "))) return false; if (text.startsWith(QLatin1String("details "))) return false; if (text.startsWith(QLatin1String("determined "))) return false; if (text.startsWith(QLatin1String("did not "))) return false; if (text.startsWith(QLatin1String("different ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("difficult "))) return false; if (text.startsWith(QLatin1String("discussed "))) return false; if (text.startsWith(QLatin1String("dissolved "))) return false; if (text.startsWith(QLatin1String("do "))) return false; if (text.startsWith(QLatin1String("does "))) return false; if (text.startsWith(QLatin1String("due ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("during "))) return false; } if (fc == 101) { if (text.startsWith(QLatin1String("each "))) return false; if (text.startsWith(QLatin1String("easily "))) return false; if (text.startsWith(QLatin1String("easy "))) return false; if (text.startsWith(QLatin1String("edited "))) return false; if (text.startsWith(QLatin1String("effect ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("effects ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("either "))) return false; if (text.startsWith(QLatin1String("elsevier "))) return false; } if (fc == 102) { if (text.startsWith(QLatin1String("faculty of "))) return false; if (text.startsWith(QLatin1String("figure "))) return false; if (text.startsWith(QLatin1String("figures "))) return false; if (text.startsWith(QLatin1String("find "))) return false; if (text.startsWith(QLatin1String("finding "))) return false; if (text.startsWith(QLatin1String("findings "))) return false; if (text.startsWith(QLatin1String("first ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("followed "))) return false; if (text.startsWith(QLatin1String("following "))) return false; if (text.startsWith(QLatin1String("footnote "))) return false; if (text.startsWith(QLatin1String("for "))) return false; if (text.startsWith(QLatin1String("form "))) return false; if (text.startsWith(QLatin1String("found "))) return false; if (text.startsWith(QLatin1String("foundation "))) return false; if (text.startsWith(QLatin1String("free of charge "))) return false; if (text.startsWith(QLatin1String("from "))) return false; if (text.startsWith(QLatin1String("fur "))) return false; if (text.startsWith(QLatin1String("further "))) return false; } if (fc == 103) { if (text.startsWith(QLatin1String("gave "))) return false; if (text.startsWith(QLatin1String("give "))) return false; if (text.startsWith(QLatin1String("given "))) return false; if (text.startsWith(QLatin1String("gives "))) return false; if (text.startsWith(QLatin1String("go "))) return false; if (text.startsWith(QLatin1String("goes "))) return false; if (text.startsWith(QLatin1String("going "))) return false; if (text.startsWith(QLatin1String("groups "))) return false; } if (fc == 104) { if (text.startsWith(QLatin1String("has "))) return false; if (text.startsWith(QLatin1String("have "))) return false; if (text.startsWith(QLatin1String("he "))) return false; if (text.startsWith(QLatin1String("highlighted "))) return false; if (text.startsWith(QLatin1String("his "))) return false; if (text.startsWith(QLatin1String("how "))) return false; } if (fc == 105) { if (text.startsWith(QLatin1String("i "))) return false; if (text.startsWith(QLatin1String("if "))) return false; if (text.startsWith(QLatin1String("ii "))) return false; if (text.startsWith(QLatin1String("iii "))) return false; if (text.startsWith(QLatin1String("in "))) return false; if (text.startsWith(QLatin1String("initially "))) return false; if (text.startsWith(QLatin1String("int j "))) return false; if (text.startsWith(QLatin1String("international conference on "))) return false; if (text.startsWith(QLatin1String("international journal "))) return false; if (text.startsWith(QLatin1String("into "))) return false; if (text.startsWith(QLatin1String("is "))) return false; if (text.startsWith(QLatin1String("it "))) return false; if (text.startsWith(QLatin1String("its "))) return false; } if (fc == 106) { if (text.startsWith(QLatin1String("j "))) return false; if (text.startsWith(QLatin1String("journal of "))) return false; if (text.startsWith(QLatin1String("journal on "))) return false; if (text.startsWith(QLatin1String("just "))) return false; } if (fc == 107) { if (text.startsWith(QLatin1String("kept "))) return false; } if (fc == 108) { if (text.startsWith(QLatin1String("laboratory for "))) return false; if (text.startsWith(QLatin1String("laboratory of "))) return false; if (text.startsWith(QLatin1String("larger "))) return false; if (text.startsWith(QLatin1String("less "))) return false; if (text.startsWith(QLatin1String("let "))) return false; if (text.startsWith(QLatin1String("lower "))) return false; } if (fc == 109) { if (text.startsWith(QLatin1String("may "))) return false; if (text.startsWith(QLatin1String("mol "))) return false; if (text.startsWith(QLatin1String("more "))) return false; if (text.startsWith(QLatin1String("most ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("much ")) && text.count(_space_char) < 3) return false; if (text.startsWith(QLatin1String("my "))) return false; } if (fc == 110) { if (text.startsWith(QLatin1String("national academy of "))) return false; if (text.startsWith(QLatin1String("need "))) return false; if (text.startsWith(QLatin1String("new "))) return false; if (text.startsWith(QLatin1String("not ")) && text.count(_space_char) < 3) return false; } if (fc == 111) { if (text.startsWith(QLatin1String("observed "))) return false; if (text.startsWith(QLatin1String("obtained "))) return false; if (text.startsWith(QLatin1String("occur "))) return false; if (text.startsWith(QLatin1String("occurs "))) return false; if (text.startsWith(QLatin1String("of "))) return false; if (text.startsWith(QLatin1String("office "))) return false; if (text.startsWith(QLatin1String("on "))) return false; if (text.startsWith(QLatin1String("only "))) return false; if (text.startsWith(QLatin1String("onto "))) return false; if (text.startsWith(QLatin1String("or "))) return false; if (text.startsWith(QLatin1String("other "))) return false; if (text.startsWith(QLatin1String("otherwise "))) return false; if (text.startsWith(QLatin1String("our "))) return false; if (text.startsWith(QLatin1String("over "))) return false; } if (fc == 112) { if (text.startsWith(QLatin1String("per "))) return false; if (text.startsWith(QLatin1String("permission of "))) return false; if (text.startsWith(QLatin1String("play "))) return false; if (text.startsWith(QLatin1String("played "))) return false; if (text.startsWith(QLatin1String("please "))) return false; if (text.startsWith(QLatin1String("possible "))) return false; if (text.startsWith(QLatin1String("present"))) return false; if (text.startsWith(QLatin1String("previous "))) return false; if (text.startsWith(QLatin1String("proceedings "))) return false; if (text.startsWith(QLatin1String("proof "))) return false; } if (fc == 113) { if (text.startsWith(QLatin1String("quite "))) return false; } if (fc == 114) { if (text.startsWith(QLatin1String("rather "))) return false; if (text.startsWith(QLatin1String("rest of "))) return false; if (text.startsWith(QLatin1String("result of "))) return false; if (text.startsWith(QLatin1String("reviews in "))) return false; if (text.startsWith(QLatin1String("run "))) return false; } if (fc == 115) { if (text.startsWith(QLatin1String("same "))) return false; if (text.startsWith(QLatin1String("see "))) return false; if (text.startsWith(QLatin1String("several "))) return false; if (text.startsWith(QLatin1String("shall "))) return false; if (text.startsWith(QLatin1String("show "))) return false; if (text.startsWith(QLatin1String("shown "))) return false; if (text.startsWith(QLatin1String("since "))) return false; if (text.startsWith(QLatin1String("so "))) return false; if (text.startsWith(QLatin1String("some "))) return false; if (text.startsWith(QLatin1String("strongly "))) return false; if (text.startsWith(QLatin1String("studied "))) return false; if (text.startsWith(QLatin1String("studies "))) return false; if (text.startsWith(QLatin1String("study "))) return false; if (text.startsWith(QLatin1String("such "))) return false; if (text.startsWith(QLatin1String("supporting "))) return false; if (text.startsWith(QLatin1String("suppose "))) return false; if (text.startsWith(QLatin1String("symposium on "))) return false; } if (fc == 116) { if (text.startsWith(QLatin1String("than "))) return false; if (text.startsWith(QLatin1String("thank "))) return false; if (text.startsWith(QLatin1String("that "))) return false; if (text.startsWith(QLatin1String("the "))) return false; if (text.startsWith(QLatin1String("their "))) return false; if (text.startsWith(QLatin1String("then "))) return false; if (text.startsWith(QLatin1String("there "))) return false; if (text.startsWith(QLatin1String("these "))) return false; if (text.startsWith(QLatin1String("they "))) return false; if (text.startsWith(QLatin1String("this "))) return false; if (text.startsWith(QLatin1String("those "))) return false; if (text.startsWith(QLatin1String("thus "))) return false; if (text.startsWith(QLatin1String("title "))) return false; if (text.startsWith(QLatin1String("to "))) return false; if (text.startsWith(QLatin1String("too "))) return false; if (text.startsWith(QLatin1String("top "))) return false; if (text.startsWith(QLatin1String("transactions on "))) return false; } if (fc == 117) { if (text.startsWith(QLatin1String("under "))) return false; if (text.startsWith(QLatin1String("us "))) return false; if (text.startsWith(QLatin1String("use "))) return false; if (text.startsWith(QLatin1String("used "))) return false; if (text.startsWith(QLatin1String("uses "))) return false; if (text.startsWith(QLatin1String("using "))) return false; } if (fc == 118) { if (text.startsWith(QLatin1String("very ")) && text.count(_space_char) < 3) return false; } if (fc == 119) { if (text.startsWith(QLatin1String("was "))) return false; if (text.startsWith(QLatin1String("we "))) return false; if (text.startsWith(QLatin1String("were "))) return false; if (text.startsWith(QLatin1String("were "))) return false; if (text.startsWith(QLatin1String("what "))) return false; if (text.startsWith(QLatin1String("when "))) return false; if (text.startsWith(QLatin1String("whenever "))) return false; if (text.startsWith(QLatin1String("where "))) return false; if (text.startsWith(QLatin1String("whether "))) return false; if (text.startsWith(QLatin1String("which "))) return false; if (text.startsWith(QLatin1String("while "))) return false; if (text.startsWith(QLatin1String("whose "))) return false; if (text.startsWith(QLatin1String("wiley "))) return false; if (text.startsWith(QLatin1String("will "))) return false; if (text.startsWith(QLatin1String("with "))) return false; if (text.startsWith(QLatin1String("within "))) return false; if (text.startsWith(QLatin1String("without "))) return false; if (text.startsWith(QLatin1String("work "))) return false; if (text.startsWith(QLatin1String("workshop on "))) return false; if (text.startsWith(QLatin1String("worth "))) return false; if (text.startsWith(QLatin1String("would "))) return false; } if (fc == 120) { if (text.startsWith(QLatin1String("x "))) return false; } if (fc == 121) { if (text.startsWith(QLatin1String("yes "))) return false; if (text.startsWith(QLatin1String("you "))) return false; if (text.startsWith(QLatin1String("your "))) return false; } const ushort lc(text.at(text.length() - 1).unicode()); if (lc == 95) return false; if (lc == 97) { if (text.endsWith(QLatin1String(" a"))) return false; if (text.endsWith(QLatin1String(" via"))) return false; } if (lc == 100) { if (text.endsWith(QLatin1String(" and"))) return false; if (text.endsWith(QLatin1String(" applied"))) return false; if (text.endsWith(QLatin1String(" carried"))) return false; if (text.endsWith(QLatin1String(" could"))) return false; if (text.endsWith(QLatin1String(" performed"))) return false; if (text.endsWith(QLatin1String(" second"))) return false; if (text.endsWith(QLatin1String(" should"))) return false; if (text.endsWith(QLatin1String(" showed"))) return false; if (text.endsWith(QLatin1String(" third"))) return false; if (text.endsWith(QLatin1String(" used"))) return false; if (text.endsWith(QLatin1String(" would"))) return false; } if (lc == 101) { if (text.endsWith(QLatin1String(" above"))) return false; if (text.endsWith(QLatin1String(" are"))) return false; if (text.endsWith(QLatin1String(" available"))) return false; if (text.endsWith(QLatin1String(" be"))) return false; if (text.endsWith(QLatin1String(" because"))) return false; if (text.endsWith(QLatin1String(" due"))) return false; if (text.endsWith(QLatin1String(" gave"))) return false; if (text.endsWith(QLatin1String(" have"))) return false; if (text.endsWith(QLatin1String(" he"))) return false; if (text.endsWith(QLatin1String(" here"))) return false; if (text.endsWith(QLatin1String(" importance"))) return false; if (text.endsWith(QLatin1String(" indicate"))) return false; if (text.endsWith(QLatin1String(" like"))) return false; if (text.endsWith(QLatin1String(" made"))) return false; if (text.endsWith(QLatin1String(" more"))) return false; if (text.endsWith(QLatin1String(" same"))) return false; if (text.endsWith(QLatin1String(" since"))) return false; if (text.endsWith(QLatin1String(" the"))) return false; if (text.endsWith(QLatin1String(" there"))) return false; if (text.endsWith(QLatin1String(" these"))) return false; if (text.endsWith(QLatin1String(" we"))) return false; if (text.endsWith(QLatin1String(" were"))) return false; if (text.endsWith(QLatin1String(" where"))) return false; if (text.endsWith(QLatin1String(" where"))) return false; if (text.endsWith(QLatin1String(" while"))) return false; if (text.endsWith(QLatin1String(" whose"))) return false; } if (lc == 102) { if (text.endsWith(QLatin1String(" if"))) return false; if (text.endsWith(QLatin1String(" of"))) return false; } if (lc == 103) { if (text.endsWith(QLatin1String(" according"))) return false; if (text.endsWith(QLatin1String(" along"))) return false; if (text.endsWith(QLatin1String(" belonging"))) return false; if (text.endsWith(QLatin1String(" containing"))) return false; if (text.endsWith(QLatin1String(" corresponding"))) return false; if (text.endsWith(QLatin1String(" during"))) return false; if (text.endsWith(QLatin1String(" having"))) return false; if (text.endsWith(QLatin1String(" involving"))) return false; if (text.endsWith(QLatin1String(" using"))) return false; } if (lc == 104) { if (text.endsWith(QLatin1String(" although"))) return false; if (text.endsWith(QLatin1String(" both"))) return false; if (text.endsWith(QLatin1String(" much"))) return false; if (text.endsWith(QLatin1String(" such"))) return false; if (text.endsWith(QLatin1String(" through"))) return false; if (text.endsWith(QLatin1String(" which"))) return false; if (text.endsWith(QLatin1String(" with"))) return false; } if (lc == 105) { if (text.endsWith(QLatin1String(" i"))) return false; } if (lc == 108) { if (text.endsWith(QLatin1String(" all"))) return false; if (text.endsWith(QLatin1String(" several"))) return false; if (text.endsWith(QLatin1String(" will"))) return false; } if (lc == 109) { if (text.endsWith(QLatin1String(" from"))) return false; if (text.endsWith(QLatin1String(" them"))) return false; } if (lc == 110) { if (text.endsWith(QLatin1String(" an"))) return false; if (text.endsWith(QLatin1String(" been"))) return false; if (text.endsWith(QLatin1String(" between"))) return false; if (text.endsWith(QLatin1String(" can"))) return false; if (text.endsWith(QLatin1String(" in"))) return false; if (text.endsWith(QLatin1String(" known"))) return false; if (text.endsWith(QLatin1String(" on"))) return false; if (text.endsWith(QLatin1String(" shown"))) return false; if (text.endsWith(QLatin1String(" shown"))) return false; if (text.endsWith(QLatin1String(" supporting information"))) return false; if (text.endsWith(QLatin1String(" taken"))) return false; if (text.endsWith(QLatin1String(" than"))) return false; if (text.endsWith(QLatin1String(" then"))) return false; if (text.endsWith(QLatin1String(" upon"))) return false; if (text.endsWith(QLatin1String(" when"))) return false; if (text.endsWith(QLatin1String(" within"))) return false; } if (lc == 111) { if (text.endsWith(QLatin1String(" also"))) return false; if (text.endsWith(QLatin1String(" do"))) return false; if (text.endsWith(QLatin1String(" into"))) return false; if (text.endsWith(QLatin1String(" to"))) return false; if (text.endsWith(QLatin1String(" two"))) return false; if (text.endsWith(QLatin1String(" who"))) return false; } if (lc == 114) { if (text.endsWith(QLatin1String(" after"))) return false; if (text.endsWith(QLatin1String(" chapter"))) return false; if (text.endsWith(QLatin1String(" elsevier"))) return false; if (text.endsWith(QLatin1String(" for"))) return false; if (text.endsWith(QLatin1String(" or"))) return false; if (text.endsWith(QLatin1String(" our"))) return false; if (text.endsWith(QLatin1String(" over"))) return false; if (text.endsWith(QLatin1String(" per"))) return false; if (text.endsWith(QLatin1String(" their"))) return false; if (text.endsWith(QLatin1String(" under"))) return false; if (text.endsWith(QLatin1String(" whether"))) return false; if (text.endsWith(QLatin1String(" your"))) return false; } if (lc == 115) { if (text.endsWith(QLatin1String(" across"))) return false; if (text.endsWith(QLatin1String(" as"))) return false; if (text.endsWith(QLatin1String(" does"))) return false; if (text.endsWith(QLatin1String(" does"))) return false; if (text.endsWith(QLatin1String(" follows"))) return false; if (text.endsWith(QLatin1String(" gives"))) return false; if (text.endsWith(QLatin1String(" has"))) return false; if (text.endsWith(QLatin1String(" his"))) return false; if (text.endsWith(QLatin1String(" is"))) return false; if (text.endsWith(QLatin1String(" its"))) return false; if (text.endsWith(QLatin1String(" ones"))) return false; if (text.endsWith(QLatin1String(" shows"))) return false; if (text.endsWith(QLatin1String(" this"))) return false; if (text.endsWith(QLatin1String(" us"))) return false; if (text.endsWith(QLatin1String(" was"))) return false; if (text.endsWith(QLatin1String(" yes"))) return false; if (text.endsWith(QLatin1String("acids res"))) return false; } if (lc == 116) { if (text.endsWith(QLatin1String(" about"))) return false; if (text.endsWith(QLatin1String(" at"))) return false; if (text.endsWith(QLatin1String(" department"))) return false; if (text.endsWith(QLatin1String(" et"))) return false; if (text.endsWith(QLatin1String(" first"))) return false; if (text.endsWith(QLatin1String(" important"))) return false; if (text.endsWith(QLatin1String(" it"))) return false; if (text.endsWith(QLatin1String(" let"))) return false; if (text.endsWith(QLatin1String(" most"))) return false; if (text.endsWith(QLatin1String(" must"))) return false; if (text.endsWith(QLatin1String(" not"))) return false; if (text.endsWith(QLatin1String(" out"))) return false; if (text.endsWith(QLatin1String(" suggest"))) return false; if (text.endsWith(QLatin1String(" that"))) return false; if (text.endsWith(QLatin1String(" without"))) return false; } if (lc == 117) { if (text.endsWith(QLatin1String(" you"))) return false; } if (lc == 119) { if (text.endsWith(QLatin1String(" how"))) return false; if (text.endsWith(QLatin1String(" new"))) return false; if (text.endsWith(QLatin1String(" show"))) return false; } if (lc == 121) { if (text.endsWith(QLatin1String(" any"))) return false; if (text.endsWith(QLatin1String(" by"))) return false; if (text.endsWith(QLatin1String(" may"))) return false; if (text.endsWith(QLatin1String(" my"))) return false; if (text.endsWith(QLatin1String(" only"))) return false; if (text.endsWith(QLatin1String(" society"))) return false; if (text.endsWith(QLatin1String(" they"))) return false; if (text.endsWith(QLatin1String(" wiley"))) return false; } if (text.contains(QLatin1String("_ "))) return false; if (text.contains(QLatin1String(" _"))) return false; return true; } QString collectionIndex::preprocessedText(const QString& journal, const QString& text) const { QString pt(text); pt = pt.toLower(); if (journal.contains(_space_char)) { QStringList jns; jns.append(journal.toLower()); jns.append(_bpP->fullJournal(journal).toLower()); jns.append(_bpP->abbreviatedJournal(journal).toLower()); jns.append(QString(jns.at(0)).remove('.')); jns.append(QString(jns.at(1)).remove('.')); jns.append(QString(jns.at(2)).remove('.')); #if QT_VERSION >= 0x040500 jns.removeDuplicates(); #endif for (int i = 0; i < jns.count(); ++i) c2bUtils::fillString(pt, QStringMatcher(jns.at(i), Qt::CaseSensitive), '.'); } replace(pt, '"', ' '); replace(pt, '-', '_'); pt.replace(QRegExp("_{2,}"), "_"); pt.replace(QRegExp("\\bin *situ\\b", Qt::CaseSensitive), " in_situ "); pt.replace(QRegExp("\\bin *vivo\\b", Qt::CaseSensitive), " in_vivo "); pt.replace(QRegExp("\\bin *vitro\\b", Qt::CaseSensitive), " in_vitro "); pt.replace(QRegExp("\\bex *situ\\b", Qt::CaseSensitive), " ex_situ "); pt.replace(QRegExp("\\bex *vivo\\b", Qt::CaseSensitive), " ex_vivo "); pt.replace(QRegExp("\\bex *vitro\\b", Qt::CaseSensitive), " ex_vitro "); // Clear some strings c2bUtils::fillString(pt, QRegExp("\\bbased (?=on\\b)"), ' '); c2bUtils::fillString(pt, QRegExp("\\bin order (?=to\\b)"), ' '); c2bUtils::fillString(pt, QStringMatcher(" a ", Qt::CaseSensitive), ' '); c2bUtils::fillString(pt, QStringMatcher(" an ", Qt::CaseSensitive), ' '); c2bUtils::fillString(pt, QStringMatcher(" its ", Qt::CaseSensitive), ' '); c2bUtils::fillString(pt, QStringMatcher(" the ", Qt::CaseSensitive), ' '); c2bUtils::fillString(pt, QStringMatcher(" their ", Qt::CaseSensitive), ' '); c2bUtils::fillString(pt, QStringMatcher(" '", Qt::CaseSensitive), ' '); c2bUtils::fillString(pt, QStringMatcher("' ", Qt::CaseSensitive), ' '); // Set additional breakpoints c2bUtils::fillString(pt, QStringMatcher(" are ", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QStringMatcher(" be ", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QStringMatcher(" is ", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QStringMatcher(" was ", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QStringMatcher(" were ", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QRegExp("\\binstitut\\w*", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QRegExp("\\buniversi\\w*", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QRegExp("\\bdoi\\w*", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QRegExp("\\bet al\\w*", Qt::CaseSensitive), '.'); // Normalize proper names c2bUtils::fillString(pt, QRegExp("\\bdo not\\b", Qt::CaseSensitive), '.'); pt.replace(QRegExp("\\b" + author::prefixes + "\\s", Qt::CaseSensitive), QString("\\1%1").arg(QChar(127))); replace(pt, QChar(127), '_'); // Remove noisy elements from PDF articles c2bUtils::fillString(pt, QStringMatcher("page intentionally left", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QStringMatcher("journal article", Qt::CaseSensitive), '.'); c2bUtils::fillString(pt, QRegExp(" \\w \\w \\w "), '.'); c2bUtils::stripDiacritics(pt); c2bUtils::simplifyString(pt); return pt; } QString& collectionIndex::replace(QString& str, const QChar& a, const QChar& b) const { const int length(str.length()); QChar* const s(str.data()); int i(0); while (i < length) { QChar& c(s[i]); if (c == a) c = b; ++i; } return str; } cb2bib-1.4.9/src/c2b/coreBibParser.cpp0000644000175000017500000002517312045520050017262 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "coreBibParser.h" coreBibParser::coreBibParser(QObject* parento) : QObject(parento), _close(QChar('}')), _comma(QChar(',')), _open(QChar('{')), _space(QChar(' ')) { _settingsP = settings::instance(); // Setting Bibliographic Types setTypes(); // Setting Bibliographic Fields setFields(); // Setting Regular Expressions setRegularExpressions(); } bool coreBibParser::referencesIn(const QString& str, bibReference* ref) { // File parsing for given fields in ref ref->clearReference(); const int pos(referenceStarts(str, ref->pos)); if (pos < 0) return false; referenceContents(str, ref, pos); return true; } bool coreBibParser::referenceAtKey(const QString& key, const QString& str, bibReference* ref) { // File parsing for given fields in ref ref->clearReference(); const int pos(referenceStarts(key, str)); if (pos < 0) return false; referenceContents(str, ref, pos); return true; } QString coreBibParser::referenceToFomattedBibTeX(const bibReference& ref) const { // Writes a BibTeX string from struct bibReference QString BibString('@' + ref.typeName + '{' + ref.citeidName); const bool ConvertReferenceToLaTeX(_settingsP->value("cb2Bib/ConvertReferenceToLaTeX").toBool()); const bool PostprocessMonth(_settingsP->value("cb2Bib/PostprocessMonth").toBool()); const bool UseDoubleBraces(_settingsP->value("cb2Bib/UseDoubleBraces").toBool()); QStringList::const_iterator it = _bibliographic_fields.begin(); while (it != _bibliographic_fields.end()) { QString fvalue(ref.value(*it)); if (!fvalue.isEmpty()) { if (ConvertReferenceToLaTeX) c2bUtils::c2bToBib(fvalue); const QString fd(*it); const QString padding(QString().fill(' ', 12 - fd.length())); if (fd == "title" || fd == "booktitle") { if (UseDoubleBraces) if (!fvalue.contains(QRegExp("^\\{.+\\}$"))) fvalue = '{' + fvalue + '}'; fvalue = '{' + fvalue + '}'; } else if (fd == "month") { if (!PostprocessMonth) fvalue = '{' + fvalue + '}'; } else fvalue = '{' + fvalue + '}'; BibString += ",\n" + fd + padding + " = " + fvalue; } ++it; } BibString += "\n}\n"; return BibString; } QString coreBibParser::referenceToBibTeX(const bibReference& ref) const { // Writes a BibTeX string from struct bibReference // No special formatting is done here QString BibString('@' + ref.typeName + '{'); QStringList::const_iterator it = _bibliographic_fields.begin(); while (it != _bibliographic_fields.end()) { const QString fvalue(ref.value(*it)); if (!fvalue.isEmpty()) { const QString fd(*it); const QString padding(QString().fill(' ', 12 - fd.length())); BibString += ",\n" + fd + padding + " = {" + fvalue + '}'; } ++it; } BibString += "\n}\n"; return BibString; } QString coreBibParser::adjacentNumbers(const QString& numbers) const { // Originary for pages. However also used for multiple volume, number and year QString pages(numbers); pages.replace(c2bUtils::nonLetter, " "); pages = c2bUtils::simplifyString(pages); pages.replace(' ', '-'); QRegExp rx1("^(\\d+)-(\\d+)-*pp$"); QRegExp rx2("^(\\d+)-(\\d+)$"); if (rx1.indexIn(pages) > -1) { pages = rx1.cap(1); int ilp(rx1.cap(2).toInt() - 1); if (ilp > 0) pages += '-' + QString().setNum(rx1.cap(1).toInt() + ilp); // eg, 123-7pp -> 123 - 129 } else if (rx2.indexIn(pages) > -1) { QString fp(rx2.cap(1)); pages = fp + '-'; QString lp(rx2.cap(2)); uint lfp(fp.length()); uint llp(lp.length()); if (lfp > llp) lp = fp.remove(lfp - llp, llp) + lp; // eg, 123-7 -> 123 - 127 pages += lp; } const QString separator(_settingsP->value("cb2Bib/PageNumberSeparator").toString()); if (separator.isEmpty()) pages.replace('-', " - "); else pages.replace('-', separator); return pages; } void coreBibParser::setFields() { _bibliographic_fields << "title" << "author" << "journal" << "booktitle" << "series" << "chapter" << "pages" << "volume" << "number" << "edition" << "institution" << "organization" << "school" << "address" << "month" << "year" << "editor" << "publisher" << "abstract" << "keywords" << "isbn" << "issn" << "doi" << "eprint" << "file" << "url" << "note" << "annote"; _sorted_bibliographic_fields = _bibliographic_fields; qSort(_sorted_bibliographic_fields); } void coreBibParser::setTypes() { _bibliographic_types << "" << "article" << "book" << "booklet" << "conference" << "inbook" << "incollection" << "inproceedings" << "manual" << "mastersthesis" << "misc" << "periodical" << "phdthesis" << "proceedings" << "techreport" << "unpublished"; } void coreBibParser::setRegularExpressions() { _field_re = QRegExp("\\b(" + _bibliographic_fields.join("|") + ")\\b"); _bib_begin_re = QRegExp("@\\w+\\s*\\{"); _bib_begin0_re = QRegExp("^\\s*@\\w+\\s*\\{"); _bib_begin1_re = QRegExp("[\\r\\n]\\s*@\\w+\\s*\\{"); _bib_key_re = QRegExp("^@\\w+\\s*\\{\\s*([\\w:\\.-]+),"); _bib_type_re = QRegExp("^@(\\w+)\\s*\\{"); // List of regular expressions for extracting bib fields for (int i = 0; i < _bibliographic_fields.count(); ++i) { QRegExp bf("\\b" + _bibliographic_fields.at(i) + "\\s*=\\s*[\\{\"]", Qt::CaseInsensitive); // Consider non-braces case (eg. 'year = 2000,') QRegExp bfNB("\\b" + _bibliographic_fields.at(i) + "\\s*=\\s*(\\w*)\\s*,", Qt::CaseInsensitive); // Exception: Process macros for month, to be able to read cb2Bib writing if (_bibliographic_fields.at(i) == "month") { bf.setPattern("\\b" + _bibliographic_fields.at(i) + "\\s*=\\s*[\\{]"); bfNB.setPattern("\\b" + _bibliographic_fields.at(i) + "\\s*=\\s*([\\w\\s~#\"]*)\\s*,"); } bf.setMinimal(true); _bib_fields_re.append(bf); bfNB.setMinimal(true); _bib_fields_nb_re.append(bfNB); } } void coreBibParser::initReferenceParsing(const QString& dir, const QStringList& fields, bibReference* ref) { setReferenceParsingDir(dir); // Init file parsing for given fields ref->clearFields(); ref->clearReference(); ref->bib_fieldList = fields; for (int i = 0; i < fields.count(); ++i) { QRegExp bf("\\b" + fields.at(i) + "\\s*=\\s*[\\{\"]", Qt::CaseInsensitive); // Consider non-braces case (eg. 'year = 2000,') QRegExp bfNB("\\b" + fields.at(i) + "\\s*=\\s*(\\w*)\\s*,", Qt::CaseInsensitive); // Exception: Process macros for month, to be able to read cb2Bib writing if (fields.at(i) == "month") { bf.setPattern("\\b" + fields.at(i) + "\\s*=\\s*[\\{]"); bfNB.setPattern("\\b" + fields.at(i) + "\\s*=\\s*([\\w\\s~#\"]*)\\s*,"); } bf.setMinimal(true); ref->_bib_fields_re.append(bf); bfNB.setMinimal(true); ref->_bib_fields_nb_re.append(bfNB); } } bibReference coreBibParser::wholeReference(const QString& str) { // Skip citeidName and positionValue as they are not needed here // Skip trimming it is done later in bibParser::parse() bibReference ref; int pos(referenceStarts(str)); if (pos < 0) return ref; QString str_ref(referenceAt(str, &pos)); c2bUtils::fullBibToC2b(str_ref); c2bUtils::simplifyString(str_ref); _bib_type_re.indexIn(str_ref); ref.typeName = _bib_type_re.cap(1).toLower(); setReferenceEnd(&str_ref, str_ref.length()); QString fvalue; const int kwi(_bibliographic_fields.indexOf(QLatin1String("keywords"))); for (int i = 0; i < _bib_fields_re.count(); ++i) { QRegExp* bf = &_bib_fields_re[i]; pos = bf->indexIn(str_ref); if (i == kwi) { QString kwv; if (pos > 0) { while (pos > -1) { if (c2bUtils::inBraces(pos + bf->matchedLength(), str_ref, &fvalue)) kwv += ';' + fvalue; pos = bf->indexIn(str_ref, pos + bf->matchedLength()); } } else { bf = &_bib_fields_nb_re[i]; pos = bf->indexIn(str_ref); while (pos > -1) { kwv += ';' + bf->cap(1); pos = bf->indexIn(str_ref, pos + bf->matchedLength()); } } ref[_bibliographic_fields.at(i)] = kwv; } else { if (pos > 0) { if (c2bUtils::inBraces(pos + bf->matchedLength(), str_ref, &fvalue)) ref[_bibliographic_fields.at(i)] = fvalue; } else { bf = &_bib_fields_nb_re[i]; if (bf->indexIn(str_ref) > -1) ref[_bibliographic_fields.at(i)] = bf->cap(1); } } } return ref; } cb2bib-1.4.9/src/c2b/substringMatcher.cpp0000644000175000017500000000573012045520050020061 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "substringMatcher.h" #include "cb2bib_utilities.h" #include "triads.h" substringMatcher::substringMatcher() : _hook(-1), _substring_count(0), _matched_length(-1), _p0(0), _pn(0) {} substringMatcher::substringMatcher(const QString& pattern, const Qt::CaseSensitivity cs) : _hook(-1), _matched_length(-1) { QRegExp sep("\\.\\{(\\d+),(\\d+)\\}"); QStringList substrings(pattern.split(sep, QString::SkipEmptyParts)); Q_ASSERT_X(substrings.count() >= 2, "substringMatcher", "Expected at least two substrings in pattern"); int s(0); QList stretches; while ((s = sep.indexIn(pattern, s)) != -1) { Q_ASSERT_X(sep.numCaptures() == 2, "substringMatcher", "Expected two digits in repetition"); Q_ASSERT_X(sep.cap(1).toInt() == 0, "substringMatcher", "Expected zero in first repetition digit"); stretches.append(sep.cap(2).toInt()); s += sep.matchedLength(); } Q_ASSERT_X(substrings.count() == stretches.count() + 1, "substringMatcher", "Mismatch in pattern"); _substring_count = substrings.count(); _substrings.resize(_substring_count); _lengths.resize(_substring_count); for (int i = 0; i < _substring_count; ++i) { _substrings[i] = QStringMatcher(substrings.at(i), cs); _lengths[i] = substrings.at(i).length(); } _stretches.resize(_substring_count); _stretches[0] = 0; for (int i = 1; i < _substring_count; ++i) _stretches[i] = stretches.at(i - 1); _acc_lengths.fill(0, _substring_count); for (int i = 1; i < _substring_count; ++i) _acc_lengths[i] = _acc_lengths[i-1] + _lengths.at(i - 1); int lf(10000); for (int i = 0; i < _substring_count; ++i) { const int f(triads::textFrequency(substrings.at(i))); if (f < lf) { lf = f; _hook = i; } } #if C2B_DEBUG_SUBSTRINGMATCHER qDebug() << "Pattern:" << pattern; qDebug() << "Hook:" << substrings.at(_hook); #endif } int substringMatcher::indexIn(const QString& str, const int from) const { _matched_length = -1; if (_hook == -1) { c2bUtils::warn(QObject::tr("Warning: Uninitialized substringMatcher")); return -1; } _p0 = from; if (_p0 < 0) _p0 = 0; _pn = str.length(); if (_pn == 0) return -1; int hp(_p0); int p(-1); while (p == -1) { hp = _index_in(_hook, str, hp + _acc_lengths.at(_hook)); #if C2B_DEBUG_SUBSTRINGMATCHER qDebug() << "Hook at" << hp; #endif if (hp == -1) return -1; p = _index_around(str, hp); hp += _lengths.at(_hook); } return p; } cb2bib-1.4.9/src/c2b/wordPattern.cpp0000644000175000017500000000425112045520050017043 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "wordPattern.h" #include "cb2bib_utilities.h" #include "triads.h" wordPattern::wordPattern() : compositePattern(), _type(AllWords) {} wordPattern::wordPattern(const QString& pattern, const Type type, const Qt::CaseSensitivity cs) : compositePattern(pattern, cs), _type(type) { setPattern(pattern, type, cs); } void wordPattern::setPattern(const QString& pattern, const Type type, const Qt::CaseSensitivity cs) { _string = pattern.simplified(); _type = type; _case_sensitivity = cs; _is_multipattern = false; _matched_length = -1; const QStringList words(_string.split(c2bUtils::nonLetter, QString::SkipEmptyParts)); _subpattern_count = words.count(); if (_subpattern_count == 0) return; _ranks.clear(); QStringList subpattern; QStringList substring; for (int i = 0; i < words.count(); ++i) { const QString& wi = words.at(i); const QString sp(escape(wi, _case_sensitivity)); subpattern.append(sp); substring.append(wi); _ranks.append(triads::textFrequency(wi)); // Rank according expectation (arXiv:0705.0751v1, Eq. 6) } set_sort_index(); if (_subpattern_count == 1) _regexp.setPattern(escape(_string, _case_sensitivity)); else _regexp.setPattern(QString("(?:%1)").arg(subpattern.join("|"))); _submatchers.resize(_subpattern_count); _subregexps.resize(_subpattern_count); _substrings.clear(); for (int i = 0; i < _subpattern_count; ++i) { const int ii(_index.at(i)); _submatchers[i] = QStringMatcher(substring.at(ii), _case_sensitivity); _subregexps[i] = QRegExp(subpattern.at(ii), Qt::CaseSensitive, QRegExp::RegExp2); _subregexps[i].setMinimal(false); _substrings.append(substring.at(ii)); } _is_multipattern = _subpattern_count > 1; } cb2bib-1.4.9/src/c2b/posTagger.h0000644000175000017500000000320012045520050016123 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef POSTAGGER_H #define POSTAGGER_H #include class posTagger { public: posTagger(); inline ~posTagger() {} QString ruletag(const QString& word) const; QString tagged(const QString& text) const; bool loadLexicon(); inline bool contains(const QString& sentence) const { return _sentence_patterns.contains(sentence); } private: const QChar _period; const QChar _space; const QString _pos_a; const QString _pos_g; const QString _pos_n; const QString _pos_o; const QString _pos_r; const QString _pos_s; const QString _suffix_able; const QString _suffix_ae; const QString _suffix_al; const QString _suffix_apostrophes; const QString _suffix_ar; const QString _suffix_ed; const QString _suffix_ful; const QString _suffix_ic; const QString _suffix_ics; const QString _suffix_ing; const QString _suffix_is; const QString _suffix_ive; const QString _suffix_lent; const QString _suffix_less; const QString _suffix_like; const QString _suffix_ly; const QString _suffix_ous; const QString _suffix_s; const QString _suffix_ss; const QString _suffix_us; QHash _lexicon; QHash _sentence_patterns; }; #endif cb2bib-1.4.9/src/c2b/metadataParser.h0000644000175000017500000000401612045520050017133 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef METADATAPARSER_H #define METADATAPARSER_H #include #include class coreBibParser; class settings; class metadataParser : public QObject { Q_OBJECT public: metadataParser(QObject* parento = 0); metadataParser(coreBibParser* bp, QObject* parento = 0); inline ~metadataParser() {} bool insertMetadata(const bibReference& ref, const QString& fn, QString* error = 0) const; bool metadata(const QString& fn, bibReference* ref); const QString metadata(const QString& fn); signals: void showMessage(const QString& title, const QString& ms) const; private: QHash _bibtex_key; QRegExp _bibtex_fields; QRegExp _fields; bibReference _ref; bool _has_bibtex; bool _has_cb2bib; bool _has_prism; bool _metadata(const QString& fn); const QString _pdfDictionary(const QByteArray& rawpdf); coreBibParser* _cbpP; settings* _settingsP; void _fuzzyParser(const QString& data); void _metadataXmp(const QString& fn, const QByteArray& raw_contents, QStringList* xmls); void _metadataXmpExifTool(const QString& fn, QStringList* xmls); void _miscellaneousData(const QString& fn, const QByteArray& raw_contents); void init(); inline QString formattedAuthor(const QString& author) const { const QStringList alist(author.split(" and ", QString::SkipEmptyParts)); int na(alist.count()); if (na <= 2) return author; QString formatted(alist.first()); for (int i = 1; i < na - 1; ++i) formatted += ", " + alist.at(i); formatted += ", and " + alist.last(); return formatted; } }; #endif cb2bib-1.4.9/src/c2b/wordMatcher.cpp0000644000175000017500000000422112045520050017006 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "wordMatcher.h" #include "triads.h" #include "cb2bib_utilities.h" wordMatcher::wordMatcher() : _stretch(0), _hook(-1), _substring_count(0), _matched_length(-1), _p0(0), _pn(0) {} wordMatcher::wordMatcher(const QString& pattern, const Qt::CaseSensitivity cs) : _p0(0), _pn(0) { setPattern(pattern, cs); } void wordMatcher::setPattern(const QString& pattern, const Qt::CaseSensitivity cs) { _hook = -1; _matched_length = -1; const QStringList substrings(pattern.split(c2bUtils::nonLetter, QString::SkipEmptyParts)); if (substrings.count() == 0) return; _substring_count = substrings.count(); _substrings.resize(_substring_count); _lengths.resize(_substring_count); _sp0.resize(_substring_count); _stretch = 0; for (int i = 0; i < _substring_count; ++i) { _substrings[i] = QStringMatcher(substrings.at(i), cs); _lengths[i] = substrings.at(i).length(); if (_lengths.at(i) > 4) _stretch += 50; else _stretch += 10; } int lf(10000); for (int i = 0; i < _substring_count; ++i) { const int f(triads::textFrequency(substrings.at(i))); if (f < lf) { lf = f; _hook = i; } } } int wordMatcher::indexIn(const QString& str, const int from) const { _matched_length = -1; if (_hook == -1) { c2bUtils::warn(QObject::tr("Warning: Uninitialized wordMatcher")); return -1; } _p0 = from; if (_p0 < 0) _p0 = 0; _pn = str.length(); if (_pn == 0) return -1; int hp(_p0); int p(-1); while (p == -1) { hp = _index_in(_hook, str, hp); if (hp == -1) return -1; p = _index_around(str, hp); hp += _lengths.at(_hook); } return p; } cb2bib-1.4.9/src/c2b/bibSearcher.h0000644000175000017500000000610412045520050016407 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef BIBSEARCHER_H #define BIBSEARCHER_H #include "documentCache.h" #include "searchPattern.h" #include #include #include class bibParser; class bibReference; class bibSearcher : public QObject { Q_OBJECT public: bibSearcher(bibParser* bp, QObject* parento = 0); bibSearcher(bibParser* bp, const QString& bib_dir, QObject* parento = 0); inline ~bibSearcher() {} static QString searchDocumentKeyword(const QString& bibtexfn, const QString& documentfn, const QString& keyword); const QString highlight(const QString& abstract) const; void addPattern(bool Not, bool caseSensitive, const QString& patternType, const QString& scope, const QChar& yearScope, const QString& pattern); void clear(); void exec(); inline void setBoolean(bool AND) { _boolean_and = AND; } inline void setSearchScope(const QString& file, const QString& dir, bool all, bool documents) { _bibtex_file = file; _bibtex_dir = dir; _all_bibtex_files = all; _include_documents = documents; } inline void setSimplifySource(bool simplify) { _simplify_source = simplify; } inline int errorsCount() const { return _error_counter; } inline int hitsCount() const { return _hits_map.count(); } inline QString hitsString() const { return _hits_string; } inline QString hitValue(const QString& key) const { return _hits_map.value(key); } inline int patternsCount() const { return _patterns.count(); } inline int referencesCount() const { return _reference_counter; } inline QString logString() const { return _log_string; } public slots: void abort(); private: bibSearcher(); QList _patterns; QMap _hits_map; QString _bibtex_dir; QString _bibtex_file; QString _do_search_similar_citeid; QString _hits_string; QString _log_string; QStringList _scopes; bibParser* _bpP; bool _aborted; bool _all_bibtex_files; bool _boolean_and; bool _include_documents; bool _simplify_source; const QString excerpts(const QString& contents) const; const QString location(const QString& fn, const bibReference& ref) const; const bool _do_search_similar; documentCache _documents; int _bibtex_counter; int _document_counter; int _error_counter; int _reference_counter; void search(const QString& bib_file); void searchReference(const QString& bib_file, const bibReference& ref); void searchSimilarReferences(const QString& bib_file, const bibReference& ref); }; #endif cb2bib-1.4.9/src/c2b/bibPreparser.cpp0000644000175000017500000000450612045520050017155 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "bibPreparser.h" #include "cb2bib_utilities.h" #include "settings.h" #include bibPreparser::bibPreparser(QObject* parento) : QObject(parento) { settings* settingsP = settings::instance(); m_inp_file = settingsP->tempPath() + "/cb2bib_clipborad_inp.tmp_" + settingsP->applicationPid(); m_out_file = settingsP->tempPath() + "/cb2bib_clipborad_out.tmp_" + settingsP->applicationPid(); } void bibPreparser::preparse(const QString& text, QString* out_text) { out_text->clear(); if (!c2bUtils::stringToFile(text + '\n', m_inp_file)) { emit statusMessage(tr("Unable to open the file %1 for writing.").arg(m_inp_file)); return; } // External preparsing QStringList arguments; arguments.append(m_inp_file); arguments.append(m_out_file); QProcess preparser; preparser.start(settings::instance()->fileName("cb2Bib/PreparserBin"), arguments); if (!preparser.waitForFinished(2000)) { preparser.kill(); QFile ifile(m_inp_file); ifile.remove(); QFile ofile(m_out_file); ofile.remove(); emit statusMessage(tr("Failed to call %1.").arg(settings::instance()->fileName("cb2Bib/PreparserBin"))); return; } QFile ifile(m_inp_file); ifile.remove(); (*out_text) = c2bUtils::fileToString(m_out_file, true); if (out_text->isEmpty()) { emit statusMessage(tr("External Parsing ended. Input string remains unchanged.")); (*out_text) = text; } else emit statusMessage(tr("External Parsing ended.")); if (settings::instance()->value("cb2Bib/PreparserShowLog").toBool()) { QString log_string(QString::fromUtf8(preparser.readAllStandardOutput()) + '\n'); log_string += QString::fromUtf8(preparser.readAllStandardError()) + '\n'; log_string += QString("Input[\n%1\n]\n").arg(text); log_string += QString("Output[\n%1\n]\n").arg(*out_text); emit preparserLogAvailable(log_string); } } cb2bib-1.4.9/src/c2b/texParser.h0000644000175000017500000000367212045520050016162 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef TEXPARSER_H #define TEXPARSER_H #include #include /** Minimalist TeX parser */ class texParser { public: inline texParser() : _stop_parsing(false) {} inline virtual ~texParser() {} protected: virtual void parseComment(const QString& /* p */) {} virtual void parseElement(const QString& /* p */, const QString& /* e */, const QString& /* v */) {} virtual void parseEmptyLine() {} virtual void parseLaTeXMarkup(const QString& /* p */, const QString& /* e */) {} virtual void parseTextParagraph(const QString& /* p */) {} void parse(QString tex); inline void stop() { _stop_parsing = true; } private: QString _element; QString _line; QString _paragraph; QTextStream _stream; bool _stop_parsing; void doElement(); void gotoEnd(const QString& e); void gotoEndBraces(const QString& e); void gotoEndMacro(const QString& e); inline const QString& readLine(const bool trim = false) { if (trim) _line = _stream.readLine().trimmed(); else _line = _stream.readLine(); return _line; } inline void flushElement(const QString& e, const QString& v) { flush(); parseElement(_element, e, v); } inline void flushLaTeXMarkup(const QString& e) { _element = _line; flush(); parseLaTeXMarkup(_element, e); } inline void flush() { if (_paragraph.isEmpty()) return; parseTextParagraph(_paragraph.mid(1)); _paragraph.clear(); } }; #endif cb2bib-1.4.9/src/c2b/approximatePattern.h0000644000175000017500000000532612045520050020072 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * Class implementation of the approximate search algorithm * P. Constans. Approximate textual retrieval. arXiv:0705.0751v1, 2007. ***************************************************************************/ #ifndef APPROXIMATEPATTERN_H #define APPROXIMATEPATTERN_H #include "compositePattern.h" #include "substringMatcher.h" #define C2B_DEBUG_APPROXIMATEPATTERN 0 class approximatePattern : public compositePattern { public: approximatePattern(); approximatePattern(const QString& pattern, const Qt::CaseSensitivity cs); inline ~approximatePattern() {} void setPattern(const QString& pattern, const Qt::CaseSensitivity cs = Qt::CaseSensitive); inline bool matches(const QString& str) const { _matched_length = -1; if (str.length() == 0) return false; if (_is_multipattern) { for (int i = 0; i < _subpattern_count; ++i) if (_submatchers.at(i).indexIn(str) != -1) return true; return false; } else return _regexp.indexIn(str) != -1; } inline int indexIn(const QString& str, const int from = 0) const { _matched_length = -1; if (str.length() == 0) return -1; int index; if (_is_multipattern) { for (int i = 0; i < _subpattern_count; ++i) { _p0[i] = _submatchers.at(i).indexIn(str, from); _pn[i] = _p0.at(i) + _submatchers.at(i).matchedLength(); } mergeIndices(&index, str); } else { index = _regexp.indexIn(str, from); _matched_length = _regexp.matchedLength(); } return index; } inline const QVector& submatchers() const { return _submatchers; } private: const QStringList splitWord(const QString& word) const; int stretch(int piece_i, int piece_j) const; static QString wordPattern(const QString& word, Qt::CaseSensitivity cs); static int wordCount(const QString& str); static void splitPattern(const QString& p, QStringList* w, QList* ws, QList* we); void mergeIndices(int* index_in, const QString& str) const; void splitPattern(); QList _piece_ends; QList _piece_starts; QStringList _prefixes; QStringList _string_pieces; QStringList _suffixes; QVector _submatchers; }; #endif cb2bib-1.4.9/src/c2b/documentCache.h0000644000175000017500000000230312045520050016735 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef DOCUMENTCACHE_H #define DOCUMENTCACHE_H #include "documentContents.h" #include class settings; class documentCache { public: documentCache(); ~documentCache(); bool setCurrent(const QString& fn); bool setCurrent(const QString& fn, int* pdfCounter, QString* logString, int* errorCounter); void load(const QString& fn, const documentContents::Type type); void unload(); inline const documentContents& current() const { return _current; } inline const QHash& cacheData() const { return _cache; } private: QHash _cache; QString _cache_filename; QString _load_filename; documentContents _current; documentContents::Type _content_type; int _cache_load_size; settings* _settingsP; void save(); }; #endif cb2bib-1.4.9/src/c2b/wordPattern.h0000644000175000017500000000422212045520050016506 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef WORDPATTERN_H #define WORDPATTERN_H #include "compositePattern.h" #include class wordPattern : public compositePattern { public: enum Type {AllWords, AnyWord}; wordPattern(); wordPattern(const QString& pattern, const Type type, const Qt::CaseSensitivity cs); inline ~wordPattern() {} void setPattern(const QString& pattern, const Type type, const Qt::CaseSensitivity cs = Qt::CaseSensitive); inline bool matches(const QString& str) const { _matched_length = -1; if (str.length() == 0) return false; if (_type == AllWords) { for (int i = _subpattern_count - 1; i >= 0; --i) if (_submatchers.at(i).indexIn(str) == -1) return false; return true; } else { for (int i = 0; i < _subpattern_count; ++i) if (_submatchers.at(i).indexIn(str) != -1) return true; return false; } } inline int indexIn(const QString& str, const int from = 0) const { // Do not match. Get index for (w1|w2|...). _matched_length = -1; if (str.length() == 0) return -1; int index(str.length()); for (int i = 0; i < _subpattern_count; ++i) { const int p(_submatchers.at(i).indexIn(str, from)); if (p != -1 && p < index) { index = p; _matched_length = _substrings.at(i).length(); } } if (index == str.length()) index = -1; return index; } inline const QVector& submatchers() const { return _submatchers; } private: QVector _submatchers; Type _type; }; #endif cb2bib-1.4.9/src/c2b/c2blib.pro0000644000175000017500000000067412045517740015726 0ustar rusconirusconiLANGUAGE = C++ HEADERS += *.h qtregexp/*.h SOURCES += *.cpp qtregexp/*.cpp RESOURCES += c2blib.qrc DEFINES += C2B_USE_QMAKE INCLUDEPATH += . QT = core network win32 { TARGET = ../../c2b } else { TARGET = ../c2b } CONFIG -= dll CONFIG += staticlib VERSION = 0.0.0 TEMPLATE = lib QMAKE_CXXFLAGS_DEBUG += -DC2B_DEBUG CONFIG += use_lzo use_lzo { DEFINES += C2B_USE_LZO } disable_lzo { CONFIG -= use_lzo DEFINES -= C2B_USE_LZO } cb2bib-1.4.9/src/c2b/documentParser.h0000644000175000017500000000331412045520050017171 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef DOCUMENTPARSER_H #define DOCUMENTPARSER_H #include class documentParser { public: documentParser(const QString& text, const int maximum); ~documentParser(); bool parses(); inline QStringRef subsentence() const { return _text.midRef(_current_ssentence_origin, _current_ssentence_length); } inline int nlength() const { return _current_ssentence_length; } inline int nwords() const { return _current_nwords; } private: int nextWord(const int pos) const; inline static bool _is_letter(const QChar& c) { const ushort uc(c.unicode()); if ((uc > 96 && uc < 123) || uc == 95 || uc == 39) return true; else return c.isLetter(); } inline static bool _is_letter_or_number(const QChar& c) { const ushort uc(c.unicode()); if ((uc > 96 && uc < 123) || (uc > 47 && uc < 58) || uc == 95 || uc == 39) return true; else return c.isLetterOrNumber(); } bool _all_done; int _current_nwords; int _current_ssentence_length; int _current_ssentence_origin; int _nwords; int _position; int _ssentence_origin; const QChar _space; const QString _text; const int _maximum_words; const int _minimum_words; const int _text_length; }; #endif cb2bib-1.4.9/src/c2b/wordMatcher.h0000644000175000017500000000472512045520050016464 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef WORDMATCHER_H #define WORDMATCHER_H #include #include class wordMatcher { public: wordMatcher(); wordMatcher(const QString& pattern, const Qt::CaseSensitivity cs = Qt::CaseSensitive); inline ~wordMatcher() {} int indexIn(const QString& str, const int from = 0) const; void setPattern(const QString& pattern, const Qt::CaseSensitivity cs); inline int matchedLength() const { return _matched_length; } private: inline int _index_in(const int& s, const QString& str, const int& p0) const { return _substrings.at(s).indexIn(str, p0); } inline int _index_in(const int& s, const QString& str, const int& p0, const int& pn) const { if (p0 >= pn) return -1; #if QT_VERSION >= 0x040500 return _substrings.at(s).indexIn(str.unicode(), std::min(_pn, pn), p0); #else const QString substr(QString::fromRawData(str.unicode(), std::min(_pn, pn))); return _substrings.at(s).indexIn(substr, p0); #endif } inline int _index_around(const QString& str, const int phook) const { _sp0.fill(-1); _sp0[_hook] = phook; const int bp0 = std::max(_p0, phook - _stretch); const int bpn = std::min(_pn, phook + _stretch); for (int i = 0; i < _substring_count; ++i) if (_sp0.at(i) == -1) { const int p0(_index_in(i, str, bp0, bpn)); if (p0 == -1) return -1; _sp0[i] = p0; } int bp(_pn); int fp(_p0); for (int i = 0; i < _substring_count; ++i) { const int p0 = _sp0.at(i); if (bp > p0) bp = p0; const int pn = p0 + _lengths.at(i); if (fp < pn) fp = pn; } _matched_length = fp - bp; return bp; } QVector _substrings; QVector _lengths; int _stretch; int _hook; int _substring_count; mutable QVector _sp0; mutable int _matched_length; mutable int _p0; mutable int _pn; }; #endif cb2bib-1.4.9/src/c2b/heuristicBibParser.h0000644000175000017500000000626512045520050017777 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef HEURISTICBIBPARSER_H #define HEURISTICBIBPARSER_H #include "authorString.h" #include "bibReference.h" class EQRegExp; class bibParser; class journalDB; /** bibParser helper class for heuristic recognition @author Pere Constans */ class heuristicBibParser { public: heuristicBibParser(bibParser* bp); ~heuristicBibParser(); void guessFields(const QString& clean_text, const QString& tagged_text); void heuristicFields(const QString& text); private: EQRegExp* _author_b2_lc_rx; EQRegExp* _author_b2_uc_rx; EQRegExp* _author_b3_lc_rx; EQRegExp* _author_b3_uc_rx; EQRegExp* _author_b4_lc_rx; EQRegExp* _author_b4_uc_rx; EQRegExp* _author_b5_lc_rx; EQRegExp* _author_b5_uc_rx; QRegExp _author_sb; QRegExp _author_sb_lc; QRegExp _author_sb_uc; QRegExp _hyphens; QRegExp _leading_non_letters; QString _hyphen_nums; QString _hyphen_pages; QString guessAuthor_multi_block(); QString guessAuthor_single_block(); QStringList _word_prefix_lexicon; author::encoder _aencoder; bibParser* _bpP; bibReference& _current_reference; bool _reliable_number; bool _reliable_pages; bool _reliable_volume; const QString _abstract; const QString _addauthors; const QString _author; const QString _isbn; const QString _keywords; const QString _number; const QString _pages; const QString _title; const QString _volume; const QString _year; const QStringList& _bibliographic_fields; const journalDB& _journal_db; int _max_year; static int authorCount(const QString& authors); void guessAbstract(const QString& text); void guessAuthor(const QString& tagged_text); void guessFromMetadata(const QString& text); void guessISBN(const QString& text); void guessJournal(const QString& text); void guessKeywords(const QString& text); void guessNumber(const QString& text); void guessPages(const QString& text); void guessTitle(const QString& text); void guessVolume(const QString& text); void guessVolumePagesYear(const QString& text); void guessVolumeYearPages(const QString& text); void guessYear(const QString& text); void guessYearVolumePages(const QString& text); inline void _debug_guess(const QString& #ifdef C2B_DEBUG_HEURISTICBIBPARSER procedure #endif ) const { #ifdef C2B_DEBUG_HEURISTICBIBPARSER qDebug() << "[cb2bib] " << procedure; for (int i = 0; i < _bibliographic_fields.count(); ++i) { if (!_current_reference.value(_bibliographic_fields.at(i)).isEmpty()) qDebug() << QString(" %1: '%2'").arg(_bibliographic_fields.at(i)) .arg(_current_reference.value(_bibliographic_fields.at(i))); } #endif } }; #endif cb2bib-1.4.9/src/c2b/compositePattern.cpp0000644000175000017500000000423712045520050020076 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "compositePattern.h" #include "cb2bib_utilities.h" template class descending { public: descending(const T& data) : _data(data) {} inline bool operator()(const int i, const int j) { return _data.at(i) > _data.at(j); } private: const T& _data; }; compositePattern::compositePattern() : _case_sensitivity(Qt::CaseSensitive), _is_multipattern(false), _subpattern_count(0), _matched_length(-1) { _regexp.setCaseSensitivity(Qt::CaseSensitive); // Setting _regexp case sensitive for efficiency _regexp.setMinimal(false); _regexp.setPatternSyntax(QRegExp::RegExp2); } compositePattern::compositePattern(const QString& pattern, const Qt::CaseSensitivity cs) : _string(pattern.simplified()), _case_sensitivity(cs), _is_multipattern(false), _subpattern_count(0), _matched_length(-1) { _regexp.setCaseSensitivity(Qt::CaseSensitive); // Setting _regexp case sensitive for efficiency _regexp.setMinimal(false); _regexp.setPatternSyntax(QRegExp::RegExp2); } QString compositePattern::escape(const QString& str, const Qt::CaseSensitivity cs) { if (cs == Qt::CaseSensitive) return QRegExp::escape(str); QString scaped; for (int i = 0; i < str.length(); ++i) if (str.at(i).isLetter()) scaped += QString("[%1%2]").arg(str.at(i).toUpper()).arg(str.at(i).toLower()); else scaped += QRegExp::escape(str.at(i)); return scaped; } void compositePattern::set_sort_index() { Q_ASSERT_X(_ranks.count() == _subpattern_count, "compositePattern", "Mismatch in subexpression initialization"); _index.resize(_subpattern_count); for (int i = 0; i < _subpattern_count; ++i) _index[i] = i; descending< QList > sort(_ranks); qSort(_index.begin(), _index.end(), sort); } cb2bib-1.4.9/src/c2b/networkQuery.h0000644000175000017500000000537212045520050016723 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef NETWORKQUERY_H #define NETWORKQUERY_H #include #include class bibParser; class bibReference; class network; class settings; /** cb2Bib Network Queries @author Pere Constans */ class networkQuery : public QObject { Q_OBJECT public: networkQuery(bibParser* bp, QObject* parento = 0); networkQuery(bibParser* bp, network* net, QObject* parento = 0); inline virtual ~networkQuery() {} void submitQuery(const bibReference& reference, const QString& raw_reference, const bool check_document); inline QString errorString() const { return _error_string; } inline network* networkPtr() const { return _networkP; } signals: void queryEnded(bool succeeded, const QString& targetPDF, const QString& targetBib); void statusMessage(const QString& ms); protected: virtual bool checkQueryFile(const QString& fn) const; virtual inline QString fromHtmlString(const QString& str, const bool /* addMetadata */ = false) const { // Note: fromHtmlString in c2bUtils uses QTextDocument to perform HTML to text // conversions. c2bUtils::fromHtmlString is not set in the c2blib because GUI classes // are excluded from the core library. return str; } virtual bool openFile(const QString& /* fn */) const { // Reimplement to open files in GUI mode return false; } private: QList _query_parameter_count; QString _Qauthor; QString _Qdoi; QString _Qexcerpt; QString _Qjournal; QString _QjournalCode; QString _Qpage; QString _Qtitle; QString _Qvolume; QString _action; QString _captionQ; QString _error_string; QString _networkquery_tmp_fn1; QString _networkquery_tmp_fn2; QString _pdfurl_prefix; QString _pdfurl_sufix; QString _referenceurl_prefix; QString _referenceurl_sufix; QString _targetBib; QString _targetPDF; QString _targetQ; bibParser* _bpP; bool _check_document; bool _is_end_of_file; const QString encodeUrl(const QString& url) const; network* _networkP; settings* _settingsP; void init(); private slots: bool areQueryParametersValid(); bool setQueryParameters(); void queryDone(bool succeeded); void submitQuery1(); void submitQuery2(bool succeeded); void submitQuery3(bool succeeded); void updateQueryPlaceholders(); }; #endif cb2bib-1.4.9/src/c2b/monthDB.h0000644000175000017500000000154012045520050015530 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef MONTHDB_H #define MONTHDB_H #include #include /** Post processing of tag 'month' @author Pere Constans */ class monthDB { public: monthDB(); inline ~monthDB() {} QString retrieve(const QString& month_query); private: QRegExp _day_rx; QRegExp _month_rx; QString abbreviated(const QString& month) const; QString full(const QString& month) const; const QStringList _month_abbreviated; const QStringList _month_full; }; #endif cb2bib-1.4.9/src/c2b/documentContents.h0000644000175000017500000000402712045520050017534 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef DOCUMENTCONTENTS_H #define DOCUMENTCONTENTS_H #include "cb2bib_utilities.h" #include #include class documentContents { public: enum Type {Simplified, Raw}; inline const QString& signature() const { if (!_is_signature_loaded) { _signature = QString::fromUtf8(_cache.value(_signature_key)); _is_signature_loaded = true; } return _signature; } inline const QString& text() const { if (!_is_text_loaded) { if (_type == Simplified) _text = c2bUtils::toAscii(c2bUtils::fromUtf8(c2bUtils::uncompress(_cache.value(_text_key))), c2bUtils::KeepWords); else _text = c2bUtils::fromUtf8(c2bUtils::uncompress(_cache.value(_text_key))); _is_text_loaded = true; } return _text; } private: inline documentContents(const QHash& cache) : _cache(cache) {} inline ~documentContents() {} inline void clear() { _is_signature_loaded = false; _is_text_loaded = false; _signature.clear(); _signature_key.clear(); _text.clear(); _text_key.clear(); } inline void preload(const QString& skey, const QString& tkey, const Type type) { clear(); _signature_key = skey; _text_key = tkey; _type = type; } QString _signature_key; QString _text_key; Type _type; const QHash& _cache; mutable QString _signature; mutable QString _text; mutable bool _is_signature_loaded; mutable bool _is_text_loaded; friend class documentCache; }; #endif cb2bib-1.4.9/src/c2b/collectionAnalyzer.cpp0000644000175000017500000002171612045520050020400 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "collectionAnalyzer.h" #include "settings.h" #include #include template class lengthsorting { public: lengthsorting(const T& data) : _data(data) {} inline bool operator()(const int i, const int j) { const int ni(_data[i].length()); const int nj(_data[j].length()); if (ni == nj) return _data[i] < _data[j]; else return ni < nj; } private: const T& _data; }; // Template double_sort was adapted from qSortHelper by Pere Constans. // qSortHelper is copyrighted by: // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies), // and released under GLP/LGPL license. // http://www.qt.gitorious.org/qt/qt/blobs/4.7/src/corelib/tools/qalgorithms.h template void double_sort(int start, int end, T1* v1, T2* v2) { top: int span = end - start; if (span < 2) return; --end; int low = start; int high = end - 1; int pivot = start + span / 2; if ((*v1)[end] > (*v1)[start]) { qSwap((*v1)[end], (*v1)[start]); qSwap((*v2)[end], (*v2)[start]); } if (span == 2) return; if ((*v1)[pivot] > (*v1)[start]) { qSwap((*v1)[pivot], (*v1)[start]); qSwap((*v2)[pivot], (*v2)[start]); } if ((*v1)[end] > (*v1)[pivot]) { qSwap((*v1)[end], (*v1)[pivot]); qSwap((*v2)[end], (*v2)[pivot]); } if (span == 3) return; qSwap((*v1)[pivot], (*v1)[end]); qSwap((*v2)[pivot], (*v2)[end]); while (low < high) { while (low < high && (*v1)[low] > (*v1)[end]) ++low; while (high > low && (*v1)[end] > (*v1)[high]) --high; if (low < high) { qSwap((*v1)[low], (*v1)[high]); qSwap((*v2)[low], (*v2)[high]); ++low; --high; } else break; } if ((*v1)[low] > (*v1)[end]) ++low; qSwap((*v1)[end], (*v1)[low]); qSwap((*v2)[end], (*v2)[low]); double_sort(start, low, v1, v2); start = low + 1; ++end; goto top; } collectionAnalyzer::collectionAnalyzer() : _ndocuments(0), _nsentences(0), _nsimilar(0), _settingsP(settings::instance()) {} void collectionAnalyzer::reload() { _ndocuments = 0; _nsentences = 0; _nsimilar = 0; _document_keyword.clear(); _keyword_document_fn.clear(); _similar_document_fn.clear(); const QString cache_dir(_settingsP->fileName("cb2Bib/CacheDirectory")); _documentslf_fn = QDir::cleanPath(cache_dir + "/documents.lc2b"); QFile documentslf(_documentslf_fn); if (documentslf.open(QIODevice::ReadOnly)) { QDataStream stream(&documentslf); stream >> _ndocuments; _documents.resize(_ndocuments); for (int i = 0; i < _ndocuments; ++i) stream >> _documents[i]; documentslf.close(); } _similar.resize(_ndocuments); _similarity.resize(_ndocuments); _sentenceslf_fn = QDir::cleanPath(cache_dir + "/sentences.lc2b"); QFile sentenceslf(_sentenceslf_fn); if (sentenceslf.open(QIODevice::ReadOnly)) { QDataStream stream(&sentenceslf); stream >> _nsentences; _sentences.resize(_nsentences); for (int i = 0; i < _nsentences; ++i) stream >> _sentences[i]; sentenceslf.close(); } _documentsif_fn = QDir::cleanPath(cache_dir + "/documents.ic2b"); QFile documentsif(_documentsif_fn); if (documentsif.open(QIODevice::ReadOnly)) { QDataStream stream(&documentsif); _document_norms.resize(_ndocuments); int ns; int ss; for (int d = 0; d < _ndocuments; ++d) { stream >> ns; _document_norms[d] = ns; for (int s = 0; s < ns; ++s) stream >> ss; } documentsif.close(); } _sentencesif_fn = QDir::cleanPath(cache_dir + "/sentences.ic2b"); } void collectionAnalyzer::setDocumentKeywords(const QString& documentfn) { if (documentfn == _keyword_document_fn) return; _keyword_document_fn = documentfn; _document_keyword_ids.clear(); QVector dsentences; grepDocuments(documentfn, &dsentences); const int ndsentences(dsentences.size()); if (ndsentences == 0) return; lengthsorting< QVarLengthArray > ls(_sentences); qSort(dsentences.begin(), dsentences.end(), ls); for (int i = 0; i < ndsentences; ++i) { const QString& si(_sentences[dsentences.at(i)]); bool redundant(false); for (int j = i + 1; j < ndsentences; ++j) if (_sentences[dsentences.at(j)].contains(si)) { redundant = true; break; } if (!redundant) _document_keyword_ids.append(dsentences.at(i)); } qSort(_document_keyword_ids); } void collectionAnalyzer::setKeywordDocuments(const QString& keyword) { if (keyword == _document_keyword) return; _document_keyword = keyword; grepSentences(keyword, &_sdocuments); } void collectionAnalyzer::setSimilarDocuments(const QString& documentfn) { if (documentfn == _similar_document_fn) return; _similar_document_fn = documentfn; _nsimilar = 0; QVector dsentences; grepDocuments(documentfn, &dsentences); const int ndsentences(dsentences.size()); if (ndsentences == 0) return; QVarLengthArray overlaps(_ndocuments); for (int i = 0; i < _ndocuments; ++i) overlaps[i] = 0; QFile sentencesif(_sentencesif_fn); if (sentencesif.open(QIODevice::ReadOnly)) { QDataStream stream(&sentencesif); int nd; int dd; int s0(0); for (int i = 0; i < ndsentences; ++i) { const int sentenceid(dsentences[i]); for (int s = s0; s < sentenceid; ++s) { stream >> nd; for (int d = 0; d < nd; ++d) stream >> dd; } stream >> nd; for (int d = 0; d < nd; ++d) { stream >> dd; overlaps[dd] += 1; } s0 = sentenceid + 1; } sentencesif.close(); } const int documentid(_document_id(documentfn)); for (int i = 0; i < _ndocuments; ++i) { const int o(overlaps[i]); if (o == 0) continue; const double s(double(o) / sqrt(double(_document_norms[documentid] * _document_norms[i]))); if (s < 0.051) continue; _similarity[_nsimilar] = s; _similar[_nsimilar++] = i; } double_sort(0, _nsimilar, &_similarity, &_similar); } void collectionAnalyzer::skipSimilarDocument(const int i) { --_nsimilar; for (int j = i; j < _nsimilar; ++j) _similarity[j] = _similarity[j+1]; for (int j = i; j < _nsimilar; ++j) _similarity[j] = _similarity[j+1]; } void collectionAnalyzer::grepDocuments(const QString& documentfn, QVector* dsentences) const { dsentences->clear(); const int documentid(_document_id(documentfn)); if (documentid == -1) return; QFile documentsif(_documentsif_fn); if (documentsif.open(QIODevice::ReadOnly)) { QDataStream stream(&documentsif); int ns; int ss; for (int d = 0; d < documentid; ++d) { stream >> ns; for (int s = 0; s < ns; ++s) stream >> ss; } stream >> ns; dsentences->resize(ns); for (int s = 0; s < ns; ++s) stream >> (*dsentences)[s]; documentsif.close(); } } void collectionAnalyzer::grepSentences(const QString& keyword, QVarLengthArray* sdocuments) const { sdocuments->clear(); const int sentenceid(_sentence_id(keyword)); if (sentenceid == -1) return; QFile sentencesif(_sentencesif_fn); if (sentencesif.open(QIODevice::ReadOnly)) { QDataStream stream(&sentencesif); int nd; int dd; for (int s = 0; s < sentenceid; ++s) { stream >> nd; for (int d = 0; d < nd; ++d) stream >> dd; } stream >> nd; sdocuments->resize(nd); for (int d = 0; d < nd; ++d) stream >> (*sdocuments)[d]; sentencesif.close(); } } int collectionAnalyzer::_document_id(const QString& documentfn) const { for (int i = 0; i < _ndocuments; ++i) if (_documents[i] == documentfn) return i; return -1; } int collectionAnalyzer::_sentence_id(const QString& keyword) const { for (int i = 0; i < _nsentences; ++i) if (_sentences[i] == keyword) return i; return -1; } cb2bib-1.4.9/src/c2b/networkQuery.cpp0000644000175000017500000003464012045520050017256 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "networkQuery.h" #include "bibParser.h" #include "cb2bib_utilities.h" #include "network.h" #include "settings.h" #include networkQuery::networkQuery(bibParser* bp, QObject* parento) : QObject(parento), _bpP(bp) { Q_ASSERT_X(_bpP, "networkQuery", "bibParser was not instantiated"); _networkP = new network(this); init(); } networkQuery::networkQuery(bibParser* bp, network* net, QObject* parento) : QObject(parento), _bpP(bp), _networkP(net) { Q_ASSERT_X(_bpP, "networkQuery", "bibParser was not instantiated"); Q_ASSERT_X(_networkP, "networkQuery", "network was not instantiated"); init(); } void networkQuery::init() { _settingsP = settings::instance(); _settingsP->setValue("networkQuery/isSupervised", true); _networkquery_tmp_fn1 = _settingsP->tempPath() + "/cb2bib_query_tmp_html1_" + _settingsP->applicationPid(); _networkquery_tmp_fn2 = _settingsP->tempPath() + "/cb2bib_query_tmp_html2_" + _settingsP->applicationPid(); } void networkQuery::submitQuery(const bibReference& reference, const QString& raw_reference, const bool check_document) { // Submission Initialization _error_string.clear(); _query_parameter_count.clear(); _is_end_of_file = false; _check_document = check_document && _settingsP->value("cb2Bib/AutomaticPdfDownload").toBool(); // Query data _Qtitle = reference.value("title"); _Qjournal = _bpP->fullJournal(reference.value("journal")); _Qvolume = reference.value("volume"); _Qpage = c2bUtils::firstPage(reference.value("pages")); _Qdoi = reference.value("doi").trimmed(); if (!_Qdoi.isEmpty() && !_Qdoi.contains(QRegExp("^10\\.[\\d\\.]+/\\S+$"))) { _Qdoi.clear(); c2bUtils::warn(tr("Warning: DOI skipped: '%1' is not a valid DOI").arg(_Qdoi)); } _Qauthor = reference.value("author"); _Qauthor.replace(QRegExp("(?:\\b\\w\\b|\\band\\b|\\W)"), " "); _Qauthor = c2bUtils::simplifyString(_Qauthor); _Qexcerpt = _bpP->excerpt(raw_reference, QStringList() << _Qdoi << _Qauthor << _Qtitle); submitQuery1(); } void networkQuery::submitQuery1() { // Submission, first step, setting journal codes if (!setQueryParameters()) { _error_string = tr("No data for query."); emit queryEnded(false, _targetQ, _networkquery_tmp_fn1); return; } if (_is_end_of_file) { if (_networkP->errorString().isEmpty()) _error_string = tr("Performed %1 queries: No reference found.").arg(_query_parameter_count.count()); else _error_string = tr("Performed %1 queries: No reference found. %2").arg(_query_parameter_count.count()).arg(_networkP->errorString()); emit queryEnded(false, _targetQ, _networkquery_tmp_fn1); return; } c2bUtils::debug(tr("Query Number = %1").arg(_query_parameter_count.count())); c2bUtils::debug(tr("targetQ[%1]").arg(_targetQ)); c2bUtils::debug(tr("captionQ[%1]").arg(_captionQ)); c2bUtils::debug(tr("referenceurl_prefix[%1]").arg(_referenceurl_prefix)); c2bUtils::debug(tr("referenceurl_sufix[%1]").arg(_referenceurl_sufix)); c2bUtils::debug(tr("pdfurl_prefix[%1]").arg(_pdfurl_prefix)); c2bUtils::debug(tr("pdfurl_sufix[%1]").arg(_pdfurl_sufix)); c2bUtils::debug(tr("action[%1]").arg(_action)); c2bUtils::debug(tr("POST1[%1]").arg(_targetQ)); if (_action == "browse_query") { if (openFile(encodeUrl(_targetQ))) { _error_string = tr("Browsing query."); emit queryEnded(true, QString(), QString()); } else { _error_string = tr("Could not open URL '%1'.").arg(encodeUrl(_targetQ)); emit queryEnded(false, QString(), QString()); } return; } if (_action == "htm2txt_query") emit statusMessage(tr("Importing: %1.").arg(_targetQ)); else emit statusMessage(tr("Query: %1.").arg(_targetQ)); _networkP->getFile(_targetQ, _networkquery_tmp_fn1, network::Copy, this, SLOT(submitQuery2(bool)), !_settingsP->value("cb2Bib/KeepTmpNQFiles").toBool()); } void networkQuery::submitQuery2(bool succeeded) { // Submission, second part: check query replay and PDF existence if (!succeeded) { _error_string = _networkP->errorString(); emit statusMessage(tr("Query failed with %1.").arg(_error_string)); QTimer::singleShot(10, this, SLOT(submitQuery1())); return; } QString lines(c2bUtils::fileToString(_networkquery_tmp_fn1, !_settingsP->value("cb2Bib/KeepTmpNQFiles").toBool())); if (_action == "htm2txt_query") { _error_string = tr("Importing query URL."); emit queryEnded(true, QString(), fromHtmlString(lines, true)); return; } QRegExp rx(_captionQ); rx.setMinimal(true); if (!rx.isValid()) c2bUtils::warn(tr("Warning: RegExp '%1' is not valid").arg(_captionQ)); const int ncap(rx.indexIn(lines)); if (ncap > -1) lines = fromHtmlString(rx.cap(1)); else { QTimer::singleShot(10, this, SLOT(submitQuery1())); return; } c2bUtils::debug(tr("CAPTURED[%1]").arg(lines)); _targetBib = _referenceurl_prefix + lines + _referenceurl_sufix; if (_check_document && !_pdfurl_prefix.isEmpty()) { _targetPDF = _pdfurl_prefix + lines + _pdfurl_sufix; emit statusMessage(tr("Checking: %1.").arg(_targetPDF)); _networkP->headFile(_targetPDF, this, SLOT(submitQuery3(bool))); } else submitQuery3(false); } void networkQuery::submitQuery3(bool succeeded) { // Submission, third part: extracting reference location if (!succeeded || !_networkP->mimetypeString().contains(QRegExp("\\b(chm|djvu|pdf|ps)\\b"))) _targetPDF.clear(); else _targetPDF = _networkP->sourceFilename(); c2bUtils::debug(tr("POST2[%1]").arg(_targetBib)); c2bUtils::debug(tr("POST3[%1]").arg(_targetPDF)); if (_action == "browse_referenceurl") { if (openFile(encodeUrl(_targetBib))) { _error_string = tr("Browsing reference."); emit queryEnded(true, QString(), QString()); } else { _error_string = tr("Could not open URL '%1'.").arg(encodeUrl(_targetBib)); emit queryEnded(false, QString(), QString()); } return; } if (_action == "htm2txt_referenceurl") emit statusMessage(tr("Importing: %1.").arg(_targetBib)); else emit statusMessage(tr("Retrieving: %1.").arg(_targetBib)); _networkP->getFile(_targetBib, _networkquery_tmp_fn2, network::Copy, this, SLOT(queryDone(bool)), !_settingsP->value("cb2Bib/KeepTmpNQFiles").toBool()); } void networkQuery::queryDone(bool succeeded) { // Submission Done if (!succeeded) { _error_string = _networkP->errorString(); emit queryEnded(false, _targetBib, _networkquery_tmp_fn2); return; } QString lines(c2bUtils::fileToString(_networkquery_tmp_fn2, !_settingsP->value("cb2Bib/KeepTmpNQFiles").toBool())); if (_action == "htm2txt_referenceurl") { _error_string = tr("Importing reference URL."); emit queryEnded(true, _targetPDF, fromHtmlString(lines, true)); return; } if (_targetBib.contains("MEDLINE")) { QRegExp med_rx; med_rx.setMinimal(true); med_rx.setPattern("^.+\"pre_replace\">(.+)<.+$"); lines.replace(med_rx, "\\1"); lines.replace("", "_NEW_LINE_"); med_rx.setPattern("<.+>"); lines.replace(med_rx, " "); lines = fromHtmlString(lines); // Convert to unicode the text-related HTML tags in Pubmed, keep lines lines.replace("_NEW_LINE_", "\n"); } _targetBib = lines.trimmed(); emit queryEnded(true, _targetPDF, _targetBib); } bool networkQuery::setQueryParameters() { if (!checkQueryFile(_settingsP->fileName("cb2Bib/NetworkFile"))) return false; QFile file(_settingsP->fileName("cb2Bib/NetworkFile")); file.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); QRegExp Journal("journal=" + _Qjournal + "\\|"); QRegExp AnyJournal("journal=\\s*$"); uint readQueryParams(0); _is_end_of_file = false; QString line; while (!stream.atEnd()) { line = stream.readLine(); // Skip comments and blanks if (!(line.isEmpty() || line.contains(QRegExp("^#")))) { if (line.contains(Journal)) { const QStringList lc(line.split('|')); if (lc.count() > 1) _QjournalCode = lc.at(1); else _QjournalCode.clear(); } else if (line.contains(AnyJournal)) _QjournalCode = _Qjournal; // Get appropiate parameters for Journal or AnyJournal if (line.contains(Journal) || line.contains(AnyJournal)) { // Skip if already performed if (!_query_parameter_count.contains(++readQueryParams)) { while (line.contains(QRegExp("^journal="))) line = stream.readLine(); _targetQ = line.remove(QRegExp("^query=")); line = stream.readLine(); _captionQ = line.remove(QRegExp("^capture_from_query=")); line = stream.readLine(); _referenceurl_prefix = line.remove(QRegExp("^referenceurl_prefix=")); line = stream.readLine(); _referenceurl_sufix = line.remove(QRegExp("^referenceurl_sufix=")); line = stream.readLine(); _pdfurl_prefix = line.remove(QRegExp("^pdfurl_prefix=")); line = stream.readLine(); _pdfurl_sufix = line.remove(QRegExp("^pdfurl_sufix=")); line = stream.readLine(); _action = line.remove(QRegExp("^action=")); // Setting Query Parameters updateQueryPlaceholders(); // Finally, check for unresolved cb2Bib tags if (areQueryParametersValid()) { _query_parameter_count.append(readQueryParams); return true; } } } } } file.close(); _is_end_of_file = true; return (!_query_parameter_count.isEmpty()); } void networkQuery::updateQueryPlaceholders() { if (!_Qtitle.isEmpty()) { _targetQ.replace("<>", _Qtitle); _captionQ.replace("<<title>>", _Qtitle); _referenceurl_prefix.replace("<<title>>", _Qtitle); _referenceurl_sufix.replace("<<title>>", _Qtitle); _pdfurl_prefix.replace("<<title>>", _Qtitle); _pdfurl_sufix.replace("<<title>>", _Qtitle); } if (!_QjournalCode.isEmpty()) { _QjournalCode.replace(" & ", " and "); // Avoid sending '&' to confuse the URL _targetQ.replace("<<journal>>", _QjournalCode); _captionQ.replace("<<journal>>", _QjournalCode); _referenceurl_prefix.replace("<<journal>>", _QjournalCode); _referenceurl_sufix.replace("<<journal>>", _QjournalCode); _pdfurl_prefix.replace("<<journal>>", _QjournalCode); _pdfurl_sufix.replace("<<journal>>", _QjournalCode); } if (!_Qpage.isEmpty()) { _targetQ.replace("<<pages>>", _Qpage); _captionQ.replace("<<pages>>", _Qpage); _referenceurl_prefix.replace("<<pages>>", _Qpage); _referenceurl_sufix.replace("<<pages>>", _Qpage); _pdfurl_prefix.replace("<<pages>>", _Qpage); _pdfurl_sufix.replace("<<pages>>", _Qpage); } if (!_Qvolume.isEmpty()) { _targetQ.replace("<<volume>>", _Qvolume); _captionQ.replace("<<volume>>", _Qvolume); _referenceurl_prefix.replace("<<volume>>", _Qvolume); _referenceurl_sufix.replace("<<volume>>", _Qvolume); _pdfurl_prefix.replace("<<volume>>", _Qvolume); _pdfurl_sufix.replace("<<volume>>", _Qvolume); } if (!_Qdoi.isEmpty()) { _targetQ.replace("<<doi>>", _Qdoi); _captionQ.replace("<<doi>>", _Qdoi); _referenceurl_prefix.replace("<<doi>>", _Qdoi); _referenceurl_sufix.replace("<<doi>>", _Qdoi); _pdfurl_prefix.replace("<<doi>>", _Qdoi); _pdfurl_sufix.replace("<<doi>>", _Qdoi); } if (!_Qexcerpt.isEmpty()) { _targetQ.replace("<<excerpt>>", _Qexcerpt); _captionQ.replace("<<excerpt>>", _Qexcerpt); _referenceurl_prefix.replace("<<excerpt>>", _Qexcerpt); _referenceurl_sufix.replace("<<excerpt>>", _Qexcerpt); _pdfurl_prefix.replace("<<excerpt>>", _Qexcerpt); _pdfurl_sufix.replace("<<excerpt>>", _Qexcerpt); } } bool networkQuery::areQueryParametersValid() { if (!_action.isEmpty()) { if (_action == "browse_query" || _action == "browse_referenceurl") { if (!_settingsP->value("networkQuery/isSupervised").toBool()) return false; } else if (!(_action == "htm2txt_query" || _action == "htm2txt_referenceurl")) return false; } const QString allParams(_targetQ + _captionQ + _referenceurl_prefix + _referenceurl_sufix + _pdfurl_prefix + _pdfurl_sufix); return !(allParams.contains(QRegExp("(?:<<title>>|<<journal>>|<<pages>>|<<volume>>|<<doi>>|<<excerpt>>)"))); } const QString networkQuery::encodeUrl(const QString& url) const { // Removes <<post>> tag if present and encodes URL to percent encoding QString encoded_url(url); encoded_url.remove(QRegExp("^<<post>>")); encoded_url = QUrl::toPercentEncoding(encoded_url, "+:/?=&\\"); return encoded_url; } bool networkQuery::checkQueryFile(const QString& fn) const { if (fn.isEmpty()) { c2bUtils::warn(tr("No network query file especified")); return false; } QFileInfo fi(fn); if (!fi.exists() || !fi.isReadable()) { c2bUtils::warn(tr("Could not open network query file %1 for reading").arg(fn)); return false; } return true; } ������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/searchPattern.h����������������������������������������������������������������0000644�0001750�0001750�00000011323�12045520050�017000� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef SEARCHPATTERN_H #define SEARCHPATTERN_H #include "approximatePattern.h" #include "documentContents.h" #include "wordMatcher.h" #include "wordPattern.h" #include <QRegExp> #include <QList> class searchPattern { public: searchPattern(const QString& pattern, const QString& patternType); searchPattern(const bool NOT, const bool caseSensitive, const QString& patternType, const QString& scope, const QChar& yearScope, const QString& pattern); inline ~searchPattern() {} enum Type {ApproximateString = 1, FixedStringAllWords = 2, FixedStringAnyWord = 3, FixedStringContext = 4, FixedString = 5, RegularExpression = 6, Wildcard = 7 }; static const QString type(const Type t); static const QStringList types(); struct modifiers { QChar yearScope; QString scope; QString string; bool NOT; }; inline const modifiers& modifier() const { return _modifier; } inline bool matches(const QString& contents) const { return _matcher.match(contents); } inline bool matches(const documentContents& contents) const { return _matcher.match(contents); } inline int indexIn(const QString& contents, const int from) const { return _matcher.index(contents, from); } inline int indexIn(const documentContents& contents, const int from) const { return _matcher.index(contents.text(), from); } inline int matchedLength() const { return _matcher.length; } inline const QString toString() const { return _formatted_string; } inline bool operator< (const searchPattern& p) const { return (_rank < p._rank); } private: struct matcher { matcher(const QString& pattern, const Type t, const Qt::CaseSensitivity cs); QRegExp regexp; QString signature; QStringMatcher strexp; QVector<QString> subsignatures; Type type; approximatePattern appexp; mutable int length; wordMatcher cwordexp; wordPattern wordexp; bool match(const QString& contents) const; bool match(const documentContents& contents) const; int index(const QString& contents, const int from) const; inline static bool _match_signature(const QString& ps, const QString& cs) { const int pl(ps.length()); // Always pl > 0 const int cl(cs.length()); const ushort* ups = (const ushort*) ps.unicode(); const ushort* p = ups; const ushort* pn = ups + pl; const ushort* ucs = (const ushort*) cs.unicode(); const ushort* c = ucs - 1; const ushort* cn = ucs + cl; while (++c != cn) if (*c == *p) if (++p == pn) return true; return false; } template <typename T> inline static bool _match(const T& submatcher, const QString& psignature, const documentContents& contents) { // Skip signature check for patterns that do not define it if (psignature.length() == 0 || _match_signature(psignature, contents.signature())) return submatcher.indexIn(contents.text()) != -1; else return false; } template <typename T> inline bool _match_all(const int n, const T& submatchers, const documentContents& contents) const { for (int i = n - 1; i >= 0; --i) if (!_match(submatchers.at(i), subsignatures.at(i), contents)) return false; return true; } template <typename T> inline bool _match_any(const int n, const T& submatchers, const documentContents& contents) const { for (int i = 0; i < n; ++i) if (_match(submatchers.at(i), subsignatures.at(i), contents)) return true; return false; } }; QString _formatted_string; int _rank; matcher _matcher; modifiers _modifier; static const QMap<QString, searchPattern::Type> typemap(); inline static Qt::CaseSensitivity qtcase(bool caseSensitive) { return caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive; } }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/cb2bib_utilities.cpp�����������������������������������������������������������0000644�0001750�0001750�00000062400�12045520050�017750� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "cb2bib_utilities.h" #ifdef C2B_USE_LZO #include <lzo/lzoconf.h> #include <lzo/lzo1x.h> #endif namespace c2bUtils { QString setCapitalization(const QString& str) { QString cap_string(str); if (isUpperCaseString(str)) cap_string = cap_string.toLower(); bool do_upper(true); for (int i = 0; i < cap_string.length(); i++) if (cap_string.at(i).isLetter()) { if (do_upper) cap_string[i] = cap_string.at(i).toUpper(); do_upper = false; } else if (cap_string.at(i) == '.' || cap_string.at(i) == ':') do_upper = true; return (cap_string); } QString& simplifyString(QString& str) { if (str.length() == 0) return str; const ushort space(32); ushort* const c0 = (ushort*)str.data(); ushort* const cn = c0 + str.length(); ushort* c = c0; ushort* o = c0; while (c < cn) { const ushort ch = *c; if ((ch > 32 && ch < 160) || !(ch == space || QChar(ch).isSpace())) *o++ = ch; else if (o > c0 && *(o - 1) != space) *o++ = space; ++c; } if (o > c0 && *(o - 1) == space) --o; str.truncate(int(o - c0)); return str; } QString& fillString(QString& str, const QStringMatcher& pattern, const QChar& ch) { if (str.length() == 0) return str; const int pl(pattern.pattern().length()); const ushort uch(ch.unicode()); ushort* const c0((ushort*)str.data()); int p(0); while (p >= 0) { p = pattern.indexIn(str, p); if (p > -1) { ushort* c(c0 + p); const ushort* const cpl(c + pl); while (c < cpl) *c++ = uch; p += pl; } } return str; } QString& fillString(QString& str, const QString& pattern, const QChar& ch) { return fillString(str, QStringMatcher(pattern, Qt::CaseSensitive), ch); } QString& fillString(QString& str, const QRegExp& pattern, const QChar& ch) { if (str.length() == 0) return str; const ushort uch(ch.unicode()); ushort* const c0((ushort*)str.data()); int p(0); while (p >= 0) { p = pattern.indexIn(str, p); if (p > -1) { const int pl(pattern.matchedLength()); ushort* c(c0 + p); const ushort* const cpl(c + pl); while (c < cpl) *c++ = uch; p += pl; } } return str; } static const unsigned short _cyrillic_to_ascii[] = { // Code points 1024 to 1309 // See http://en.wikipedia.org/wiki/ISO_9 69, 69, 68, 71, 69, 90, 73, 73, 74, 76, 78, 67, 75, 73, 85, 68, 65, 66, 86, 71, 68, 69, 90, 90, 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 70, 72, 67, 67, 83, 83, 698, 89, 697, 69, 85, 65, 97, 98, 118, 103, 100, 101, 122, 122, 105, 106, 107, 108, 109, 110, 111, 112, 114, 115, 116, 117, 102, 104, 99, 99, 115, 115, 698, 121, 697, 101, 117, 97, 101, 101, 100, 103, 101, 122, 105, 105, 106, 108, 110, 99, 107, 105, 117, 100, 1120, 1121, 69, 101, 1124, 1125, 1126, 1127, 1128, 1129, 65, 97, 1132, 1133, 1134, 1135, 1136, 1137, 70, 102, 89, 121, 89, 121, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 71, 103, 71, 103, 71, 103, 90, 122, 1176, 1177, 75, 107, 75, 107, 75, 107, 75, 107, 78, 110, 78, 110, 80, 112, 79, 111, 83, 115, 84, 116, 85, 117, 85, 117, 72, 104, 67, 99, 67, 99, 67, 99, 72, 104, 67, 99, 67, 99, 1216, 90, 122, 75, 107, 76, 108, 78, 110, 78, 110, 67, 99, 1229, 1230, 1231, 65, 97, 65, 97, 1236, 1237, 69, 101, 65, 97, 65, 97, 90, 122, 90, 122, 90, 122, 73, 105, 73, 105, 79, 111, 79, 111, 79, 111, 69, 101, 85, 117, 85, 117, 85, 117, 67, 99, 1270, 1271, 89, 121, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 78, 110, 1292, 1293, 84, 116, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 81, 113, 87, 119 }; static inline QString& _to_ascii_transliterate(QString& str) { // Strip diacritics, undo ligatures, transliterate if (str.length() == 0) return str; ushort* const c0 = (ushort*)str.data(); ushort* const cn = c0 + str.length(); ushort* c = c0 - 1; bool do_ligatures_198(false); bool do_ligatures_223(false); bool do_ligatures_230(false); bool do_ligatures_338(false); bool do_ligatures_339(false); while (c < cn) { ++c; if (*c < 128) continue; if (*c > 1023 && *c < 1310) { *c = _cyrillic_to_ascii[*c-1024]; if (*c == 1236) { *c = 198; do_ligatures_198 = true; } if (*c == 1237) { *c = 230; do_ligatures_230 = true; } continue; } QChar qc(*c); if (!qc.isLetter()) continue; switch (*c) { case 216: *c = QChar('O').unicode(); break; case 248: *c = QChar('o').unicode(); break; case 272: *c = QChar('D').unicode(); break; case 273: *c = QChar('d').unicode(); break; case 321: *c = QChar('L').unicode(); break; case 322: *c = QChar('l').unicode(); break; case 198: do_ligatures_198 = true; break; case 223: do_ligatures_223 = true; break; case 230: do_ligatures_230 = true; break; case 338: do_ligatures_338 = true; break; case 339: do_ligatures_339 = true; break; } if (qc.decompositionTag() == QChar::NoDecomposition) continue; qc = qc.decomposition().at(0); *c = qc.unicode(); if (qc.decompositionTag() == QChar::NoDecomposition) continue; qc = qc.decomposition().at(0); *c = qc.unicode(); } if (do_ligatures_198) str.replace(QChar(198), "AE", Qt::CaseSensitive); if (do_ligatures_223) str.replace(QChar(223), "ss", Qt::CaseSensitive); if (do_ligatures_230) str.replace(QChar(230), "ae", Qt::CaseSensitive); if (do_ligatures_338) str.replace(QChar(338), "OE", Qt::CaseSensitive); if (do_ligatures_339) str.replace(QChar(339), "oe", Qt::CaseSensitive); return str; } static inline QString& _to_ascii_keep_words(QString& str) { // Do: // const QRegExp nonAsciiWords("[^A-Za-z0-9\\+\\- ]"); // str.replace(nonAsciiWords, " "); // str = str.simplified(); if (str.length() == 0) return str; const ushort dash(QChar('-').unicode()); const ushort la(QChar('a').unicode()); const ushort lz(QChar('z').unicode()); const ushort n0(QChar('0').unicode()); const ushort n9(QChar('9').unicode()); const ushort plus(QChar('+').unicode()); const ushort space(QChar(' ').unicode()); const ushort ua(QChar('A').unicode()); const ushort uz(QChar('Z').unicode()); ushort* const c0 = (ushort*)str.data(); ushort* const cn = c0 + str.length(); ushort* c = c0; ushort* o = c0; while (c < cn) { const ushort ch = *c; if ((ch >= la && ch <= lz) || (ch >= ua && ch <= uz) || (ch >= n0 && ch <= n9) || ch == dash || ch == plus) *o++ = ch; else if (o > c0 && *(o - 1) != space) *o++ = space; ++c; } if (o > c0 && *(o - 1) == space) --o; str.truncate(int(o - c0)); return str; } QString toAscii(const QString& str, const AsciiConversion type) { QString ascii(str); if (type == FromBibTeX) cleanEquations(ascii); _to_ascii_transliterate(ascii); if (type == Collation) { for (int i = 0; i < ascii.length(); ++i) if (ascii.at(i).category() == QChar::Punctuation_Dash) ascii[i] = ' '; return ascii.toCaseFolded(); } if (type == KeepWords || type == FromBibTeX) _to_ascii_keep_words(ascii); else if (type == Cleanup) ascii.remove(nonAsciiLetter); return ascii; } QString& stripDiacritics(QString& str) { _to_ascii_transliterate(str); return str; } QString& c2bToBib(QString& str) { // Escape common Extended Latin Characters str.replace(" &", " \\&"); str.replace(QChar(183), "$\\cdot$"); str.replace(QChar(192), "{\\`A}"); str.replace(QChar(193), "{\\'A}"); str.replace(QChar(194), "{\\^A}"); str.replace(QChar(195), "{\\~A}"); str.replace(QChar(196), "{\\\"A}"); str.replace(QChar(197), "{\\AA{}}"); str.replace(QChar(198), "{\\AE{}}"); str.replace(QChar(199), "{\\c{C}}"); str.replace(QChar(200), "{\\`E}"); str.replace(QChar(201), "{\\'E}"); str.replace(QChar(202), "{\\^E}"); str.replace(QChar(203), "{\\\"E}"); str.replace(QChar(204), "{\\`I}"); str.replace(QChar(205), "{\\'I}"); str.replace(QChar(206), "{\\^I}"); str.replace(QChar(207), "{\\\"I}"); str.replace(QChar(209), "{\\~N}"); str.replace(QChar(210), "{\\`O}"); str.replace(QChar(211), "{\\'O}"); str.replace(QChar(212), "{\\^O}"); str.replace(QChar(213), "{\\~O}"); str.replace(QChar(214), "{\\\"O}"); str.replace(QChar(216), "{\\O}"); str.replace(QChar(217), "{\\`U}"); str.replace(QChar(218), "{\\'U}"); str.replace(QChar(219), "{\\^U}"); str.replace(QChar(220), "{\\\"U}"); str.replace(QChar(221), "{\\'Y}"); str.replace(QChar(223), "{\\ss}"); str.replace(QChar(224), "{\\`a}"); str.replace(QChar(225), "{\\'a}"); str.replace(QChar(226), "{\\^a}"); str.replace(QChar(227), "{\\~a}"); str.replace(QChar(228), "{\\\"a}"); str.replace(QChar(229), "{\\aa{}}"); str.replace(QChar(230), "{\\ae{}}"); str.replace(QChar(231), "{\\c{c}}"); str.replace(QChar(232), "{\\`e}"); str.replace(QChar(233), "{\\'e}"); str.replace(QChar(234), "{\\^e}"); str.replace(QChar(235), "{\\\"e}"); str.replace(QChar(236), "{\\`i}"); str.replace(QChar(237), "{\\'i}"); str.replace(QChar(238), "{\\^i}"); str.replace(QChar(239), "{\\\"i}"); str.replace(QChar(241), "{\\~n}"); str.replace(QChar(242), "{\\`o}"); str.replace(QChar(243), "{\\'o}"); str.replace(QChar(244), "{\\^o}"); str.replace(QChar(245), "{\\~o}"); str.replace(QChar(246), "{\\\"o}"); str.replace(QChar(248), "{\\o}"); str.replace(QChar(249), "{\\`u}"); str.replace(QChar(250), "{\\'u}"); str.replace(QChar(251), "{\\^u}"); str.replace(QChar(252), "{\\\"u}"); str.replace(QChar(253), "{\\'y}"); str.replace(QChar(255), "{\\\"y}"); str.replace(QChar(263), "{\\'c}"); str.replace(QChar(268), "{\\v{C}}"); str.replace(QChar(269), "{\\v{c}}"); str.replace(QChar(272), "{\\DJ}"); str.replace(QChar(273), "{\\dj}"); str.replace(QChar(321), "{\\L}"); str.replace(QChar(322), "{\\l}"); str.replace(QChar(323), "{\\'N}"); str.replace(QChar(324), "{\\'n}"); str.replace(QChar(338), "{\\OE}"); str.replace(QChar(339), "{\\oe}"); str.replace(QChar(352), "{\\v{S}}"); str.replace(QChar(353), "{\\v{s}}"); str.replace(QChar(376), "{\\\"Y"); str.replace(QChar(381), "{\\v{Z}}"); str.replace(QChar(382), "{\\v{z}}"); // Escape common Greek and math str.replace(QChar(913), "$\\Alpha$"); // Some uppercases might require engrec package str.replace(QChar(914), "$\\Beta$"); str.replace(QChar(915), "$\\Gamma$"); str.replace(QChar(916), "$\\Delta$"); str.replace(QChar(917), "$\\Epsilon$"); str.replace(QChar(918), "$\\Zeta$"); str.replace(QChar(919), "$\\Eta$"); str.replace(QChar(920), "$\\Theta$"); str.replace(QChar(921), "$\\Iota$"); str.replace(QChar(922), "$\\Kappa$"); str.replace(QChar(923), "$\\Lambda$"); str.replace(QChar(924), "$\\Mu$"); str.replace(QChar(925), "$\\Nu$"); str.replace(QChar(926), "$\\Xi$"); str.replace(QChar(927), "$\\Omicron$"); str.replace(QChar(928), "$\\Pi$"); str.replace(QChar(929), "$\\Rho$"); str.replace(QChar(931), "$\\Sigma$"); str.replace(QChar(932), "$\\Tau$"); str.replace(QChar(933), "$\\Upsilon$"); str.replace(QChar(934), "$\\Phi$"); str.replace(QChar(935), "$\\Chi$"); str.replace(QChar(936), "$\\Psi$"); str.replace(QChar(937), "$\\Omega$"); str.replace(QChar(945), "$\\alpha$"); str.replace(QChar(946), "$\\beta$"); str.replace(QChar(947), "$\\gamma$"); str.replace(QChar(948), "$\\delta$"); str.replace(QChar(949), "$\\varepsilon$"); str.replace(QChar(950), "$\\zeta$"); str.replace(QChar(951), "$\\eta$"); str.replace(QChar(952), "$\\theta$"); str.replace(QChar(953), "$\\iota$"); str.replace(QChar(954), "$\\kappa$"); str.replace(QChar(955), "$\\lambda$"); str.replace(QChar(956), "$\\mu$"); str.replace(QChar(957), "$\\nu$"); str.replace(QChar(958), "$\\xi$"); str.replace(QChar(959), "$\\omicron$"); str.replace(QChar(960), "$\\pi$"); str.replace(QChar(961), "$\\rho$"); str.replace(QChar(962), "$\\varsigma$"); str.replace(QChar(963), "$\\sigma$"); str.replace(QChar(964), "$\\tau$"); str.replace(QChar(965), "$\\upsilon$"); str.replace(QChar(966), "$\\phi$"); str.replace(QChar(967), "$\\chi$"); str.replace(QChar(968), "$\\psi$"); str.replace(QChar(969), "$\\omega$"); str.replace(QChar(977), "$\\vartheta$"); str.replace(QChar(981), "$\\varphi$"); str.replace(QChar(982), "$\\varpi$"); str.replace(QChar(989), "$\\digamma$"); str.replace(QChar(1008), "$\\varkappa$"); str.replace(QChar(1009), "$\\varrho$"); str.replace(QChar(1013), "$\\epsilon$"); str.replace(QChar(8706), "$\\partial$"); str.replace(QChar(8722), '-'); str.replace(QChar(8734), "$\\infty$"); return str; } QString& bibToC2b(QString& str) { // Escape TeX special characters to Unicode str.replace("\\&", "&"); // From \LaTeX{} syntax to {\LaTeX} for the implemented subset str.replace(QRegExp("\\\\(.{1,2})\\{(.{0,2})\\}"), "{\\\\1\\2}"); if (hasLatexDiacritic.indexIn(str) >= 0) { str.replace("{\\`A}", QChar(192)); str.replace("{\\'A}", QChar(193)); str.replace("{\\^A}", QChar(194)); str.replace("{\\~A}", QChar(195)); str.replace("{\\\"A}", QChar(196)); str.replace("{{\\AA}}", QChar(197)); str.replace("{{\\AE}}", QChar(198)); str.replace("{\\AA}", QChar(197)); // {\\AA{}} str.replace("{\\AE}", QChar(198)); // {\\AE{}} str.replace("{{\\cC}}", QChar(199)); // {\\c{C}} str.replace("{\\cC}", QChar(199)); // {\\c{C}} str.replace("{\\`E}", QChar(200)); str.replace("{\\'E}", QChar(201)); str.replace("{\\^E}", QChar(202)); str.replace("{\\\"E}", QChar(203)); str.replace("{\\`I}", QChar(204)); str.replace("{\\'I}", QChar(205)); str.replace("{\\^I}", QChar(206)); str.replace("{\\\"I}", QChar(207)); str.replace("{\\~N}", QChar(209)); str.replace("{\\`O}", QChar(210)); str.replace("{\\'O}", QChar(211)); str.replace("{\\^O}", QChar(212)); str.replace("{\\~O}", QChar(213)); str.replace("{\\\"O}", QChar(214)); str.replace("{\\O}", QChar(216)); str.replace("{\\`U}", QChar(217)); str.replace("{\\'U}", QChar(218)); str.replace("{\\^U}", QChar(219)); str.replace("{\\\"U}", QChar(220)); str.replace("{\\'Y}", QChar(221)); str.replace("{\\ss}", QChar(223)); str.replace("{\\`a}", QChar(224)); str.replace("{\\'a}", QChar(225)); str.replace("{\\^a}", QChar(226)); str.replace("{\\~a}", QChar(227)); str.replace("{\\\"a}", QChar(228)); str.replace("{{\\aa}}", QChar(229)); str.replace("{{\\ae}}", QChar(230)); str.replace("{\\aa}", QChar(229)); // {\\aa{}} str.replace("{\\ae}", QChar(230)); // {\\ae{}} str.replace("{{\\cc}}", QChar(231)); // {\\c{c}} str.replace("{\\cc}", QChar(231)); // {\\c{c}} str.replace("{\\`e}", QChar(232)); str.replace("{\\'e}", QChar(233)); str.replace("{\\^e}", QChar(234)); str.replace("{\\\"e}", QChar(235)); str.replace("{\\`i}", QChar(236)); str.replace("{\\'i}", QChar(237)); str.replace("{\\^i}", QChar(238)); str.replace("{\\\"i}", QChar(239)); str.replace("{\\`\\i}", QChar(236)); str.replace("{\\'\\i}", QChar(237)); str.replace("{\\^\\i}", QChar(238)); str.replace("{\\\"\\i}", QChar(239)); str.replace("{\\~n}", QChar(241)); str.replace("{\\`o}", QChar(242)); str.replace("{\\'o}", QChar(243)); str.replace("{\\^o}", QChar(244)); str.replace("{\\~o}", QChar(245)); str.replace("{\\\"o}", QChar(246)); str.replace("{\\o}", QChar(248)); str.replace("{\\`u}", QChar(249)); str.replace("{\\'u}", QChar(250)); str.replace("{\\^u}", QChar(251)); str.replace("{\\\"u}", QChar(252)); str.replace("{\\'y}", QChar(253)); str.replace("{\\\"y}", QChar(255)); str.replace("{\\'c}", QChar(263)); str.replace("{{\\vC}}", QChar(268)); // {\\v{C}} str.replace("{\\vC}", QChar(268)); str.replace("{{\\vc}}", QChar(269)); // {\\v{c} str.replace("{\\vc}", QChar(269)); str.replace("{\\DJ}", QChar(272)); str.replace("{\\dj}", QChar(273)); str.replace("{\\L}", QChar(321)); str.replace("{\\l}", QChar(322)); str.replace("{\\'N}", QChar(323)); str.replace("{\\'n}", QChar(324)); str.replace("{\\OE}", QChar(338)); str.replace("{\\oe}", QChar(339)); str.replace("{{\\vS}}", QChar(352)); // {\\v{S}} str.replace("{\\vS}", QChar(352)); str.replace("{{\\vs}}", QChar(353)); // {\\v{s}} str.replace("{\\vs}", QChar(353)); str.replace("{\\\"Y}", QChar(376)); str.replace("{{\\vZ}}", QChar(381)); // {\\v{Z}} str.replace("{\\vZ}", QChar(381)); str.replace("{{\\vz}}", QChar(382)); // {\\v{Z}} str.replace("{\\vz}", QChar(382)); } if (hasLatexSymbol.indexIn(str) >= 0) { str.replace("$\\cdot$", QChar(183)); str.replace("$\\Alpha$", QChar(913)); str.replace("$\\Beta$", QChar(914)); str.replace("$\\Gamma$", QChar(915)); str.replace("$\\Delta$", QChar(916)); str.replace("$\\Epsilon$", QChar(917)); str.replace("$\\Zeta$", QChar(918)); str.replace("$\\Eta$", QChar(919)); str.replace("$\\Theta$", QChar(920)); str.replace("$\\Iota$", QChar(921)); str.replace("$\\Kappa$", QChar(922)); str.replace("$\\Lambda$", QChar(923)); str.replace("$\\Mu$", QChar(924)); str.replace("$\\Nu$", QChar(925)); str.replace("$\\Xi$", QChar(926)); str.replace("$\\Omicron$", QChar(927)); str.replace("$\\Pi$", QChar(928)); str.replace("$\\Rho$", QChar(929)); str.replace("$\\Sigma$", QChar(931)); str.replace("$\\Tau$", QChar(932)); str.replace("$\\Upsilon$", QChar(933)); str.replace("$\\Phi$", QChar(934)); str.replace("$\\Chi$", QChar(935)); str.replace("$\\Psi$", QChar(936)); str.replace("$\\Omega$", QChar(937)); str.replace("$\\alpha$", QChar(945)); str.replace("$\\beta$", QChar(946)); str.replace("$\\gamma$", QChar(947)); str.replace("$\\delta$", QChar(948)); str.replace("$\\varepsilon$", QChar(949)); str.replace("$\\zeta$", QChar(950)); str.replace("$\\eta$", QChar(951)); str.replace("$\\theta$", QChar(952)); str.replace("$\\iota$", QChar(953)); str.replace("$\\kappa$", QChar(954)); str.replace("$\\lambda$", QChar(955)); str.replace("$\\mu$", QChar(956)); str.replace("$\\nu$", QChar(957)); str.replace("$\\xi$", QChar(958)); str.replace("$\\omicron$", QChar(959)); str.replace("$\\pi$", QChar(960)); str.replace("$\\rho$", QChar(961)); str.replace("$\\sigmaf$", QChar(962)); str.replace("$\\varsigma$", QChar(962)); // Equal to \sigmaf str.replace("$\\sigma$", QChar(963)); str.replace("$\\tau$", QChar(964)); str.replace("$\\upsilon$", QChar(965)); str.replace("$\\phi$", QChar(966)); str.replace("$\\chi$", QChar(967)); str.replace("$\\psi$", QChar(968)); str.replace("$\\omega$", QChar(969)); str.replace("$\\vartheta$", QChar(977)); str.replace("$\\varphi$", QChar(981)); str.replace("$\\varpi$", QChar(982)); str.replace("$\\digamma$", QChar(989)); str.replace("$\\varkappa$", QChar(1008)); str.replace("$\\varrho$", QChar(1009)); str.replace("$\\epsilon$", QChar(1013)); str.replace("$\\partial$", QChar(8706)); str.replace("$\\infty$", QChar(8734)); } return str; } const QString fromUtf8(const QByteArray& ba) { // Based on Qt's QString::fromUtf8 function. Input ba must be an UTF-8 // encoded array produced by QString::toUtf8. Encoding correctness is // assumed and checking omitted. It performs a 20% faster compared to // Qt 4.5, and expected more compared to Qt 4.6. const char* b = ba.constData(); const char* const bn = b + ba.length(); QString output; output.resize(ba.length()); ushort* o = (ushort*)output.unicode(); uint c; while (b < bn) { c = uint(*b); if (c & 0x80) { if ((c & 0xe0) == 0xc0) { c &= 0x1f; c = (uint)((c << 6) | (*++b & 0x3f)); } else if ((c & 0xf0) == 0xe0) { c &= 0x0f; c = (uint)((c << 6) | (b[1] & 0x3f)); c = (uint)((c << 6) | (b[2] & 0x3f)); b += 2; } else if ((c & 0xf8) == 0xf0) { c &= 0x07; c = (uint)((c << 6) | (b[1] & 0x3f)); c = (uint)((c << 6) | (b[2] & 0x3f)); c = (uint)((c << 6) | (b[3] & 0x3f)); *o++ = QChar::highSurrogate(c); c = QChar::lowSurrogate(c); b += 3; } else c = QChar::ReplacementCharacter; } *o++ = ushort(c); ++b; } output.truncate(int(o - (ushort*)output.unicode())); // QString check = QString::fromUtf8(ba); // qDebug() << (check == output); return output; } #ifdef C2B_USE_LZO const QByteArray lzo::compress(const QByteArray& data) { const lzo_uint src_s(data.size()); if (src_s == 0) return QByteArray(); if (lzo_init() != LZO_E_OK) { warn("compress: lzo: internal error - initialization failed"); return QByteArray(); } const lzo_bytep src_p = reinterpret_cast<const lzo_bytep>(data.constData()); QByteArray compressed; const lzo_uint dest_s = HEADER_LENGTH + (src_s + src_s / 16 + 64 + 3); compressed.resize((int)dest_s); lzo_bytep compressed_p = reinterpret_cast<lzo_bytep>(compressed.data()); lzo_bytep dest_p = compressed_p + HEADER_LENGTH; lzo_uint enc_dest_s = dest_s - HEADER_LENGTH; QByteArray wrkmem; wrkmem.resize(LZO1X_999_MEM_COMPRESS); lzo_bytep wrkmem_p = reinterpret_cast<lzo_bytep>(wrkmem.data()); if (lzo1x_999_compress(src_p, src_s, dest_p, &enc_dest_s, wrkmem_p) == LZO_E_OK) { compressed.resize((int)enc_dest_s + HEADER_LENGTH); QByteArray header(QByteArray::number((qulonglong)src_s)); for (int i = 0; i < qMin(header.length(), HEADER_LENGTH); ++i) compressed[i] = header[i]; for (int i = qMin(header.length(), HEADER_LENGTH); i < HEADER_LENGTH; ++i) compressed[i] = ' '; return compressed; } else { warn("compress: lzo: internal error - compression failed"); return QByteArray(); } } const QByteArray lzo::uncompress(const QByteArray& data) { const lzo_uint data_s(data.size()); if (data_s <= (unsigned int)HEADER_LENGTH) return QByteArray(); if (lzo_init() != LZO_E_OK) { warn("uncompress: lzo: internal error - initialization failed"); return QByteArray(); } const lzo_bytep data_p = reinterpret_cast<const lzo_bytep>(data.constData()); const lzo_bytep src_p = data_p + HEADER_LENGTH; const lzo_uint src_s = data_s - HEADER_LENGTH; QByteArray uncompressed; const ulong expected_dest_s = data.left(HEADER_LENGTH).trimmed().toULong(); lzo_uint dest_s = qMax(expected_dest_s, lzo_uint(1)); uncompressed.resize((int)dest_s); lzo_bytep dest_p = reinterpret_cast<lzo_bytep>(uncompressed.data()); if (lzo1x_decompress(src_p, src_s, dest_p, &dest_s, NULL) == LZO_E_OK && (ulong)dest_s == expected_dest_s) return uncompressed; else { warn("uncompress: lzo: internal error - uncompression failed"); return QByteArray(); } } #endif } // namespace c2bUtils ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/texToHtml.cpp������������������������������������������������������������������0000644�0001750�0001750�00000033722�12045520050�016467� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "texToHtml.h" #include "cb2bib_parameters.h" #include "settings.h" #include <QUrl> texToHtml::texToHtml() : texParser() { _has_inline_equations_rx = QRegExp("\\$.{1,100}\\$"); _macro_arguments_rx = QRegExp("\\}\\s*\\[\\s*(\\d+)\\s*\\]\\s*\\{"); _named_extern_url_rx = QRegExp("_((?:file|http|https|ftp)://(?:[^\\s\\n\\r\\[]+))\\[([^\\]]*)\\]"); _named_url_rx = QRegExp("\\b((?:file|http|https|ftp)://(?:[^\\s\\n\\r\\[]+))\\[([^\\]]*)\\]"); _extern_url_rx = QRegExp("_((?:file|http|https|ftp)(?!.+\">)://(?:[^\\s\\n\\r\\[]+))(\\.[\\s\\n\\r]){0,1}"); _url_rx = QRegExp("\\b((?:file|http|https|ftp)(?!.+\">)://(?:[^\\s\\n\\r\\[]+))(\\.[\\s\\n\\r]){0,1}"); _close_subsection = false;; _close_subsubsection = false;; _has_equation = false;; _make_index = false;; _use_relative_links = false;; _index_anchors = 0;; _settingsP = settings::instance(); } void texToHtml::toHtml(const QString& tex, const QString& fn) { _html_filename = fn; c2bUtils::stringToFile(toHtml(tex), fn); } QString texToHtml::toHtml(const QString& tex) { _bibtex_directory.clear(); _cites.clear(); _close_subsection = false; _close_subsubsection = false; _has_equation = false; _html.clear(); _index = "<ul>\n"; _index_anchors = 0; _make_index = false; _references.clear(); _tex_macro_names_rx.clear(); _tex_macros.clear(); _title.clear(); _use_relative_links = _settingsP->value("c2bAnnote/UseRelativeLinks").toBool(); if (_html_filename.isEmpty()) _use_relative_links = false; else _current_dir = QDir(QFileInfo(_html_filename).absolutePath()); parse(tex); if (_close_subsubsection) _index += "</ul></li>\n"; if (_close_subsection) _index += "</ul></li>\n"; _index += "</ul>"; QString tex2html(c2bUtils::fileToString(":/htm/htm/tex2html.html")); if (_settingsP->value("c2bAnnote/IncludeCSS").toBool()) { QString css(c2bUtils::fileToString(_settingsP->fileName("c2bAnnote/AnnoteCssFile"))); if (css.isEmpty()) css = c2bUtils::fileToString(":/htm/htm/tex2html.css"); tex2html.replace("GET_CSS", "\n <style type=\"text/css\">\n" + css.trimmed() + "\n </style>\n"); } else { QString cssfn(_settingsP->fileName("c2bAnnote/AnnoteCssFile")); if (cssfn.isEmpty()) tex2html.remove("GET_CSS"); else { if (_use_relative_links) cssfn = _current_dir.relativeFilePath(cssfn); tex2html.replace("GET_CSS", "\n <link href=\"" + cssfn + "\" rel=\"stylesheet\" type=\"text/css\"/>\n"); } } tex2html.replace("GET_TITLE", _title); retrieveReferences(); QString reference_list_html; referencesToHtml(&reference_list_html); tex2html.replace("GET_REFERENCES", reference_list_html); citesToHtml(&_html); if (_has_equation || _html.contains(_has_inline_equations_rx)) { QString jsmath_head(c2bUtils::fileToString(":/htm/htm/tex2html_jsmath_head.html")); QString jsmath_dn(_settingsP->fileName("c2bAnnote/jsMathDirectory")); if (_use_relative_links) jsmath_dn = _current_dir.relativeFilePath(jsmath_dn); jsmath_head.replace("GET_JSMATH_ROOT_DIRECTORY", jsmath_dn); jsmath_head.replace("GET_JSMATH_MACROS", _tex_macros); tex2html.replace("GET_JSMATH_HEAD", jsmath_head); } else tex2html.remove("GET_JSMATH_HEAD"); if (_make_index && _index_anchors > 1) { _index = c2bUtils::fileToString(":/htm/htm/tex2html_index.html").arg(_index); tex2html.replace("GET_INDEX", _index); } else tex2html.remove("GET_INDEX"); tex2html.replace("GET_HTML", _html); tex2html.replace("GET_CB2BIB_VERSION_NUMBER", C2B_VERSION); _html_filename.clear(); return tex2html; } void texToHtml::parseElement(const QString& p, const QString& e, const QString& v) { if (e == "section") { const QString sv(toHtmlString(v)); ++_index_anchors; _html += QString("\n<h1><a id=\"sect%1\"></a>%2</h1>\n\n").arg(_index_anchors).arg(sv); if (_close_subsubsection) _index += "</ul></li>\n"; if (_close_subsection) _index += "</ul></li>\n"; _index += QString("<li><a href=\"#sect%1\">%2</a></li>\n").arg(_index_anchors).arg(sv); _close_subsubsection = false; _close_subsection = false; } else if (e == "subsection") { const QString sv(toHtmlString(v)); ++_index_anchors; _html += QString("\n<h2><a id=\"sect%1\"></a>%2</h2>\n\n").arg(_index_anchors).arg(sv); if (_close_subsubsection) _index += "</ul></li>\n"; if (!_close_subsection) _index += "<li style=\"list-style: none\"><ul>\n"; _index += QString("<li><a href=\"#sect%1\">%2</a></li>\n").arg(_index_anchors).arg(sv); _close_subsubsection = false; _close_subsection = true; } else if (e == "subsubsection") { const QString sv(toHtmlString(v)); ++_index_anchors; _html += QString("\n<h3><a id=\"sect%1\"></a>%2</h3>\n\n").arg(_index_anchors).arg(sv); if (!_close_subsubsection) _index += "<li style=\"list-style: none\"><ul>\n"; _index += QString("<li><a href=\"#sect%1\">%2</a></li>\n").arg(_index_anchors).arg(sv); _close_subsubsection = true; } else if (e == "title") _title = toHtmlString(v); else if (e == "equation") { _html += QString("\n<div id=\"math\" class=\"math\">\n%1\n</div>\n\n").arg(v.trimmed()); _has_equation = true; } else if (e == "itemize") { const QStringList items(v.trimmed().split("\\item ", QString::SkipEmptyParts)); for (int i = 0; i < items.count(); ++i) parseTextParagraph("- " + items.at(i).simplified()); } else if (e == "abstract") _html += QString("\n<div id=\"abstract\" class=\"abstract\">\n%1\n</div><br /><hr />\n\n").arg(toHtmlString(v.trimmed())); else if (e == "verbatim") _html += QString("\n<pre>%1</pre>\n\n").arg(v); else if (e == "newcommand") extractMacro(v); else _html += QString("\n<pre>\n%1\n</pre>\n\n").arg(p); } void texToHtml::parseComment(const QString& p) { if (p.startsWith("%\\c2b_bibtex_directory{")) c2bUtils::inBraces(p.indexOf('{') + 1, p, &_bibtex_directory); else if (p == "%\\c2b_makeindex") _make_index = true; } void texToHtml::parseTextParagraph(const QString& p) { extractCites(p); QString pstr(toHtmlString(p)); urlToHtml(&pstr); if (p.startsWith("- ")) _html += QString("\n<ul><li>%1</li></ul>\n\n").arg(pstr.mid(2)); else _html += QString("\n<p>%1</p>\n\n").arg(pstr); } void texToHtml::extractMacro(const QString& v) { QString name; if (!c2bUtils::inBraces(1, v, &name)) return; // Substitution '\macro' -> '$\macro[args]$'. jsMath will not process macros outside equation environments. _tex_macro_names_rx.append(QRegExp("(\\" + name + "\\S*)")); // To minimize clashes, the replacement must be performed from longest to shortest names. // Sort now, even if this needs multiple sortings. This way, substitutions can be done while parsing. qSort(_tex_macro_names_rx.begin(), _tex_macro_names_rx.end(), c2bUtils::patternLengthMoreThan); QString definition; for (int i = name.length() + 2; i < v.length(); ++i) if (v.at(i) == '{') { if (c2bUtils::inBraces(i + 1, v, &definition)) break; else return; } if (definition.isEmpty()) return; name.remove("\\"); definition.remove("\\ensuremath"); definition.replace("\\", "\\\\"); if (_macro_arguments_rx.indexIn(v) > -1) _tex_macros += QString("\n <script type=\"text/javascript\">jsMath.Macro('%1','%2',%3)</script>") .arg(name).arg(definition).arg(_macro_arguments_rx.cap(1)); else _tex_macros += QString("\n <script type=\"text/javascript\">jsMath.Macro('%1','%2')</script>") .arg(name).arg(definition); } void texToHtml::extractCites(const QString& p) { int pos(p.indexOf("\\cite{", 0)); while (pos >= 0) { QString cites; if (c2bUtils::inBraces(pos + 6, p, &cites)) { const QStringList cite(cites.split(',', QString::SkipEmptyParts)); for (int i = 0; i < cite.count(); ++i) { const QString c(cite.at(i).trimmed()); if (!_cites.contains(c)) _cites.insert(c, -(1 + _cites.count())); } } pos = p.indexOf("\\cite{", pos + 6); } } void texToHtml::citesToHtml(QString* html) { QString key("\\b%1\\b"); QHash<QString, bibReference>::const_iterator i = _references.constBegin(); while (i != _references.constEnd()) { const QString k(i.key()); html->replace(QRegExp(key.arg(k)), QString("<a href=\"#%1\">%2</a>").arg(k).arg(_cites.value(k))); ++i; } html->replace(QRegExp("\\\\cite\\{([^\\{]+)\\}"), "<span class=\"citations\">[\\1]</span>"); } /** Retrieve references from BibTeX files directory */ void texToHtml::retrieveReferences() { if (_bibtex_directory.isEmpty()) _bibtex_directory = QFileInfo(_settingsP->fileName("cb2Bib/BibTeXFile")).path(); const QStringList flist(c2bUtils::filesInDir(_bibtex_directory, QStringList() << "*.bib")); const QStringList keys(_cites.keys()); QStringList fields; fields.append("author"); fields.append("booktitle"); fields.append("doi"); fields.append("editor"); fields.append("file"); fields.append("journal"); fields.append("pages"); fields.append("title"); fields.append("url"); fields.append("volume"); fields.append("year"); bibReference ref; _cbp.initReferenceParsing(_bibtex_directory + '/', fields, &ref); bool done(false); for (int i = 0; i < flist.count(); ++i) { if (done) return; const QString bib_contents(c2bUtils::fileToString(flist.at(i))); done = true; for (int j = 0; j < keys.count(); ++j) { if (_cites.value(keys.at(j)) > 0) continue; done = false; const QString key(keys.at(j)); if (_cbp.referenceAtKey(key, bib_contents, &ref)) { _references.insert(key, ref); _cites[key] = -_cites[key]; } } } } void texToHtml::referencesToHtml(QString* reference_list_html) { reference_list_html->clear(); if (_references.count() == 0) return; QStringList keys(_references.keys()); QMap<int, QString> ordering; for (int i = 0; i < keys.count(); ++i) ordering.insert(_cites.value(keys.at(i)), keys.at(i)); keys = ordering.values(); const QString reference_item_html(c2bUtils::fileToString(":/htm/htm/reference_item.html")); const QRegExp nonletters("[^\\w\\s-]"); QString references; for (int i = 0; i < keys.count(); ++i) { const bibReference& ref = _references.value(keys.at(i)); QString author(ref.anyAuthor()); if (!author.isEmpty()) { author = _cbp.authorFromBibTeX(author); author.remove(nonletters); author.replace(" and ", ", "); c2bUtils::simplifyString(author); author += '.'; } QString title(ref.anyTitle()); c2bUtils::cleanTitle(title, true); // Do not percent encode file (some browsers dont like encoded local files) and url // (it might already be, if needed, decode prior to encode) const QString doi(ref.value("doi")); const QString file(ref.value("file")); const QString url(ref.value("url")); QString link; if (!file.isEmpty()) { if (_use_relative_links) link = QDir::cleanPath(_current_dir.relativeFilePath(file)); else link = QDir::cleanPath(file); } else if (!url.isEmpty()) link = url; else if (!doi.isEmpty()) { if (doi.startsWith("http://")) link = doi; else link = "http://dx.doi.org/" + QUrl::toPercentEncoding(doi); } const QString journal(ref.anyJournal()); const QString volume(ref.value("volume")); QString pages(ref.value("pages")); if (!pages.isEmpty()) { if (!volume.isEmpty()) pages = ", " + pages.remove(' '); else pages = ' ' + pages.remove(' '); } QString year(ref.value("year")); if (!year.isEmpty()) year = '(' + year + ")."; QString item(reference_item_html); item.replace("GET_REFERENCE_ANCHOR_ID", ref.citeidName); item.replace("GET_REFERENCE_ANCHOR_NAME", ref.citeidName); item.replace("GET_REFERENCE_AUTHOR", author); if (link.isEmpty()) item.remove("href=\"GET_REFERENCE_LINK\""); else item.replace("GET_REFERENCE_LINK", link); item.replace("GET_REFERENCE_PAGES", pages); item.replace("GET_REFERENCE_SOURCE", journal); item.replace("GET_REFERENCE_TITLE", c2bUtils::toHtmlString(title)); item.replace("GET_REFERENCE_VOLUME", volume); item.replace("GET_REFERENCE_YEAR", year); references += item; // Update _cites values according to this list _cites[keys.at(i)] = i + 1; } *reference_list_html = c2bUtils::fileToString(":/htm/htm/reference_list.html"); reference_list_html->replace("GET_REFERENCES", references); } ����������������������������������������������cb2bib-1.4.9/src/c2b/journalDB.cpp������������������������������������������������������������������0000644�0001750�0001750�00000011045�12045520050�016411� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "journalDB.h" #include "cb2bib_utilities.h" #include <QFile> #include <QObject> #include <QTextStream> journalDB::journalDB(const QString& dbfile) { if (dbfile.isEmpty()) { c2bUtils::warn(QObject::tr("No journal file especified")); return; } _nitems = 0; QFile file(dbfile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { c2bUtils::warn(QObject::tr("Could not open journal file %1 for reading").arg(dbfile)); return; } QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); QString line; int line_number(0); while (!stream.atEnd()) { line = stream.readLine(); ++line_number; if (!(line.isEmpty() || line.startsWith('#'))) { const QStringList spLine(line.split('|')); if (spLine.count() != 3) { c2bUtils::warn(QObject::tr("Syntax error in journal file at line %1").arg(line_number)); continue; } _nitems++; JCode += spLine.at(0).toLower(); JAbbrev += spLine.at(1); QString dum(spLine.at(1).toLower()); dum.replace(c2bUtils::nonLetter, " "); // Keeps word structure c2bUtils::simplifyString(dum); JAbbrev_simp_w += dum; dum.remove(' '); // Removes whitespaces also JAbbrev_simp += dum; JExtended += spLine.at(2); dum = spLine.at(2).toLower(); dum.remove(c2bUtils::nonLetter); // Removes whitespaces also JExtended_simp += dum; } } file.close(); } /** \page journalproc Processing of journal names cb2Bib processes journal names according to its editable database, stored at <tt>abbreviations.txt</tt>. See \ref c2bconf_files and \ref c2bconf_bibtex. Journal names processing is performed in the following situations whenever a string is recognized as 'journal'. Additionally, it is also processed by pressing <b>Intro Key</b> at the journal edit line. <p> </p> - Retrieves Journal name, <b>abbreviated form</b>, if found. - If Journal name is not found in the database, returns input Journal name. - Search is case insensitive. - Warning: Journal codes can be duplicated. If duplicated, returns input Journal name. */ QString journalDB::retrieve(const QString& JQuery) const { const QString query(JQuery.toLower().remove(c2bUtils::nonLetter)); // Removes whitespaces also int journal_found(0); int journal_found_at(-1); for (int i = 0; i < _nitems; i++) { if (JCode.at(i) == query) { journal_found++; journal_found_at = i; } if (JAbbrev_simp.at(i) == query) if (++journal_found == 1) return(JAbbrev.at(i)); if (JExtended_simp.at(i) == query) if (++journal_found == 1) return(JAbbrev.at(i)); } if (journal_found == 1 && journal_found_at != -1) return(JAbbrev.at(journal_found_at)); else return(JQuery); } /** \page journalproc Processing of journal names <p> </p> - Retrieves Journal name, <b>full form</b>, if found. - If Journal name is not found in the database, returns input Journal name. - Search is case insensitive. - Warning: Journal codes can be duplicated. If duplicated, returns input Journal name. */ QString journalDB::retrieveFull(const QString& JQuery) const { QString query(JQuery.toLower()); query.remove(c2bUtils::nonLetter); // Removes whitespaces also int journal_found(0); int journal_found_at(-1); for (int i = 0; i < _nitems; i++) { if (JCode.at(i) == query) { journal_found++; journal_found_at = i; } if (JAbbrev_simp.at(i) == query) if (++journal_found == 1) return(JExtended.at(i)); if (JExtended_simp.at(i) == query) if (++journal_found == 1) return(JExtended.at(i)); } if (journal_found == 1 && journal_found_at != -1) return(JExtended.at(journal_found_at)); else return(JQuery); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/searchPattern.cpp��������������������������������������������������������������0000644�0001750�0001750�00000015360�12045520050�017340� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "searchPattern.h" #include "triads.h" #include <QMap> /** Top level driver for calling cb2Bib search types */ searchPattern::searchPattern(const QString& pattern, const QString& patternType) : _matcher(pattern.simplified(), typemap().value(patternType), Qt::CaseInsensitive) { _modifier.NOT = false; _modifier.string = pattern.simplified(); _rank = 0; } searchPattern::searchPattern(const bool NOT, const bool caseSensitive, const QString& patternType, const QString& scope, const QChar& yearScope, const QString& pattern) : _matcher(pattern.simplified(), typemap().value(patternType), qtcase(caseSensitive)) { _modifier.NOT = NOT; _modifier.string = pattern.simplified(); _modifier.scope = scope; _modifier.yearScope = yearScope; if (_modifier.NOT) _formatted_string += "NOT."; _formatted_string += QString(" [%1][%2|case=%3]").arg(_modifier.string).arg(patternType).arg(caseSensitive); if (_modifier.scope == "year") _formatted_string += QString(" IN [%1(%2)]").arg(_modifier.scope).arg(_modifier.yearScope); else _formatted_string += QString(" IN [%1]").arg(_modifier.scope); // Set an approximate ranking to speed up composite searches _rank = 0; if (_modifier.scope == "file") _rank += 200; else if (_modifier.scope == "all") _rank += 100; else if (_modifier.scope == "year" || _modifier.scope == "volume" || _modifier.scope == "pages") _rank += 50; else _rank += 1; if (!caseSensitive) _rank *= 2; if (_matcher.type == FixedStringAllWords || _matcher.type == FixedStringAnyWord) _rank *= 5; else if (_matcher.type == ApproximateString) _rank *= 10; else if (_matcher.type == RegularExpression) _rank *= 20; } const QStringList searchPattern::types() { return typemap().keys(); } const QString searchPattern::type(const Type t) { return typemap().key(t); } const QMap<QString, searchPattern::Type> searchPattern::typemap() { QMap<QString, Type> tm; tm.insert(QObject::tr("Approximate string"), ApproximateString); tm.insert(QObject::tr("Fixed string: All Words"), FixedStringAllWords); tm.insert(QObject::tr("Fixed string: Any Word"), FixedStringAnyWord); tm.insert(QObject::tr("Fixed string: Context"), FixedStringContext); tm.insert(QObject::tr("Fixed string"), FixedString); tm.insert(QObject::tr("Regular expression"), RegularExpression); tm.insert(QObject::tr("Wildcard"), Wildcard); return tm; } searchPattern::matcher::matcher(const QString& pattern, const Type t, const Qt::CaseSensitivity cs) : type(t), length(-1) { switch (t) { default: c2bUtils::warn(QObject::tr("Internal Error: Invalid search pattern type. Set to 'Approximate string'")); case ApproximateString: { appexp.setPattern(pattern, cs); if (appexp.isMultipattern()) { signature = triads::textSignature(pattern); subsignatures = triads::textSignature(appexp.substrings()); } else // Skip signatures for regular expression case { regexp = appexp.regexp(); type = RegularExpression; } } break; case FixedStringAnyWord: { wordexp.setPattern(pattern, wordPattern::AnyWord, cs); signature = triads::textSignature(pattern); subsignatures = triads::textSignature(wordexp.substrings()); } break; case FixedStringAllWords: { wordexp.setPattern(pattern, wordPattern::AllWords, cs); signature = triads::textSignature(pattern); subsignatures.fill(signature, wordexp.subpatternCount()); } break; case FixedStringContext: { cwordexp.setPattern(pattern, cs); signature = triads::textSignature(pattern); } break; case FixedString: { strexp.setPattern(pattern); strexp.setCaseSensitivity(cs); signature = triads::textSignature(pattern); } break; case RegularExpression: { regexp.setPattern(pattern); regexp.setCaseSensitivity(cs); regexp.setPatternSyntax(QRegExp::RegExp2); regexp.setMinimal(true); } break; case Wildcard: { regexp.setPattern(pattern); regexp.setCaseSensitivity(cs); regexp.setPatternSyntax(QRegExp::Wildcard); regexp.setMinimal(true); signature = triads::textSignature(pattern); } break; } } bool searchPattern::matcher::match(const QString& contents) const { length = -1; switch (type) { case ApproximateString: return appexp.matches(contents); case FixedStringAnyWord: case FixedStringAllWords: return wordexp.matches(contents); case FixedStringContext: return cwordexp.indexIn(contents) != -1; case FixedString: return strexp.indexIn(contents) != -1; default: return regexp.indexIn(contents) != -1; } } bool searchPattern::matcher::match(const documentContents& contents) const { length = -1; switch (type) { case ApproximateString: return _match_any(appexp.subpatternCount(), appexp.submatchers(), contents); case FixedStringAnyWord: return _match_any(wordexp.subpatternCount(), wordexp.submatchers(), contents); case FixedStringAllWords: return _match_all(wordexp.subpatternCount(), wordexp.submatchers(), contents); case FixedStringContext: return _match(cwordexp, signature, contents); case FixedString: return _match(strexp, signature, contents); default: return _match(regexp, signature, contents); } } int searchPattern::matcher::index(const QString& contents, const int from) const { int i; switch (type) { case ApproximateString: i = appexp.indexIn(contents, from); length = appexp.matchedLength(); return i; case FixedStringAnyWord: case FixedStringAllWords: i = wordexp.indexIn(contents, from); length = wordexp.matchedLength(); return i; case FixedStringContext: i = cwordexp.indexIn(contents, from); length = cwordexp.matchedLength(); return i; case FixedString: i = strexp.indexIn(contents, from); length = strexp.pattern().length(); return i; default: i = regexp.indexIn(contents, from); length = regexp.matchedLength(); return i; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/journalDB.h��������������������������������������������������������������������0000644�0001750�0001750�00000003160�12045520050�016055� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef JOURNALDB_H #define JOURNALDB_H #include <QString> #include <QStringList> /** Database of Journal Names @author Pere Constans */ class journalDB { public: journalDB(const QString& dbfile); inline ~journalDB() {} QString retrieve(const QString& JQuery) const; QString retrieveFull(const QString& JQuery) const; inline int count() const { return _nitems; } inline const QString& retrieve(const int index) const { return JAbbrev.at(index); } inline const QString& retrieveFull(const int index) const { return JExtended.at(index); } inline const QString& simplified(const int index) const { return JAbbrev_simp_w.at(index); } inline const QString& fullsimplified(const int index) const { return JAbbrev_simp.at(index); } inline const QString& fullsimplifiedFull(const int index) const { return JExtended_simp.at(index); } inline const QStringList& abbreviatedSimplifiedList() const { return JAbbrev_simp_w; } private: QStringList JAbbrev; QStringList JAbbrev_simp; QStringList JAbbrev_simp_w; QStringList JCode; QStringList JExtended; QStringList JExtended_simp; int _nitems; }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/compositePattern.h�������������������������������������������������������������0000644�0001750�0001750�00000003626�12045520050�017544� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef COMPOSITEPATTERN_H #define COMPOSITEPATTERN_H #include <QRegExp> #include <QStringList> #include <QVector> class compositePattern { public: compositePattern(); compositePattern(const QString& pattern, const Qt::CaseSensitivity cs); inline virtual ~compositePattern() {} inline const QString strings() const { return _string; } inline const QStringList substrings() const { return _substrings; } inline const QRegExp& regexp() const { return _regexp; } inline const QVector<QRegExp>& subregexps() const { return _subregexps; } inline Qt::CaseSensitivity caseSensitivity() const { return _case_sensitivity; } inline int subpatternCount() const { return _subpattern_count; } inline int matchedLength() const { return _matched_length; } inline bool isMultipattern() const { return _is_multipattern; } virtual bool matches(const QString& str) const = 0; virtual int indexIn(const QString& str, const int from) const = 0; protected: static QString escape(const QString& str, const Qt::CaseSensitivity cs); void set_sort_index(); QList<double> _ranks; QRegExp _regexp; QString _string; QStringList _substrings; QVector<QRegExp> _subregexps; QVector<int> _index; Qt::CaseSensitivity _case_sensitivity; bool _is_multipattern; int _subpattern_count; mutable QVector<int> _p0; mutable QVector<int> _pn; mutable int _matched_length; }; #endif ����������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/pubmedXml.cpp������������������������������������������������������������������0000644�0001750�0001750�00000011304�12045520050�016464� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "pubmedXml.h" #include "cb2bib_utilities.h" pubmedXml::pubmedXml(const QString& xml) : QXmlStreamReader() { // toQtXmlString and fromQtXmlString are workarounds for Qt < 4.5 addData(c2bUtils::toQtXmlString(xml)); _reference.clearReference(); readReference(); QMutableHashIterator<QString, QString> it(_reference); while (it.hasNext()) { it.next(); it.value() = c2bUtils::fromQtXmlString(it.value()); } } void pubmedXml::readReference() { while (reading("PubmedArticle")) if (name() == "Journal") readJournal(); else if (name() == "AuthorList") readAuthors(); else if (name() == "MeshHeadingList") readKeywords(); else if (name() == "ArticleTitle") readField("title"); else if (name() == "AbstractText") readField("abstract"); else if (name() == "MedlinePgn") { readNext(); _reference["pages"] = text().toString().remove(QRegExp("\\,[\\s\\d]+")); // Cases "11-5, 25" } else if (name() == "PMID") { readNext(); _reference["url"] = c2bUtils::pubmedUrl.arg(text().toString()); } else if (name() == "ArticleId") { if (attributes().count() > 0) if (attributes().first().value().toString() == "doi") readField("doi"); } } void pubmedXml::readField(const QString& field) { readNext(); _reference[field] = text().toString(); } void pubmedXml::readAuthors() { QStringList authors; while (reading("AuthorList")) { if (name() == "Author" && attributes().value("ValidYN") != "N") { QString a, i; bool abbreviated(true); while (reading("Author")) if (name() == "LastName") { readNext(); a = a + ' ' + text().toString(); } else if (name() == "ForeName" || name() == "FirstName") { readNext(); a = text().toString() + ' ' + a; abbreviated = false; } else if (name() == "Suffix") { readNext(); if (text() == "2nd") a = a + " II"; else if (text() == "3rd") a = a + " III"; else a = a + ' ' + text().toString(); } else if (name() == "Initials") { readNext(); i = text().toString(); } if (abbreviated) authors.append(i + ' ' + a); else authors.append(a); } } _reference["author"] = authors.join(", "); } void pubmedXml::readJournal() { QString ja, jf, mldate; while (reading("Journal")) if (name() == "ISOAbbreviation") { readNext(); ja = text().toString(); } else if (name() == "Title") { readNext(); jf = text().toString(); } else if (name() == "Volume") readField("volume"); else if (name() == "Issue") readField("number"); else if (name() == "Year") readField("year"); else if (name() == "MedlineDate") { readNext(); mldate = text().toString(); } if (ja.isEmpty()) _reference["journal"] = jf; else _reference["journal"] = ja; if (_reference.value("year").isEmpty()) { mldate.remove(QRegExp("[^\\d\\s-]")); mldate.remove(QRegExp("\\b\\d{1,3}\\b")); _reference["year"] = mldate; } } void pubmedXml::readKeywords() { QStringList k; while (reading("MeshHeadingList")) if (name() == "DescriptorName") { readNext(); k.append(text().toString()); } _reference["keywords"] = k.join(", "); } bool pubmedXml::reading(const QString& tag) { while (!atEnd()) { TokenType t = readNext(); if (t == StartElement) return true; else if (t == EndElement) if (name() == tag) return false; } return false; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/metadataParser.cpp�������������������������������������������������������������0000644�0001750�0001750�00000047277�12045520050�017506� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "metadataParser.h" #include "coreBibParser.h" #include "settings.h" #include <QDate> #include <QProcess> #include <QXmlStreamReader> /** \page metadata Reading and writing bibliographic metadata \section metadata_read Reading metadata Metadata in scientific documents is, unfortunately, rarely appreciated and not widely used. When it comes to bibliographic metadata, the situation is even quite deceiving: there is no accepted format specification, and the reliability of publishers' metadata, if any at all, is questionable in many cases. The cb2Bib reads all XMP (a specific XML standard devised for metadata storage) packets found in the document. It then parses the XML strings looking for nodes and attributes with key names meaningful to bibliographic references. If a given bibliographic field is found in multiple packets, the cb2Bib will take the last one, which most often, and according to the PDF specs, is the most updated one. The fields <tt>file</tt>, which would be the document itself, and <tt>pages</tt>, which is usually the actual number of pages, are skipped. The metadata is then summarized in the cb2Bib clipboard panel as, for instance \code [Bibliographic Metadata <title>arXiv:0705.0751v1 [cs.IR] 5 May 2007 /Bibliographic Metadata] \endcode This data, whenever the user considers it to be correct, can be easily imported by the build-in 'Heuristic Guess' capability. On the other hand, if keys are found with the prefix bibtex, the cb2Bib will assume the document does contain bibliographic metadata, and it will only consider the keys having this prefix. Assuming therefore that metadata is bibliographic, the cb2Bib will automatically import the reference. This way, if using PDFImport, BibTeX-aware documents will be processed as successfully recognized, without requiring any user supplied regular expression. See also \ref relnotes100, \ref c2bconf_clipboard, and \ref c2bpdfimport.

     

    \section metadata_write Writing metadata Once an extracted reference is saved and there is a document attached to it, the cb2Bib will optionally insert the bibliographic metadata into the document itself. The cb2Bib writes an XMP packet as, for instance, \code P. Constans arXiv 0705.0751 Approximate textual retrieval article 2007 \endcode which is similar to \htmlonly JabRef, \endhtmlonly but differs on that the cb2Bib strictly sticks to BibTeX and avoids (perhaps unnecessary) syntax specialization in author strings. The BibTeX fields file and id are skip from writing. The former for the reason mentioned above, and the latter because it is easily generated by specialized BibTeX software according to each user preferences. LaTeX escaped characters for non Ascii letters are converted to UTF-8, as XMP already specifies this codec. The actual writing of the packet into the document is performed by ExifTool, an excellent Perl program written by Phil Harvey. See \htmlonly http://www.sno.phy.queensu.ca/~phil/exiftool/. \endhtmlonly ExifTool supports several document formats for writing. The most relevant here are Postscript and PDF. For PDF documents, metadata is written as an incremental update of the document. This exactly preserves the binary structure of the document, and changes can be easily reversed or modified if so desired. Whenever ExifTool is unable to insert metadata, e.g., because the document format is not supported or it has structural errors, the cb2Bib will issue an information message, and the document will remain untouched. See also \ref c2bconf_documents and \ref update_metadata. */ metadataParser::metadataParser(QObject* parento) : QObject(parento) { _cbpP = new coreBibParser(this); init(); } metadataParser::metadataParser(coreBibParser* cbp, QObject* parento) : QObject(parento), _cbpP(cbp) { Q_ASSERT_X(_cbpP, "metadataParser", "coreBibParser was not instantiated"); init(); } void metadataParser::init() { _settingsP = settings::instance(); // Set bibliographic fields // Remove fields file (it is itself) and pages (usually number of pages) from list _fields = QRegExp("\\b(?:abstract|address|annote|author|authors|booktitle|chapter|" "doi|edition|editor|eprint|institution|isbn|issn|journal|" "keyword|keywords|key words|month|note|number|organization|" "pagerange|publicationname|publisher|school|series|title|url|volume|year)\\b"); _fields.setCaseSensitivity(Qt::CaseInsensitive); // Recognition from BibTeX entries _bibtex_fields = QRegExp("\\bbibtex:(?:abstract|address|annote|author|booktitle|chapter|" "doi|edition|editor|eprint|institution|isbn|issn|journal|" "keywords|month|note|number|organization|pages|publisher|" "school|series|title|url|volume|year)\\b"); _bibtex_fields.setCaseSensitivity(Qt::CaseInsensitive); // Set field keys equivalences const QStringList& bibliographicFields = _cbpP->bibliographicFields(); for (int i = 0; i < bibliographicFields.count(); ++i) _bibtex_key.insert(bibliographicFields.at(i), bibliographicFields.at(i)); _bibtex_key.insert("authors", "author"); _bibtex_key.insert("key words", "keywords"); _bibtex_key.insert("keyword", "keywords"); _bibtex_key.insert("pagerange", "pages"); _bibtex_key.insert("publicationname", "journal"); } const QString metadataParser::metadata(const QString& fn) { if (!_metadata(fn)) return QString(); QString data; if (_has_bibtex) data = _cbpP->referenceToBibTeX(_ref); else { const QStringList& bibliographicFields(_cbpP->bibliographicFields()); if (_ref.contains("type")) data += QString("<%1>%2\n").arg("type").arg(_ref.value("type")); for (int i = 0; i < bibliographicFields.count(); ++i) { const QString key(bibliographicFields.at(i)); if (_ref.contains(key)) data += QString("<%1>%2\n").arg(key).arg(_ref.value(key)); } } data = QString("[Bibliographic Metadata\n%1/Bibliographic Metadata]\n").arg(data); return data; } bool metadataParser::metadata(const QString& fn, bibReference* ref) { ref->clearReference(); bool has_reference(_metadata(fn)); has_reference = has_reference && _has_bibtex && _has_cb2bib; if (has_reference) (*ref) = _ref; return has_reference; } bool metadataParser::_metadata(const QString& fn) { QByteArray raw_contents; QFile f(fn); if (f.open(QIODevice::ReadOnly)) { raw_contents = f.readAll(); f.close(); } else return false; _ref.clearReference(); _ref.typeName = "article"; _has_bibtex = false; _has_cb2bib = false; _has_prism = false; QStringList xmls; _metadataXmp(fn, raw_contents, &xmls); // Last in list should be the most updated, parse it last for (int i = 0; i < xmls.count(); ++i) _fuzzyParser(xmls.at(i)); QMutableHashIterator it(_ref); while (it.hasNext()) { it.next(); it.value() = c2bUtils::fromQtXmlString(it.value()); } if (!_has_cb2bib) _miscellaneousData(fn, raw_contents); if (_ref.count() == 0) return false; if (_has_bibtex) if (_ref.contains("type")) _ref.typeName = _ref.value("type"); return true; } void metadataParser::_metadataXmp(const QString& fn, const QByteArray& raw_contents, QStringList* xmls) { xmls->clear(); int pos(0); while (pos > -1) { // Scan all packets, and do not trust "='' " etc, as producers encode differently pos = raw_contents.indexOf(" -1) { int posn(raw_contents.indexOf(" pos) { xmls->append(c2bUtils::toQtXmlString(QString::fromUtf8(raw_contents.mid(pos, posn - pos + 19)))); _has_bibtex = _has_bibtex || xmls->last().contains("bibtex:"); _has_cb2bib = _has_cb2bib || xmls->last().contains("http://www.molspaces.com/cb2bib"); _has_prism = _has_prism || xmls->last().contains("http://prismstandard.org/namespaces/basic/2.0"); pos = posn; } else pos = -1; } } if (xmls->count() == 0) _metadataXmpExifTool(fn, xmls); } void metadataParser::_miscellaneousData(const QString& fn, const QByteArray& raw_contents) { // Get title, author, and keywords from here whenever no cb2Bib BibTeX data is available QString data; QRegExp pdf_author_rx; QRegExp pdf_title_rx; QRegExp pdf_keywords_rx; const QString exiftool_bin(_settingsP->fileName("cb2Bib/ExifToolBin")); bool is_exiftool_available = !exiftool_bin.isEmpty(); if (is_exiftool_available) { QProcess exiftool; QStringList arglist; arglist.append(fn); exiftool.start(exiftool_bin, arglist); if (!exiftool.waitForFinished(90000)) exiftool.kill(); data = QString::fromUtf8(exiftool.readAllStandardOutput()); if (exiftool.error() == QProcess::UnknownError) // No error { pdf_author_rx.setPattern("Author\\s*:\\s+(.*)\\n"); pdf_title_rx.setPattern("Title\\s*:\\s+(.*)\\n"); pdf_keywords_rx.setPattern("Subject\\s*:\\s+(.*)\\n"); } else is_exiftool_available = false; } if (!is_exiftool_available) { if (!raw_contents.startsWith("%PDF")) return; data = _pdfDictionary(raw_contents); pdf_author_rx.setPattern("\\Author\\s*\\((.*)\\)"); pdf_title_rx.setPattern("\\Title\\s*\\((.*)\\)"); } pdf_author_rx.setMinimal(true); pdf_author_rx.setCaseSensitivity(Qt::CaseSensitive); if (pdf_author_rx.indexIn(data) > -1) if (!pdf_author_rx.cap(1).trimmed().isEmpty()) _ref["author"] = pdf_author_rx.cap(1); // Dublin Core Metadata keywords if exiftool is available if (_has_prism && is_exiftool_available) { pdf_keywords_rx.setMinimal(true); pdf_keywords_rx.setCaseSensitivity(Qt::CaseSensitive); if (pdf_keywords_rx.indexIn(data) > -1) if (!pdf_keywords_rx.cap(1).trimmed().isEmpty()) _ref["keywords"] = pdf_keywords_rx.cap(1); } // Done if BibTeX, otherwise try checking dictionary for title if (_has_bibtex) return; pdf_title_rx.setMinimal(true); pdf_title_rx.setCaseSensitivity(Qt::CaseSensitive); if (pdf_title_rx.indexIn(data) > -1) if (!pdf_title_rx.cap(1).trimmed().isEmpty()) _ref["title"] = pdf_title_rx.cap(1); } const QString metadataParser::_pdfDictionary(const QByteArray& rawpdf) { // Heuristic to locate the Pdf dictionary const int pos(rawpdf.lastIndexOf("/Producer")); if (pos > -1) { const int pos0(rawpdf.lastIndexOf("<<", pos)); if (pos0 > -1) { const int posn(rawpdf.indexOf(">>", pos)); if (posn > pos0) return QString::fromLatin1(rawpdf.mid(pos0, posn - pos0 + 2)); } } return QString(); } void metadataParser::_metadataXmpExifTool(const QString& fn, QStringList* xmls) { // Not actually needed, called for not directly visible XMP packages // It's slower than _metadataXmp() full scan. const QString exiftool_bin(_settingsP->fileName("cb2Bib/ExifToolBin")); if (exiftool_bin.isEmpty()) return; QProcess exiftool; QStringList arglist; arglist.append("-xmp"); arglist.append("-b"); arglist.append(fn); exiftool.start(exiftool_bin, arglist); if (!exiftool.waitForFinished(90000)) exiftool.kill(); QString xmp(c2bUtils::toQtXmlString(QString::fromUtf8(exiftool.readAllStandardOutput()))); if (xmp.startsWith("append(xmp); _has_bibtex = _has_bibtex || xmls->last().contains("bibtex:"); _has_cb2bib = _has_cb2bib || xmls->last().contains("http://www.molspaces.com/cb2bib"); _has_prism = _has_prism || xmls->last().contains("http://prismstandard.org/namespaces/basic/2.0"); } } void metadataParser::_fuzzyParser(const QString& data) { if (data.isEmpty()) return; QXmlStreamReader parser; parser.addData(data); QRegExp* fields; if (_has_bibtex) fields = &_bibtex_fields; else fields = &_fields; QString field; QString key; QString value; while (!parser.atEnd()) { parser.readNext(); if (parser.isStartElement()) { // Do attributes (seems poppler xml composing) QXmlStreamAttributes att = parser.attributes(); for (int i = 0; i < att.count(); ++i) { field = att.at(i).qualifiedName().toString(); key = att.at(i).name().toString().toLower(); value = att.at(i).value().toString(); if (value.isEmpty()) continue; if (field.contains(*fields)) _ref[_bibtex_key.value(key)] = value; else if (QString::compare(field, "summary", Qt::CaseInsensitive) == 0 || QString::compare(field, "subject", Qt::CaseInsensitive) == 0) { if (!_ref.contains("abstract")) // Prefer BibTeX field key if exists than synonyms _ref["abstract"] = value; } else if (QString::compare(field, "bibtex:type", Qt::CaseInsensitive) == 0 || QString::compare(field, "bibtex:entrytype", Qt::CaseInsensitive) == 0) _ref["type"] = value.toLower(); } // Do element (exiftool and exempi xml composing) field = parser.qualifiedName().toString(); key = parser.name().toString().toLower(); if (field.contains(*fields)) { parser.readNext(); value = parser.text().toString().trimmed(); if (!value.isEmpty()) _ref[_bibtex_key.value(key)] = value; } else if (!_has_bibtex && QString::compare(field, "prism:coverDate", Qt::CaseSensitive) == 0) { parser.readNext(); value = parser.text().toString().trimmed(); const QDate pdate(QDate::fromString(value, Qt::ISODate)); const QString pyear(pdate.toString("yyyy")); // Prefer BibTeX date over Prism if (!pyear.isEmpty() && !_ref.contains("year")) _ref["year"] = pyear; const QString pmonth(pdate.toString("d MMMM")); if (!pmonth.isEmpty() && !_ref.contains("month")) _ref["month"] = pmonth; } else if (QString::compare(field, "summary", Qt::CaseInsensitive) == 0 || QString::compare(field, "subject", Qt::CaseInsensitive) == 0) { parser.readNext(); value = parser.text().toString().trimmed(); if (!value.isEmpty() && !_ref.contains("abstract")) // Prefer BibTeX field key if exists than synonyms _ref["abstract"] = value; } else if (QString::compare(field, "bibtex:type", Qt::CaseInsensitive) == 0 || QString::compare(field, "bibtex:entrytype", Qt::CaseInsensitive) == 0) { parser.readNext(); value = parser.text().toString().trimmed(); if (!value.isEmpty()) _ref["type"] = value.toLower(); } } } if (parser.hasError()) c2bUtils::debug(tr("metadataParser: Error while parsing XML packets")); } bool metadataParser::insertMetadata(const bibReference& ref, const QString& fn, QString* error) const { if (error) error->clear(); const QString exiftool_bin(_settingsP->fileName("cb2Bib/ExifToolBin")); if (exiftool_bin.isEmpty()) { if (error) *error = tr("Metadata writer: ExifTool location has not been specified."); else emit showMessage(tr("Warning - cb2Bib"), tr("Metadata writer: ExifTool location has not been specified.")); return false; } if (ref.count() == 0) return false; QString bibtags; QString key; QString value; QString entry("%2\n"); bibtags += entry.arg("type").arg(ref.typeName); const QStringList& bibliographicFields = _cbpP->bibliographicFields(); for (int i = 0; i < bibliographicFields.count(); ++i) { key = bibliographicFields.at(i); value = ref.value(key); if (value.isEmpty()) continue; if (key == "file") continue; else if (key == "id") continue; c2bUtils::fullBibToC2b(value); if (key == "title" || key == "booktitle") c2bUtils::cleanTitle(value); bibtags += entry.arg(key).arg(value); } QString bibtags_xmp(c2bUtils::fileToString(":/xml/xml/cb2bib.xmp")); bibtags_xmp.replace("GET_BIBTEX_TAGS", bibtags); bibtags_xmp.replace("GET_FORMATTED_AUTHOR", formattedAuthor(ref.value("author"))); const QString workdir(QFileInfo(fn).absolutePath()); const QString bibtags_file(workdir + "/bibtags.xmp"); c2bUtils::stringToFile(bibtags_xmp, bibtags_file); QProcess exiftool; QStringList arglist; arglist.append("-overwrite_original"); arglist.append("-m"); arglist.append("-TagsFromFile"); arglist.append(bibtags_file); arglist.append("-all:all"); arglist.append("-pdf:all-',;&\\.\\s\\w - Simplify White Spaces - Consider composing prefixes (da|de|dal|del|der|di|do|du|dos|la|le|van|vande|von) - Consider composing suffixes (II|III|IV|Jr) - Some publishers use superscripts to refer to multiple author affiliations. Text clipboard copying loses superscript formatting. Author strings are clean from 'orphan' lowcase, single letters in a preprocessing step. Everything following the pattern [a-z] is removed. Fortunately, abbreviated initials are most normally input as uppercase letters, thus permitting a correct superscript clean up. \n Caution: Lowcase, single, a to z letters are removed from author's string.\n Caution: Supperscripts will be added to author Last Name if no separation is provided. Users should care about it and correct these cases. Rules to identify separators: - Contains comma and semicolon -> ';' - Contains pattern '^Abcd, E.-F.,' -> ',' - Contains pattern '^Abcd,' -> 'and' - Contains comma -> ',' - Contains semicolon -> ';' - Any other -> 'and' */ QString authorString::toBibTeX(const QString& author, bool full_form) { _full_form = full_form; _author_string = author; author::simplifyString(_author_string, true); as_unifier.unifyNames(_author_string); const bool has_comma(_author_string.contains(',')); const bool has_semicolon(_author_string.contains(';')); const bool has_ands(_author_string.count(" and ") > 1); const bool is_first_reversed(_author_string.contains(author::reversed_name_rx)); const bool is_special_case(_author_string.contains(author::reversed_romance_name_rx)); bool is_string_reversed((has_comma && has_semicolon) || (has_comma && has_ands) || is_special_case); QString separator; if (is_special_case) separator = " and "; else if (has_comma && has_semicolon) separator = ';'; // Multiple Authors, separated by semicolon, reversed naming else if (has_comma) { if (is_first_reversed) { if (_author_string.contains(QRegExp('^' + author::name + ",(?:\\s*-{0,1}\\b\\w\\b\\.){1,3},\\s*" + author::name))) { _author_string.replace(QRegExp("\\bJr.", Qt::CaseSensitive), "Jr"); _author_string.replace(".,", ".;"); separator = ';'; // Reversed, comma separated 'Abrahamsson, A.-L., Springett, J., Karlsson, L., Ottosson, T.' is_string_reversed = true; } else if (_author_string.contains(QRegExp('^' + author::name + ',' + author::initials + ','))) { _author_string.replace(QRegExp("^([-'\\w]+),"), "\\1 "); separator = ','; // Mixed naming 'Smith, J.-L., R. Jones, and K. Gibbons' } else separator = " and "; // Reversed naming } else if (has_ands) separator = " and "; else // Natural naming separator = ','; } else if (has_semicolon) separator = ';'; // Multiple Authors, separated by semicolon else separator = " and "; c2bUtils::debug(QObject::tr("Separator: |%1|").arg(separator)); c2bUtils::debug("1--|" + _author_string + '|'); _author_string.replace(QRegExp("\\band\\b", Qt::CaseInsensitive), separator); _author_string.replace(QRegExp("\\s&\\s", Qt::CaseInsensitive), separator); c2bUtils::debug("2--|" + _author_string + '|'); _author_string.remove(QRegExp("[^\\w\\.]+$")); // Removing of duplicate commas and semicolons _author_string.replace(QRegExp(",\\s*"), ","); c2bUtils::debug("3--|" + _author_string + '|'); _author_string.replace(QRegExp(",+"), ","); _author_string.replace(QRegExp(";\\s*"), ";"); _author_string.replace(QRegExp(";+"), ";"); c2bUtils::debug("4--|" + _author_string + '|'); const bool are_authors_in_uppercase(containUpperCaseLetter(_author_string) && !containLowerCaseLetter(_author_string)); if (are_authors_in_uppercase) c2bUtils::debug("Input Authors in Uppercase"); QStringList authors; if (separator == " and ") authors = _author_string.split(QRegExp("\\band\\b")); else authors = _author_string.split(separator); // Setting author ordering const QString first_author(authors.first().trimmed()); bool is_current_reversed(is_string_reversed || is_first_reversed || isReverseOrder(first_author)); const QString last_author(authors.last().trimmed()); const bool is_last_reversed(is_string_reversed || last_author.contains(author::reversed_name_rx) || isReverseOrder(last_author)); const bool is_string_mixed(is_current_reversed && !is_last_reversed); if (is_string_mixed) // Mixed naming 'Smith, J., R. Jones' c2bUtils::debug("Mixed order"); // Process each author name for (int ai = 0; ai < authors.count(); ++ai) { QString author_i(authors.at(ai)); c2bUtils::debug(author_i); author_i.replace(QRegExp("\\.{0,1}\\s{0,1}-"), "-"); // Abbreviated cases, eg M.-H. Something author_i.replace(QRegExp("[^-'\\w,]"), " "); // Only these characters compose a name; keep commas author_i = c2bUtils::simplifyString(author_i); // Split author name QStringList fore_name_parts; QString last_name; if (is_current_reversed) { const QStringList parts(author_i.split(',', QString::SkipEmptyParts)); const int nparts(parts.count()); if (nparts == 2) { QStringList p(parts.first().split(' ', QString::SkipEmptyParts)); if (p.count() > 0) last_name = p.takeLast(); fore_name_parts = parts.last().split(' ', QString::SkipEmptyParts) + p; } else if (nparts == 3) { QStringList p(parts.first().split(' ', QString::SkipEmptyParts)); if (p.count() > 0) last_name = p.takeLast(); fore_name_parts = parts.at(1).split(' ', QString::SkipEmptyParts) + p; if (parts.last().contains(QRegExp("^(?:Jr|II|III|IV)$"))) // If otherwise, ignore it last_name += '_' + parts.last(); } else { fore_name_parts = author_i.split(' ', QString::SkipEmptyParts); if (fore_name_parts.count() > 0) last_name = fore_name_parts.takeFirst(); } c2bUtils::debug("Reversed order"); } else { fore_name_parts = author_i.split(' ', QString::SkipEmptyParts); if (fore_name_parts.count() > 0) last_name = fore_name_parts.takeLast(); c2bUtils::debug("Natural order"); } // Process first and middle names QString author_name; for (int i = 0; i < fore_name_parts.count(); ++i) { c2bUtils::debug("First and Midle: " + fore_name_parts.at(i)); if (fore_name_parts.at(i).contains('-')) // Composite names { const QStringList fnpi(fore_name_parts.at(i).split('-')); if (fnpi.count() > 1) { author_name += processFirstMiddle(fnpi.at(0)) + '-'; author_name += processFirstMiddle(fnpi.at(1)) + ' '; // Shouldn't be more than 2 parts... } } else // Regular names { QString fore_name(fore_name_parts.at(i)); const int fore_length(fore_name.length()); const bool is_uppercase(!containLowerCaseLetter(fore_name)); if (fore_name_parts.count() == 1 && fore_length > 1 && !fore_name.contains(QRegExp("\\b" + author::double_initials + '_', Qt::CaseInsensitive)) && !are_authors_in_uppercase && is_uppercase) { // Cases 'Last, FST': Always abbreviated, no call to processFirstMiddle for (int l = 0; l < fore_length; ++l) author_name += fore_name[l] + ". "; } else if (fore_name_parts.count() == 2 && fore_length > 1 && fore_length < 3 && is_current_reversed && !are_authors_in_uppercase && is_uppercase) { // Cases 'Last1 Last2, FST': Always abbreviated, no call to processFirstMiddle for (int l = 0; l < fore_length; ++l) author_name += fore_name[l] + ". "; } else if (i == 1 && fore_name_parts.count() == 2 && fore_length > 1 && fore_length < 3 && !is_current_reversed && !are_authors_in_uppercase && is_uppercase) { // Cases 'Fore IJ Last': Process initials for (int l = 0; l < fore_length; ++l) author_name += fore_name[l] + ". "; } else author_name += processFirstMiddle(fore_name) + ' '; } } // Add last name author_name += capitalize(last_name); authors[ai] = author_name; c2bUtils::debug(author_name); if (is_string_mixed) // Mixed naming 'Smith, J., R. Jones' is_current_reversed = false; } authors.removeAll(QString()); _author_string = authors.join(" and "); // Restore Composite Names white spaces _author_string.replace("_i_", " i "); _author_string.replace(QRegExp("_II\\b", Qt::CaseInsensitive), " II"); // Suffix can be lower case here _author_string.replace(QRegExp("_III\\b", Qt::CaseInsensitive), " III"); _author_string.replace(QRegExp("_IV\\b", Qt::CaseInsensitive), " IV"); _author_string.replace(QRegExp("_JR\\b", Qt::CaseInsensitive), " Jr"); _author_string.replace(QRegExp(author::prefixes + '_', Qt::CaseInsensitive), "\\1 "); _author_string.replace(QRegExp("\\b" + author::double_initials + '_', Qt::CaseInsensitive), "\\1."); _author_string = c2bUtils::simplifyString(_author_string); return _author_string; } QString authorString::processFirstMiddle(const QString& first_middle) const { // Process First and Middle parts // Abbreviates if required // Takes care of abbreviation periods QString proc_fm; if (_full_form) { if (first_middle.length() > 1) proc_fm = capitalize(first_middle); else proc_fm = first_middle + '.'; } else { if (first_middle.contains('_')) // Composite names should not be abbreviated { proc_fm = capitalize(first_middle); if (first_middle.length() - first_middle.indexOf('_') == 2) proc_fm += '.'; } else proc_fm = first_middle.left(1) + '.'; } return proc_fm; } QString authorString::capitalize(const QString& name) { // Capitalizes author's name if (name.isEmpty()) return QString(); QString proc_name(name); int ii(0); const int prefixes(proc_name.count(QRegExp(author::prefixes + "_(?!(?:Jr|II|III|IV)\\b)", Qt::CaseInsensitive))); for (int p = 0; p < prefixes; ++p) { const int iin(proc_name.indexOf('_', ii)); if (c2bUtils::isUpperCaseString(proc_name, ii, iin)) for (int i = 0; i < iin; ++i) proc_name[i] = proc_name.at(i).toLower(); ii = qMin(iin + 1, proc_name.length() - 1); } if (c2bUtils::isUpperCaseString(proc_name, ii)) { proc_name[ii] = proc_name.at(ii).toUpper(); for (int i = ++ii; i < proc_name.length(); ++i) proc_name[i] = proc_name.at(i).toLower(); ii = proc_name.indexOf(QRegExp("[\\s-']")); // As before, assume just one part if (ii++ > 0) if (ii < proc_name.length()) proc_name[ii] = proc_name.at(ii).toUpper(); if (proc_name.startsWith("Mc")) if (proc_name.length() > 4) proc_name[2] = proc_name.at(2).toUpper(); } return proc_name; } /** \page authorproc Rules to identify ordering: - Contains comma and semicolon -> Reverse - Pattern '^Abcd,' -> Reverse - Pattern '^Abcd EF Ghi' -> Natural - Pattern '^Abcd EF' -> Reverse - Pattern '^Abcd E.F.' -> Reverse - Any other pattern -> Natural */ bool authorString::isReverseOrder(const QString& author) { // Returns true if Author Name is in reversed order as "Him DF, Her SR, " // ISI doesn't contain point - return for safety // Consider "Him DF Last" const QString author_line(author.simplified()); QRegExp rRevNISI("^([-'\\w]+) ((\\w\\.\\s*)+)$"); rRevNISI.setMinimal(false); if (rRevNISI.indexIn(author_line) > -1) { const QString Last(rRevNISI.cap(3)); if (Last != "and") return true; } if (author_line.contains('.')) return false; rRevNISI = QRegExp("^([-'\\w]+) ([-'\\w]+) ([-'\\w]+)"); rRevNISI.setMinimal(false); if (rRevNISI.indexIn(author_line) > -1) { const QString Last(rRevNISI.cap(3)); if (Last != "and") return false; } rRevNISI = QRegExp("^([-'\\w]+) ([-\\w]{1,3})$"); // Consider only 1 to 3 initials rRevNISI.setMinimal(false); if (rRevNISI.indexIn(author_line) > -1) { const QString Last(rRevNISI.cap(1)); const QString First(rRevNISI.cap(2)); c2bUtils::debug(QObject::tr("ISI: |%1| |%2|").arg(Last).arg(First)); if (containLowerCaseLetter(First)) return false; if (!containLowerCaseLetter(Last)) return false; return true; } return false; } bool authorString::containLowerCaseLetter(const QString& author) { QString author_line(author); author_line.remove(QRegExp("\\band\\b")); // Remove possible 'and' separator author_line.remove(QRegExp(author::prefixes + '_', Qt::CaseInsensitive)); // Remove possible prefixes author_line.remove(QRegExp(author::double_initials + '_', Qt::CaseSensitive)); // Remove possible two-letter initials for (int i = 0; i < author_line.length(); i++) { if (author_line.at(i).isLetter()) if (author_line.at(i).category() == QChar::Letter_Lowercase) return true; } return false; } bool authorString::containUpperCaseLetter(const QString& author) { for (int i = 0; i < author.length(); i++) { if (author.at(i).isLetter()) if (author.at(i).category() == QChar::Letter_Uppercase) return true; } return false; } namespace author { unifier::unifier() { unifier_rx1 = QRegExp("(\\w\\w)\\si\\s(\\w\\w)(?!d\\b)", Qt::CaseSensitive); unifier_rx2 = QRegExp("\\b" + prefixes + "\\s(?!(?:,|and\\b))", Qt::CaseInsensitive); unifier_rx3 = QRegExp("\\b" + double_initials + "\\.", Qt::CaseInsensitive); unifier_rx4 = QRegExp("\\b(\\w[-'\\w]{2,})\\W+Jr\\.", Qt::CaseInsensitive); unifier_rx5 = QRegExp("\\b(\\w[-'\\w]{2,})\\W+Jr\\b", Qt::CaseInsensitive); unifier_rx6 = QRegExp("(\\w),{0,1}\\s(II|III|IV)\\b", Qt::CaseSensitive); unifier_rx7 = QRegExp("([^\\w-])[a-z](?=[^\\w'])"); } QString& unifier::unifyNames(QString& author) { // Composite Names temporary unified author.replace(unifier_rx1, "\\1+i+\\2"); author.replace(unifier_rx2, "\\1+"); author.replace("Da+", "Da ", Qt::CaseSensitive); author.replace(unifier_rx3, "\\1+ "); if (author.contains("Jr", Qt::CaseInsensitive)) { // Remove period and first comma if there author.replace(unifier_rx4, "\\1+JR"); author.replace(unifier_rx5, "\\1+JR"); } if (author.contains('I', Qt::CaseSensitive)) author.replace(unifier_rx6, "\\1+\\2"); author.replace('+', '_'); author.replace(unifier_rx7, "\\1 "); // Cleaning affiliation 'superscripts'. Avoid cleaning 'M.-m. Lin' return author; } QString fromMedline(const QString& author) { // Preprocess Author from Medline 'AAAAAAA BB' to Aaaaaaa, BB' // which can be unambiguously translated to 'B. B. Aaaaaaa' // Takes care of cb2Bib included prefixes and suffixes // FAU - Foa, Edna B // AU - Foa EB // FAU - Steketee, Gail S // AU - Steketee GS QString FullN(author.simplified()); FullN.replace(QRegExp("\\b" + prefixes + "\\s", Qt::CaseInsensitive), "\\1+"); FullN.replace('+', '_'); QStringList parts; QString LastN; if (FullN.contains(',')) // Some FAU are 'Last1 Last2, First' { parts = FullN.split(',', QString::SkipEmptyParts); if (parts.count() > 1) LastN = parts.takeFirst(); } else { parts = FullN.split(' ', QString::SkipEmptyParts); if (parts.count() > 1) LastN = parts.takeFirst(); } FullN = parts.join(" "); parts = FullN.split(' ', QString::SkipEmptyParts); if (!LastN.isEmpty()) if (c2bUtils::isUpperCaseString(LastN)) { LastN = LastN.toLower(); LastN[0] = LastN.at(0).toUpper(); int ii(LastN.indexOf(QRegExp("[-']"))); if (ii++ > 0) LastN[ii] = LastN.at(ii).toUpper(); } QString FirstN; for (int i = 0; i < parts.count(); ++i) FirstN += ' ' + parts.at(i); QString isSuffix; if (parts.count() > 0) isSuffix = parts.last(); if (isSuffix.contains(QRegExp("\\b(?:2nd|3rd|Jr|II|III)\\b"))) { isSuffix.replace(QRegExp("\\b2nd\\b"), "II"); isSuffix.replace(QRegExp("\\b3rd\\b"), "III"); LastN += ' ' + isSuffix; FirstN.remove(QRegExp("\\b(?:2nd|3rd|Jr|II|III)\\b")); } LastN.replace(QRegExp(prefixes + '_', Qt::CaseInsensitive), "\\1 "); FullN = LastN + ',' + FirstN; return FullN; } /** Implementation of author field extraction P. Constans. A Simple Extraction Procedure for Bibliographical Author Field. arXiv:0902.0755v1, 2009. */ void encoder::encode(const QString& raw) { clear(); QString str(raw); as_unifier.unifyNames(str); int position(0); int length(0); for (int i = 0; i < str.length(); ++i) { const QChar& si = str[i]; if (si.isLetter()) ++length; else if (si == '_') ++length; else if (si == '-') ++length; else if (si == '\'') ++length; else { if (length > 0) fragments.append(str.mid(position, length)); position = i + 1; length = 0; if (si != ' ') fragments.append(str.at(i)); } } if (length > 0) fragments.append(str.mid(position, length)); for (int i = 0; i < fragments.count(); ++i) { const QString& w = fragments.at(i); if (isSeparator(w)) code += '&'; else if (isAdparticle(w)) code += 'a'; else if (isInitial(w)) code += 'I'; else if (isPlainWord(w)) code += 'w'; else if (isName(w)) { if (isCapitalName(w)) code += 'N'; else code += 'n'; } else if (w.at(0) == '.') code += 'p'; else if (w.at(0) == ',') code += ','; else if (w.at(0) == ';') code += ';'; else if (w.at(0) == ':') code += ':'; else if (w.at(0) == '|') code += 'L'; else code += 'o'; } scapePattern("aL+[nN]{1,2}"); scapePattern("a[nNw]&L+[nN]{1,2}"); // in Linear and / Sublinear Time scapePattern(":L+[InN]{1,2}"); // ... Structure Classification: / A Survey scapePattern("[nN]*&L[nN]L"); // Not an & for author } QString encoder::decoded(const int position, const int length) const { if (position < 0) return QString(); if (length < 1 || position + length > fragments.count()) return QString(); QString d(fragments.at(position)); for (int i = 1; i < length; ++i) d += ' ' + fragments.at(position + i); // Above extra spaces are fine, except in these cases d.replace(" . -", ".-"); d.replace(" ,", ","); return d; } bool encoder::isPlainWord(const QString& w) { if (w.length() > 1) { if (w.contains('_') || w.contains('-')) return c2bUtils::isLowerCaseString(w); if (w.at(0).isLetter()) if (w.at(0).category() == QChar::Letter_Lowercase) return true; } return false; } bool encoder::isInitial(const QString& w) { if (w.length() == 1) if (w.at(0).isLetter()) return w.at(0).isUpper(); if (w.length() == 2) if (w.at(0) == '-') if (w.at(1).isLetter()) return true; // Chinese composite might(?) be lower return false; } bool encoder::isName(const QString& w) { if (w.length() < 2) return false; if (w.at(0).isUpper()) return true; if (w.contains('_')) return hasUpper(w); return false; } bool encoder::isAdparticle(const QString& w) { const int ws(w.size()); if (ws < 2) return false; if (ws > 6) return false; const QByteArray ba(w.toLatin1()); const char* s = ba.data(); const int ss(ws * int(sizeof(char))); if (ws == 2) { if (memcmp("of", s, ss) == 0) return true; if (memcmp("on", s, ss) == 0) return true; if (memcmp("to", s, ss) == 0) return true; if (memcmp("in", s, ss) == 0) return true; if (memcmp("as", s, ss) == 0) return true; if (memcmp("vs", s, ss) == 0) return true; if (memcmp("at", s, ss) == 0) return true; if (memcmp("is", s, ss) == 0) return true; if (memcmp("an", s, ss) == 0) return true; } if (ws == 3) { if (memcmp("for", s, ss) == 0) return true; if (memcmp("but", s, ss) == 0) return true; if (memcmp("are", s, ss) == 0) return true; if (memcmp("its", s, ss) == 0) return true; if (memcmp("the", s, ss) == 0) return true; } if (ws == 4) { if (memcmp("from", s, ss) == 0) return true; if (memcmp("with", s, ss) == 0) return true; if (memcmp("into", s, ss) == 0) return true; } if (ws == 6) { if (memcmp("within", s, ss) == 0) return true; } return false; } } // namespace author cb2bib-1.4.9/src/c2b/collectionIndex.h0000644000175000017500000000342512045520050017324 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef COLLECTIONINDEX_H #define COLLECTIONINDEX_H #include #include class bibParser; class settings; class QTextStream; class collectionIndex { public: collectionIndex(bibParser* bp); ~collectionIndex(); int index(const QString& dir); private: struct KeysentenceData { inline KeysentenceData() : ndocuments(0) {} inline KeysentenceData(const int document) : ndocuments(1) { documents.append(document); } inline void update(const int document) { ++ndocuments; documents.append(document); } int ndocuments; QList documents; }; KeysentenceData* _digest_sentence(KeysentenceData* ksd, KeysentenceData* ksdndmax, int* ndmax) const; QString preprocessedText(const QString& journal, const QString& text) const; QString& replace(QString& str, const QChar& a, const QChar& b) const; bool isValidKeySentence(const QString& text) const; void analyzeKeySentences(); void cleanupKeySentences(); void digestKeySentences(); void setKeySentences(const int documentid, const QString& text); QTextStream& _out; bibParser* _bpP; const QChar _space_char; int _nerrors; settings* _settingsP; QHash _keysentences; QMultiHash _document_sentences; QMultiHash _document_sentenceids; }; #endif cb2bib-1.4.9/src/c2b/approximatePattern.cpp0000644000175000017500000002454312045520050020427 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * Class implementation of the approximate search algorithm * P. Constans. Approximate textual retrieval. arXiv:0705.0751v1, 2007. ***************************************************************************/ #include "approximatePattern.h" #include "cb2bib_utilities.h" #include "triads.h" approximatePattern::approximatePattern() : compositePattern() {} approximatePattern::approximatePattern(const QString& pattern, const Qt::CaseSensitivity cs) : compositePattern(pattern, cs) { setPattern(pattern, cs); } void approximatePattern::setPattern(const QString& pattern, const Qt::CaseSensitivity cs) { _string = pattern.simplified(); _case_sensitivity = cs; _is_multipattern = false; _matched_length = -1; _subpattern_count = 0; // Exact match if (_string.length() < 5) { _regexp.setPattern(escape(_string, _case_sensitivity)); return; } // Single word: Allow 1 error (1 missing / 3 excess), anywhere if (wordCount(_string) == 1) { _regexp.setPattern(wordPattern(_string, _case_sensitivity)); return; } // Multiple words _prefixes = c2bUtils::fileToString(":/txt/txt/prefixes.txt").split(c2bUtils::nonLetter, QString::SkipEmptyParts); _suffixes = c2bUtils::fileToString(":/txt/txt/suffixes.txt").split(c2bUtils::nonLetter, QString::SkipEmptyParts); splitPattern(); if (_string_pieces.count() < 3) // Cases: "qq pp", "qqq pp", etc { _regexp.setPattern(wordPattern(_string, _case_sensitivity)); return; } _is_multipattern = true; // Set parameters const double percent_scan(50.); const double scan_factor(100. / percent_scan); const int max_blocks(_string_pieces.count() / 2); const int requested_blocks(c2bUtils::nearInteger(scan_factor)); const int blocks(qMin(max_blocks, 1 + requested_blocks)); int pieces_per_block(_string_pieces.count() / blocks); // Ceiling if ((_string_pieces.count() % blocks) > 0) ++pieces_per_block; #if C2B_DEBUG_APPROXIMATEPATTERN qDebug() << _string_pieces << max_blocks << scan_factor << requested_blocks << pieces_per_block << _string_pieces.count() % blocks; for (int b = 0; b < blocks; ++b) for (int i = 0; i < pieces_per_block; ++i) if (b + (i * blocks) < _string_pieces.count()) qDebug() << "block# " << b << "pick item " << b + (i * blocks) << _string_pieces.at(b + (i * blocks)); #endif _ranks.clear(); QStringList submatcher; QStringList subpattern; QStringList substring; const QString sp_stretch(".{0,%1}%2"); for (int b = 0; b < blocks; ++b) { int ii(b); QString sm(_string_pieces.at(ii)); QString sp(escape(_string_pieces.at(ii), _case_sensitivity)); QString ss(_string_pieces.at(ii)); double stretch_product(1.); for (int j = 1; j < pieces_per_block; ++j) { int jj(b + (j * blocks)); if (jj < _string_pieces.count()) { const int st(stretch(ii, jj)); sm += sp_stretch.arg(st).arg(_string_pieces.at(jj)); sp += sp_stretch.arg(st).arg(escape(_string_pieces.at(jj), _case_sensitivity)); ss += ' ' + _string_pieces.at(jj); stretch_product *= st; ii = jj; } } submatcher.append(sm); subpattern.append(sp); substring.append(ss); _ranks.append(stretch_product * triads::textFrequency(ss)); // Rank according expectation (arXiv:0705.0751v1, Eq. 6) ++_subpattern_count; } set_sort_index(); _regexp.setPattern(QString("(?:%1)").arg(subpattern.join("|"))); _submatchers.resize(_subpattern_count); _subregexps.resize(_subpattern_count); _substrings.clear(); for (int i = 0; i < _subpattern_count; ++i) { const int ii(_index.at(i)); _submatchers[i] = substringMatcher(submatcher.at(ii), _case_sensitivity); _subregexps[i] = QRegExp(subpattern.at(ii), Qt::CaseSensitive, QRegExp::RegExp2); _subregexps[i].setMinimal(false); _substrings.append(substring.at(ii)); } _p0.resize(_subpattern_count); _pn.resize(_subpattern_count); } void approximatePattern::splitPattern() { if (_string.isEmpty()) return; QStringList wordList; QList wordStarts; QList wordEnds; splitPattern(_string, &wordList, &wordStarts, &wordEnds); for (int i = 0; i < wordList.count(); ++i) { const QStringList pieces(splitWord(wordList.at(i))); const QString prefix(pieces.at(0)); if (prefix.length() > 2) { _string_pieces.append(prefix); _piece_starts.append(wordStarts.at(i)); _piece_ends.append(wordStarts.at(i) + prefix.length()); } const QString suffix(pieces.at(1)); if (suffix.length() > 2) { _string_pieces.append(suffix); _piece_starts.append(wordEnds.at(i) - suffix.length()); _piece_ends.append(wordEnds.at(i)); } } } void approximatePattern::splitPattern(const QString& p, QStringList* w, QList* ws, QList* we) { w->clear(); ws->clear(); we->clear(); QString str(p); str.replace(c2bUtils::nonLetter, " "); str.append(' '); int w_starts(0); int w_ends(0); bool in_word(false); for (int i = 0; i < str.length(); ++i) if (str.at(i) == ' ') { if (in_word) { // Word actually ends at i - 1. However, this convention simplifies things. w_ends = i; w->append(str.mid(w_starts, w_ends - w_starts)); ws->append(w_starts); we->append(w_ends); } in_word = false; } else { if (!in_word) w_starts = i; in_word = true; } } const QStringList approximatePattern::splitWord(const QString& word) const { // Returns the pair "prefix+root root+suffix" const int minimum_length(5); const int wlen(word.length()); if (wlen < minimum_length) return QStringList() << word << word; QString w(word.toLower()); int plen_min(wlen); int slen_min(wlen); int plen_max(0); int slen_max(0); for (int i = 0; i < _prefixes.count(); ++i) if (w.startsWith(_prefixes.at(i))) { const int plen(_prefixes.at(i).length()); if (plen < plen_min) plen_min = plen; if (plen > plen_max) plen_max = plen; } for (int i = 0; i < _suffixes.count(); ++i) if (w.endsWith(_suffixes.at(i))) { const int slen(_suffixes.at(i).length()); if (slen < slen_min) slen_min = slen; if (slen > slen_max) slen_max = slen; } if (plen_min == wlen) plen_min = 0; if (slen_min == wlen) slen_min = 0; w = word; const int wlenMp_min(qMax(plen_min, wlen - slen_min)); const int wlenMs_min(qMax(slen_min, wlen - plen_min)); const int wlenMp_max(qMax(plen_max, wlen - slen_max)); const int wlenMs_max(qMax(slen_max, wlen - plen_max)); #if C2B_DEBUG_APPROXIMATEPATTERN qDebug() << wlenMp_min << wlenMs_min << w.left(wlenMp_min) << w.right(wlenMs_min); qDebug() << wlenMp_max << wlenMs_max << w.left(wlenMp_max) << w.right(wlenMs_max); #endif if (wlenMp_max >= minimum_length && wlenMs_max >= minimum_length) return QStringList() << w.left(wlenMp_max) << w.right(wlenMs_max); else if (wlenMp_min >= minimum_length && wlenMs_min >= minimum_length) return QStringList() << w.left(wlenMp_min) << w.right(wlenMs_min); else return QStringList() << word << word; } QString approximatePattern::wordPattern(const QString& word, Qt::CaseSensitivity cs) { const int len(word.length()); const QString ord(word.right(len - 1)); QStringList possible; possible.append(escape(ord.left(len - 2), cs)); for (int i = 1; i < len - 2; ++i) possible.append(QString("%1.{0,2}%2").arg(escape(ord.left(len - i - 3), cs)).arg(escape(ord.right(i), cs))); #if C2B_DEBUG_APPROXIMATEPATTERN qDebug() << "WordPattern: " << QString("(?:%1(?:%2)|%3)").arg(escape(word.at(0), cs)).arg(possible.join("|")).arg(escape(ord, cs)); #endif return QString("(?:%1(?:%2)|%3)").arg(escape(word.at(0), cs)).arg(possible.join("|")).arg(escape(ord, cs)); } int approximatePattern::wordCount(const QString& str) { const QString tstr(QString(str).replace(c2bUtils::nonLetter, " ").simplified()); return 1 + tstr.count(' '); } int approximatePattern::stretch(int piece_i, int piece_j) const { const int minStretch(3); const int maxStretch(20); if (_string_pieces.at(piece_j).length() > 4) return qMax((maxStretch * (piece_j - piece_i)), minStretch * (_piece_starts.at(piece_j) - _piece_ends.at(piece_i))); else return minStretch * (_piece_starts.at(piece_j) - _piece_ends.at(piece_i)); // Estimated error ratio only } void approximatePattern::mergeIndices(int* index_in, const QString& str) const { int index = str.length(); for (int i = 0; i < _subpattern_count; ++i) if (_p0.at(i) != -1 && _p0.at(i) < index) index = _p0.at(i); if (index == str.length()) index = -1; else { int pn(0); for (int i = 0; i < _subpattern_count; ++i) if (_pn.at(i) > pn && _p0.at(i) == index) pn = _pn.at(i); for (int m = 0; m < _subpattern_count; ++m) for (int i = 0; i < _subpattern_count; ++i) if (_pn.at(i) > pn && _p0.at(i) < pn) pn = _pn.at(i); // Beautify match by including whole words for (int w = index - 1; w > std::max(0, index - 13); --w) if (!str.at(w).isLetter()) { index = w + 1; break; } for (int w = pn; w < std::min(pn + 13, str.length()); ++w) if (!str.at(w).isLetter()) { pn = w; break; } _matched_length = pn - index; } *index_in = index; } cb2bib-1.4.9/src/c2b/heuristicBibParser.cpp0000644000175000017500000010351212045520050020323 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "heuristicBibParser.h" #include "bibParser.h" #include "journalDB.h" #include "qtregexp/eqregexp.h" #include heuristicBibParser::heuristicBibParser(bibParser* bp) : _bpP(bp), _current_reference(bp->_current_reference), _reliable_number(false), _reliable_pages(false), _reliable_volume(false), _abstract("abstract"), _addauthors("addauthors"), _author("author"), _isbn("isbn"), _keywords("keywords"), _number("number"), _pages("pages"), _title("title"), _volume("volume"), _year("year"), _bibliographic_fields(bp->_bibliographic_fields), _journal_db(*bp->_journal_dbP) { _leading_non_letters = QRegExp("^[^<\\w]+"); // Char 65533 appears many times in pdftotext outputs on windows (seems an encoding error, though) _hyphens = QRegExp("\\s*[-" + QString(QChar(8211)) + QString(QChar(8722)) + QString(QChar(65533)) + "]+\\s*"); _hyphen_nums = "(?:\\d+|\\d+-\\d+)"; _hyphen_pages = "(?:\\d+|\\d+-\\d+p{0,2}|\\d+ \\d+pp)"; _max_year = 3 + QDate::currentDate().year(); // Setup author recognition // Implementation of author field extraction // P. Constans. A Simple Extraction Procedure for Bibliographical Author Field. // arXiv:0902.0755v1, 2009. _word_prefix_lexicon = c2bUtils::fileToString(":/txt/txt/word_prefix_lexicon.txt").split(c2bUtils::nonLetter, QString::SkipEmptyParts); for (int i = 0; i < _word_prefix_lexicon.count(); ++i) { _word_prefix_lexicon[i].replace('_', ' '); _word_prefix_lexicon[i].squeeze(); } const QString author_lc_t("(?:n%1n|n%1%1n|%1n|%1nn|%1%1n|%1%1%1n|n%1nn|nn%1n|%1%1nn|%1n%1n|nn|nnn)"); const QString author_uc_t("(?:[nN]%1N|[nN]%1%1N|%1N|%1[nN]N|%1%1N|%1%1%1N|[nN]%1[nN]N|[nN]N%1N|%1%1[nN]N|%1[nN]%1N|[nN]N|[nN][nN]N)"); const QString author_initial("Ip{0,1}"); const QString author_line("L%1(?:[,;&L]+%1)*(?=L)"); const QString author_lc(author_line.arg(author_lc_t.arg(author_initial))); const QString author_uc(author_line.arg(author_uc_t.arg(author_initial))); const QString author_address("(?:L[^L]*)"); _author_sb = QRegExp(QString("L%1(?:[,;&]+L{0,2}%1)*[,;&L]*L").arg(author_lc_t.arg(author_initial)), Qt::CaseInsensitive, QRegExp::RegExp); _author_sb_lc = QRegExp(QString("L%1(?:[,;&L]+%1)*(?=L)").arg(author_lc_t.arg(author_initial)), Qt::CaseSensitive, QRegExp::RegExp); _author_sb_uc = QRegExp(QString("L%1(?:[,;&L]+%1)*(?=L)").arg(author_uc_t.arg(author_initial)), Qt::CaseSensitive, QRegExp::RegExp); _author_sb.setMinimal(false); _author_sb_lc.setMinimal(false); _author_sb_uc.setMinimal(false); // Note: Syntax must be RegExp and not RegExp2. // If not, in cases as 'LnnL ... Lnn,nn,Lnn,&nnL' it will overextend addresses to include Lnn,nn,L. // This is not related to minimal/greedy. // Note also that Lnn,nn,L will not be taken, unless it is followed by another author line. This is a feature. _author_b2_lc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)").arg(author_lc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b2_uc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)").arg(author_uc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b3_lc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)%2{0,7}(%1)").arg(author_lc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b3_uc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)%2{0,7}(%1)").arg(author_uc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b4_lc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)%2{0,7}(%1)%2{0,7}(%1)").arg(author_lc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b4_uc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)%2{0,7}(%1)%2{0,7}(%1)").arg(author_uc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b5_lc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)%2{0,7}(%1)%2{0,7}(%1)%2{0,7}(%1)").arg(author_lc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b5_uc_rx = new EQRegExp(QString("(%1)%2{0,7}(%1)%2{0,7}(%1)%2{0,7}(%1)%2{0,7}(%1)").arg(author_uc).arg(author_address), Qt::CaseSensitive, EQRegExp::RegExp); _author_b2_lc_rx->setMinimal(true); _author_b2_uc_rx->setMinimal(true); _author_b3_lc_rx->setMinimal(true); _author_b3_uc_rx->setMinimal(true); _author_b4_lc_rx->setMinimal(true); _author_b4_uc_rx->setMinimal(true); _author_b5_lc_rx->setMinimal(true); _author_b5_uc_rx->setMinimal(true); } heuristicBibParser::~heuristicBibParser() { delete _author_b2_lc_rx; delete _author_b2_uc_rx; delete _author_b3_lc_rx; delete _author_b3_uc_rx; delete _author_b4_lc_rx; delete _author_b4_uc_rx; delete _author_b5_lc_rx; delete _author_b5_uc_rx; } void heuristicBibParser::guessFields(const QString& clean_text, const QString& tagged_text) { QString clean_num(clean_text); clean_num.replace(_hyphens, "-"); // Order is important to increase the chances of a proper recognition guessJournal(clean_text); guessAbstract(tagged_text); guessAuthor(tagged_text); guessKeywords(tagged_text); guessYear(clean_num); _debug_guess("guessYear"); guessVolume(clean_num); _debug_guess("guessVolume"); guessNumber(clean_num); _debug_guess("guessNumber"); guessPages(clean_num); _debug_guess("guessPages"); guessTitle(tagged_text); guessISBN(clean_num); guessVolumeYearPages(clean_num); _debug_guess("guessVolumeYearPages"); guessYearVolumePages(clean_num); _debug_guess("guessYearVolumePages"); guessVolumePagesYear(clean_num); _debug_guess("guessVolumePagesYear"); guessFromMetadata(clean_text); } void heuristicBibParser::heuristicFields(const QString& text) { // Heuristics for reasonably secure extraction QRegExp rxdoi("(10\\.[\\d\\.]+/\\S+)"); if (rxdoi.indexIn(text) > -1) { QString cdoi(rxdoi.cap(1)); // This happens when publishers set doi to title in metadata: doi:10. ... if (cdoi.endsWith("")) cdoi.chop(8); if (cdoi.endsWith(',')) cdoi.chop(1); _current_reference["doi"] = _bpP->parse("doi", cdoi); } QRegExp rxarxiv("arXiv:([\\w\\./-]+)"); if (rxarxiv.indexIn(text) > -1) { _current_reference["journal"] = _bpP->parse("journal", rxarxiv.cap(0)); _current_reference["url"] = _bpP->parse("url", QString("http://arxiv.org/abs/%1").arg(rxarxiv.cap(1))); } QRegExp rxhtml("((http://|https://|ftp://|www\\.|ftp\\.)(www\\.|ftp\\.){0,1}\\S+)"); if (rxhtml.indexIn(text) > -1) _current_reference["url"] = _bpP->parse("url", rxhtml.cap(1)); } /** \page heuristicguess Field Recognition Rules - Abstract - If Abstract\b is found. - If Summary\b is found. */ void heuristicBibParser::guessAbstract(const QString& text) { // Check whether text might come from a web page or from a PDF with new lines // Set line length to 93 // Check first for abstract, check later for summary if (text.contains("Abstract", Qt::CaseInsensitive)) { const QString crl(QChar(169)); // Avoid abstract overextending to copyright line. QRegExp rxH("(?:|)\\s*Abstract[\\s\\.:]*(.+)(?:" + crl + "| -1) if (rxH.cap(1).length() > 93) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } rxH = QRegExp("(?:|)\\s*Abstract[\\s\\.:]*(.+)(?:" + crl + "|\\s* -1) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } rxH = QRegExp("(?:|)\\s*Abstract\\b(.+)(?:" + crl + "| -1) if (rxH.cap(1).length() > 93) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } rxH = QRegExp("(?:|)\\s*Abstract\\b(.+)(?:" + crl + "|\\s* -1) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } } if (text.contains("Summary", Qt::CaseInsensitive)) { QRegExp rxH("(?:|)\\s*Summary[\\s\\.:]*(.+)(?: -1) if (rxH.cap(1).length() > 93) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } rxH = QRegExp("(?:|)\\s*Summary[\\s\\.:]*(.+)(?:\\s* -1) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } rxH = QRegExp("(?:|)\\s*Summary\\b(.+)(?: -1) if (rxH.cap(1).length() > 93) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } rxH = QRegExp("(?:|)\\s*Summary\\b(.+)(?:\\s* -1) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_abstract] = _bpP->parse(_abstract, val); return; } } } /** \page heuristicguess Field Recognition Rules - Author - Check capitalization patterns. See \htmlonly A Simple Extraction Procedure for Bibliographical Author Field. \endhtmlonly */ void heuristicBibParser::guessAuthor(const QString& tagged_text) { // Prepare input stream QString simplified_text("| " + tagged_text + " |"); simplified_text.replace('|', ' '); simplified_text = "| " + simplified_text + " |"; simplified_text.replace(QRegExp(""), " | "); simplified_text.replace(QRegExp("(\\w)(\\w)"), "\\1 , \\2"); simplified_text.replace(QRegExp(""), " "); simplified_text.remove(QRegExp("author.{0,3}:{0,1}", Qt::CaseInsensitive)); simplified_text.replace(QRegExp("(\\w{4,10})[a-z]\\)", Qt::CaseSensitive), "\\1 "); // Remove superscript, e. g. LASTNAMEa simplified_text.replace(QRegExp("([A-Z]{2,10})[a-z]\\b", Qt::CaseSensitive), "\\1 "); // Remove superscript, e. g. LASTNAMEa) simplified_text.replace(_hyphens, "-"); simplified_text.replace(QChar(183), ','); // Fancy author separator simplified_text.replace(' ' + QChar(198) + ' ', " , "); // Fancy author separator simplified_text.replace(QChar(8226), ','); // Fancy author separator simplified_text.replace(QChar(178), ' '); // Superscript dagger as sometimes translated by pdftotext author::simplifyString(simplified_text); // Capitalize and encode for (int i = 0; i < _word_prefix_lexicon.count(); ++i) { const QString& wp = _word_prefix_lexicon.at(i); simplified_text.replace(wp, wp, Qt::CaseInsensitive); } simplified_text.replace(" by ", " "); _aencoder.encode(simplified_text); const QString sb_author(guessAuthor_single_block()); const int n_sb_author(authorCount(sb_author)); const QString mb_author(guessAuthor_multi_block()); const int n_mb_author(authorCount(mb_author)); if (n_mb_author > n_sb_author) _current_reference[_author] = mb_author; else _current_reference[_author] = sb_author; } QString heuristicBibParser::guessAuthor_single_block() { QString author; if (_author_sb_lc.indexIn(_aencoder.code) > -1) author = _bpP->parse(_author, _aencoder.decoded(_author_sb_lc.pos(0), _author_sb_lc.matchedLength())); else if (_author_sb_uc.indexIn(_aencoder.code) > -1) author = _bpP->parse(_author, _aencoder.decoded(_author_sb_uc.pos(0), _author_sb_uc.matchedLength())); else if (_author_sb.indexIn(_aencoder.code) > -1) // Few cases are extracted by _author_sb, keep it for cases 'A. Name,', with ',' usually coming // from a faulty plain text conversion. author = _bpP->parse(_author, _aencoder.decoded(_author_sb.pos(0), _author_sb.matchedLength())); return author; } QString heuristicBibParser::guessAuthor_multi_block() { QString author; if (_author_b5_uc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b5_uc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b5_uc_rx->pos(i), _author_b5_uc_rx->cap(i).length()), author); else if (_author_b5_lc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b5_lc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b5_lc_rx->pos(i), _author_b5_lc_rx->cap(i).length()), author); else if (_author_b4_uc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b4_uc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b4_uc_rx->pos(i), _author_b4_uc_rx->cap(i).length()), author); else if (_author_b4_lc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b4_lc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b4_lc_rx->pos(i), _author_b4_lc_rx->cap(i).length()), author); else if (_author_b3_uc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b3_uc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b3_uc_rx->pos(i), _author_b3_uc_rx->cap(i).length()), author); else if (_author_b3_lc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b3_lc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b3_lc_rx->pos(i), _author_b3_lc_rx->cap(i).length()), author); else if (_author_b2_uc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b2_uc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b2_uc_rx->pos(i), _author_b2_uc_rx->cap(i).length()), author); else if (_author_b2_lc_rx->indexIn(_aencoder.code) > -1) for (int i = 1; i < _author_b2_lc_rx->capturedTexts().count(); ++i) author = _bpP->parse(_addauthors, _aencoder.decoded(_author_b2_lc_rx->pos(i), _author_b2_lc_rx->cap(i).length()), author); return author; } int heuristicBibParser::authorCount(const QString& authors) { if (authors.isEmpty()) return 0; return 1 + authors.count(" and "); } /** \page heuristicguess - Keywords - If Key\\s{0,1}words\b is found. */ void heuristicBibParser::guessKeywords(const QString& text) { QRegExp rxH("<(?:NewLine|Tab)\\d+>\\s*Key\\s{0,1}words[\\s\\.:]*(.+)( -1) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_keywords] = _bpP->parse(_keywords, val); return; } rxH = QRegExp("<(?:NewLine|Tab)\\d+>\\s*Key\\s{0,1}words\\b(.+)( -1) { const QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_keywords] = _bpP->parse(_keywords, val); } } /** \page heuristicguess - Volume - If Volume:{0,1} is found. - If Vol.{0,1} is found. - If \\b(\\d+)[,:]\\s*\\d+\\W+\\d+ is found. - If \\b(\\d+)\\s*\\(\\d+\\) is found. - If \\b(\\d+)[,:]\\s*\\d+\\b is found. */ void heuristicBibParser::guessVolume(const QString& text) { _reliable_volume = true; QRegExp rxH("Volumes{0,1}:{0,1}\\s*(" + _hyphen_nums + ')', Qt::CaseInsensitive); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } rxH = QRegExp("Vols{0,1}\\.{0,1}\\s*(" + _hyphen_nums + ')', Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } rxH = QRegExp("\\b(\\d+)\\s*\\(" + _hyphen_nums + "\\)[,:]\\s*pp\\.{0,1}\\s*\\d+", Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } rxH = QRegExp("\\b(\\d+)[,:]\\s*pp\\.{0,1}\\s*\\d+", Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } _reliable_volume = false; rxH = QRegExp("(\\d+)\\s*\\(" + _hyphen_nums + "\\)[,:]\\s*\\d+", Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } rxH = QRegExp("\\b(\\d+)\\s*\\(\\d+\\)"); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } rxH = QRegExp("\\b(\\d+)[,:]\\s*" + _hyphen_nums, Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); return; } rxH = QRegExp("\\b(\\d+)[,:]\\s*\\d+\\b"); nH = rxH.indexIn(text); if (nH > -1) _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); } /** \page heuristicguess - Number - If Numbers{0,1}:{0,1}\\s*([\\d-]+) is found. - If No\\.{0,1}\\s*(\\d+) is found. - If Issue\\:{0,1}\\s*(\\d+) is found. - If \\d\\s*\\((\\d+)\\)[^\\.] is found. */ void heuristicBibParser::guessNumber(const QString& text) { _reliable_number = true; QRegExp rxH("Numbers{0,1}\\:{0,1}\\s*(" + _hyphen_nums + ')', Qt::CaseInsensitive); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_number] = _bpP->parse(_number, rxH.cap(1)); return; } rxH = QRegExp("Nos{0,1}\\.{0,1}\\s*(" + _hyphen_nums + ')', Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_number] = _bpP->parse(_number, rxH.cap(1)); return; } rxH = QRegExp("Issues{0,1}\\:{0,1}\\s*(" + _hyphen_nums + ')', Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_number] = _bpP->parse(_number, rxH.cap(1)); return; } _reliable_number = false; rxH = QRegExp("\\d\\s*\\((" + _hyphen_nums + ")\\)[^\\.]"); nH = rxH.indexIn(text); if (nH > -1) if (rxH.cap(1) != _current_reference.value(_year)) // Avoid confusing (number) and (year) _current_reference[_number] = _bpP->parse(_number, rxH.cap(1)); } /** \page heuristicguess - Pages - If \\bPages{0,1}[:\\.]{0,1}([\\d\\s-]+) is found. - If \\bp{1,2}\\.{0,1}\\s+(\\d+) is found. - If \\b(\\d+)\\s*-{1,2}\\s*(\\d+pp)\\b is found. - If \\b(\\d+)\\s*-{1,2}\\s*(\\d+)\\b is found. */ void heuristicBibParser::guessPages(const QString& text) { _reliable_pages = true; QRegExp rxH("\\bPages{0,1}[:\\.]{0,1}\\s*((?!\\()" + _hyphen_nums + "(?!\\)))", Qt::CaseInsensitive); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(1)); return; } rxH = QRegExp("(?!\\()(\\d+[\\s-]\\d+pp)(?!\\))", Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(1)); return; } rxH = QRegExp("\\bpp\\.{0,1}\\s+(" + _hyphen_nums + ')', Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(1)); return; } _reliable_pages = false; rxH = QRegExp("\\bp\\.{0,1}\\s+(" + _hyphen_nums + ')'); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(1)); return; } rxH = QRegExp("\\d+\\s*\\(" + _hyphen_nums + "\\),{0,1}\\s*(" + _hyphen_nums + ')'); nH = rxH.indexIn(text); // 120 (1-3), 927 if (nH > -1) { _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(1)); return; } rxH = QRegExp("(?!\\()(\\d+)\\s*-{1,2}\\s*(\\d+)\\b(?!\\))"); nH = 0; while (nH >= 0) { nH = rxH.indexIn(text, nH); if (nH > -1) { if (!rxH.cap(1).startsWith('0')) { const QString pp(_bpP->parse(_pages, QString("%1 %2").arg(rxH.cap(1)).arg(rxH.cap(2)))); const QStringList flpp(pp.split(QRegExp("\\D"), QString::SkipEmptyParts)); if (flpp.count() != 2) continue; const int fp(flpp.first().toInt()); const int lp(flpp.last().toInt()); if (fp < lp && lp - fp < 250) { _current_reference[_pages] = pp; return; } } nH += rxH.matchedLength(); } } } /** \page heuristicguess - Year - If \\b(19|20)(\\d\\d)\\b is found. */ void heuristicBibParser::guessYear(const QString& text) { QRegExp rxH("\\((19|20)(\\d\\d)\\)"); int nH(rxH.indexIn(text)); if (nH > -1) { const QString y(_bpP->parse(_year, rxH.cap(1) + rxH.cap(2))); if (y.toInt() < _max_year) { _current_reference[_year] = y; return; } } rxH = QRegExp("\\d+:" + _hyphen_nums + "[,\\s]+(19|20)(\\d\\d)\\b"); nH = rxH.indexIn(text); // 44:2077 – 2082, 2004. if (nH > -1) { const QString y(_bpP->parse(_year, rxH.cap(1) + rxH.cap(2))); if (y.toInt() < _max_year) { _current_reference[_year] = y; return; } } rxH = QRegExp("\\b(19|20)(\\d\\d)\\b"); nH = rxH.indexIn(text); if (nH > -1) { const QString y(_bpP->parse(_year, rxH.cap(1) + rxH.cap(2))); if (y.toInt() < _max_year) { _current_reference[_year] = y; return; } } } /** \page heuristicguess - Title - If \\bTitle:{0,1} is found. */ void heuristicBibParser::guessTitle(const QString& text) { QRegExp rxH("\\bTitle:{0,1}\\s*(.+)( -1) { QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_title] = _bpP->parse(_title, val); return; } rxH = QRegExp("\\bTitle:{0,1}(.+)( -1) { QString val(rxH.cap(1).remove(_leading_non_letters)); _current_reference[_title] = _bpP->parse(_title, val); } } /** \page heuristicguess - ISBN - If \\bISBN\\b(?:-\\d+){0,1}:{0,1}(?:-\\d+){0,1}\\s*(\\d+-[\\d-]+-\\d+) is found. - If \\bISBN\\b(?:-\\d+){0,1}:{0,1}(?:-\\d+){0,1}\\s*(\\d+) is found. */ void heuristicBibParser::guessISBN(const QString& text) { QRegExp rxH("\\bISBN\\b(?:[ -]\\d+){0,1}:{0,1}(?:-\\d+){0,1}\\s*(\\d+-[\\d-]+-\\d+)", Qt::CaseInsensitive); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_isbn] = _bpP->parse(_isbn, rxH.cap(1)); return; } rxH = QRegExp("\\bISBN\\b(?:[ -]\\d+){0,1}:{0,1}(?:-\\d+){0,1}\\s*(\\d+)", Qt::CaseInsensitive); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_isbn] = _bpP->parse(_isbn, rxH.cap(1)); return; } } /** \page heuristicguess - Journal - Check cb2Bib internal database. */ void heuristicBibParser::guessJournal(const QString& text) { QString stext(text.toLower()); stext.remove(c2bUtils::nonLetter); QString jn; int pos(stext.length() + 1); int jnl(0); QStringMatcher blank(" "); for (int i = 0; i < _journal_db.count(); ++i) if (blank.indexIn(_journal_db.retrieveFull(i)) >= 0) { const int p(stext.indexOf(_journal_db.fullsimplifiedFull(i), 0, Qt::CaseSensitive)); if (p > -1 && p < pos) { pos = p; jnl = _journal_db.fullsimplifiedFull(i).length(); jn = _journal_db.retrieve(i); } else if (p == pos && jn.length() < _journal_db.retrieve(i).length()) // Cases 'Chem Phys' vs 'Chem Phys Lett' jn = _journal_db.retrieve(i); } if (!jn.isEmpty() && (pos < 50 || pos + jnl > stext.length() - 50)) { _current_reference["journal"] = _bpP->parse("journal", jn); return; } QString jheader, jfooter; for (int i = 0; i < _journal_db.count(); ++i) { const int p(stext.indexOf(_journal_db.fullsimplified(i), 0, Qt::CaseSensitive)); if (p > -1) { const QString j(_journal_db.retrieve(i)); const int jl(j.length()); if (jn.length() < jl) jn = j; if (p < 25 && jheader.length() < jl) jheader = j; else if (p + j.length() > stext.length() - 100 && jfooter.length() < jl) jfooter = j; } } if (!jheader.isEmpty()) jn = jheader; else if (!jfooter.isEmpty()) jn = jfooter; if (!jn.isEmpty()) _current_reference["journal"] = _bpP->parse("journal", jn); } void heuristicBibParser::guessFromMetadata(const QString& text) { if (!text.contains("[Bibliographic Metadata")) return; QRegExp bf; bf.setMinimal(true); bf.setCaseSensitivity(Qt::CaseSensitive); QString p("<%1>(.+)"); for (int i = 0; i < _bibliographic_fields.count(); ++i) { bf.setPattern(p.arg(_bibliographic_fields.at(i))); if (bf.indexIn(text) > -1) _current_reference[_bibliographic_fields.at(i)] = _bpP->parse(_bibliographic_fields.at(i), bf.cap(1)); } } void heuristicBibParser::guessVolumePagesYear(const QString& text) { // Does several volume pages year formats if (_reliable_pages && _reliable_volume && _reliable_number) return; // J. Sci., 108 (15), 3206, 2004 // J. Sci., 108 (15), 3206 2004 QRegExp rxH("(\\d+)\\s*\\((" + _hyphen_nums + ")\\)\\s*[,:]\\s*(" + _hyphen_pages + ")[,\\s]+(19|20)(\\d\\d)"); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_number] = _bpP->parse(_number, rxH.cap(2)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(3)); _current_reference[_year] = _bpP->parse(_year, rxH.cap(4) + rxH.cap(5)); return; } // J. Sci., 108 (15), 3206 (2004) rxH = QRegExp("(\\d+)\\s*\\((" + _hyphen_nums + ")\\)\\s*[,:]\\s*(" + _hyphen_pages + ")[,\\s]*\\((19|20)(\\d\\d)\\)"); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_number] = _bpP->parse(_number, rxH.cap(2)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(3)); _current_reference[_year] = _bpP->parse(_year, rxH.cap(4) + rxH.cap(5)); return; } if (_reliable_pages && _reliable_volume) return; // J. Sci. 124, 204109 2006 // J. Sci. 124, 204109, 2006 rxH = QRegExp("(\\d+)[,:]\\s*(" + _hyphen_pages + ")[,\\s]+(19|20)(\\d\\d)"); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); _current_reference[_year] = _bpP->parse(_year, rxH.cap(3) + rxH.cap(4)); return; } // 120, 8425 - 8433 (2004) // J. Sci. 30, 2745 (1984) rxH = QRegExp("(\\d+)[,:]\\s*(" + _hyphen_pages + ")[,\\s]*\\((19|20)(\\d\\d)\\)"); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); _current_reference[_year] = _bpP->parse(_year, rxH.cap(3) + rxH.cap(4)); return; } } void heuristicBibParser::guessVolumeYearPages(const QString& text) { // Does several volume year pages formats if (_reliable_number && _reliable_volume) return; // J. Sci. 203 (2003) 209. QRegExp rxH("(\\d+)\\s*\\(" + _current_reference.value(_year) + "\\)\\s*(" + _hyphen_pages + ')'); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); return; } } void heuristicBibParser::guessYearVolumePages(const QString& text) { // Does several year volume pages formats if (_reliable_pages && _reliable_volume && _reliable_number) return; // J. Sci. 1995 January 25; 247(4):536-40. // J. Sci. 1995, 247(4):536-40. QRegExp rxH(_current_reference.value(_year) + "[\\w ]{0,15}[,:; ]\\s*(\\d+)\\s*\\((" + _hyphen_nums + ")\\)\\s*[,:;]\\s*(" + _hyphen_pages + ')'); int nH(rxH.indexIn(text)); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_number] = _bpP->parse(_number, rxH.cap(2)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(3)); _reliable_pages = true; _reliable_volume = true; return; } // J. Sci. (1999), 86, 3, pp. 635-648 rxH = QRegExp("\\(" + _current_reference.value(_year) + "\\)" + "\\s*[,:;]\\s*(\\d+)\\s*[,:;]\\s*(" + _hyphen_nums + ")\\s*[,:;]\\s*(?:pp)?\\.?\\s*(" + _hyphen_pages + ')'); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_number] = _bpP->parse(_number, rxH.cap(2)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(3)); _reliable_pages = true; _reliable_volume = true; return; } if (_reliable_volume) return; // J. Sci. 1995 January 25; 247:536-40. // J. Sci. 2005, 103, 818 // J. Sci. 2002;9:101–106.5. rxH = QRegExp(_current_reference.value(_year) + "\\s*[\\w ]{0,15}[,:;]\\s*(\\d+)\\s*[,:;]\\s*(" + _hyphen_pages + ')'); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); _reliable_pages = true; _reliable_volume = true; return; } // J. Sci. 2005 103:818 rxH = QRegExp(_current_reference.value(_year) + "\\s+(\\d+)\\s*:\\s*(" + _hyphen_pages + ')'); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); return; } // (2006) J. Sci. 39:3047 rxH = QRegExp("\\(" + _current_reference.value(_year) + "\\)\\D{5,30}(\\d+)\\s*[,:;]\\s*(" + _hyphen_pages + ')'); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); return; } // 2006 J. Sci. 39 3047 rxH = QRegExp(_current_reference.value(_year) + "\\D{5,30}(\\d+)\\s*[,:; ]\\s*(" + _hyphen_pages + ')'); nH = rxH.indexIn(text); if (nH > -1) { _current_reference[_volume] = _bpP->parse(_volume, rxH.cap(1)); _current_reference[_pages] = _bpP->parse(_pages, rxH.cap(2)); return; } } cb2bib-1.4.9/src/c2b/bibParser.cpp0000644000175000017500000005044112045520050016445 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "bibParser.h" #include "authorString.h" #include "bibPreparser.h" #include "heuristicBibParser.h" #include "idMaker.h" #include "preprocess.h" #include "pubmedXml.h" #include "settings.h" #include #include bibParser::bibParser(QObject* parento) : coreBibParser(parento) { // Creating journal name database _journal_dbP = new journalDB(_settingsP->fileName("cb2Bib/JournalFile")); // Creating month list _month_dbP = new monthDB(); // Creating cite and document ID makers _cite_idmP = new idMaker("cb2Bib/CiteIdPattern", this); _file_idmP = new idMaker("cb2Bib/DocumentIdPattern", this); // Creating (external) reference preparser _preparserP = new bibPreparser(this); connect(_preparserP, SIGNAL(statusMessage(const QString&)), this, SIGNAL(statusMessage(const QString&))); // Creating stream preprocess object _preprocessP = new preprocess(this); // Creating heuristic bibliographic parser _heuristic_parserP = new heuristicBibParser(this); } bibParser::~bibParser() { delete _journal_dbP; delete _month_dbP; delete _heuristic_parserP; } /** Process each field and set its final format */ QString bibParser::parse(const QString& field, const QString& value, const QString& init_value) { QString v(value); if (field == "file") return v.trimmed(); v = removeTags(v); if (v.isEmpty()) return (v); c2bUtils::fullBibToC2b(v); if (field == "author") { c2bUtils::debug(v); v = _authorString.toBibTeX(v, _settingsP->value("cb2Bib/UseFullNames").toBool()); } else if (field == "addauthors") { c2bUtils::debug(v); if (init_value.isEmpty()) v = _authorString.toBibTeX(v, _settingsP->value("cb2Bib/UseFullNames").toBool()); else v = init_value + " and " + _authorString.toBibTeX(v, _settingsP->value("cb2Bib/UseFullNames").toBool()); } else if (field == "editor") { c2bUtils::debug(v); v.remove(QRegExp("\\((Editor|Editors|Ed|Eds)\\.{0,1}\\)", Qt::CaseInsensitive)); v = _authorString.toBibTeX(v, _settingsP->value("cb2Bib/UseFullNames").toBool()); } else if (field == "addeditors") { c2bUtils::debug(v); v.remove(QRegExp("\\((Editor|Editors|Ed|Eds)\\.{0,1}\\)", Qt::CaseInsensitive)); if (init_value.isEmpty()) v = _authorString.toBibTeX(v, _settingsP->value("cb2Bib/UseFullNames").toBool()); else v = init_value + " and " + _authorString.toBibTeX(v, _settingsP->value("cb2Bib/UseFullNames").toBool()); } else if (field == "doi") v.remove(QRegExp("^.+(?=10\\.[\\d\\.]+/\\S+)")); else if (field == "isbn") v.remove(' '); else if (field == "journal") { if (_settingsP->value("cb2Bib/SetJournalsToFullname").toBool()) v = _journal_dbP->retrieveFull(v); else v = _journal_dbP->retrieve(v); } else if (field == "keywords") { v.replace(" - ", ","); QStringList kl(v.split(QRegExp("[^\\w\\s-']"), QString::SkipEmptyParts)); kl.removeAll(" "); #if QT_VERSION >= 0x040500 kl.removeDuplicates(); #endif v = kl.join(", "); v.replace(QRegExp("\\s+,"), ","); v = v.toLower(); } else if (field == "month") v = _month_dbP->retrieve(v); // Fields edition and note require first letter capitalization else if (field == "edition") v = c2bUtils::setCapitalization(v); else if (field == "note") v = c2bUtils::setCapitalization(v); // Process pages, volume, number, and year to set hyphenation else if (field == "pages") v = adjacentNumbers(v); else if (field == "volume") v = adjacentNumbers(v); else if (field == "number") v = adjacentNumbers(v); else if (field == "year") v = adjacentNumbers(v); else if (field == "title" || field == "booktitle") v = c2bUtils::setCapitalization(v); else if (field == "addtitle") { v = c2bUtils::setCapitalization(v); if (!init_value.isEmpty()) v = init_value + ": " + v; } return c2bUtils::simplifyString(v); } /** Process each field and set its final format for a complete reference */ bibReference& bibParser::parse(bibReference& reference) { QMutableHashIterator i(reference); while (i.hasNext()) { i.next(); const QString v(parse(i.key(), i.value())); i.setValue(v); } return reference; } QString bibParser::setJournalsToFull(const QString& text) { QString substituted_text(text); QRegExp jnre("\\bjournal\\s*=\\s*[\\{\"](.*)[\\}\"]", Qt::CaseInsensitive); jnre.setMinimal(true); int pos(0); uint nj(0); while (pos >= 0) { pos = jnre.indexIn(substituted_text, pos); if (pos > -1) { QString line(jnre.cap(0)); const QString jn(jnre.cap(1)); line.replace(jn, fullJournal(jn)); substituted_text.replace(pos, jnre.matchedLength(), line); pos += line.length(); nj++; } emit statusMessage(tr("Processed %1 journal names...").arg(nj)); QCoreApplication::processEvents(); } emit statusMessage(tr("Processed %1 journal names.").arg(nj)); return (substituted_text); } QString bibParser::setJournalsToAbbreviated(const QString& text) { QString substituted_text(text); QRegExp jnre("\\bjournal\\s*=\\s*[\\{\"](.*)[\\}\"]", Qt::CaseInsensitive); jnre.setMinimal(true); int pos(0); uint nj(0); while (pos >= 0) { pos = jnre.indexIn(substituted_text, pos); if (pos > -1) { QString line(jnre.cap(0)); const QString jn(jnre.cap(1)); line.replace(jn, abbreviatedJournal(jn)); substituted_text.replace(pos, jnre.matchedLength(), line); pos += line.length(); nj++; } emit statusMessage(tr("Processed %1 journal names...").arg(nj)); QCoreApplication::processEvents(); } emit statusMessage(tr("Processed %1 journal names.").arg(nj)); return (substituted_text); } QString bibParser::excerpt(const QString& text, const QStringList& hints) const { QString txt(removeTags(text)); txt.replace(QRegExp("\\[Bibliographic Metadata.+/Bibliographic Metadata\\]"), " "); txt.replace(QRegExp("(http://|https://|ftp://|www\\.|ftp\\.)(www\\.|ftp\\.){0,1}\\S+"), " "); txt.replace(QRegExp("\\b[A-Z]+\\b"), " "); txt.replace(QRegExp("\\d"), " "); txt.replace(c2bUtils::nonLetter, " "); txt.replace(QRegExp("\\b\\w{1,2}\\b"), " "); txt.replace(QRegExp("\\b(about|and|are|com|for|from|how|into|that|the|their|this|where|with|www)\\b", Qt::CaseInsensitive), " "); txt.replace(QRegExp("\\b(january|february|march|april|may|june|july|august|september|october|november|december)\\b", Qt::CaseInsensitive), " "); txt = hints.join(" ") + ' ' + txt; txt = c2bUtils::simplifyString(txt); const QStringList txtlist(txt.split(' ', QString::SkipEmptyParts)); QStringList txtlistSimp; for (int i = 0; i < qMin(15, txtlist.count()); ++i) txtlistSimp.append(txtlist.at(i)); return txtlistSimp.join(" "); } void bibParser::setField(const QString& name, const QString& value) { _current_reference[name] = parse(name, value); } void bibParser::setReferenceType(const QString& type) { _current_reference.typeName = type; } void bibParser::setCiteID() { _current_reference.citeidName = _cite_idmP->makeID(_current_reference); } QString bibParser::documentFilename(const QString& base_fn, const QString& bibtex_fn) { if (base_fn.isEmpty()) return base_fn; if (!_settingsP->value("cb2Bib/MovePdf").toBool()) { const QUrl u(base_fn); const QString scheme(u.scheme()); if (scheme == "file") return parse("file", u.toLocalFile()); else return parse("file", base_fn); } QString filename(_file_idmP->makeID(_current_reference)); if (filename.isEmpty()) filename = "no_cite_id"; QFileInfo fi(base_fn); QString docExtension('.' + fi.suffix().toLower()); // Possible document extensions if (!docExtension.contains(QRegExp("^\\.\\w{2,4}$"))) docExtension = ".pdf"; // Default if (docExtension == ".gz") if (fi.completeSuffix().toLower() == ".ps.gz") docExtension = ".ps.gz"; // Composite extension filename = c2bUtils::documentFilename(_settingsP->value("cb2Bib/RelativePdfDirectory").toBool(), bibtex_fn, _settingsP->fileName("cb2Bib/PdfDirectory"), filename + docExtension); return parse("file", filename); } /**************************************************************************** AUTOMATIC BIB CAPTION *****************************************************************************/ void bibParser::preparse(const QString& text, QString* out_text) { _preparserP->preparse(text, out_text); } /** \page bibproc Extracting data from the clipboard Clipboard contents is processed according to the following rules: - Perform external, user-defined preparsing on input stream. See \ref c2bconf_clipboard. - Perform user-defined substitutions on input stream. See \ref c2bconf_clipboard. - Check if input stream is already a BibTeX entry. If so, process entry. - Check if input stream is a PubMed XML or Medline entry. If so, process entry. - Preprocess author names: PI JOAN III -> Pi III, J. (care of name prefixes, suffixes, and removal of ambiguities). If otherwise, - Extract DOI \n (DOI, URL and FILE/PDF are preprocessed, performed before the automatic recognition takes place.) - Extract URL - Remove leading and trailing white spaces, TABs and CRs. - "\r\n", "\n" and/or "\r" replaced by the line indicator tag "". - Replace "\t" and ten or more consecutive "\s" by the tabular tag "". - Simplify White Spaces - Start the automatic recognition engine. If the automatic recognition engine fails, optionally, a heuristic guessing will be performed. See also \ref heuristicguess and \ref metadata. */ void bibParser::parse(const QString& text, QString* out_text, QString* out_tagtext) { QString& otext = *out_text; otext = text; QString& ottext = *out_tagtext; ottext.clear(); _preprocessP->preprocessText(out_text); if (hasBibTeX(otext)) { _current_reference = wholeReference(otext); parse(_current_reference); currentReferenceUpdated(); _auto_recognized_string = tr("Processed as 'BibTeX'."); _auto_recognized = true; emit statusMessage(_auto_recognized_string); return; } if (otext.contains("")) { pubmedXml pxml(otext); _current_reference = pxml.reference(); parse(_current_reference); currentReferenceUpdated(); _auto_recognized_string = tr("Processed as 'PubMed XML'."); _auto_recognized = true; emit statusMessage(_auto_recognized_string); return; } if (otext.contains(QRegExp("^\\s*PMID\\s*-"))) { _current_reference.typeName = "article"; otext = ' ' + otext; ottext = otext; // http://www.nlm.nih.gov/bsd/mms/medlineelements.html ottext.replace(QRegExp("[\\n\\r]\\s*([A-Z]{2,4}\\s*-)"), "][\\1"); // Two to four capital letter in field tags ottext = c2bUtils::simplifyString(ottext); if (!ottext.contains(QRegExp("\\[FAU\\s+-"))) ottext.replace(QRegExp("\\[(AU\\s*-\\s*[-'\\w]+)"), "[F\\1 "); QStringList fList(ottext.split("][")); QString kw; QRegExp fld("^([A-Z]{2,4})\\s{0,1}-\\s*(.+)$"); fld.setPatternSyntax(QRegExp::RegExp2); for (QStringList::Iterator it = fList.begin(); it != fList.end(); ++it) { if (fld.indexIn(*it) == -1) continue; const QString tag(fld.cap(1)); QString value(fld.cap(2)); if (tag == "AB") _current_reference["abstract"] = parse("abstract", value); else if (tag == "FAU") _current_reference["author"] = parse("addauthors", author::fromMedline(value), _current_reference.value("author")); else if (tag == "TA") _current_reference["journal"] = parse("journal", value); else if (tag == "IP") _current_reference["number"] = parse("number", value); else if (tag == "PG") _current_reference["pages"] = parse("pages", value); else if (tag == "TI") _current_reference["title"] = parse("title", value); else if (tag == "PMID") _current_reference["url"] = parse("url", c2bUtils::pubmedUrl.arg(value)); else if (tag == "VI") _current_reference["volume"] = parse("volume", value); else if (tag == "AID") { if (value.contains("[doi]")) _current_reference["doi"] = parse("doi", value.remove("[doi]")); } else if (tag == "DP") _current_reference["year"] = parse("year", value.replace(QRegExp("^([\\d\\s]+).*$"), "\\1")); else if (tag == "MH") kw += "; " + value.trimmed(); } if (!kw.isEmpty()) _current_reference["keywords"] = parse("keywords", kw.remove(0, 2)); currentReferenceUpdated(); _auto_recognized_string = tr("Processed as 'PubMed - Medline Journals'."); _auto_recognized = true; emit statusMessage(_auto_recognized_string); return; } _heuristic_parserP->heuristicFields(otext); // Set tags and start regular expression extraction ottext = setTags(otext); QString regular_expression_f(_settingsP->fileName("cb2Bib/RegularExpressionFile")); checkRegExpFile(regular_expression_f); QFile file(regular_expression_f); file.open(QIODevice::ReadOnly | QIODevice::Text); QString ItemX; QString line; QString reftype; QString fieldset; QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); int nfilters(0); while (!stream.atEnd()) { line = stream.readLine(); if (!(line.isEmpty() || line.contains(QRegExp("^#")))) { reftype = stream.readLine(); fieldset = stream.readLine(); ItemX = stream.readLine(); c2bUtils::debug(tr("The RegExp file contains1: |%1|").arg(line)); c2bUtils::debug(tr("The RegExp file contains2: |%1|").arg(reftype)); c2bUtils::debug(tr("The RegExp file contains3: |%1|").arg(fieldset)); c2bUtils::debug(tr("The RegExp file contains4: |%1|").arg(ItemX)); QRegExp rx(ItemX); rx.setMinimal(true); if (!rx.isValid()) c2bUtils::warn(tr("RegExp |%1| is not valid").arg(ItemX)); const QStringList list(fieldset.split(' ', QString::SkipEmptyParts)); const int efields(list.count()); const int cfields(rx.numCaptures()); int npos(rx.indexIn(ottext)); c2bUtils::debug(tr("Expected Fields: |%1|").arg(efields)); c2bUtils::debug(tr("Captured Fields: |%1|").arg(cfields)); c2bUtils::debug(tr("Position: |%1|").arg(npos)); if (efields != cfields) { c2bUtils::warn(tr("RegExp |%1| is not valid. Mismatch between expected and actual captures").arg(ItemX)); npos = -1; } nfilters++; if (npos > -1) { for (int i = 0; i < cfields; i++) { const QString& listi = list.at(i); int ii(i + 1); c2bUtils::debug(QString("Fields in Template %1: |%2|").arg(i).arg(rx.cap(ii))); if (_field_re.indexIn(listi) > -1) { if (listi == "author") // Reminder: "addauthors" requires to init _current_reference["author"] _current_reference[listi] = parse("addauthors", rx.cap(ii), _current_reference.value(listi)); else if (listi == "editor") // Reminder: "addeditors" requires to init _current_reference["editor"] _current_reference[listi] = parse("addeditors", rx.cap(ii), _current_reference.value(listi)); else if (listi == "title") // Reminder: "addtitle" requires to init _current_reference["title"] _current_reference[listi] = parse("addtitle", rx.cap(ii), _current_reference.value(listi)); else _current_reference[listi] = parse(listi, rx.cap(ii)); } } _current_reference.typeName = reftype; currentReferenceUpdated(); _auto_recognized_string = tr("Processed as '%1'.").arg(line); _auto_recognized = true; emit statusMessage(_auto_recognized_string); file.close(); return; } } } file.close(); // Heuristic Bib Parsing if (_settingsP->value("cb2Bib/DoHeuristicGuess").toBool()) { // Sometimes (if user is on tag mode) tag could be on otext. Revert tags here, just in case. const QString clean_text(removeTags(ottext)); _heuristic_parserP->guessFields(clean_text, ottext); currentReferenceUpdated(); _auto_recognized_string = tr("Applied %1 filters: No automatic format detection. %2 fields guessed.") .arg(nfilters).arg(fieldCount()); } else _auto_recognized_string = tr("Applied %1 filters: No automatic format detection.").arg(nfilters); emit statusMessage(_auto_recognized_string); } void bibParser::checkRegExpFile(const QString& fn) { if (fn.isEmpty()) { c2bUtils::warn(tr("No regular expression file especified")); return; } QFileInfo fi(fn); if (!fi.exists() || !fi.isReadable()) { c2bUtils::warn(tr("Could not open regular expression file %1 for reading").arg(fn)); return; } } void bibParser::guessFields(const QString& text) { const QString clean_text(text.simplified()); const QString tagged_text(setTags(text)); _heuristic_parserP->heuristicFields(clean_text); _heuristic_parserP->guessFields(clean_text, tagged_text); currentReferenceUpdated(); _auto_recognized_string = tr("%1 fields guessed.").arg(fieldCount()); emit statusMessage(_auto_recognized_string); } QString bibParser::setTags(const QString& text) const { QString tagged_text(text.trimmed()); tagged_text.replace(QRegExp("\\r\\n"), ""); // Windows new line tagged_text.replace(QRegExp("\\n"), ""); // Linux new line, LF tagged_text.replace(QRegExp("\\r"), ""); // OSX new line, CR QStringList spText(tagged_text.split("")); int n(spText.count()); tagged_text.clear(); for (int i = 0; i < n - 1; i++) tagged_text += spText.at(i) + QString("").arg(i + 1); tagged_text += spText[n-1]; spText = tagged_text.split(QRegExp("(\\s{10,}|\\t)")); n = spText.count(); tagged_text.clear(); for (int i = 0; i < n - 1; i++) tagged_text += spText.at(i) + QString("").arg(i + 1); tagged_text += spText[n-1]; tagged_text = c2bUtils::simplifyString(tagged_text); return tagged_text; } QString bibParser::removeTags(const QString& text) const { QString clean(text); clean.remove("[["); clean.remove("]]"); clean.replace(QRegExp(""), " "); clean.replace(QRegExp(""), " "); clean = c2bUtils::simplifyString(clean); return clean; } cb2bib-1.4.9/src/c2b/triads.h0000644000175000017500000000162512045520050015467 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef TRIADS_H #define TRIADS_H #include class triads { public: static const QString asciiTextSignature(const QString& str); static const QString textSignature(const QString& str); static const QVector textSignature(const QStringList& strs); static const QVector textFrequency(const QStringList& strs); static int textFrequency(const QString& str); private: inline triads() {} inline ~triads() {} static int _rank(const QString& str, const QString& sign, const QString& ranks); }; #endif cb2bib-1.4.9/src/c2b/idMaker.cpp0000644000175000017500000001635312045520050016114 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * Improvements and modifications: * July 2009 - Added <>, (C) 2009 by Dayu Huang ***************************************************************************/ #include "idMaker.h" #include "cb2bib_utilities.h" #include "settings.h" idMaker::idMaker(const QString& patternKey, QObject* parento) : QObject(parento), _pattern_key(patternKey) { loadSettings(); connect(settings::instance(), SIGNAL(newSettings()), this, SLOT(loadSettings())); } /** \page idplaceholders Predefined cite and document ID placeholders - <> Takes first three letters of the last word of all authors's last name in cite, and converts to lowercase. - <> Takes capitalized initials of all authors in cite. - <> Takes first author last name/s. - <> This placeholder is meant to be used alone, and only for document IDs. It takes the pattern defined for the cite ID. If the cite ID is modified manually, the document ID is synchronized automatically. - <> Takes capitalized initials of journal name. - <> First page. - <> First page, written as, e. g., 'p125'. - <></tt> Title. To truncate titles exceeding a maximum length <tt>l</tt> use <<title_l>>, where <tt>l</tt> stands for an integer value. - <tt><<title_underscored>></tt> Title with blanks set to underscores. To truncate title to <tt>l</tt> characters use <<title_underscored_l>>. - <tt><<volume>></tt> Volume number. - <tt><<year_abbreviated>></tt> Last two digits from year. - <tt><<year_full>></tt> All digits from year. <b>Note:</b> If <tt>author</tt> is empty, <tt>editor</tt> will be considered instead. On conference proceedings or monographs this situation is usual. Similarly, if <tt>title</tt> is empty, <tt>booktitle</tt> is considered. <b>Note:</b> Only one placeholder of a given field, e. g. <<author_first>> or <<author_all_initials>>, should be used to compose the ID patterns. The cb2Bib only performs one substitution per field placeholder. <b>Note:</b> The cb2Bib performs a series of string manipulations, such as stripping diacritics and ligatures, aimed to provide ID values suitable for BibTeX keys and platform independent filenames. Currently only ASCII characters are considered. */ QString idMaker::makeID(const bibReference& reference) { if (_id_pattern.isEmpty()) return QString(); if (_id_pattern.contains("<<citeid>>")) return reference.citeidName; // Initialize fields _author = reference.anyAuthor(); _journal = reference.value("journal"); _pages = reference.value("pages"); _title = reference.anyTitle(); _volume = reference.value("volume"); _year = reference.value("year"); // Set cite ID QString id(_id_pattern); if (_id_pattern.contains("<<author_first>>")) make_author_first(&id); else if (_id_pattern.contains("<<author_all_abbreviated>>")) make_author_all_abbreviated(&id); else if (_id_pattern.contains("<<author_all_initials>>")) make_author_all_initials(&id); if (_id_pattern.contains("<<journal_initials>>")) make_journal_initials(&id); if (_id_pattern.contains("<<pages_first>>")) make_pages_first(&id); else if (_id_pattern.contains("<<ppages_first>>")) make_ppages_first(&id); if (!_title_pattern.isEmpty()) if (_id_pattern.contains(_title_pattern)) make_title(&id); if (_id_pattern.contains("<<volume>>")) make_volume(&id); if (_id_pattern.contains("<<year_abbreviated>>")) make_year_abbreviated(&id); else if (_id_pattern.contains("<<year_full>>")) make_year_full(&id); return id; } void idMaker::make_author_first(QString* id) { QRegExp rx("([-'\\s\\w]+)(?:\\sand|$)"); rx.setMinimal(true); rx.indexIn(_author); _author = rx.cap(1); if (_author.contains(c2bUtils::nonAsciiLetter)) _author = c2bUtils::toAscii(_author, c2bUtils::Cleanup); id->replace("<<author_first>>", _author); } void idMaker::make_author_all_abbreviated(QString* id) { // If there is less than 3 letters in their last name's last word, // then use all the letters in the last name's last word QString temp_author; QRegExp rx("([-'\\w]{1,3})(?:[-'\\w]*)(?:\\sand|$)"); rx.setMinimal(true); rx.indexIn(_author); int pos(0); while ((pos = rx.indexIn(_author, pos)) != -1) { temp_author += rx.cap(1); pos += rx.matchedLength(); } _author = temp_author.toLower(); if (_author.contains(c2bUtils::nonAsciiLetter)) _author = c2bUtils::toAscii(_author, c2bUtils::Cleanup); id->replace("<<author_all_abbreviated>>", _author); } void idMaker::make_author_all_initials(QString* id) { _author.remove(QRegExp("\\b\\w\\b")); _author.remove(" and "); if (_author.contains(c2bUtils::nonAsciiLetter)) _author = c2bUtils::toAscii(_author, c2bUtils::Cleanup); _author.remove(QRegExp("[a-z]")); id->replace("<<author_all_initials>>", _author); } void idMaker::make_journal_initials(QString* id) { _journal.remove(QRegExp("[^A-Z]")); id->replace("<<journal_initials>>", _journal); } void idMaker::make_pages_first(QString* id) { _pages = c2bUtils::firstPage(_pages); id->replace("<<pages_first>>", _pages); } void idMaker::make_ppages_first(QString* id) { _pages = c2bUtils::firstPage(_pages); if (!_pages.isEmpty()) if (_pages.at(0).isDigit()) _pages = 'p' + _pages; id->replace("<<ppages_first>>", _pages); } void idMaker::make_title(QString* id) { if (_title.contains(c2bUtils::nonAsciiLetter)) _title = c2bUtils::toAscii(_title, c2bUtils::FromBibTeX); _title = _title.left(_title_max_length).trimmed(); // Avoid possible trailing blank if (_is_title_underscored) _title.replace(' ', '_'); id->replace(_title_pattern, _title); } void idMaker::make_volume(QString* id) { _volume.remove(' '); id->replace("<<volume>>", _volume); } void idMaker::make_year_abbreviated(QString* id) { _year = _year.right(2); id->replace("<<year_abbreviated>>", _year); } void idMaker::make_year_full(QString* id) { id->replace("<<year_full>>", _year); } void idMaker::loadSettings() { _id_pattern = settings::instance()->value(_pattern_key).toString(); QRegExp title_pattern("(<<title(?:_underscored)?(?:_\\d+)?>>)"); if (title_pattern.indexIn(_id_pattern) > -1) { _title_pattern = title_pattern.cap(1); _title_pattern.remove(QRegExp("\\D")); _title_max_length = _title_pattern.toInt(); if (_title_max_length == 0) _title_max_length = -1; _title_pattern = title_pattern.cap(1); _is_title_underscored = _title_pattern.contains(QRegExp("_underscored(?:_\\d+)?>>")); } else _title_pattern.clear(); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/documentCache.cpp��������������������������������������������������������������0000644�0001750�0001750�00000011076�12045520050�017277� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "documentCache.h" #include "cb2bib_utilities.h" #include "document.h" #include "settings.h" #include "triads.h" documentCache::documentCache() : _current(_cache), _content_type(documentContents::Raw), _cache_load_size(0), _settingsP(settings::instance()) {} documentCache::~documentCache() { save(); } void documentCache::load(const QString& fn, const documentContents::Type type) { _content_type = type; if (_load_filename == fn) return; unload(); _load_filename = fn; const QString cache_dir(_settingsP->fileName("cb2Bib/CacheDirectory")); if (QFileInfo(cache_dir).exists() && QFileInfo(cache_dir).isDir()) _cache_filename = QDir::cleanPath(cache_dir + '/' + QFileInfo(_load_filename).fileName() + ".c2b"); else _cache_filename = _load_filename.trimmed() + ".c2b"; if (QFileInfo(_cache_filename).exists()) { QFile file(_cache_filename); if (file.open(QIODevice::ReadOnly)) { QDataStream ds(&file); ds >> _cache; } } #ifdef C2B_USE_LZO if (!_cache.contains("lzo")) { _cache.clear(); _cache.insert("lzo", QByteArray()); } #else if (!_cache.contains("zlib")) { _cache.clear(); _cache.insert("zlib", QByteArray()); } #endif _cache_load_size = _cache.size(); } void documentCache::unload() { // Release cache memory save(); _cache.clear(); _cache_filename.clear(); _cache_load_size = 0; _load_filename.clear(); } bool documentCache::setCurrent(const QString& fn, int* pdfCounter, QString* logString, int* errorCounter) { const QString doc_fn(fn.trimmed()); if (doc_fn.isEmpty()) { _current.clear(); return false; } const QString skey("sign:" + doc_fn); const QString tkey(doc_fn); _current.preload(skey, tkey, _content_type); if (!_cache.contains(tkey)) { document doc(doc_fn, document::Raw); _current._text = doc.toString(); if (!doc.errorString().isEmpty()) { ++(*errorCounter); (*logString) += QObject::tr("% [cb2bib] %1\n").arg(doc.errorString()); return false; } _current._text = c2bUtils::simplifyString(_current._text); _cache.insert(doc_fn, c2bUtils::compress(_current._text.toUtf8())); if (_content_type == documentContents::Simplified) { _current._text = c2bUtils::toAscii(_current._text, c2bUtils::KeepWords); _current._signature = triads::asciiTextSignature(_current._text); } else _current._signature = triads::textSignature(_current._text); _cache.insert(skey, _current._signature.toUtf8()); _current._is_text_loaded = true; _current._is_signature_loaded = true; } ++(*pdfCounter); return true; } bool documentCache::setCurrent(const QString& fn) { const QString doc_fn(fn.trimmed()); if (doc_fn.isEmpty()) { _current.clear(); return false; } const QString skey("sign:" + doc_fn); const QString tkey(doc_fn); _current.preload(skey, tkey, _content_type); if (!_cache.contains(tkey)) { document doc(doc_fn, document::Raw); _current._text = doc.toString(); if (!doc.errorString().isEmpty()) return false; _current._text = c2bUtils::simplifyString(_current._text); _cache.insert(doc_fn, c2bUtils::compress(_current._text.toUtf8())); if (_content_type == documentContents::Simplified) { _current._text = c2bUtils::toAscii(_current._text, c2bUtils::KeepWords); _current._signature = triads::asciiTextSignature(_current._text); } else _current._signature = triads::textSignature(_current._text); _cache.insert(skey, _current._signature.toUtf8()); _current._is_text_loaded = true; _current._is_signature_loaded = true; } return true; } void documentCache::save() { if (_cache_load_size != _cache.size() && !_cache_filename.isEmpty()) { QFile file(_cache_filename); if (file.open(QIODevice::WriteOnly)) { QDataStream ds(&file); ds << _cache; } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/settings.cpp�������������������������������������������������������������������0000644�0001750�0001750�00000062710�12045520050�016376� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "settings.h" #include "cb2bib_utilities.h" #include <QCoreApplication> #include <QDir> #include <QFSFileEngine> /** Global settings for the cb2Bib */ settings::settings(const QString& organization, const QString& application, QObject* parento) : QSettings(organization, application, parento) { _init(); } settings::settings(const QString& fn, QObject* parento) : QSettings(fn, QSettings::IniFormat, parento) { _init(); } settings::settings(QObject* parento) : QSettings(C2B_ORGANIZATION, C2B_APPLICATION, parento) { _init(); init(false); } settings::~settings() { _c2b_global_settings = 0; } void settings::init(bool command_line) { if (command_line) readCommandLine(); if (cl_user_configured) _is_usb_configured_mode = QDir::toNativeSeparators(QDir::cleanPath(QSettings::fileName())) == QDir::toNativeSeparators(QDir::cleanPath(_c2bApp->applicationDirPath() + '/' + "cb2bib.conf")); else _is_usb_configured_mode = false; if (_is_usb_configured_mode) { _c2bAppDir = QDir(_c2bApp->applicationDirPath()); QFSFileEngine::setCurrentPath(_c2bApp->applicationDirPath()); _tmp_dir_path = _c2bApp->applicationDirPath(); } else { // Use user's home as tmp_dir since tmp files are more accessible if they are needed, // for instance, for debugging netqinf // Using cb2bib remotely causes tmp_dir not being writable, fallback to machine's tmp const QFileInfo hpi(QDir::homePath()); if (hpi.exists() && hpi.isWritable()) _tmp_dir_path = QDir::homePath(); else _tmp_dir_path = QDir::tempPath(); } setDefaults(); // Set relative to BibTeX file in USB mode, overriding defaults. if (_is_usb_configured_mode) setValue("cb2Bib/RelativePdfDirectory", true); } void settings::_init() { _c2bApp = QCoreApplication::instance(); Q_ASSERT_X(_c2bApp, "settings", "application was not instantiated"); Q_ASSERT_X(!_c2b_global_settings, "settings", "settings already instantiated"); settings::_c2b_global_settings = this; _application_pid = QString::number(_c2bApp->applicationPid()); _is_loaded = true; cl_bibedit = false; cl_cb2bib_import_mode = false; cl_cb2bib_tests = false; cl_citer = false; cl_configure = false; cl_doc2bib = false; cl_html_annote = false; cl_import = false; cl_index = false; cl_sloppy = false; cl_txt2bib = false; cl_user_configured = false; cl_view_annote = false; } void settings::setDefaultValue(const QString& key, const QVariant& defaulValue) { // Makes sure a key is initialized setValue(key, value(key, defaulValue)); } void settings::setDefaults() { QHash<QString, QVariant> defaults; const QString dsep(QDir::separator()); // Files defaults["cb2Bib/BibTeXFile"] = QDir::cleanPath(QDir::homePath() + dsep + "references.bib"); defaults["cb2Bib/CacheDirectory"] = QDir::cleanPath(QDir::homePath() + dsep + "PdfDocuments" + dsep + "c2b.tmp"); defaults["cb2Bib/PdfDirectory"] = QDir::cleanPath(QDir::homePath() + dsep + "PdfDocuments"); #ifdef Q_WS_X11 defaults["c2bAnnote/AnnoteCssFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "data/tex2html.css"); defaults["c2bBibSearcher/Pdf2TextBin"] = QDir::cleanPath(C2B_BIBSEARCHER_PDF2TXT_BIN); defaults["c2bPdfImport/LastFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "testPDFImport/nomeaning1.pdf"); defaults["c2bPdfImport/Pdf2TextBin"] = QDir::cleanPath(C2B_PDFIMPORT_PDF2TXT_BIN); defaults["cb2Bib/BrowserCssFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "data/references.css"); defaults["cb2Bib/ExifToolBin"] = QDir::cleanPath(C2B_METADATAPARSER_EXIFTOOL_BIN); defaults["cb2Bib/JournalFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "data/abbreviations.txt"); defaults["cb2Bib/NetworkFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "data/netqinf.txt"); defaults["cb2Bib/PosLexiconFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "data/lexicon.pos"); defaults["cb2Bib/PostprocessBibTeXBin"] = QDir::cleanPath(C2B_DATA_DIR + dsep + C2B_POSTPROCESS_BIBTEX_BIN); defaults["cb2Bib/PreparserBin"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "c2btools/ris2bib"); defaults["cb2Bib/RegularExpressionFile"] = QDir::cleanPath(C2B_DATA_DIR + dsep + "data/regexps.txt"); #endif #ifdef Q_WS_MACX QString C2B_DATA_DIR_MAC(C2B_DATA_DIR); if (QDir(C2B_DATA_DIR + "/data/").exists()) C2B_DATA_DIR_MAC = QDir::cleanPath(C2B_DATA_DIR + '/'); else if (QDir(_c2bApp->applicationDirPath() + "/../Resources/data/").exists()) C2B_DATA_DIR_MAC = QDir::cleanPath(_c2bApp->applicationDirPath() + "/../Resources/"); defaults["c2bAnnote/AnnoteCssFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/data/tex2html.css"); defaults["c2bBibSearcher/Pdf2TextBin"] = QDir::cleanPath(C2B_BIBSEARCHER_PDF2TXT_BIN); defaults["c2bPdfImport/LastFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/testPDFImport/nomeaning1.pdf"); defaults["c2bPdfImport/Pdf2TextBin"] = QDir::cleanPath(C2B_PDFIMPORT_PDF2TXT_BIN); defaults["cb2Bib/BrowserCssFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/data/references.css"); defaults["cb2Bib/ExifToolBin"] = QDir::cleanPath(C2B_METADATAPARSER_EXIFTOOL_BIN); defaults["cb2Bib/JournalFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/data/abbreviations.txt"); defaults["cb2Bib/NetworkFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/data/netqinf.txt"); defaults["cb2Bib/PosLexiconFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + dsep + "data/lexicon.pos"); defaults["cb2Bib/PostprocessBibTeXBin"] = QDir::cleanPath(C2B_DATA_DIR_MAC + C2B_POSTPROCESS_BIBTEX_BIN); defaults["cb2Bib/PreparserBin"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/c2btools/ris2bib"); defaults["cb2Bib/RegularExpressionFile"] = QDir::cleanPath(C2B_DATA_DIR_MAC + "/data/regexps.txt"); #endif #ifdef Q_WS_WIN const QString C2B_APP_DIR(_c2bApp->applicationDirPath() + dsep); defaults["c2bAnnote/AnnoteCssFile"] = C2B_APP_DIR + "data\\tex2html.css"; defaults["c2bBibSearcher/Pdf2TextBin"] = C2B_APP_DIR + "externtools\\xpdf\\pdftotext.exe"; defaults["c2bPdfImport/LastFile"] = C2B_APP_DIR + "testPDFImport\\nomeaning1.pdf"; defaults["c2bPdfImport/Pdf2TextBin"] = C2B_APP_DIR + "externtools\\xpdf\\pdftotext.exe"; defaults["cb2Bib/BrowserCssFile"] = C2B_APP_DIR + "data\\references.css"; defaults["cb2Bib/JournalFile"] = C2B_APP_DIR + "data\\abbreviations.txt"; defaults["cb2Bib/NetworkFile"] = C2B_APP_DIR + "data\\netqinf.txt"; defaults["cb2Bib/PosLexiconFile"] = C2B_APP_DIR + "data\\lexicon.pos"; defaults["cb2Bib/PostprocessBibTeXBin"] = C2B_APP_DIR + C2B_POSTPROCESS_BIBTEX_BIN; defaults["cb2Bib/PreparserBin"] = C2B_APP_DIR + "c2btools\\ris2bib.bat"; defaults["cb2Bib/RegularExpressionFile"] = C2B_APP_DIR + "data\\regexps.txt"; #endif // External file manager defaults["cb2Bib/FmClient"] = false; defaults["cb2Bib/FmClientCopyArg"] = C2B_FM_CLIENT_COPY_ARG; defaults["cb2Bib/FmClientCopyBin"] = QDir::cleanPath(C2B_FM_CLIENT_COPY_BIN); defaults["cb2Bib/FmClientMoveArg"] = C2B_FM_CLIENT_MOVE_ARG; defaults["cb2Bib/FmClientMoveBin"] = QDir::cleanPath(C2B_FM_CLIENT_MOVE_BIN); // Proxy defaults["cb2Bib/UseProxy"] = false; defaults["cb2Bib/ProxyPort"] = 8080; defaults["cb2Bib/ProxyType"] = 0; // Postprocess BibTeX defaults["cb2Bib/PostprocessBibTeXArg"] = C2B_POSTPROCESS_BIBTEX_ARG; defaults["cb2Bib/PostprocessBibTeXExt"] = C2B_POSTPROCESS_BIBTEX_EXT; // Misc defaults["c2bAnnote/IncludeCSS"] = true; defaults["c2bAnnote/UseRelativeLinks"] = false; defaults["cb2Bib/AddMetadata"] = true; defaults["cb2Bib/AutomaticPdfDownload"] = false; defaults["cb2Bib/AutomaticQuery"] = false; defaults["cb2Bib/CheckRepeatedOnSave"] = false; defaults["cb2Bib/CiteIdPattern"] = C2B_CITE_ID_PATTERN; defaults["cb2Bib/ConvertReferenceToLaTeX"] = true; defaults["cb2Bib/CopyMovePdf"] = "copy"; defaults["cb2Bib/DoHeuristicGuess"] = true; defaults["cb2Bib/DocumentIdPattern"] = C2B_DOCUMENT_ID_PATTERN; defaults["cb2Bib/FindReplaceInput"] = true; defaults["cb2Bib/FindReplaceInputList"] = C2B_FIND_REPLACE_LIST.split("^e"); defaults["cb2Bib/InsertMetadata"] = false; defaults["cb2Bib/KeepTmpNQFiles"] = false; defaults["cb2Bib/MovePdf"] = false; defaults["cb2Bib/PageNumberSeparator"] = " - "; defaults["cb2Bib/PostprocessMonth"] = false; defaults["cb2Bib/PreAppendMetadata"] = "prepend"; defaults["cb2Bib/PreparserAutomatic"] = false; defaults["cb2Bib/PreparserShowLog"] = true; defaults["cb2Bib/RelativePdfDirectory"] = false; defaults["cb2Bib/SetJournalsToFullname"] = false; defaults["cb2Bib/UseDoubleBraces"] = true; defaults["cb2Bib/UseFullNames"] = false; // Pdf2Text arguments defaults["c2bBibSearcher/Pdf2TextArg"] = "-raw -enc UTF-8"; defaults["c2bPdfImport/Pdf2TextArg"] = "-f 1 -l 1 -enc UTF-8"; // Construct current settings const QStringList keys(defaults.keys()); for (int i = 0; i < keys.count(); ++i) setValue(keys.at(i), value(keys.at(i), defaults.value(keys.at(i)))); } settings* settings::_c2b_global_settings = 0; /*************************************************************************** * Command line processing ***************************************************************************/ /** \page commandline The cb2Bib Command Line \verbatim Usage: cb2bib cb2bib [action] [filename1 [filename2 ... ]] [--conf [filename.conf]] Actions: --configure [filename.conf] Edit configuration --bibedit [filename1.bib [filename2.bib ... ]] Edit/browse BibTeX files --citer [filename1.bib [filename2.bib ... ]] Start cb2Bib citer --import tmp_reference_filename Import reference, usually from ad hoc websites --doc2bib fn1.doc [fn2.doc ... ] reference.bib Extract reference from document file --txt2bib fn1.txt [fn2.txt ... ] reference.bib Extract reference from text file --index [bibdirname] Extract keywords from document files --html-annote filename.tex Convert annote file to HTML --view-annote filename.tex Convert and visualize annote file --view-annote filename.tex.html Visualize annote file Switches: --conf [filename.conf] Use configuration file --sloppy Accept guesses in automatic reference extraction Examples: cb2bib Start cb2Bib extraction panel cb2bib --import tmp_reference_filename Import reference cb2bib --bibedit filename.bib Edit BibTeX filename.bib cb2bib --conf Start cb2Bib in USB mode cb2bib --doc2bib *.pdf references.bib Extract references from PDF title pages Notes: -Use switch --conf to particularize specific settings for specific actions. -The file cb2bib.conf must be readable and writable. If it does not exist, the cb2Bib will create one based on predefined defaults. -If starting the cb2Bib from a removable media, use the command 'cb2bib --conf' without configuration filename. Settings will be read from and written to /cb2bib/full/path/cb2bib.conf, being therefore independent of the mounting address that the host computer will provide. -To import references from a browser select when asked c2bimport, which expands to 'cb2bib --import %f'. The browser will provide the temporary reference filename. -A number of factors influence the reliability of automatic extractions. Consider writing customized regular expressions and network queries, and use metadata when available. Important: -The commands --doc2bib and --txt2bib do not append the references to the references.bib. They create a new file, or silently overwrite it if already exists. \endverbatim - <b>Note:</b> On Windows use <tt>c2bconsole</tt> instead of <tt>cb2bib</tt>. See \ref relnotes130. - <b>Note:</b> If using reference extraction command, see \ref faq_automatic_extraction. */ bool settings::isConsoleMode(int& argc, char** argv) { for (int i = 0; i < argc; ++i) if ( strcmp(argv[i], "--html-annote") == 0 || strcmp(argv[i], "--doc2bib") == 0 || strcmp(argv[i], "--txt2bib") == 0 || strcmp(argv[i], "--index") == 0 || strcmp(argv[i], "--test") == 0) return true; return false; } bool settings::isSingleApplicationMode(int& argc, char** argv) { for (int i = 0; i < argc; ++i) if (strcmp(argv[i], "--citer") == 0) return true; return false; } bool settings::isConfiguredMode() { const QCoreApplication* capp = QCoreApplication::instance(); if (capp->argc() > 1) { for (int i = 1; i < capp->argc(); i++) if (QString(capp->argv()[i]) == "--conf") return true; for (int i = 1; i < capp->argc(); i++) if (QString(capp->argv()[i]) == "--configure") { const int j(i + 1); if (j < capp->argc()) if (!QString(capp->argv()[j]).startsWith('-')) return true; return false; } } return false; } const QString settings::configuredFilename() { const QCoreApplication* capp = QCoreApplication::instance(); QStringList arguments(capp->arguments()); arguments.removeAll(QString()); QString filename; for (int i = 1; i < capp->argc() - 1; ++i) if (QString(arguments.at(i)) == "--conf" || QString(arguments.at(i)) == "--configure") { const int j(i + 1); if (!arguments.at(j).startsWith('-')) filename = QFile::decodeName(arguments.at(j).toLocal8Bit()); break; } if (filename.isEmpty()) filename = capp->applicationDirPath() + QDir::separator() + "cb2bib.conf"; QFileInfo fi(filename); if (fi.isDir()) { c2bUtils::warn(QObject::tr("Error: Could not open %1 configuration file for reading/writing").arg(filename)); c2bUtils::warn(QObject::tr("Error: Filename is a directory")); exit(1); } QFile file(filename); if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { c2bUtils::warn(QObject::tr("Error: Could not open %1 configuration file for reading/writing").arg(filename)); c2bUtils::warn(QObject::tr("Error: %1.").arg(file.errorString())); exit(1); } return filename; } void settings::readCommandLine() { QStringList arguments(_c2bApp->arguments()); arguments.removeAll(QString()); int actions(0); for (int i = 1; i < arguments.count(); ++i) if (arguments.at(i).startsWith('-')) { // switches if (arguments.at(i) == "--conf") { checkCommand(&cl_user_configured, &actions); _conf_command_flags.append("--conf"); const int j(i + 1); if (j < arguments.count() && !arguments.at(j).startsWith('-')) _conf_command_flags.append(arguments.at(j)); --actions; } else if (arguments.at(i) == "--sloppy") { checkCommand(&cl_sloppy, &actions); --actions; } // actions else if (arguments.at(i) == "--configure") checkCommand(&cl_configure, &actions); else if (arguments.at(i) == "--bibedit") checkCommand(&cl_bibedit, &actions); else if (arguments.at(i) == "--citer") checkCommand(&cl_citer, &actions); else if (arguments.at(i) == "--import") checkCommand(&cl_import, &actions); else if (arguments.at(i) == "--html-annote") checkCommand(&cl_html_annote, &actions); else if (arguments.at(i) == "--view-annote") checkCommand(&cl_view_annote, &actions); else if (arguments.at(i) == "--doc2bib") checkCommand(&cl_doc2bib, &actions); else if (arguments.at(i) == "--txt2bib") checkCommand(&cl_txt2bib, &actions); else if (arguments.at(i) == "--index") checkCommand(&cl_index, &actions); else if (arguments.at(i).startsWith("--test")) cl_cb2bib_tests = true; else _is_loaded = false; } if (actions > 1) _is_loaded = false; if (cl_user_configured && cl_configure) _is_loaded = false; if (cl_sloppy && !(cl_doc2bib || cl_txt2bib)) _is_loaded = false; if (cl_index && (cl_bibedit || cl_citer || cl_import || cl_html_annote || cl_view_annote || cl_doc2bib || cl_txt2bib)) _is_loaded = false; if (!_is_loaded) { printUsage(); return; } cl_console_mode = cl_html_annote || cl_cb2bib_tests || cl_doc2bib || cl_txt2bib || cl_index; cl_cb2bib_mode = !(cl_console_mode || cl_configure || cl_view_annote); // Check for cl_user_configured if (cl_configure) for (int i = 1; i < arguments.count() - 1; ++i) if (arguments.at(i) == "--configure") { if (!arguments.at(i + 1).startsWith('-')) cl_user_configured = true; break; } // Check for --bibedit files if (cl_bibedit) { for (int i = 1; i < arguments.count(); ++i) if (arguments.at(i) == "--bibedit") { for (int j = i + 1; j < arguments.count(); ++j) if (arguments.at(j).startsWith('-')) break; else cl_bibedit_filenames.append(decodeFilename(arguments.at(j))); break; } if (cl_bibedit_filenames.count() == 0) cl_bibedit = false; else setValue("cb2Bib/BibTeXFile", cl_bibedit_filenames.first()); } // Check for --citer files else if (cl_citer) { for (int i = 1; i < arguments.count(); ++i) if (arguments.at(i) == "--citer") { for (int j = i + 1; j < arguments.count(); ++j) if (arguments.at(j).startsWith('-')) break; else cl_citer_filenames.append(decodeFilename(arguments.at(j))); break; } } // Check for --index BibTeX dirname else if (cl_index) { for (int i = 1; i < arguments.count(); ++i) if (arguments.at(i) == "--index") { const int j(i + 1); if (j < arguments.count() && !arguments.at(j).startsWith('-')) cl_index_dirname.append(decodeFilename(arguments.at(j))); break; } } // Check for annote file else if (cl_html_annote || cl_view_annote) { for (int i = 1; i < arguments.count(); ++i) if (arguments.at(i) == "--html-annote" || arguments.at(i) == "--view-annote") { const int j(i + 1); if (j < arguments.count()) if (!arguments.at(j).startsWith('-')) cl_annote_filename = decodeFilename(arguments.at(j)); if (cl_annote_filename.isEmpty()) _is_loaded = false; } } // Check for extraction files else if (cl_doc2bib || cl_txt2bib) { for (int i = 1; i < arguments.count(); ++i) if (arguments.at(i) == "--doc2bib" || arguments.at(i) == "--txt2bib") { for (int j = i + 1; j < arguments.count(); ++j) if (arguments.at(j).startsWith('-')) break; else cl_extract_input_filenames.append(decodeFilename(arguments.at(j))); break; } if (cl_extract_input_filenames.count() < 2) _is_loaded = false; else cl_extract_output_filename = cl_extract_input_filenames.takeLast(); } // Check for import reference file else if (cl_import) { if (arguments.count() > 2) if (!arguments.at(2).startsWith('-')) { cl_import_filename = QFileInfo(QFile::decodeName(arguments.at(2).toLocal8Bit())).absoluteFilePath(); return; } cl_import = false; _is_loaded = false; } // Accept also 'cb2bib filename' as '--import' to ease import on Windows else if (arguments.count() > 1) if (!arguments.at(1).startsWith('-')) { cl_import_filename = QFileInfo(QFile::decodeName(arguments.at(1).toLocal8Bit())).absoluteFilePath(); cl_import = true; return; } if (!_is_loaded) printUsage(); } void settings::checkCommand(bool* action, int* actions) { if (*action) _is_loaded = false; *action = true; *actions += 1; } QString settings::decodeFilename(const QString& fn) const { // This function is meant for fn given by the command shell and that will end up being visible return QDir::toNativeSeparators(QFileInfo(QFile::decodeName(fn.toLocal8Bit())).absoluteFilePath()); } void settings::printUsage() { fprintf(stdout, "Usage: cb2bib\n"); fprintf(stdout, " cb2bib [action] [filename1 [filename2 ... ]] [--conf [filename.conf]]\n"); fprintf(stdout, "\n"); fprintf(stdout, "Actions:\n"); fprintf(stdout, " --configure [filename.conf] Edit configuration\n"); fprintf(stdout, "\n"); fprintf(stdout, " --bibedit [filename1.bib [filename2.bib ... ]] Edit/browse BibTeX files\n"); fprintf(stdout, " --citer [filename1.bib [filename2.bib ... ]] Start cb2Bib citer\n"); fprintf(stdout, " --import tmp_reference_filename Import reference, usually from ad hoc websites\n"); fprintf(stdout, "\n"); fprintf(stdout, " --doc2bib fn1.doc [fn2.doc ... ] reference.bib Extract reference from document file\n"); fprintf(stdout, " --txt2bib fn1.txt [fn2.txt ... ] reference.bib Extract reference from text file\n"); fprintf(stdout, "\n"); fprintf(stdout, " --index [bibdirname] Extract keywords from document files\n"); fprintf(stdout, "\n"); fprintf(stdout, " --html-annote filename.tex Convert annote file to HTML\n"); fprintf(stdout, " --view-annote filename.tex Convert and visualize annote file\n"); fprintf(stdout, " --view-annote filename.tex.html Visualize annote file\n"); fprintf(stdout, "\n"); fprintf(stdout, "Switches:\n"); fprintf(stdout, " --conf [filename.conf] Use configuration file\n"); fprintf(stdout, " --sloppy Accept guesses in automatic reference extraction\n"); fprintf(stdout, "\n"); fprintf(stdout, "Examples:\n"); fprintf(stdout, " cb2bib Start cb2Bib extraction panel\n"); fprintf(stdout, " cb2bib --import tmp_reference_filename Import reference\n"); fprintf(stdout, " cb2bib --bibedit filename.bib Edit BibTeX filename.bib\n"); fprintf(stdout, " cb2bib --conf Start cb2Bib in USB mode\n"); fprintf(stdout, " cb2bib --doc2bib *.pdf references.bib Extract references from PDF title pages\n"); fprintf(stdout, "\n"); fprintf(stdout, "Notes:\n"); fprintf(stdout, " -Use switch --conf to particularize specific settings for specific actions.\n"); fprintf(stdout, " -The file cb2bib.conf must be readable and writable. If it does not exist, the cb2Bib will create one\n"); fprintf(stdout, " based on predefined defaults.\n"); fprintf(stdout, " -If starting the cb2Bib from a removable media use, the command 'cb2bib --conf' without configuration\n"); fprintf(stdout, " filename. Settings will be read from and written to /cb2bib/full/path/cb2bib.conf, being therefore\n"); fprintf(stdout, " independent of the mounting address that the host computer will provide.\n"); fprintf(stdout, " -To import references from a browser select when asked c2bimport, which expands to 'cb2bib --import %%f'.\n"); fprintf(stdout, " The browser will provide the temporary reference filename.\n"); fprintf(stdout, " -A number of factors influence the reliability of automatic extractions. Consider writing customized\n"); fprintf(stdout, " regular expressions and network queries, and use metadata when available.\n"); fprintf(stdout, "\n"); fprintf(stdout, "Important:\n"); fprintf(stdout, " -The commands --doc2bib and --txt2bib do not append the references to the references.bib. They create\n"); fprintf(stdout, " a new file, or silently overwrite it if already exists.\n"); fprintf(stdout, "\n"); } ��������������������������������������������������������cb2bib-1.4.9/src/c2b/preprocess.h�������������������������������������������������������������������0000644�0001750�0001750�00000001413�12045520050�016361� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef PREPROCESS_H #define PREPROCESS_H #include <QObject> #include <QStringList> /** @author Pere Constans */ class preprocess : public QObject { Q_OBJECT public: preprocess(QObject* parento = 0); inline ~preprocess() {} public: void preprocessText(QString* text); public slots: void loadSettings(); private: bool FindReplaceInput; QStringList FindReplaceInputList; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/CMakeLists.txt�����������������������������������������������������������������0000644�0001750�0001750�00000001235�12045517740�016601� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # cb2bib cmake build script # - build libc2b #------------------------------------------------------------------------------- find_package(Qt4 ${CB2BIB_MINIMUM_REQUIRED_QT} COMPONENTS QtCore QtNetwork REQUIRED) list_source_files(LIBC2B_CPP LIBC2B_H LIBC2B_MOCH) list(APPEND LIBC2B_CPP qtregexp/eqregexp.cpp) qt4_wrap_cpp(LIBC2B_MOC ${LIBC2B_MOCH}) qt4_add_resources(LIBC2B_RCC c2blib.qrc) include(${QT_USE_FILE}) include_directories(.) add_library(c2b STATIC ${LIBC2B_CPP} ${LIBC2B_MOC} ${LIBC2B_RCC}) #-------------------------------------------------------------------------------�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/texToHtml.h��������������������������������������������������������������������0000644�0001750�0001750�00000005441�12045520050�016131� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef TEXTOHTML_H #define TEXTOHTML_H #include "texParser.h" #include "coreBibParser.h" /** Minimalist TeX to HTML converter */ class texToHtml : public texParser { public: texToHtml(); inline ~texToHtml() {} QString toHtml(const QString& tex); void toHtml(const QString& tex, const QString& fn); private: QDir _current_dir; QHash<QString, bibReference> _references; QHash<QString, int> _cites; QList<QRegExp> _tex_macro_names_rx; QRegExp _extern_url_rx; QRegExp _has_inline_equations_rx; QRegExp _macro_arguments_rx; QRegExp _named_extern_url_rx; QRegExp _named_url_rx; QRegExp _url_rx; QString _bibtex_directory; QString _html; QString _html_filename; QString _index; QString _tex_macros; QString _title; bool _close_subsection; bool _close_subsubsection; bool _has_equation; bool _make_index; bool _use_relative_links; coreBibParser _cbp; int _index_anchors; settings* _settingsP; void citesToHtml(QString* html); void extractCites(const QString& p); void extractMacro(const QString& v); void parseComment(const QString& p); void parseElement(const QString& p, const QString& e, const QString& v); void parseTextParagraph(const QString& p); void referencesToHtml(QString* reference_list_html); void retrieveReferences(); inline void urlToHtml(QString* str) { str->replace(_named_url_rx, "<a href=\"\\1\">\\2</a>"); str->replace(_url_rx, "<a href=\"\\1\">\\1</a>\\2"); str->replace(_named_extern_url_rx, "<a href=\"\\1\" target=\"_blank\">\\2</a>"); str->replace(_extern_url_rx, "<a href=\"\\1\" target=\"_blank\">\\1</a>\\2"); } inline QString toHtmlString(QString str, const bool do_macros = true) { // Move LaTeX to Unicode c2bUtils::bibToC2b(str); // Encode some symbols to HTML for proper browser display str.replace('<', "<"); str.replace('>', ">"); str.replace('%', "%"); // Super/sub scripts: Not clear if jsMath should manage them str.replace(QRegExp("_\\{([^\\}]*)\\}"), "<sub>\\1</sub>"); str.replace(QRegExp("\\^\\{([^\\}]*)\\}"), "<sup>\\1</sup>"); // Insert $$ into LaTeX macros if (do_macros) for (int i = 0; i < _tex_macro_names_rx.count(); ++i) str.replace(_tex_macro_names_rx.at(i), "$\\1$"); return str; } }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/settings.h���������������������������������������������������������������������0000644�0001750�0001750�00000010312�12045520050�016032� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef SETTINGS_H #define SETTINGS_H #include "cb2bib_parameters.h" #include <QDir> #include <QSettings> #include <QStringList> class QCoreApplication; class settings : public QSettings { Q_OBJECT public: settings(QObject* parento = 0); virtual ~settings(); // Command line data. (Set public for easiest access. Only settings or derived classes should modify it) QString cl_annote_filename; QString cl_extract_output_filename; QString cl_import_filename; QString cl_index_dirname; QStringList cl_bibedit_filenames; QStringList cl_citer_filenames; QStringList cl_extract_input_filenames; bool cl_bibedit; bool cl_cb2bib_import_mode; bool cl_cb2bib_mode; bool cl_cb2bib_tests; bool cl_citer; bool cl_configure; bool cl_console_mode; bool cl_doc2bib; bool cl_html_annote; bool cl_import; bool cl_index; bool cl_sloppy; bool cl_txt2bib; bool cl_user_configured; bool cl_view_annote; // Get/Set filenames according to settings // PdfDirectory is a particular case. If relative, it is relative to the BibTeX file inline QString fileName(const QString& key) const { if (_is_usb_configured_mode) { const QString v(value(key).toString()); if (key == "cb2Bib/PdfDirectory") if (value("cb2Bib/RelativePdfDirectory").toBool()) return QDir::toNativeSeparators(QDir::cleanPath(v)); if (key.endsWith("Bin")) // Pathless binary to be found on PATH if (!(v.contains('/') || v.contains('\\'))) return v; return QDir::toNativeSeparators(QDir::cleanPath(_c2bAppDir.absoluteFilePath(v))); } else return QDir::toNativeSeparators(QDir::cleanPath(value(key).toString())); } inline void setFilename(const QString& key, const QString& fn) { if (_is_usb_configured_mode) { if (key == "cb2Bib/PdfDirectory") { if (value("cb2Bib/RelativePdfDirectory").toBool()) { setValue(key, fn); return; } } setValue(key, _c2bAppDir.relativeFilePath(fn)); } else setValue(key, fn); } inline bool loaded() const { return _is_loaded; } inline bool isUsbConfiguredMode() const { return _is_usb_configured_mode; } inline QStringList confCommandFlags() const { return _conf_command_flags; } inline QString tempPath() const { return _tmp_dir_path; } inline QString applicationPid() const { return _application_pid; } void setDefaultValue(const QString& key, const QVariant& value); static bool isConsoleMode(int& argc, char** argv); static bool isSingleApplicationMode(int& argc, char** argv); static settings* instance() { Q_ASSERT_X(_c2b_global_settings, "settings", "settings was not instantiated"); return _c2b_global_settings; } protected: settings(const QString& organization, const QString& application, QObject* parento = 0); settings(const QString& fn, QObject* parento = 0); // init() has a virtual method, keep it out of the constructor void init(bool command_line = true); static bool isConfiguredMode(); static const QString configuredFilename(); virtual QString decodeFilename(const QString& fn) const; private: QCoreApplication* _c2bApp; QDir _c2bAppDir; QString _application_pid; QString _tmp_dir_path; QStringList _conf_command_flags; bool _is_loaded; bool _is_usb_configured_mode; static settings* _c2b_global_settings; void _init(); void checkCommand(bool* action, int* actions); void printUsage(); void readCommandLine(); void setDefaults(); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/document.cpp�������������������������������������������������������������������0000644�0001750�0001750�00000026055�12045520050�016356� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "document.h" #include "cb2bib_utilities.h" #include "settings.h" #include <QProcess> document::document(const QString& fn, const Conversion mode) { _document_fn = fn.trimmed(); settings* settingsP = settings::instance(); _converter_output = settingsP->tempPath() + "/cb2bib_document_conversion_tmp_" + settingsP->applicationPid(); setConverter(mode); } QString document::fileToString(const QString& fn) { _document_fn = fn.trimmed(); return toString(); } QString document::toString() { _error_string.clear(); _log_string.clear(); if (_document_fn.isEmpty()) return QString(); QFileInfo fbin(_converter_bin); if (fbin.isAbsolute()) if (!fbin.exists() || !fbin.isFile()) { _error_string = QObject::tr("Converter %1 does not exist\n").arg(_converter_bin); return QString(); } QFileInfo fi(_document_fn); if (!fi.exists() || !fi.isFile()) { _error_string = QObject::tr("File %1 does not exist\n").arg(_document_fn); return QString(); } QProcess converter; QStringList args(_converter_arg.split(' ', QString::SkipEmptyParts)); args.append(_document_fn); args.append(_converter_output); converter.start(_converter_bin, args); if (!converter.waitForStarted()) { _error_string += QObject::tr("Converter '%1 %2' could not be started. Check file permissions and path\n") .arg(_converter_bin).arg(_converter_arg); return QString(); } if (!converter.waitForFinished(_conversion_mode == Raw ? -1 : 150000)) { converter.kill(); c2bUtils::warn(QObject::tr("Error: Document conversion timeout for file '%1'").arg(_document_fn)); } QString doc(c2bUtils::fileToString(_converter_output, true)); _log_string = QString::fromUtf8(converter.readAllStandardOutput().trimmed()); _log_string += '\n' + QString::fromUtf8(converter.readAllStandardError().trimmed()); if (converter.exitStatus() != QProcess::NormalExit || doc.isEmpty()) { _error_string += QObject::tr("[%1 %2] Conversion failed for file %3\n") .arg(_converter_bin).arg(_converter_arg).arg(_document_fn); c2bUtils::warn(QObject::tr("Warning: Text conversion for file '%1' is empty").arg(_document_fn)); return QString(); } // Do some processing // Remove null chacracters (avoids truncation in toUtf8, djvutxt places them at the end of page) doc.replace(QChar(0), ' '); // Unify separator doc.replace(QChar(8208), '-'); doc.replace(QChar(8209), '-'); doc.replace(QChar(8210), '-'); doc.replace(QChar(8211), '-'); doc.replace(QChar(8212), '-'); doc.replace(QChar(8213), '-'); doc.replace(QChar(8722), '-'); doc.replace(QChar(65533), '-'); if (_conversion_mode == Raw) { // Join hyphenated words doc.remove(QRegExp("-\\s*[\\n\\r]\\s*(?=\\w)")); doc.replace(QRegExp("[\\n\\r]"), " "); } // Unify apostrophe doc.replace(QChar(8216), '\''); doc.replace(QChar(8217), '\''); // Unify comma doc.replace(QChar(65292), ','); // Revert Latin ligatures doc.replace(QChar(306), "IJ"); doc.replace(QChar(307), "ij"); doc.replace(QChar(64256), "ff"); doc.replace(QChar(64257), "fi"); doc.replace(QChar(64258), "fl"); doc.replace(QChar(64259), "ffi"); doc.replace(QChar(64260), "ffl"); doc.replace(QChar(65842), "IJ"); doc.replace(QChar(65843), "ij"); if (doc.contains(QChar(174))) // Correct frequent misencoding of "fi" as circle R in PDFs doc.replace(QRegExp(QString("%1([a-z])").arg(QChar(174))), "fi\\1"); // Corrections for pdftotext raw doc.replace(QChar(305), 'i'); doc.replace(QChar(711), ' '); const QChar grave(96); doc.replace(' ' + grave, " '"); doc.replace(QString(2, grave), "'"); doc.replace(grave + 'a', QChar(224)); doc.replace(grave + 'e', QChar(232)); doc.replace(grave + 'i', QChar(236)); doc.replace(grave + 'o', QChar(242)); doc.replace(grave + 'u', QChar(249)); doc.replace(grave + 'A', QChar(192)); doc.replace(grave + 'E', QChar(200)); doc.replace(grave + 'I', QChar(204)); doc.replace(grave + 'O', QChar(210)); doc.replace(grave + 'U', QChar(217)); doc.replace('a' + grave, QChar(224)); doc.replace('e' + grave, QChar(232)); doc.replace('i' + grave, QChar(236)); doc.replace('o' + grave, QChar(242)); doc.replace('u' + grave, QChar(249)); doc.replace('A' + grave + ' ', QChar(192)); doc.replace('E' + grave + ' ', QChar(200)); doc.replace('I' + grave + ' ', QChar(204)); doc.replace('O' + grave + ' ', QChar(210)); doc.replace('U' + grave + ' ', QChar(217)); doc.replace('A' + grave, QChar(192)); doc.replace('E' + grave, QChar(200)); doc.replace('I' + grave, QChar(204)); doc.replace('O' + grave, QChar(210)); doc.replace('U' + grave, QChar(217)); const QChar dieresis(168); doc.replace(dieresis + 'a', QChar(228)); doc.replace(dieresis + 'e', QChar(235)); doc.replace(dieresis + 'i', QChar(239)); doc.replace(dieresis + 'o', QChar(246)); doc.replace(dieresis + 'u', QChar(252)); doc.replace(dieresis + 'A', QChar(196)); doc.replace(dieresis + 'E', QChar(203)); doc.replace(dieresis + 'I', QChar(207)); doc.replace(dieresis + 'O', QChar(214)); doc.replace(dieresis + 'U', QChar(220)); doc.replace('a' + dieresis, QChar(228)); doc.replace('e' + dieresis, QChar(235)); doc.replace('i' + dieresis, QChar(239)); doc.replace('o' + dieresis, QChar(246)); doc.replace('u' + dieresis, QChar(252)); doc.replace('A' + dieresis + ' ', QChar(196)); doc.replace('E' + dieresis + ' ', QChar(203)); doc.replace('I' + dieresis + ' ', QChar(207)); doc.replace('O' + dieresis + ' ', QChar(214)); doc.replace('U' + dieresis + ' ', QChar(220)); doc.replace('A' + dieresis, QChar(196)); doc.replace('E' + dieresis, QChar(203)); doc.replace('I' + dieresis, QChar(207)); doc.replace('O' + dieresis, QChar(214)); doc.replace('U' + dieresis, QChar(220)); const QChar accute(180); doc.replace(accute + 'a', QChar(225)); doc.replace(accute + 'e', QChar(233)); doc.replace(accute + 'i', QChar(237)); doc.replace(accute + 'o', QChar(243)); doc.replace(accute + 'u', QChar(250)); doc.replace(accute + 'A', QChar(193)); doc.replace(accute + 'E', QChar(201)); doc.replace(accute + 'I', QChar(205)); doc.replace(accute + 'O', QChar(211)); doc.replace(accute + 'U', QChar(218)); doc.replace('a' + accute, QChar(225)); doc.replace('e' + accute, QChar(233)); doc.replace('i' + accute, QChar(237)); doc.replace('o' + accute, QChar(243)); doc.replace('u' + accute, QChar(250)); doc.replace('A' + accute + ' ', QChar(193)); doc.replace('E' + accute + ' ', QChar(201)); doc.replace('I' + accute + ' ', QChar(205)); doc.replace('O' + accute + ' ', QChar(211)); doc.replace('U' + accute + ' ', QChar(218)); doc.replace('A' + accute, QChar(193)); doc.replace('E' + accute, QChar(201)); doc.replace('I' + accute, QChar(205)); doc.replace('O' + accute, QChar(211)); doc.replace('U' + accute, QChar(218)); const QChar circumflex(710); doc.replace(circumflex + 'a', QChar(226)); doc.replace(circumflex + 'e', QChar(234)); doc.replace(circumflex + 'i', QChar(238)); doc.replace(circumflex + 'o', QChar(244)); doc.replace(circumflex + 'u', QChar(251)); doc.replace(circumflex + 'A', QChar(194)); doc.replace(circumflex + 'E', QChar(202)); doc.replace(circumflex + 'I', QChar(206)); doc.replace(circumflex + 'O', QChar(212)); doc.replace(circumflex + 'U', QChar(219)); doc.replace('a' + circumflex, QChar(226)); doc.replace('e' + circumflex, QChar(234)); doc.replace('i' + circumflex, QChar(238)); doc.replace('o' + circumflex, QChar(244)); doc.replace('u' + circumflex, QChar(251)); doc.replace('A' + circumflex + ' ', QChar(194)); doc.replace('E' + circumflex + ' ', QChar(202)); doc.replace('I' + circumflex + ' ', QChar(206)); doc.replace('O' + circumflex + ' ', QChar(212)); doc.replace('U' + circumflex + ' ', QChar(219)); doc.replace('A' + circumflex, QChar(194)); doc.replace('E' + circumflex, QChar(202)); doc.replace('I' + circumflex, QChar(206)); doc.replace('O' + circumflex, QChar(212)); doc.replace('U' + circumflex, QChar(219)); const QChar cedilla(184); doc.replace('c' + cedilla, QChar(231)); doc.replace('C' + cedilla, QChar(199)); doc.replace(cedilla + 'c', QChar(231)); doc.replace(cedilla + 'C', QChar(199)); doc.replace('s' + cedilla, QChar(351)); doc.replace('S' + cedilla, QChar(350)); doc.replace(cedilla + 's', QChar(351)); doc.replace(cedilla + 'S', QChar(350)); const QChar tilde(732); doc.replace('n' + tilde, QChar(241)); doc.replace('N' + tilde, QChar(209)); doc.replace(tilde + 'n', QChar(241)); doc.replace(tilde + 'N', QChar(209)); doc.replace('a' + tilde, QChar(227)); doc.replace('A' + tilde, QChar(195)); doc.replace(tilde + 'a', QChar(227)); doc.replace(tilde + 'A', QChar(195)); const QChar ring(730); doc.replace('a' + ring, QChar(229)); doc.replace('A' + ring, QChar(197)); doc.replace(ring + 'a', QChar(229)); doc.replace(ring + 'A', QChar(197)); // poppler doc.remove(QChar(826)); doc.remove(QChar(841)); doc.remove(QChar(849)); doc.remove(QChar(850)); doc.remove(QChar(851)); doc.remove(QChar(852)); doc.remove(QChar(853)); doc.remove(QChar(854)); doc.remove(QChar(855)); doc.remove(QChar(856)); doc.remove(QChar(858)); doc.remove(QChar(862)); doc.remove(QChar(873)); doc.remove(QChar(874)); doc.remove(QChar(888)); // Skip control codes // Many are improper conversions from PDF to text mathematical symbols doc.replace(QChar(127), ' '); for (int i = 0; i < doc.length(); ++i) { QCharRef c = doc[i]; const int u(c.unicode()); if (u > 31) continue; if (u > 8 && u < 14) // tabs, new lines continue; c = ' '; } return doc; } void document::setConverter(const Conversion mode) { _conversion_mode = mode; settings* s(settings::instance()); switch (_conversion_mode) { case Raw: setConverter(s->fileName("c2bBibSearcher/Pdf2TextBin"), s->value("c2bBibSearcher/Pdf2TextArg").toString()); break; case FirstPage: default: setConverter(s->fileName("c2bPdfImport/Pdf2TextBin"), s->value("c2bPdfImport/Pdf2TextArg").toString()); break; } } void document::setConverter(const QString& bin, const QString& args) { _converter_bin = bin.trimmed(); _converter_arg = args.simplified(); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/coreBibParser.h����������������������������������������������������������������0000644�0001750�0001750�00000015773�12045520050�016734� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef COREBIBPARSER_H #define COREBIBPARSER_H #include "authorString.h" #include "bibReference.h" #include "cb2bib_utilities.h" #include "settings.h" #include <QDir> #include <QObject> /** Class for bibliographic reference parsing @author Pere Constans */ class coreBibParser : public QObject { Q_OBJECT public: coreBibParser(QObject* parento = 0); inline virtual ~coreBibParser() {} QString referenceToBibTeX(const bibReference& ref) const; QString referenceToFomattedBibTeX(const bibReference& ref) const; bibReference wholeReference(const QString& str); bool referenceAtKey(const QString& key, const QString& str, bibReference* ref); bool referencesIn(const QString& str, bibReference* ref); void initReferenceParsing(const QString& dir, const QStringList& fields, bibReference* ref); inline const QStringList& bibliographicFields() const { return _bibliographic_fields; } inline const QStringList& sortedBibliographicFields() const { return _sorted_bibliographic_fields; } inline const QStringList& bibliographicTypes() const { return _bibliographic_types; } inline void setReferenceParsingDir(const QString& dir) { // Set base dir for cases of relative 'file' // Terminate dirname with separator to avoid adding it to each reference _bib_file_dir = QDir::toNativeSeparators(QFileInfo(dir).absolutePath() + QDir::separator()); } inline bool hasBibTeX(const QString& str) const { if (_bib_begin0_re.indexIn(str) > -1) return true; else return _bib_begin1_re.indexIn(str) > -1; } inline int fieldCount(const bibReference& ref) const { // Counting Non Empty Fields int n(0); bibReferenceIterator i; for (i = ref.constBegin(); i != ref.constEnd(); ++i) if (!i.value().isEmpty()) ++n; return n; } inline QString& authorFromBibTeX(QString& as) { // Avoid BibTeX reverse names if (as.contains(',')) as = _authorString.toBibTeX(as, _settingsP->value("cb2Bib/UseFullNames").toBool()); return as; } protected: QRegExp _field_re; QString adjacentNumbers(const QString& numbers) const; QStringList _bibliographic_fields; QStringList _bibliographic_types; QStringList _sorted_bibliographic_fields; authorString _authorString; settings* _settingsP; private: QList<QRegExp> _bib_fields_nb_re; QList<QRegExp> _bib_fields_re; QRegExp _bib_begin0_re; QRegExp _bib_begin1_re; QRegExp _bib_begin_re; QRegExp _bib_key_re; QRegExp _bib_type_re; QString _bib_file_dir; const QChar _close; const QChar _comma; const QChar _open; const QChar _space; void setFields(); void setRegularExpressions(); void setTypes(); inline int referenceStarts(const QString& str, int pos = 0) const { int i; if (pos == 0) { i = _bib_begin0_re.indexIn(str); if (i < 0) i = _bib_begin1_re.indexIn(str, pos); } else i = _bib_begin1_re.indexIn(str, pos); if (i < 0) return i; return _bib_begin_re.indexIn(str, i); } inline int referenceStarts(const QString& key, const QString& str) const { if (!str.contains(key)) return -1; int i(str.indexOf(QRegExp("^\\s*@\\w+\\s*\\{" + key + ','))); if (i < 0) i = str.indexOf(QRegExp("[\\r\\n]\\s*@\\w+\\s*\\{" + key + ',')); if (i < 0) return i; return str.indexOf(QRegExp("@\\w+\\s*\\{" + key + ','), i); } inline int referenceEnds(const QString& str, int pos = 0) const { // If referenceStarts call is successful, we know for sure // that there is an opening { right after pos. // Do not check again here. // Checking for brace closure is the safest way for parsing. // It will fail, though, for references incorrectly written. // Avoid overextending in these cases by checking the // start of the next reference. int ref_length(referenceStarts(str, pos + 2) - 1); if (ref_length < 0) ref_length = str.length(); const int brace_pos(str.indexOf(_open, pos)); int open_braces(1); for (int i = brace_pos + 1; i < ref_length; ++i) { const QChar& si = str.at(i); if (si == _open) open_braces++; else if (si == _close) open_braces--; if (open_braces == 0) return i; } return ref_length - 1; } inline void setReferenceEnd(QString* str, const int& length) const { // Set safer termination: field="..." } -> field="...",} if (str->at(length - 2) == _space) (*str)[length - 2] = _comma; else (*str)[length - 1] = _comma; } inline QString referenceAt(const QString& str, int* pos) const { // String str contains one or multiple references (file contents) const int pos_(referenceEnds(str, *pos) + 1); const QString str_ref(str.mid(*pos, pos_ - (*pos))); *pos = pos_; return str_ref; } inline void referenceContents(const QString& str, bibReference* ref, int pos) { // File parsing for given fields in ref ref->positionValue = pos; QString str_ref(referenceAt(str, &pos)); ref->pos = pos; ref->rawReference = str_ref; c2bUtils::bibToC2b(str_ref); c2bUtils::simplifyString(str_ref); ref->unicodeReference = str_ref; _bib_key_re.indexIn(str_ref); ref->citeidName = _bib_key_re.cap(1); _bib_type_re.indexIn(str_ref); ref->typeName = _bib_type_re.cap(1).toLower(); setReferenceEnd(&str_ref, str_ref.length()); QString fvalue; for (int i = 0; i < ref->_bib_fields_re.count(); ++i) { QRegExp* bf = &ref->_bib_fields_re[i]; pos = bf->indexIn(str_ref); if (pos > 0) { if (c2bUtils::inBraces(pos + bf->matchedLength(), str_ref, &fvalue)) (*ref)[ref->bib_fieldList.at(i)] = fvalue.trimmed(); } else { bf = &ref->_bib_fields_nb_re[i]; if (bf->indexIn(str_ref) > -1) (*ref)[ref->bib_fieldList.at(i)] = bf->cap(1).trimmed(); } } if (ref->contains("file")) if (!QDir::isAbsolutePath(ref->value("file"))) (*ref)["file"] = _bib_file_dir + ref->value("file"); } }; #endif �����cb2bib-1.4.9/src/c2b/bibExtractor.cpp���������������������������������������������������������������0000644�0001750�0001750�00000020573�12045520050�017167� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "bibExtractor.h" #include "bibParser.h" #include "cb2bib_utilities.h" #include "document.h" #include "metadataParser.h" #include "network.h" #include "networkQuery.h" #include "settings.h" #include <QEventLoop> bibExtractor::bibExtractor(QObject* parento) : QObject(parento), cout(*(new QTextStream(stdout))) { _settingsP = settings::instance(); _bpP = new bibParser(this); _mpP = new metadataParser(_bpP, this); _networkQP = new networkQuery(_bpP, this); init(); } bibExtractor::bibExtractor(bibParser* bp, metadataParser* mp, networkQuery* nq, QObject* parento) : QObject(parento), cout(*(new QTextStream(stdout))), _bpP(bp), _mpP(mp), _networkQP(nq) { _settingsP = settings::instance(); Q_ASSERT_X(_bpP, "bibExtractor", "bibParser was not instantiated"); Q_ASSERT_X(_networkQP, "bibExtractor", "networkQuery was not instantiated"); init(); } bibExtractor::~bibExtractor() { delete &cout; } void bibExtractor::init() { connect(_networkQP, SIGNAL(queryEnded(bool, const QString&, const QString&)), this, SLOT(queryEnded(bool, const QString&, const QString&)), Qt::QueuedConnection); connect(_networkQP->networkPtr(), SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)), this, SLOT(proxyLogMessage())); _event_loop = new QEventLoop(this); } /** Extracts a bibliographic reference from files input_fns and writes it to the BibTeX file output_fn */ int bibExtractor::extract(const QStringList& input_fns, const QString& output_fn, const InputType& type) { _input_type = type; QString bibtex; for (int i = 0; i < input_fns.count(); ++i) { const QString& input_fn = input_fns.at(i); if (!QFileInfo(input_fn).exists()) { logMessage(tr("Error: File %1 does not exist.").arg(input_fn)); continue; } logMessage(tr("Processing %1...").arg(input_fn)); if (_input_type == Document) { _document_fn = input_fn; const QString text(documentToString(input_fn)); extract(text); } else { _document_fn.clear(); const QString text(c2bUtils::fileToString(input_fn)); extract(text); } if (_settingsP->value("cb2Bib/MovePdf").toBool() && !_document_fn.isEmpty() && isReliable()) { const QString file(_bpP->documentFilename(_document_fn, output_fn)); const QString target_doc_fn(c2bUtils::documentAbsoluteName(_settingsP->value("cb2Bib/RelativePdfDirectory").toBool(), output_fn, _settingsP->fileName("cb2Bib/PdfDirectory"), file)); const QString doc_dirname(QFileInfo(target_doc_fn).absolutePath()); QDir doc_dir(doc_dirname); if (!doc_dir.exists()) if (!doc_dir.mkpath(doc_dirname)) logMessage(tr("Error: Unable to create directory %1.").arg(doc_dirname)); if (doc_dir.exists()) { const network::Action action(network::actionType(_settingsP->value("cb2Bib/CopyMovePdf").toString())); logMessage(tr("Copying/moving to %1...").arg(target_doc_fn)); _networkQP->networkPtr()->getFile(_document_fn, target_doc_fn, action, this, SLOT(copyMoveEnded(bool))); _event_loop->exec(); if (_is_copymove_ok) { if (_settingsP->value("cb2Bib/InsertMetadata").toBool()) { QString mp_error; if (!_mpP->insertMetadata(_bpP->currentReference(), target_doc_fn, &mp_error)) { logMessage(tr("Warning: Unable to insert metadata to file %1.").arg(target_doc_fn)); logMessage(mp_error); } } _document_fn = file; } else { if (_settingsP->cl_sloppy) { logMessage(tr("Warning: Skipping file field %1.").arg(_document_fn)); _document_fn.clear(); } else _bpP->clearCurrentReference(); } } } if (isReliable()) { if (!_document_fn.isEmpty()) _bpP->setField("file", _document_fn); bibtex += _bpP->toBibTeX(); } else logMessage(tr("Warning: Skip writing reference for file %1.").arg(input_fn)); logMessage(QString()); } if (bibtex.isEmpty()) logMessage(tr("Warning: No reference extracted.")); else { logMessage(tr("Writing %1...").arg(output_fn)); if (c2bUtils::stringToFile(bibtex, output_fn)) return 0; else logMessage(tr("Error: Unable to write file %1.").arg(output_fn)); } return 1; } /** Extracts a bibliographic reference from input string text writes it to the output string bibtex */ int bibExtractor::extract(const QString& text, QString* bibtex) { _document_fn.clear(); _input_type = PlainText; extract(text); *bibtex = _bpP->toBibTeX(); if (_bpP->isAutoRecognized()) return 0; else if (_bpP->fieldCount() > 0) return 1; else return 2; } void bibExtractor::extract(const QString& text) { _extract(text); if (_settingsP->value("cb2Bib/AutomaticQuery").toBool()) if (!_bpP->autoRecognizedString().contains("BibTeX") && _bpP->fieldCount() > 0) { logMessage(tr("Submitting query...")); _settingsP->setValue("networkQuery/isSupervised", false); _networkQP->submitQuery(_bpP->currentReference(), text, _input_type == PlainText); _event_loop->exec(); _settingsP->setValue("networkQuery/isSupervised", true); } _bpP->setCiteID(); } void bibExtractor::_extract(const QString& text) { _bpP->clearCurrentReference(); _bpP->setReferenceType("unknown"); if (text.trimmed().isEmpty()) { logMessage(tr("Warning: Empty input string.")); return; } QString out_text, out_tagtext; if (_settingsP->value("cb2Bib/PreparserAutomatic").toBool()) _bpP->preparse(text, &out_text); _bpP->parse(text, &out_text, &out_tagtext); if (_bpP->fieldCount() > 0) _bpP->setReferenceType("article"); logMessage(_bpP->autoRecognizedString()); } void bibExtractor::queryEnded(bool succeeded, const QString& targetPDF, const QString& targetBib) { if (succeeded) { _extract(targetBib); if (_input_type == PlainText && _bpP->isAutoRecognized() && !targetPDF.isEmpty()) _document_fn = targetPDF; } _event_loop->exit(); } void bibExtractor::copyMoveEnded(bool ok) { _is_copymove_ok = ok; if (!_is_copymove_ok) logMessage(tr("Error: Copy/move failed. %1").arg(_networkQP->networkPtr()->errorString())); _event_loop->exit(); } void bibExtractor::proxyLogMessage() const { _networkQP->networkPtr()->cancelDownload(); logMessage(tr("Warning: Proxy authentication dialog is disabled in command line mode.")); } void bibExtractor::logMessage(const QString& ms) const { cout << "[cb2bib] " << ms << endl; } bool bibExtractor::isReliable() const { if (_settingsP->cl_sloppy) return true; else return _bpP->isAutoRecognized(); } QString bibExtractor::documentToString(const QString& fn) const { document doc(fn, document::FirstPage); const QString text(doc.toString()); if (!doc.errorString().isEmpty()) logMessage("Error: " + doc.errorString()); if (_settingsP->value("cb2Bib/AddMetadata").toBool()) { // Add metadata to document text const QString metadata(_mpP->metadata(fn)); if (_settingsP->value("cb2Bib/PreAppendMetadata").toString() == "prepend") return metadata + text; else return text + '\n' + metadata; } else return text; } �������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/triads.cpp���������������������������������������������������������������������0000644�0001750�0001750�00000005707�12045520050�016027� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "triads.h" #include "cb2bib_utilities.h" #include <QHash> const QString triads::textSignature(const QString& str) { if (str.isEmpty()) return QString(); else return asciiTextSignature(c2bUtils::toAscii(str, c2bUtils::KeepWords)); } const QVector<QString> triads::textSignature(const QStringList& strs) { QVector<QString> s(strs.count()); for (int i = 0; i < strs.count(); ++i) s[i] = textSignature(strs.at(i)); return s; } const QString triads::asciiTextSignature(const QString& str) { QString s(str); s.replace(c2bUtils::nonAsciiLetter, " "); s = s.toLower(); s = c2bUtils::simplifyString(s); const int nletters(26); const int ngram(5); const int slength(s.length()); const int code0(QChar('a').unicode()); QHash<int, int> triads; for (int i = 0; i <= slength - ngram; ++i) { const QString t(s.mid(i, ngram)); if (t.contains(' ')) continue; int t1 = s.at(i).unicode() - code0; int t2 = s.at(i + 2).unicode() - code0; int t3 = s.at(i + 4).unicode() - code0; int code = code0 + t1 * nletters * nletters + t2 * nletters + t3; if (!triads.contains(code)) triads.insert(code, 1); } QList<int> codes(triads.keys()); qSort(codes); s.clear(); for (int i = 0; i < codes.count(); ++i) s += QChar(codes.at(i)); return s; } int triads::textFrequency(const QString& str) { const QString sign(textSignature(str)); if (sign.length() == 0) return 1000 - str.length(); else return _rank(str, sign, c2bUtils::fileToString(":txt/txt/triads.txt")); } const QVector<int> triads::textFrequency(const QStringList& strs) { if (strs.count() == 0) return QVector<int>(); const QString ranks(c2bUtils::fileToString(":txt/txt/triads.txt")); QVector<int> fr(strs.count()); for (int i = 0; i < strs.count(); ++i) { const QString sign(textSignature(strs.at(i))); if (sign.length() == 0) fr[i] = 1000 - strs.at(i).length(); else fr[i] = _rank(strs.at(i), sign, ranks); } return fr; } int triads::_rank(const QString& str, const QString& sign, const QString& ranks) { const int m(sign.length()); const int n(ranks.length()); int counter(0); int j0(0); for (int i = 0; i < m; ++i) for (int j = j0; j < n; ++j) if (sign[i] == ranks[j]) { ++counter; j0 = j + 1; break; } counter = 100 * (m - counter) + str.length(); return 1000 - counter; } ���������������������������������������������������������cb2bib-1.4.9/src/c2b/bibExtractor.h�����������������������������������������������������������������0000644�0001750�0001750�00000003246�12045520050�016632� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef BIBEXTRACTOR_H #define BIBEXTRACTOR_H #include <QObject> class bibParser; class metadataParser; class networkQuery; class settings; class QEventLoop; class QTextStream; /** Wrapper class for handling the whole bibliographic extraction/recognition process. */ class bibExtractor : public QObject { Q_OBJECT public: bibExtractor(QObject* parento = 0); bibExtractor(bibParser* bp, metadataParser* mp, networkQuery* nq, QObject* parento = 0); ~bibExtractor(); enum InputType {PlainText, Document}; int extract(const QString& text, QString* bibtex); int extract(const QStringList& input_fns, const QString& output_fn, const InputType& type); private: InputType _input_type; QEventLoop* _event_loop; QString _document_fn; QString documentToString(const QString& fn) const; QTextStream& cout; bibParser* _bpP; bool _is_copymove_ok; bool isReliable() const; metadataParser* _mpP; networkQuery* _networkQP; settings* _settingsP; void _extract(const QString& text); void extract(const QString& text); void init(); private slots: void copyMoveEnded(bool ok); void logMessage(const QString& ms) const; void proxyLogMessage() const; void queryEnded(bool succeeded, const QString& targetPDF, const QString& targetBib); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/cb2bib_utilities.h�������������������������������������������������������������0000644�0001750�0001750�00000030344�12045520050�017417� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef CB2BIB_UTILITIES_H #define CB2BIB_UTILITIES_H #include <QDir> #include <QFile> #include <QFileInfo> #include <QRegExp> #include <QString> #include <QStringMatcher> #include <QtDebug> /** cb2Bib core utilities */ namespace c2bUtils { enum AsciiConversion {Cleanup, Collation, FromBibTeX, KeepWords, Transliterate}; extern QString setCapitalization(const QString& str); extern QString toAscii(const QString& str, const AsciiConversion type); extern QString& bibToC2b(QString& str); extern QString& c2bToBib(QString& str); extern QString& fillString(QString& str, const QRegExp& pattern, const QChar& ch); extern QString& fillString(QString& str, const QString& pattern, const QChar& ch); extern QString& fillString(QString& str, const QStringMatcher& pattern, const QChar& ch); extern QString& simplifyString(QString& str); extern QString& stripDiacritics(QString& str); static const QRegExp pnasGreekLetters("[\\{\\[\\(](alpha|beta|gamma|delta|varepsilon|" "zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|" "omicron|pi|rho|sigmaf|varsigma|sigma|tau|" "upsilon|phi|chi|psi|omega|vartheta|varphi|" "varpi|digamma|varkappa|varrho|epsilon)[\\}\\]\\)]", Qt::CaseInsensitive); // Only used in QString::replace which keeps QRegExp const static const QRegExp isBibToC2b("[\\{\\[\\$\\(\\\\<>]"); static const QRegExp nonAsciiLetter("[^A-Za-z]"); static const QRegExp nonLetter("\\W"); static const QStringMatcher hasLatexDiacritic("{\\"); static const QStringMatcher hasLatexSymbol("$\\"); // Link set according to: "Creating a Web Link to the Entrez Databases", // http://www.ncbi.nlm.nih.gov/books/bv.fcgi?rid=helplinks.chapter.linkshelp#linkshelp.Retrieve_PubMed_Cita static const QString pubmedUrl("http://www.ncbi.nlm.nih.gov/pubmed/%1"); inline QString& fullBibToC2b(QString& str) { // Escape TeX and other special characters to Unicode if (!str.contains(isBibToC2b)) return str; // PNAS Style str.replace(pnasGreekLetters, "$\\\\1$"); str.replace("{micro}", "$\\mu$"); str.replace("{middle dot}", "$\\cdot$"); // Sub and superscripts str.replace(QRegExp("<sub>([^<]*)</sub>"), "$_{\\1}$"); str.replace(QRegExp("<sup>([^<]*)</sup>"), "$^{\\1}$"); str.replace(QRegExp("\\[sub ([^\\]]*)\\]"), "$_{\\1}$"); str.replace(QRegExp("\\[sup ([^\\]]*)\\]"), "$^{\\1}$"); str.replace(QRegExp("\\}\\$\\$([_\\^])\\{"), "}\\1{"); // merge if both // TeX to Unicode bibToC2b(str); return str; } inline QString& cleanEquations(QString& str) { // Simplify equations const QChar eq('$'); int i(str.indexOf(eq)); if (i == -1) return str; const QChar ob('{'); const QChar cb('}'); const QChar ca('^'); const QChar sl('\\'); const QChar us('_'); const int n(str.length()); int p(i); while (i < n) { if (str.at(i) == eq) { bool has_eq(false); for (int j = i + 1; j < qMin(i + 70, n); ++j) // Set a max equation length if (str.at(j) == eq) { has_eq = true; for (int k = i + 1; k < j; ++k) { const QChar& ck = str.at(k); if (ck != us && ck != ca && ck != sl && ck != ob && ck != cb) str[p++] = str.at(k); } i = j; break; } if (!has_eq) str[p++] = str.at(i); } else str[p++] = str.at(i); ++i; } str.chop(n - p); return str; } inline QString& cleanTitle(QString& title, const bool clean_period = false) { // Remove TeX braces and equation $ cleanEquations(title); title.remove('{'); title.remove('}'); title = title.trimmed(); if (clean_period && title.length() > 0) if (title[title.length() - 1] == '.') title.chop(1); return title; } inline QString toHtmlString(QString str) { // Encode some symbols to HTML for proper browser display str.replace('<', "<"); str.replace('>', ">"); str.replace('%', "%"); str.replace(QRegExp("_\\{([^\\}]*)\\}"), "<sub>\\1</sub>"); str.replace(QRegExp("\\^\\{([^\\}]*)\\}"), "<sup>\\1</sup>"); cleanEquations(str); return str; } inline QString firstPage(QString pages) { simplifyString(pages); pages.remove(QRegExp("[\\s\\-].*$")); return pages; } inline bool isLowerCaseString(const QString& str, const int pos0 = 0, int posn = -1) { if (str.isEmpty()) return false; if (posn < 0) posn = str.length(); for (int i = pos0; i < posn; ++i) if (str.at(i).isLetter()) if (str.at(i).category() == QChar::Letter_Uppercase) return false; return true; } inline bool isUpperCaseString(const QString& str, const int pos0 = 0, int posn = -1) { if (str.isEmpty()) return false; if (posn < 0) posn = str.length(); for (int i = pos0; i < posn; ++i) if (str.at(i).isLetter()) if (str.at(i).category() == QChar::Letter_Lowercase) return false; return true; } /** Gives a document absolute, full path-name */ inline QString documentAbsoluteName(const bool bibtexrelative, const QString& bibtexfn, const QString& docdir, const QString& docfn) { QString name; if (bibtexrelative) { // The bibtexfn might be relative in USB mode, calling absolutePath will restore its fullname. QDir ddir(QFileInfo(bibtexfn).absolutePath()); // When bibtexrelative, should only be relative to bibtexfn, (safely) disregard if it is absolute. if (QDir(docdir).isRelative()) name = ddir.absolutePath() + '/' + docdir + '/' + QFileInfo(docfn).fileName(); else name = ddir.absolutePath() + '/' + QFileInfo(docfn).fileName(); } else // The docdir should be absolute here, whether or not working in USB mode. If it was relative, // this will set it with respect the application directory. name = QDir(docdir).absolutePath() + '/' + QFileInfo(docfn).fileName(); return QDir::toNativeSeparators(QDir::cleanPath(name)); } /** Gives a document filename, as it will be written to BibTeX file tag */ inline QString documentFilename(const bool bibtexrelative, const QString& bibtexfn, const QString& docdir, const QString& docfn) { QString name; if (bibtexrelative) { QDir ddir(QFileInfo(bibtexfn).absolutePath()); if (QDir(docdir).isRelative()) name = ddir.absolutePath() + '/' + docdir + '/' + QFileInfo(docfn).fileName(); else name = ddir.absolutePath() + '/' + QFileInfo(docfn).fileName(); name = ddir.relativeFilePath(name); } else name = QDir(docdir).absolutePath() + '/' + QFileInfo(docfn).fileName(); return QDir::toNativeSeparators(QDir::cleanPath(name)); } /** Gives a document path as it will be written to BibTeX file tag */ inline QString documentDirName(const bool bibtexrelative, const QString& bibtexfn, const QString& docdir) { QString name; if (bibtexrelative) { QDir ddir(QFileInfo(bibtexfn).absolutePath()); if (QDir(docdir).isRelative()) name = ddir.absolutePath() + '/' + docdir; else name = docdir + '/'; name = ddir.relativeFilePath(name); } else name = QDir(docdir).absolutePath(); name = QDir::toNativeSeparators(QDir::cleanPath(name)); return name; } inline QString fileToString(const QString& fn, bool delete_on_close = false) { if (fn.isEmpty()) return QString(); QFile f(fn); if (f.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream(&f); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); const QString contents(stream.readAll()); if (delete_on_close) f.remove(); else f.close(); return (contents); } else return QString(); } inline bool stringToFile(const QString& str, const QString& fn) { if (fn.isEmpty()) return false; QFile f(fn); if (f.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream stream(&f); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); stream << str; f.close(); return true; } else return false; } inline QStringList filesInDir(const QString& dir, const QStringList& filters) { QStringList files; QFileInfo fi(dir); if (!fi.exists()) return files; if (fi.isDir()) { QDir d(dir); const QFileInfoList dil(d.entryInfoList(filters)); for (int i = 0; i < dil.count(); ++i) files.append(QDir::toNativeSeparators(QDir::cleanPath(dil.at(i).absoluteFilePath()))); } else if (fi.isFile()) files.append(QDir::toNativeSeparators(QDir::cleanPath(fi.absoluteFilePath()))); return files; } inline int nearInteger(double a) { int ia = int(a); a = a - double(ia); if (a >= 0.5) ia++; else if (a <= -0.5) ia--; return ia; } inline bool inBraces(const int pos, const QString& str, QString* in) { if (str.at(pos - 1) == '{') // pos > 0 always { int open_braces(1); const QChar open('{'); const QChar close('}'); QChar si; for (int i = pos; i < str.length(); ++i) { si = str.at(i); if (si == open) open_braces++; else if (si == close) open_braces--; if (open_braces == 0) { *in = str.mid(pos, i - pos); return true; } } } else // in Quotes { const QChar quote('"'); const QChar comma(','); for (int i = pos; i < str.length() - 1; ++i) if (str.at(i) == quote) if (str.at(i + 1) == comma) { *in = str.mid(pos, i - pos); return true; } } return false; } inline bool patternLengthMoreThan(const QRegExp& s1, const QRegExp& s2) { return s1.pattern().length() > s2.pattern().length(); } inline QString fromQtXmlString(QString str) { // Workaround (It will be fixed in Qt 4.5) // Escape toXmlString already done by ExifTool str.replace("%%#39;", "'"); str.replace("%%amp;", "&"); str.replace("%%gt;", ">"); str.replace("%%lt;", "<"); str.replace("%%quot;", "\""); return (str); } inline QString toQtXmlString(QString str) { // Workaround (It will be fixed in Qt 4.5) // Escape toXmlString already done by ExifTool str.replace("'", "%%#39;"); str.replace("&", "%%amp;"); str.replace(">", "%%gt;"); str.replace("<", "%%lt;"); str.replace(""", "%%quot;"); return (str); } inline void warn(const QString& ms) { qWarning("[cb2bib] %s.", (const char*)ms.toLatin1()); } inline void debug(const QString& #ifdef C2B_DEBUG debug_ms #endif ) { #ifdef C2B_DEBUG qDebug() << "[cb2bib] " << debug_ms; #endif } extern const QString fromUtf8(const QByteArray& ba); #ifdef C2B_USE_LZO namespace lzo { static const int HEADER_LENGTH = 10; extern const QByteArray compress(const QByteArray& data); extern const QByteArray uncompress(const QByteArray& data); } // namespace lzo inline const QByteArray compress(const QByteArray& data) { return lzo::compress(data); } inline const QByteArray uncompress(const QByteArray& data) { return lzo::uncompress(data); } #else inline const QByteArray compress(const QByteArray& data) { return qCompress(data); } inline const QByteArray uncompress(const QByteArray& data) { return qUncompress(data); } #endif } // namespace c2bUtils #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/substringMatcher.h�������������������������������������������������������������0000644�0001750�0001750�00000007201�12045520050�017521� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef SUBSTRINGMATCHER_H #define SUBSTRINGMATCHER_H #include <QStringMatcher> #include <QVector> #define C2B_DEBUG_SUBSTRINGMATCHER 0 class substringMatcher { public: substringMatcher(); substringMatcher(const QString& pattern, const Qt::CaseSensitivity cs = Qt::CaseSensitive); inline ~substringMatcher() {} int indexIn(const QString& str, const int from = 0) const; inline int matchedLength() const { return _matched_length; } private: inline int _index_in(const int& s, const QString& str, const int& p0) const { return _substrings.at(s).indexIn(str, p0); } inline int _index_in(const int& s, const QString& str, const int& p0, const int& pn) const { #if C2B_DEBUG_SUBSTRINGMATCHER qDebug() << "Search for substring:" << _substrings.at(s).pattern() << "in interval" << p0 << pn; int i; if (p0 >= pn) i = -1; else i = _substrings.at(s).indexIn(str.unicode(), std::min(_pn, pn), p0); qDebug() << "Returned index:" << i; return i; #else if (p0 >= pn) return -1; #if QT_VERSION >= 0x040500 return _substrings.at(s).indexIn(str.unicode(), std::min(_pn, pn), p0); #else const QString substr(QString::fromRawData(str.unicode(), std::min(_pn, pn))); return _substrings.at(s).indexIn(substr, p0); #endif #endif } inline int _p_back(const int s, const int p0) const { return std::max(_p0 + _acc_lengths.at(s), p0 - _stretches.at(s + 1) - _lengths.at(s)); } inline int _p_forth(const int s, const int p0) const { return std::min(_pn, p0 + _stretches.at(s) + _lengths.at(s)); } inline int _index_back(const int s, const QString& str, int p0, const int pn) const { while ((p0 = _index_in(s, str, p0, pn)) != -1) { if (s == 0) return p0; const int i(_index_back(s - 1, str, _p_back(s - 1, p0), p0)); if (i != -1) return i; p0 += _lengths.at(s); } return -1; } inline int _index_forth(const int s, const QString& str, int p0, const int pn) const { while ((p0 = _index_in(s, str, p0, pn)) != -1) { p0 += _lengths.at(s); if (s + 1 == _substring_count) return p0; const int i(_index_forth(s + 1, str, p0, _p_forth(s + 1, p0))); if (i != -1) return i; } return -1; } inline int _index_around(const QString& str, const int phook) const { int bp(phook); if (_hook > 0) { bp = _index_back(_hook - 1, str, _p_back(_hook - 1, bp), bp); if (bp == -1) return -1; } int fp(phook + _lengths.at(_hook)); if (_hook + 1 < _substring_count) { fp = _index_forth(_hook + 1, str, fp, _p_forth(_hook + 1, fp)); if (fp == -1) return -1; } _matched_length = fp - bp; return bp; } QVector<QStringMatcher> _substrings; QVector<int> _acc_lengths; QVector<int> _lengths; QVector<int> _stretches; int _hook; int _substring_count; mutable int _matched_length; mutable int _p0; mutable int _pn; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/texParser.cpp������������������������������������������������������������������0000644�0001750�0001750�00000007474�12045520050�016521� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "texParser.h" #include "cb2bib_utilities.h" void texParser::parse(QString tex) { _stream.setString(&tex, QIODevice::ReadOnly); _paragraph.clear(); _stop_parsing = false; while (!_stream.atEnd() && !_stop_parsing) { readLine(true); if (_line.isEmpty()) { flush(); parseEmptyLine(); } else if (_line.startsWith('%')) { flush(); parseComment(_line); } else if (_line.startsWith('\\')) doElement(); else _paragraph += ' ' + _line; } flush(); } void texParser::doElement() { if (_line.startsWith("\\begin{")) gotoEnd("begin"); else if (_line.startsWith("\\section{")) gotoEndBraces("section"); else if (_line.startsWith("\\subsection{")) gotoEndBraces("subsection"); else if (_line.startsWith("\\subsubsection{")) gotoEndBraces("subsubsection"); else if (_line.startsWith("\\title{")) gotoEndBraces("title"); else if (_line.startsWith("\\author{")) gotoEndBraces("author"); else if (_line.startsWith("\\newcommand{")) gotoEndMacro("newcommand"); else if (_line.startsWith("\\documentclass")) flushLaTeXMarkup("documentclass"); else if (_line.startsWith("\\maketitle")) flushLaTeXMarkup("maketitle"); else if (_line.startsWith("\\end{document}")) flushLaTeXMarkup("document"); else if (_line.startsWith("\\bibliography")) flushLaTeXMarkup("bibliography"); else _paragraph += ' ' + _line; } void texParser::gotoEnd(const QString& e) { QString block_name; QString block_contents; const int pos(e.length() + 2); c2bUtils::inBraces(pos, _line, &block_name); if (block_name == "document") { flushLaTeXMarkup("document"); return; } QRegExp end_block(QString("^\\s*\\\\end\\{%1\\}").arg(block_name)); _element = _line; while (!_stream.atEnd()) { readLine(); if (_line.contains(end_block)) { _element += '\n' + _line.trimmed(); break; } else { _element += '\n' + _line; block_contents += '\n' + _line; } } flushElement(block_name, block_contents); } void texParser::gotoEndBraces(const QString& e) { QString in; const int pos(e.length() + 2); _element = _line; while (!_stream.atEnd() && !c2bUtils::inBraces(pos, _element, &in)) _element += '\n' + readLine(); flushElement(e, c2bUtils::simplifyString(in)); } void texParser::gotoEndMacro(const QString& e) { // Macro syntax: \newcommand{name}[number of arguments]{definition} int line_init_pos(e.length() + 3); int element_init_pos(0); _element = _line; while (!_stream.atEnd()) { // Find the begining of macro definition for (int pos = line_init_pos; pos < _line.length(); ++pos) if (_line.at(pos) == '{') { QString in; while (!_stream.atEnd() && !c2bUtils::inBraces(element_init_pos + pos + 1, _element, &in)) _element += '\n' + readLine(); in = _element; in.remove('\\' + e); flushElement(e, c2bUtils::simplifyString(in)); return; } // Try next line line_init_pos = 0; element_init_pos = _element.length() + 1; _element += '\n' + readLine(); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/bibParser.h��������������������������������������������������������������������0000644�0001750�0001750�00000007146�12045520050�016116� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef BIBPARSER_H #define BIBPARSER_H #include "cb2bib_parameters.h" #include "coreBibParser.h" #include "journalDB.h" #include "monthDB.h" class bibPreparser; class heuristicBibParser; class idMaker; class preprocess; /** Class for bibliographic reference parsing and manipulation @author Pere Constans */ class bibParser : public coreBibParser { Q_OBJECT public: bibParser(QObject* parento = 0); virtual ~bibParser(); QString documentFilename(const QString& base_fn, const QString& bibtex_fn); QString excerpt(const QString& text, const QStringList& hints) const; QString parse(const QString& field, const QString& value, const QString& init_value = QString()); QString setJournalsToAbbreviated(const QString& text); QString setJournalsToFull(const QString& text); QString setTags(const QString& text) const; bibReference& parse(bibReference& reference); virtual void setCiteID(); virtual void setField(const QString& name, const QString& value); virtual void setReferenceType(const QString& type); void guessFields(const QString& text); void parse(const QString& text, QString* out_text, QString* out_tagtext); void preparse(const QString& text, QString* out_text); inline QString abbreviatedJournal(const QString& name) const { return _journal_dbP->retrieve(name); } inline const QStringList& abbreviatedSimplifiedJournalList() const { return _journal_dbP->abbreviatedSimplifiedList(); } inline QString fullJournal(const QString& name) const { return _journal_dbP->retrieveFull(name); } inline bool isAutoRecognized() const { return _auto_recognized; } inline QString autoRecognizedString() const { return _auto_recognized_string; } inline QString toBibTeX(bool sig = true) const { if (sig) return "% cb2Bib " + C2B_VERSION + '\n' + referenceToFomattedBibTeX(_current_reference) + '\n'; else return referenceToFomattedBibTeX(_current_reference); } inline QString toBibTeX(const bibReference& ref, bool sig = true) const { if (sig) return "% cb2Bib " + C2B_VERSION + '\n' + referenceToFomattedBibTeX(ref) + '\n'; else return referenceToFomattedBibTeX(ref); } inline const bibReference& currentReference() const { return _current_reference; } inline void clearCurrentReference() { _current_reference.clearReference(); _auto_recognized = false; _auto_recognized_string.clear(); } inline int fieldCount() const { return coreBibParser::fieldCount(_current_reference); } signals: void statusMessage(const QString& ms); protected: bibPreparser* _preparserP; bibReference _current_reference; idMaker* _cite_idmP; idMaker* _file_idmP; inline virtual void currentReferenceUpdated() {} virtual void checkRegExpFile(const QString& fn); private: QString _auto_recognized_string; QString removeTags(const QString& text) const; bool _auto_recognized; heuristicBibParser* _heuristic_parserP; journalDB* _journal_dbP; monthDB* _month_dbP; preprocess* _preprocessP; friend class heuristicBibParser; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/network.cpp��������������������������������������������������������������������0000644�0001750�0001750�00000031057�12045520050�016227� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "network.h" #include "cb2bib_utilities.h" #include "settings.h" #include <QNetworkCookie> #include <QNetworkProxy> #include <QNetworkReply> #include <QTimer> network::network(QObject* parento) : QObject(parento), _max_redirections(15) { _is_fetching = false; _fetcher = new QNetworkAccessManager(this); connect(_fetcher, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)), this, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*))); loadSettings(); connect(settings::instance(), SIGNAL(newSettings()), this, SLOT(loadSettings())); // Set predefined cookies QNetworkCookieJar* ncj = _fetcher->cookieJar(); QNetworkCookie nc("GSP", "ID=d093ce1ea042ad2b:IN=54afcd58e3b38df9:HIN=ff7e3a3ab3fbae0a+7e6cc990821af63:CF=4"); ncj->setCookiesFromUrl(QList<QNetworkCookie>() << nc, QUrl("http://scholar.google.com")); } /**************************************************************************** PUBLIC PART *****************************************************************************/ void network::getFile(const QString& source, const QString& destination, const Action action, QObject* receiver, const char* callback, const bool overwrite) { if (_is_fetching) { c2bUtils::warn(tr("network::getFile: Requesting network while still fetching previous request. Returned")); return; } setup(source, destination); disconnect(this, SIGNAL(requestFinished(bool)), 0, 0); if (receiver) connect(this, SIGNAL(requestFinished(bool)), receiver, callback); if (overwrite) if (QFileInfo(destination).exists()) QFile::remove(destination); getFilePrivate(action); } void network::headFile(const QString& source, QObject* receiver, const char* callback) { if (_is_fetching) { c2bUtils::warn(tr("network::headFile: Requesting network while still fetching previous request. Returned")); return; } setup(source); disconnect(this, SIGNAL(requestFinished(bool)), 0, 0); if (receiver) connect(this, SIGNAL(requestFinished(bool)), receiver, callback); headFilePrivate(); } void network::cancelDownload() { if (_is_fetching) _current_reply->abort(); } /**************************************************************************** PRIVATE PART *****************************************************************************/ void network::getFilePrivate(const Action action) { if (!checkDestination()) { _emit_request_finished(false); return; } if (_source_filename.startsWith("<<post>>")) // cb2Bib keyword to use post http method { _source_filename.remove(QRegExp("^<<post>>")); _fetch_c2b(action, QNetworkAccessManager::PostOperation); return; } if (FmClient) if ((action == Copy && !FmClientCopyBin.isEmpty()) || (action == Move && !FmClientMoveBin.isEmpty())) { _fetch_client(action); return; } _fetch_c2b(action); } void network::headFilePrivate() { const QUrl u(_source_filename, QUrl::TolerantMode); if (u.scheme() == "file" || QFileInfo(_source_filename).exists()) { // Local File const QString fn(u.scheme() == "file" ? u.toLocalFile() : _source_filename); const bool succeeded(QFileInfo(fn).exists()); if (!succeeded) _request_error_string = tr("File does not exist."); _emit_request_finished(succeeded); } else { // Network File _head(u); } } void network::_emit_request_finished(bool succeeded) { _request_succeeded = succeeded; // Give some time to cleanup events and to return all network functions // before passing the control to the callback routine QTimer::singleShot(50, this, SLOT(_emit_request_finished())); } void network::_emit_request_finished() { _is_fetching = false; // Assumed events are clean, all functions returned, then make the callback emit requestFinished(_request_succeeded); } bool network::checkDestination() { // Checks whether or not writing to destination is safe // Returns false if file exists if (QFileInfo(_destination_filename).exists()) { _request_error_string = tr("Destination file '%1' already exists.").arg(_destination_filename); return false; } else return true; } void network::loadSettings() { settings* s(settings::instance()); FmClient = s->value("cb2Bib/FmClient").toBool(); FmClientCopyBin = s->fileName("cb2Bib/FmClientCopyBin"); FmClientMoveBin = s->fileName("cb2Bib/FmClientMoveBin"); FmClientCopyArg = s->value("cb2Bib/FmClientCopyArg").toString(); FmClientMoveArg = s->value("cb2Bib/FmClientMoveArg").toString(); QNetworkProxy proxy; if (s->value("cb2Bib/UseProxy").toBool()) { const QString hn(s->value("cb2Bib/ProxyHostName", QString()).toString()); if (!hn.isEmpty()) { if (s->value("cb2Bib/ProxyType").toInt() == 0) proxy = QNetworkProxy::HttpProxy; else proxy = QNetworkProxy::Socks5Proxy; proxy.setHostName(hn); proxy.setPort(quint16(s->value("cb2Bib/ProxyPort").toInt())); } } _fetcher->setProxy(proxy); } /**************************************************************************** PRIVATE PART: FILEMANAGER CLIENT *****************************************************************************/ void network::_fetch_client(const Action action) { // Getting NetworkFile through kfmclient Action act(action); // Only move local files QUrl u(_source_filename); if (!(u.scheme() == "file" || QFileInfo(_source_filename).exists())) if (action == Move) act = Copy; // Copy network files QStringList arglist; QString fmclient_bin; if (act == Copy) { fmclient_bin = FmClientCopyBin; arglist = FmClientCopyArg.split(' ', QString::SkipEmptyParts); } else if (act == Move) { fmclient_bin = FmClientMoveBin; arglist = FmClientMoveArg.split(' ', QString::SkipEmptyParts); } arglist.append(_source_filename); arglist.append(_destination_filename); _fetcher_client = new QProcess(this); connect(_fetcher_client, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(_client_finished(int, QProcess::ExitStatus))); _fetcher_client->start(fmclient_bin, arglist); if (!_fetcher_client->waitForStarted()) { delete _fetcher_client; _request_error_string = tr("FM Client '%1' could not be launched.").arg(fmclient_bin); _emit_request_finished(false); } } void network::_client_finished(int exitCode, QProcess::ExitStatus exitStatus) { bool succeeded(false); if (exitStatus == QProcess::CrashExit) _request_error_string = tr("FM Client crashed."); else { if (QFileInfo(_destination_filename).exists()) succeeded = true; else _request_error_string = tr("File '%1' has not been written. Exit code '%2'.").arg(_source_filename).arg(exitCode); } delete _fetcher_client; _emit_request_finished(succeeded); } /**************************************************************************** PRIVATE PART: C2B FETCHER *****************************************************************************/ void network::_head(const QUrl& url) { QNetworkRequest request; request.setUrl(url); request.setRawHeader("User-Agent", QString("cb2Bib/" + C2B_VERSION + " (Bibliographic Browser Tool)").toLatin1()); _current_reply = _fetcher->head(request); connect(_current_reply, SIGNAL(finished()), SLOT(_head_finished())); } void network::_head_finished() { if (_redirection_count++ < _max_redirections) { const QUrl redirection(_current_reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); if (redirection.isValid()) { const QUrl ru(_current_reply->url().resolved(redirection)); _source_filename = ru.toString(); _current_reply->deleteLater(); _head(ru); return; } } const bool succeeded(_current_reply->error() == QNetworkReply::NoError); if (succeeded) _file_mimetype_string = _current_reply->header(QNetworkRequest::ContentTypeHeader).toString(); else _request_error_string = _current_reply->errorString() + '.'; _current_reply->deleteLater(); _emit_request_finished(succeeded); } void network::_fetch_c2b(const Action action, const QNetworkAccessManager::Operation operation) { _fetch_operation = operation; _fetch_url_query.clear(); QString url_str; if (_fetch_operation == QNetworkAccessManager::PostOperation) { const int qmark(_source_filename.indexOf('?')); url_str = _source_filename.mid(0, qmark); if (qmark > -1) { url_str += '/'; _fetch_url_query = _source_filename.mid(qmark + 1).toUtf8(); } } else url_str = _source_filename; QUrl u(url_str, QUrl::TolerantMode); if (u.scheme() == "file" || QFileInfo(_source_filename).exists()) { // Local File QFile source(u.scheme() == "file" ? u.toLocalFile() : _source_filename); bool succeeded(false); if (action == Copy) succeeded = source.copy(_destination_filename); else if (action == Move) succeeded = source.rename(_destination_filename); if (!succeeded) _request_error_string = source.errorString(); _emit_request_finished(succeeded); } else { // Network File _fetch(u); } } void network::_fetch(const QUrl& url) { _destination_file.setFileName(_destination_filename); if (!_destination_file.open(QIODevice::WriteOnly)) { _request_error_string = tr("File '%1' cannot be written. %2").arg(_destination_filename).arg(_destination_file.errorString()); _emit_request_finished(false); return; } QNetworkRequest request; request.setUrl(url); request.setRawHeader("User-Agent", QString("cb2Bib/" + C2B_VERSION + " (Bibliographic Browser Tool)").toLatin1()); if (_fetch_operation == QNetworkAccessManager::PostOperation) { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); _current_reply = _fetcher->post(request, _fetch_url_query); } else _current_reply = _fetcher->get(request); connect(_current_reply, SIGNAL(readyRead()), this, SLOT(_fetch_ready_read())); connect(_current_reply, SIGNAL(finished()), SLOT(_fetch_finished())); connect(_current_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(logError())); connect(_current_reply, SIGNAL(downloadProgress(qint64, qint64)), this, SIGNAL(downloadProgress(qint64, qint64))); } void network::_fetch_finished() { _destination_file.close(); if (_current_reply->error() == QNetworkReply::OperationCanceledError) _destination_file.remove(); // Delete file else if (_redirection_count++ < _max_redirections) { const QUrl redirection(_current_reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); if (redirection.isValid()) { const QUrl ru(_current_reply->url().resolved(redirection)); _source_filename = ru.toString(); const int status(_current_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()); if ((status >= 301 && status <= 303) || status == 307) _fetch_operation = QNetworkAccessManager::GetOperation; _current_reply->deleteLater(); _fetch(ru); return; } } const bool succeeded(_current_reply->error() == QNetworkReply::NoError); if (succeeded) _file_mimetype_string = _current_reply->header(QNetworkRequest::ContentTypeHeader).toString(); else _request_error_string = _current_reply->errorString() + '.'; _current_reply->deleteLater(); _emit_request_finished(succeeded); } void network::_fetch_ready_read() { _destination_file.write(_current_reply->readAll()); } void network::logError() { c2bUtils::warn(tr("network::QNetworkReply log: %1").arg(_current_reply->errorString())); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/monthDB.cpp��������������������������������������������������������������������0000644�0001750�0001750�00000004414�12045520050�016066� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "monthDB.h" #include "settings.h" monthDB::monthDB() : _day_rx(QRegExp("(\\d+)")), _month_rx(QRegExp("([A-Za-z]+)")), _month_abbreviated(QString("jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec").split('|')), _month_full(QString("January|February|March|April|May|June|July|August|September|October|November|December").split('|')) {} QString monthDB::retrieve(const QString& month_query) { bool has_month(_month_rx.indexIn(month_query) > -1); if (!has_month) return month_query; const QString month(_month_rx.cap(1)); const QString month_abbreviated(abbreviated(month)); const QString month_full(full(month)); // Early return if month is not recognized if (month_abbreviated == month_full) return month_query; const bool has_day(_day_rx.indexIn(month_query) > -1); if (settings::instance()->value("cb2Bib/PostprocessMonth").toBool()) { // Do '1 April' -> '"1~" # apr' if (has_day) return QString("\"%1~\" # %2").arg(_day_rx.cap(1)).arg(month_abbreviated); else return month_abbreviated; } else { // Capitalize if (has_day) return QString("%1 %2").arg(_day_rx.cap(1)).arg(month_full); else return month_full; } } QString monthDB::abbreviated(const QString& month) const { for (int i = 0; i < 12; i++) if (QString::compare(month, _month_abbreviated.at(i), Qt::CaseInsensitive) == 0 || QString::compare(month, _month_full.at(i), Qt::CaseInsensitive) == 0) return(_month_abbreviated.at(i)); return(month); } QString monthDB::full(const QString& month) const { for (int i = 0; i < 12; i++) if (QString::compare(month, _month_abbreviated.at(i), Qt::CaseInsensitive) == 0 || QString::compare(month, _month_full.at(i), Qt::CaseInsensitive) == 0) return(_month_full.at(i)); return(month); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/document.h���������������������������������������������������������������������0000644�0001750�0001750�00000002310�12045520050�016007� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef DOCUMENT_H #define DOCUMENT_H #include <QString> /** This class converts documents to unicode strings */ class document { public: enum Conversion {FirstPage, Raw}; document(const QString& fn = QString(), const Conversion mode = FirstPage); inline ~document() {} QString fileToString(const QString& fn); QString toString(); void setConverter(const Conversion mode); inline QString errorString() const { return _error_string.trimmed(); } inline QString logString() const { return _log_string.trimmed(); } private: Conversion _conversion_mode; QString _converter_arg; QString _converter_bin; QString _converter_output; QString _document_fn; QString _error_string; QString _log_string; void setConverter(const QString& bin, const QString& args); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/documentParser.cpp�������������������������������������������������������������0000644�0001750�0001750�00000005460�12045520050�017530� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "documentParser.h" #include "QtDebug" documentParser::documentParser(const QString& text, const int maximum) : _space(QChar(' ')), _text(text), _maximum_words(maximum), _minimum_words(2), _text_length(text.length()) { _current_nwords = 0; _current_ssentence_length = 0; _current_ssentence_origin = 0; _nwords = 0; _position = 0; if (_text_length > 0) { if (_is_letter(_text[0])) { _ssentence_origin = 0; _all_done = false; } else { _ssentence_origin = nextWord(0); _position = _ssentence_origin; _all_done = (_ssentence_origin == _text_length); } } else _all_done = true; } documentParser::~documentParser() {} bool documentParser::parses() { if (_all_done) return false; // Assumed 0-terminated string, i.e., text[_text_length] = 0 const QChar* const text(_text.constData()); int i(_position); while (i++ < _text_length) { const QChar& c(text[i]); if (_is_letter_or_number(c)) continue; ++_nwords; // Contiguous words within a subsentence if (c == _space && _is_letter(text[i + 1])) { if (_nwords < _minimum_words) continue; if (_nwords < _maximum_words) { _position = i + 1; _current_nwords = _nwords; _current_ssentence_origin = _ssentence_origin; _current_ssentence_length = i - _ssentence_origin; return true; } } // Subsentence terminated at c else if (_nwords < _minimum_words) { // Too few words in subsentence, move forward to next subsentence _ssentence_origin = nextWord(i); i = _ssentence_origin; _nwords = 0; continue; } _position = nextWord(_ssentence_origin); _current_nwords = _nwords; _current_ssentence_origin = _ssentence_origin; _current_ssentence_length = i - _ssentence_origin; _nwords = 0; _ssentence_origin = _position; return true; } _all_done = true; return false; } int documentParser::nextWord(const int pos) const { for (int i = pos + 1; i < _text_length; ++i) if (_is_letter(_text[i]) && !_is_letter_or_number(_text[i - 1])) return i; return _text_length; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/qtregexp/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045520050�015663� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/qtregexp/eqregexp.h������������������������������������������������������������0000644�0001750�0001750�00000012770�12045520050�017663� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Modified QRegExp * constans@molspaces.com, 2009 * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * *************************************************************************** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Alternatively you may (at ** your option) use any later version of the GNU General Public ** License if such license has been publicly approved by Trolltech ASA ** (or its successors, if any) and the KDE Free Qt Foundation. In ** addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.2, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If ** you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech, as the sole ** copyright holder for Qt Designer, grants users of the Qt/Eclipse ** Integration plug-in the right for the Qt/Eclipse Integration to ** link to functionality provided by Qt Designer and its related ** libraries. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly ** granted herein. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef EQREGEXP_H #define EQREGEXP_H #ifndef QT_NO_REGEXP #include <QtCore/qstring.h> #ifdef QT3_SUPPORT #include <new> #endif struct EQRegExpPrivate; class QStringList; class EQRegExp { public: enum PatternSyntax { RegExp, Wildcard, FixedString, RegExp2 }; enum CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch }; EQRegExp(); explicit EQRegExp(const QString& pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, PatternSyntax syntax = RegExp); EQRegExp(const EQRegExp& rx); ~EQRegExp(); EQRegExp& operator=(const EQRegExp& rx); bool operator==(const EQRegExp& rx) const; inline bool operator!=(const EQRegExp& rx) const { return !operator==(rx); } bool isEmpty() const; bool isValid() const; QString pattern() const; void setPattern(const QString& pattern); Qt::CaseSensitivity caseSensitivity() const; void setCaseSensitivity(Qt::CaseSensitivity cs); #ifdef QT3_SUPPORT inline QT3_SUPPORT bool caseSensitive() const { return caseSensitivity() == Qt::CaseSensitive; } inline QT3_SUPPORT void setCaseSensitive(bool sensitive) { setCaseSensitivity(sensitive ? Qt::CaseSensitive : Qt::CaseInsensitive); } #endif PatternSyntax patternSyntax() const; void setPatternSyntax(PatternSyntax syntax); #ifdef QT3_SUPPORT inline QT3_SUPPORT bool wildcard() const { return patternSyntax() == Wildcard; } inline QT3_SUPPORT void setWildcard(bool wildcard) { setPatternSyntax(wildcard ? Wildcard : RegExp); } #endif bool isMinimal() const; void setMinimal(bool minimal); #ifdef QT3_SUPPORT inline QT3_SUPPORT bool minimal() const { return isMinimal(); } #endif bool exactMatch(const QString& str) const; int indexIn(const QString& str, int offset = 0, CaretMode caretMode = CaretAtZero) const; int lastIndexIn(const QString& str, int offset = -1, CaretMode caretMode = CaretAtZero) const; #ifdef QT3_SUPPORT inline QT3_SUPPORT int search(const QString& str, int from = 0, CaretMode caretMode = CaretAtZero) const { return indexIn(str, from, caretMode); } inline QT3_SUPPORT int searchRev(const QString& str, int from = -1, CaretMode caretMode = CaretAtZero) const { return lastIndexIn(str, from, caretMode); } #endif int matchedLength() const; #ifndef QT_NO_REGEXP_CAPTURE int numCaptures() const; QStringList capturedTexts(); QString cap(int nth = 0); int pos(int nth = 0); QString errorString(); #endif static QString escape(const QString& str); #ifdef QT3_SUPPORT inline QT3_SUPPORT_CONSTRUCTOR EQRegExp(const QString& pattern, bool cs, bool wildcard = false) { new(this) EQRegExp(pattern, cs ? Qt::CaseSensitive : Qt::CaseInsensitive, wildcard ? Wildcard : RegExp); } #endif private: EQRegExpPrivate* priv; }; Q_DECLARE_TYPEINFO(EQRegExp, Q_MOVABLE_TYPE); #ifndef QT_NO_DATASTREAM QDataStream& operator<<(QDataStream& out, const EQRegExp& regExp); QDataStream& operator>>(QDataStream& in, EQRegExp& regExp); #endif #endif // QT_NO_REGEXP #endif // QREGEXP_H ��������cb2bib-1.4.9/src/c2b/qtregexp/eqregexp.cpp����������������������������������������������������������0000644�0001750�0001750�00000402030�12045520050�020206� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Modified QRegExp * constans@molspaces.com, 2009 * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * *************************************************************************** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Alternatively you may (at ** your option) use any later version of the GNU General Public ** License if such license has been publicly approved by Trolltech ASA ** (or its successors, if any) and the KDE Free Qt Foundation. In ** addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.2, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If ** you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech, as the sole ** copyright holder for Qt Designer, grants users of the Qt/Eclipse ** Integration plug-in the right for the Qt/Eclipse Integration to ** link to functionality provided by Qt Designer and its related ** libraries. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly ** granted herein. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #include "eqregexp.h" #include "qalgorithms.h" #include "qbitarray.h" #include "qcache.h" #include "qdatastream.h" #include "qlist.h" #include "qmap.h" #include "qmutex.h" #include "qstring.h" #include "qstringlist.h" #include "qvector.h" #include <limits.h> // error strings for the regexp parser #define RXERR_OK QT_TRANSLATE_NOOP("EQRegExp", "no error occurred") #define RXERR_DISABLED QT_TRANSLATE_NOOP("EQRegExp", "disabled feature used") #define RXERR_CHARCLASS QT_TRANSLATE_NOOP("EQRegExp", "bad char class syntax") #define RXERR_LOOKAHEAD QT_TRANSLATE_NOOP("EQRegExp", "bad lookahead syntax") #define RXERR_REPETITION QT_TRANSLATE_NOOP("EQRegExp", "bad repetition syntax") #define RXERR_OCTAL QT_TRANSLATE_NOOP("EQRegExp", "invalid octal value") #define RXERR_LEFTDELIM QT_TRANSLATE_NOOP("EQRegExp", "missing left delim") #define RXERR_END QT_TRANSLATE_NOOP("EQRegExp", "unexpected end") #define RXERR_LIMIT QT_TRANSLATE_NOOP("EQRegExp", "met internal limit") /* WARNING! Be sure to read qregexp.tex before modifying this file. */ /*! \class EQRegExp \reentrant \brief The EQRegExp class provides pattern matching using regular expressions. \ingroup tools \ingroup misc \ingroup shared \mainclass \keyword regular expression Regular expressions, or "regexps", provide a way to find patterns within text. This is useful in many contexts, for example: \table \row \i Validation \i A regexp can be used to check whether a piece of text meets some criteria, e.g. is an integer or contains no whitespace. \row \i Searching \i Regexps provide a much more powerful means of searching text than simple string matching does. For example we can create a regexp which says "find one of the words 'mail', 'letter' or 'correspondence' but not any of the words 'email', 'mailman' 'mailer', 'letterbox', etc." \row \i Search and Replace \i A regexp can be used to replace a pattern with a piece of text, for example replace all occurrences of '&' with '\&' except where the '&' is already followed by 'amp;'. \row \i String Splitting \i A regexp can be used to identify where a string should be split into its component fields, e.g. splitting tab-delimited strings. \endtable We present a very brief introduction to regexps, a description of Qt's regexp language, some code examples, and finally the function documentation itself. EQRegExp is modeled on Perl's regexp language, and also fully supports Unicode. EQRegExp can also be used in the weaker wildcard mode that works in a similar way to command shells. It can even be feed with fixed strings (see setPatternSyntax()). A good text on regexps is \e {Mastering Regular Expressions} (Third Edition) by Jeffrey E. F. Friedl, ISBN 0-596-52812-4. \tableofcontents \section1 Introduction Regexps are built up from expressions, quantifiers, and assertions. The simplest form of expression is simply a character, e.g. \bold{x} or \bold{5}. An expression can also be a set of characters. For example, \bold{[ABCD]}, will match an \bold{A} or a \bold{B} or a \bold{C} or a \bold{D}. As a shorthand we could write this as \bold{[A-D]}. If we want to match any of the captital letters in the English alphabet we can write \bold{[A-Z]}. A quantifier tells the regexp engine how many occurrences of the expression we want, e.g. \bold{x{1,1}} means match an \bold{x} which occurs at least once and at most once. We'll look at assertions and more complex expressions later. Note that in general regexps cannot be used to check for balanced brackets or tags. For example if you want to match an opening html \c{<b>} and its closing \c{<b>}, you can only use a regexp if you know that these tags are not nested; the html fragment, \c{<b>bold <b>bolder</b></b>} will not match as expected. If you know the maximum level of nesting it is possible to create a regexp that will match correctly, but for an unknown level of nesting, regexps will fail. We'll start by writing a regexp to match integers in the range 0 to 99. We will require at least one digit so we will start with \bold{[0-9]{1,1}} which means match a digit exactly once. This regexp alone will match integers in the range 0 to 9. To match one or two digits we can increase the maximum number of occurrences so the regexp becomes \bold{[0-9]{1,2}} meaning match a digit at least once and at most twice. However, this regexp as it stands will not match correctly. This regexp will match one or two digits \e within a string. To ensure that we match against the whole string we must use the anchor assertions. We need \bold{^} (caret) which when it is the first character in the regexp means that the regexp must match from the beginning of the string. And we also need \bold{$} (dollar) which when it is the last character in the regexp means that the regexp must match until the end of the string. So now our regexp is \bold{^[0-9]{1,2}$}. Note that assertions, such as \bold{^} and \bold{$}, do not match any characters. If you've seen regexps elsewhere, they may have looked different from the ones above. This is because some sets of characters and some quantifiers are so common that they have special symbols to represent them. \bold{[0-9]} can be replaced with the symbol \bold{\\d}. The quantifier to match exactly one occurrence, \bold{{1,1}}, can be replaced with the expression itself. This means that \bold{x{1,1}} is exactly the same as \bold{x} alone. So our 0 to 99 matcher could be written \bold{^\\d{1,2}$}. Another way of writing it would be \bold{^\\d\\d{0,1}$}, i.e. from the start of the string match a digit followed by zero or one digits. In practice most people would write it \bold{^\\d\\d?$}. The \bold{?} is a shorthand for the quantifier \bold{{0,1}}, i.e. a minimum of no occurrences a maximum of one occurrence. This is used to make an expression optional. The regexp \bold{^\\d\\d?$} means "from the beginning of the string match one digit followed by zero or one digits and then the end of the string". Our second example is matching the words 'mail', 'letter' or 'correspondence' but without matching 'email', 'mailman', 'mailer', 'letterbox', etc. We'll start by just matching 'mail'. In full the regexp is, \bold{m{1,1}a{1,1}i{1,1}l{1,1}}, but since each expression itself is automatically quantified by \bold{{1,1}} we can simply write this as \bold{mail}; an 'm' followed by an 'a' followed by an 'i' followed by an 'l'. The symbol '|' (bar) is used for \e alternation, so our regexp now becomes \bold{mail|letter|correspondence} which means match 'mail' \e or 'letter' \e or 'correspondence'. Whilst this regexp will find the words we want it will also find words we don't want such as 'email'. We will start by putting our regexp in parentheses, \bold{(mail|letter|correspondence)}. Parentheses have two effects, firstly they group expressions together and secondly they identify parts of the regexp that we wish to \l{capturing text}{capture}. Our regexp still matches any of the three words but now they are grouped together as a unit. This is useful for building up more complex regexps. It is also useful because it allows us to examine which of the words actually matched. We need to use another assertion, this time \bold{\\b} "word boundary": \bold{\\b(mail|letter|correspondence)\\b}. This regexp means "match a word boundary followed by the expression in parentheses followed by another word boundary". The \bold{\\b} assertion matches at a \e position in the regexp not a \e character in the regexp. A word boundary is any non-word character such as a space a newline or the beginning or end of the string. For our third example we want to replace ampersands with the HTML entity '\&'. The regexp to match is simple: \bold{\&}, i.e. match one ampersand. Unfortunately this will mess up our text if some of the ampersands have already been turned into HTML entities. So what we really want to say is replace an ampersand providing it is not followed by 'amp;'. For this we need the negative lookahead assertion and our regexp becomes: \bold{\&(?!amp;)}. The negative lookahead assertion is introduced with '(?!' and finishes at the ')'. It means that the text it contains, 'amp;' in our example, must \e not follow the expression that preceeds it. Regexps provide a rich language that can be used in a variety of ways. For example suppose we want to count all the occurrences of 'Eric' and 'Eirik' in a string. Two valid regexps to match these are \bold{\\b(Eric|Eirik)\\b} and \bold{\\bEi?ri[ck]\\b}. We need the word boundary '\\b' so we don't get 'Ericsson' etc. The second regexp actually matches more than we want, 'Eric', 'Erik', 'Eiric' and 'Eirik'. We will implement some the examples above in the \link #code-examples code examples \endlink section. \target characters-and-abbreviations-for-sets-of-characters \section1 Characters and Abbreviations for Sets of Characters \table \header \i Element \i Meaning \row \i \bold{c} \i Any character represents itself unless it has a special regexp meaning. Thus \bold{c} matches the character \e c. \row \i \bold{\\c} \i A character that follows a backslash matches the character itself except where mentioned below. For example if you wished to match a literal caret at the beginning of a string you would write \bold{\^}. \row \i \bold{\\a} \i This matches the ASCII bell character (BEL, 0x07). \row \i \bold{\\f} \i This matches the ASCII form feed character (FF, 0x0C). \row \i \bold{\\n} \i This matches the ASCII line feed character (LF, 0x0A, Unix newline). \row \i \bold{\\r} \i This matches the ASCII carriage return character (CR, 0x0D). \row \i \bold{\\t} \i This matches the ASCII horizontal tab character (HT, 0x09). \row \i \bold{\\v} \i This matches the ASCII vertical tab character (VT, 0x0B). \row \i \bold{\\x\e{hhhh}} \i This matches the Unicode character corresponding to the hexadecimal number \e{hhhh} (between 0x0000 and 0xFFFF). \row \i \bold{\\0\e{ooo}} (i.e., \\zero \e{ooo}) \i matches the ASCII/Latin1 character corresponding to the octal number \e{ooo} (between 0 and 0377). \row \i \bold{. (dot)} \i This matches any character (including newline). \row \i \bold{\\d} \i This matches a digit (QChar::isDigit()). \row \i \bold{\\D} \i This matches a non-digit. \row \i \bold{\\s} \i This matches a whitespace (QChar::isSpace()). \row \i \bold{\\S} \i This matches a non-whitespace. \row \i \bold{\\w} \i This matches a word character (QChar::isLetterOrNumber(), QChar::isMark(), or '_'). \row \i \bold{\\W} \i This matches a non-word character. \row \i \bold{\\\e{n}} \i The \e{n}-th \l backreference, e.g. \\1, \\2, etc. \endtable \bold{Note:} The C++ compiler transforms backslashes in strings, so to include a \bold{\\} in a regexp, you will need to enter it twice, i.e. \c{\\}. To match the backslash character itself, you will need four: \c{\\\\}. \target sets-of-characters \section1 Sets of Characters Square brackets are used to match any character in the set of characters contained within the square brackets. All the character set abbreviations described above can be used within square brackets. Apart from the character set abbreviations and the following two exceptions no characters have special meanings in square brackets. \table \row \i \bold{^} \i The caret negates the character set if it occurs as the first character, i.e. immediately after the opening square bracket. For example, \bold{[abc]} matches 'a' or 'b' or 'c', but \bold{[^abc]} matches anything \e except 'a' or 'b' or 'c'. \row \i \bold{-} \i The dash is used to indicate a range of characters, for example \bold{[W-Z]} matches 'W' or 'X' or 'Y' or 'Z'. \endtable Using the predefined character set abbreviations is more portable than using character ranges across platforms and languages. For example, \bold{[0-9]} matches a digit in Western alphabets but \bold{\\d} matches a digit in \e any alphabet. Note that in most regexp literature sets of characters are called "character classes". \target quantifiers \section1 Quantifiers By default an expression is automatically quantified by \bold{{1,1}}, i.e. it should occur exactly once. In the following list \bold{\e {E}} stands for any expression. An expression is a character or an abbreviation for a set of characters or a set of characters in square brackets or any parenthesised expression. \table \row \i \bold{\e {E}?} \i Matches zero or one occurrence of \e E. This quantifier means "the previous expression is optional" since it will match whether or not the expression occurs in the string. It is the same as \bold{\e {E}{0,1}}. For example \bold{dents?} will match 'dent' and 'dents'. \row \i \bold{\e {E}+} \i Matches one or more occurrences of \e E. This is the same as \bold{\e {E}{1,}}. For example, \bold{0+} will match '0', '00', '000', etc. \row \i \bold{\e {E}*} \i Matches zero or more occurrences of \e E. This is the same as \bold{\e {E}{0,}}. The \bold{*} quantifier is often used by a mistake. Since it matches \e zero or more occurrences it will match no occurrences at all. For example if we want to match strings that end in whitespace and use the regexp \bold{\\s*$} we would get a match on every string. This is because we have said find zero or more whitespace followed by the end of string, so even strings that don't end in whitespace will match. The regexp we want in this case is \bold{\\s+$} to match strings that have at least one whitespace at the end. \row \i \bold{\e {E}{n}} \i Matches exactly \e n occurrences of the expression. This is the same as repeating the expression \e n times. For example, \bold{x{5}} is the same as \bold{xxxxx}. It is also the same as \bold{\e {E}{n,n}}, e.g. \bold{x{5,5}}. \row \i \bold{\e {E}{n,}} \i Matches at least \e n occurrences of the expression. \row \i \bold{\e {E}{,m}} \i Matches at most \e m occurrences of the expression. This is the same as \bold{\e {E}{0,m}}. \row \i \bold{\e {E}{n,m}} \i Matches at least \e n occurrences of the expression and at most \e m occurrences of the expression. \endtable If we wish to apply a quantifier to more than just the preceding character we can use parentheses to group characters together in an expression. For example, \bold{tag+} matches a 't' followed by an 'a' followed by at least one 'g', whereas \bold{(tag)+} matches at least one occurrence of 'tag'. Note that quantifiers are "greedy". They will match as much text as they can. For example, \bold{0+} will match as many zeros as it can from the first zero it finds, e.g. '2.\underline{000}5'. Quantifiers can be made non-greedy, see setMinimal(). \target capturing parentheses \target backreferences \section1 Capturing Text Parentheses allow us to group elements together so that we can quantify and capture them. For example if we have the expression \bold{mail|letter|correspondence} that matches a string we know that \e one of the words matched but not which one. Using parentheses allows us to "capture" whatever is matched within their bounds, so if we used \bold{(mail|letter|correspondence)} and matched this regexp against the string "I sent you some email" we can use the cap() or capturedTexts() functions to extract the matched characters, in this case 'mail'. We can use captured text within the regexp itself. To refer to the captured text we use \e backreferences which are indexed from 1, the same as for cap(). For example we could search for duplicate words in a string using \bold{\\b(\\w+)\\W+\\1\\b} which means match a word boundary followed by one or more word characters followed by one or more non-word characters followed by the same text as the first parenthesized expression followed by a word boundary. If we want to use parentheses purely for grouping and not for capturing we can use the non-capturing syntax, e.g. \bold{(?:green|blue)}. Non-capturing parentheses begin '(?:' and end ')'. In this example we match either 'green' or 'blue' but we do not capture the match so we only know whether or not we matched but not which color we actually found. Using non-capturing parentheses is more efficient than using capturing parentheses since the regexp engine has to do less book-keeping. Both capturing and non-capturing parentheses may be nested. \target greedy quantifiers For historical reasons, quantifiers (e.g. \bold{*}) that apply to capturing parentheses are more "greedy" than other quantifiers. For example, \bold{a*(a)*} will match "aaa" with cap(1) == "aaa". This behavior is different from what other regexp engines do (notably, Perl). To obtain a more intuitive capturing behavior, specify EQRegExp::RegExp2 to the EQRegExp constructor or call setPatternSyntax(EQRegExp::RegExp2). \target cap_in_a_loop When the number of matches cannot be determined in advance, a common idiom is to use cap() in a loop. For example: \code EQRegExp rx("(\\d+)"); QString str = "Offsets: 12 14 99 231 7"; QStringList list; int pos = 0; while ((pos = rx.indexIn(str, pos)) != -1) { list << rx.cap(1); pos += rx.matchedLength(); } // list: ["12", "14", "99", "231", "7"] \endcode \target assertions \section1 Assertions Assertions make some statement about the text at the point where they occur in the regexp but they do not match any characters. In the following list \bold{\e {E}} stands for any expression. \table \row \i \bold{^} \i The caret signifies the beginning of the string. If you wish to match a literal \c{^} you must escape it by writing \c{\\^}. For example, \bold{^#include} will only match strings which \e begin with the characters '#include'. (When the caret is the first character of a character set it has a special meaning, see \link #sets-of-characters Sets of Characters \endlink.) \row \i \bold{$} \i The dollar signifies the end of the string. For example \bold{\\d\\s*$} will match strings which end with a digit optionally followed by whitespace. If you wish to match a literal \c{$} you must escape it by writing \c{\\$}. \row \i \bold{\\b} \i A word boundary. For example the regexp \bold{\\bOK\\b} means match immediately after a word boundary (e.g. start of string or whitespace) the letter 'O' then the letter 'K' immediately before another word boundary (e.g. end of string or whitespace). But note that the assertion does not actually match any whitespace so if we write \bold{(\\bOK\\b)} and we have a match it will only contain 'OK' even if the string is "It's \underline{OK} now". \row \i \bold{\\B} \i A non-word boundary. This assertion is true wherever \bold{\\b} is false. For example if we searched for \bold{\\Bon\\B} in "Left on" the match would fail (space and end of string aren't non-word boundaries), but it would match in "t\underline{on}ne". \row \i \bold{(?=\e E)} \i Positive lookahead. This assertion is true if the expression matches at this point in the regexp. For example, \bold{const(?=\\s+char)} matches 'const' whenever it is followed by 'char', as in 'static \underline{const} char *'. (Compare with \bold{const\\s+char}, which matches 'static \underline{const char} *'.) \row \i \bold{(?!\e E)} \i Negative lookahead. This assertion is true if the expression does not match at this point in the regexp. For example, \bold{const(?!\\s+char)} matches 'const' \e except when it is followed by 'char'. \endtable \keyword EQRegExp wildcard matching \section1 Wildcard Matching Most command shells such as \e bash or \e cmd.exe support "file globbing", the ability to identify a group of files by using wildcards. The setPatternSyntax() function is used to switch between regexp and wildcard mode. Wildcard matching is much simpler than full regexps and has only four features: \table \row \i \bold{c} \i Any character represents itself apart from those mentioned below. Thus \bold{c} matches the character \e c. \row \i \bold{?} \i This matches any single character. It is the same as \bold{.} in full regexps. \row \i \bold{*} \i This matches zero or more of any characters. It is the same as \bold{.*} in full regexps. \row \i \bold{[...]} \i Sets of characters can be represented in square brackets, similar to full regexps. Within the character class, like outside, backslash has no special meaning. \endtable For example if we are in wildcard mode and have strings which contain filenames we could identify HTML files with \bold{*.html}. This will match zero or more characters followed by a dot followed by 'h', 't', 'm' and 'l'. To test a string against a wildcard expression, use exactMatch(). For example: \code EQRegExp rx("*.txt"); rx.setPatternSyntax(EQRegExp::Wildcard); rx.exactMatch("README.txt"); // returns true rx.exactMatch("welcome.txt.bak"); // returns false \endcode \target perl-users \section1 Notes for Perl Users Most of the character class abbreviations supported by Perl are supported by EQRegExp, see \link #characters-and-abbreviations-for-sets-of-characters characters and abbreviations for sets of characters \endlink. In EQRegExp, apart from within character classes, \c{^} always signifies the start of the string, so carets must always be escaped unless used for that purpose. In Perl the meaning of caret varies automagically depending on where it occurs so escaping it is rarely necessary. The same applies to \c{$} which in EQRegExp always signifies the end of the string. EQRegExp's quantifiers are the same as Perl's greedy quantifiers (but see the \l{greedy quantifiers}{note above}). Non-greedy matching cannot be applied to individual quantifiers, but can be applied to all the quantifiers in the pattern. For example, to match the Perl regexp \bold{ro+?m} requires: \code EQRegExp rx("ro+m"); rx.setMinimal(true); \endcode The equivalent of Perl's \c{/i} option is setCaseSensitivity(Qt::CaseInsensitive). Perl's \c{/g} option can be emulated using a \l{#cap_in_a_loop}{loop}. In EQRegExp \bold{.} matches any character, therefore all EQRegExp regexps have the equivalent of Perl's \c{/s} option. EQRegExp does not have an equivalent to Perl's \c{/m} option, but this can be emulated in various ways for example by splitting the input into lines or by looping with a regexp that searches for newlines. Because EQRegExp is string oriented, there are no \\A, \\Z, or \\z assertions. The \\G assertion is not supported but can be emulated in a loop. Perl's $& is cap(0) or capturedTexts()[0]. There are no EQRegExp equivalents for $`, $' or $+. Perl's capturing variables, $1, $2, ... correspond to cap(1) or capturedTexts()[1], cap(2) or capturedTexts()[2], etc. To substitute a pattern use QString::replace(). Perl's extended \c{/x} syntax is not supported, nor are directives, e.g. (?i), or regexp comments, e.g. (?#comment). On the other hand, C++'s rules for literal strings can be used to achieve the same: \code EQRegExp mark("\\b" // word boundary "[Mm]ark" // the word we want to match ); \endcode Both zero-width positive and zero-width negative lookahead assertions (?=pattern) and (?!pattern) are supported with the same syntax as Perl. Perl's lookbehind assertions, "independent" subexpressions and conditional expressions are not supported. Non-capturing parentheses are also supported, with the same (?:pattern) syntax. See QString::split() and QStringList::join() for equivalents to Perl's split and join functions. Note: because C++ transforms \\'s they must be written \e twice in code, e.g. \bold{\\b} must be written \bold{\\\\b}. \target code-examples \section1 Code Examples \code EQRegExp rx("^\\d\\d?$"); // match integers 0 to 99 rx.indexIn("123"); // returns -1 (no match) rx.indexIn("-6"); // returns -1 (no match) rx.indexIn("6"); // returns 0 (matched as position 0) \endcode The third string matches '\underline{6}'. This is a simple validation regexp for integers in the range 0 to 99. \code EQRegExp rx("^\\S+$"); // match strings without whitespace rx.indexIn("Hello world"); // returns -1 (no match) rx.indexIn("This_is-OK"); // returns 0 (matched at position 0) \endcode The second string matches '\underline{This_is-OK}'. We've used the character set abbreviation '\\S' (non-whitespace) and the anchors to match strings which contain no whitespace. In the following example we match strings containing 'mail' or 'letter' or 'correspondence' but only match whole words i.e. not 'email' \code EQRegExp rx("\\b(mail|letter|correspondence)\\b"); rx.indexIn("I sent you an email"); // returns -1 (no match) rx.indexIn("Please write the letter"); // returns 17 \endcode The second string matches "Please write the \underline{letter}". The word 'letter' is also captured (because of the parentheses). We can see what text we've captured like this: \code QString captured = rx.cap(1); // captured == "letter" \endcode This will capture the text from the first set of capturing parentheses (counting capturing left parentheses from left to right). The parentheses are counted from 1 since cap(0) is the whole matched regexp (equivalent to '&' in most regexp engines). \code EQRegExp rx("&(?!amp;)"); // match ampersands but not & QString line1 = "This & that"; line1.replace(rx, "&"); // line1 == "This & that" QString line2 = "His & hers & theirs"; line2.replace(rx, "&"); // line2 == "His & hers & theirs" \endcode Here we've passed the EQRegExp to QString's replace() function to replace the matched text with new text. \code QString str = "One Eric another Eirik, and an Ericsson. " "How many Eiriks, Eric?"; EQRegExp rx("\\b(Eric|Eirik)\\b"); // match Eric or Eirik int pos = 0; // where we are in the string int count = 0; // how many Eric and Eirik's we've counted while (pos >= 0) { pos = rx.indexIn(str, pos); if (pos >= 0) { ++pos; // move along in str ++count; // count our Eric or Eirik } } \endcode We've used the indexIn() function to repeatedly match the regexp in the string. Note that instead of moving forward by one character at a time \c pos++ we could have written \c {pos += rx.matchedLength()} to skip over the already matched string. The count will equal 3, matching 'One \underline{Eric} another \underline{Eirik}, and an Ericsson. How many Eiriks, \underline{Eric}?'; it doesn't match 'Ericsson' or 'Eiriks' because they are not bounded by non-word boundaries. One common use of regexps is to split lines of delimited data into their component fields. \code str = "Trolltech ASA\twww.trolltech.com\tNorway"; QString company, web, country; rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$"); if (rx.indexIn(str) != -1) { company = rx.cap(1); web = rx.cap(2); country = rx.cap(3); } \endcode In this example our input lines have the format company name, web address and country. Unfortunately the regexp is rather long and not very versatile -- the code will break if we add any more fields. A simpler and better solution is to look for the separator, '\\t' in this case, and take the surrounding text. The QString::split() function can take a separator string or regexp as an argument and split a string accordingly. \code QStringList field = str.split("\t"); \endcode Here field[0] is the company, field[1] the web address and so on. To imitate the matching of a shell we can use wildcard mode. \code EQRegExp rx("*.html"); rx.setPatternSyntax(EQRegExp::Wildcard); rx.exactMatch("index.html"); // returns true rx.exactMatch("default.htm"); // returns false rx.exactMatch("readme.txt"); // returns false \endcode Wildcard matching can be convenient because of its simplicity, but any wildcard regexp can be defined using full regexps, e.g. \bold{.*\.html$}. Notice that we can't match both \c .html and \c .htm files with a wildcard unless we use \bold{*.htm*} which will also match 'test.html.bak'. A full regexp gives us the precision we need, \bold{.*\\.html?$}. EQRegExp can match case insensitively using setCaseSensitivity(), and can use non-greedy matching, see setMinimal(). By default EQRegExp uses full regexps but this can be changed with setWildcard(). Searching can be forward with indexIn() or backward with lastIndexIn(). Captured text can be accessed using capturedTexts() which returns a string list of all captured strings, or using cap() which returns the captured string for the given index. The pos() function takes a match index and returns the position in the string where the match was made (or -1 if there was no match). \sa QString, QStringList, EQRegExpValidator, QSortFilterProxyModel, {tools/regexp}{Regular Expression Example} */ const int NumBadChars = 64; #define BadChar(ch) ((ch).unicode() % NumBadChars) const int NoOccurrence = INT_MAX; const int EmptyCapture = INT_MAX; const int InftyLen = INT_MAX; const int InftyRep = 1025; const int EOS = -1; static bool isWord(QChar ch) { return ch.isLetterOrNumber() || ch.isMark() || ch == QLatin1Char('_'); } /* Merges two vectors of ints and puts the result into the first one. */ static void mergeInto(QVector<int> *a, const QVector<int> &b) { int asize = a->size(); int bsize = b.size(); if (asize == 0) { *a = b; #ifndef QT_NO_REGEXP_OPTIM } else if (bsize == 1 && a->at(asize - 1) < b.at(0)) { a->resize(asize + 1); (*a)[asize] = b.at(0); #endif } else if (bsize >= 1) { int csize = asize + bsize; QVector<int> c(csize); int i = 0, j = 0, k = 0; while (i < asize) { if (j < bsize) { if (a->at(i) == b.at(j)) { ++i; --csize; } else if (a->at(i) < b.at(j)) { c[k++] = a->at(i++); } else { c[k++] = b.at(j++); } } else { memcpy(c.data() + k, a->constData() + i, (asize - i) * sizeof(int)); break; } } c.resize(csize); if (j < bsize) memcpy(c.data() + k, b.constData() + j, (bsize - j) * sizeof(int)); *a = c; } } #ifndef QT_NO_REGEXP_WILDCARD /* Translates a wildcard pattern to an equivalent regular expression pattern (e.g., *.cpp to .*\.cpp). */ static QString wc2rx(const QString &wc_str) { int wclen = wc_str.length(); QString rx; int i = 0; const QChar *wc = wc_str.unicode(); while (i < wclen) { QChar c = wc[i++]; switch (c.unicode()) { case '*': rx += QLatin1String(".*"); break; case '?': rx += QLatin1Char('.'); break; case '$': case '(': case ')': case '+': case '.': case '\\': case '^': case '{': case '|': case '}': rx += QLatin1Char('\\'); rx += c; break; case '[': rx += c; if (wc[i] == QLatin1Char('^')) rx += wc[i++]; if (i < wclen) { if (rx[i] == QLatin1Char(']')) rx += wc[i++]; while (i < wclen && wc[i] != QLatin1Char(']')) { if (wc[i] == QLatin1Char('\\')) rx += QLatin1Char('\\'); rx += wc[i++]; } } break; default: rx += c; } } return rx; } #endif static int caretIndex(int offset, EQRegExp::CaretMode caretMode) { if (caretMode == EQRegExp::CaretAtZero) { return 0; } else if (caretMode == EQRegExp::CaretAtOffset) { return offset; } else { // EQRegExp::CaretWontMatch return -1; } } /* The EQRegExpEngineKey struct uniquely identifies an engine. */ struct EQRegExpEngineKey { QString pattern; EQRegExp::PatternSyntax patternSyntax; Qt::CaseSensitivity cs; inline EQRegExpEngineKey(const QString &pattern, EQRegExp::PatternSyntax patternSyntax, Qt::CaseSensitivity cs) : pattern(pattern), patternSyntax(patternSyntax), cs(cs) {} inline void clear() { pattern.clear(); patternSyntax = EQRegExp::RegExp; cs = Qt::CaseSensitive; } }; bool operator==(const EQRegExpEngineKey &key1, const EQRegExpEngineKey &key2) { return key1.pattern == key2.pattern && key1.patternSyntax == key2.patternSyntax && key1.cs == key2.cs; } class EQRegExpEngine; //Q_DECLARE_TYPEINFO(QVector<int>, Q_MOVABLE_TYPE); /* This is the engine state during matching. */ struct EQRegExpMatchState { const QString *str; // a pointer to the input QString const QChar *in; // a pointer to the input string data int pos; // the current position in the string int caretPos; int len; // the length of the input string bool minimal; // minimal matching? QVector<int> bigArray; // big QVector<int> array int *inNextStack; // is state is nextStack? int *curStack; // stack of current states int *nextStack; // stack of next states int *curCapBegin; // start of current states' captures int *nextCapBegin; // start of next states' captures int *curCapEnd; // end of current states' captures int *nextCapEnd; // end of next states' captures int *tempCapBegin; // start of temporary captures int *tempCapEnd; // end of temporary captures int *capBegin; // start of captures for a next state int *capEnd; // end of captures for a next state int *slideTab; // bump-along slide table for bad-character heuristic int slideTabSize; // size of slide table #ifndef QT_NO_REGEXP_BACKREF QList<QVector<int> > sleeping; // list of back-reference sleepers #endif int matchLen; // length of match int oneTestMatchedLen; // length of partial match QVector<int> captured; // what match() returned last const EQRegExpEngine *eng; inline EQRegExpMatchState() { captured.fill(-1, 2); } void drain() { bigArray.clear(); } // to save memory void prepareForMatch(EQRegExpEngine *eng); void match(const QString &str, int pos, bool minimal, bool oneTest, int caretIndex); bool matchHere(); bool testAnchor(int i, int a, const int *capBegin); }; /* The struct EQRegExpAutomatonState represents one state in a modified NFA. The input characters matched are stored in the state instead of on the transitions, something possible for an automaton constructed from a regular expression. */ struct EQRegExpAutomatonState { #ifndef QT_NO_REGEXP_CAPTURE int atom; // which atom does this state belong to? #endif int match; // what does it match? (see CharClassBit and BackRefBit) QVector<int> outs; // out-transitions QMap<int, int> reenter; // atoms reentered when transiting out QMap<int, int> anchors; // anchors met when transiting out inline EQRegExpAutomatonState() { } #ifndef QT_NO_REGEXP_CAPTURE inline EQRegExpAutomatonState(int a, int m) : atom(a), match(m) { } #else inline EQRegExpAutomatonState(int m) : match(m) { } #endif }; Q_DECLARE_TYPEINFO(EQRegExpAutomatonState, Q_MOVABLE_TYPE); /* The struct EQRegExpCharClassRange represents a range of characters (e.g., [0-9] denotes range 48 to 57). */ struct EQRegExpCharClassRange { ushort from; // 48 ushort len; // 10 }; Q_DECLARE_TYPEINFO(EQRegExpCharClassRange, Q_PRIMITIVE_TYPE); #ifndef QT_NO_REGEXP_CAPTURE /* The struct EQRegExpAtom represents one node in the hierarchy of regular expression atoms. */ struct EQRegExpAtom { enum { NoCapture = -1, OfficialCapture = -2, UnofficialCapture = -3 }; int parent; // index of parent in array of atoms int capture; // index of capture, from 1 to ncap - 1 }; Q_DECLARE_TYPEINFO(EQRegExpAtom, Q_PRIMITIVE_TYPE); #endif struct EQRegExpLookahead; #ifndef QT_NO_REGEXP_ANCHOR_ALT /* The struct EQRegExpAnchorAlternation represents a pair of anchors with OR semantics. */ struct EQRegExpAnchorAlternation { int a; // this anchor... int b; // ...or this one }; Q_DECLARE_TYPEINFO(EQRegExpAnchorAlternation, Q_PRIMITIVE_TYPE); #endif #ifndef QT_NO_REGEXP_CCLASS /* The class EQRegExpCharClass represents a set of characters, such as can be found in regular expressions (e.g., [a-z] denotes the set {a, b, ..., z}). */ class EQRegExpCharClass { public: EQRegExpCharClass(); inline EQRegExpCharClass(const EQRegExpCharClass &cc) { operator=(cc); } EQRegExpCharClass &operator=(const EQRegExpCharClass &cc); void clear(); bool negative() const { return n; } void setNegative(bool negative); void addCategories(int cats); void addRange(ushort from, ushort to); void addSingleton(ushort ch) { addRange(ch, ch); } bool in(QChar ch) const; #ifndef QT_NO_REGEXP_OPTIM const QVector<int> &firstOccurrence() const { return occ1; } #endif #if defined(QT_DEBUG) void dump() const; #endif private: int c; // character classes QVector<EQRegExpCharClassRange> r; // character ranges bool n; // negative? #ifndef QT_NO_REGEXP_OPTIM QVector<int> occ1; // first-occurrence array #endif }; #else struct EQRegExpCharClass { int dummy; #ifndef QT_NO_REGEXP_OPTIM EQRegExpCharClass() { occ1.fill(0, NumBadChars); } const QVector<int> &firstOccurrence() const { return occ1; } QVector<int> occ1; #endif }; #endif Q_DECLARE_TYPEINFO(EQRegExpCharClass, Q_MOVABLE_TYPE); /* The EQRegExpEngine class encapsulates a modified nondeterministic finite automaton (NFA). */ class EQRegExpEngine { public: EQRegExpEngine(Qt::CaseSensitivity cs, bool greedyQuantifiers) : cs(cs), greedyQuantifiers(greedyQuantifiers) { setup(); } EQRegExpEngine(const EQRegExpEngineKey &key); ~EQRegExpEngine(); bool isValid() const { return valid; } const QString &errorString() const { return yyError; } int numCaptures() const { return officialncap; } int createState(QChar ch); int createState(const EQRegExpCharClass &cc); #ifndef QT_NO_REGEXP_BACKREF int createState(int bref); #endif void addCatTransitions(const QVector<int> &from, const QVector<int> &to); #ifndef QT_NO_REGEXP_CAPTURE void addPlusTransitions(const QVector<int> &from, const QVector<int> &to, int atom); #endif #ifndef QT_NO_REGEXP_ANCHOR_ALT int anchorAlternation(int a, int b); int anchorConcatenation(int a, int b); #else int anchorAlternation(int a, int b) { return a & b; } int anchorConcatenation(int a, int b) { return a | b; } #endif void addAnchors(int from, int to, int a); #ifndef QT_NO_REGEXP_OPTIM void heuristicallyChooseHeuristic(); #endif #if defined(QT_DEBUG) void dump() const; #endif int ref; private: enum { CharClassBit = 0x10000, BackRefBit = 0x20000 }; enum { InitialState = 0, FinalState = 1 }; void setup(); int setupState(int match); /* Let's hope that 13 lookaheads and 14 back-references are enough. */ enum { MaxLookaheads = 25, MaxBackRefs = 14 }; enum { Anchor_Dollar = 0x00000001, Anchor_Caret = 0x00000002, Anchor_Word = 0x00000004, Anchor_NonWord = 0x00000008, Anchor_FirstLookahead = 0x00000010, Anchor_BackRef1Empty = Anchor_FirstLookahead << MaxLookaheads, Anchor_BackRef0Empty = Anchor_BackRef1Empty >> 1, Anchor_Alternation = Anchor_BackRef1Empty << MaxBackRefs, Anchor_LookaheadMask = (Anchor_FirstLookahead - 1) ^ ((Anchor_FirstLookahead << MaxLookaheads) - 1) }; #ifndef QT_NO_REGEXP_CAPTURE int startAtom(bool officialCapture); void finishAtom(int atom, bool needCapture); #endif #ifndef QT_NO_REGEXP_LOOKAHEAD int addLookahead(EQRegExpEngine *eng, bool negative); #endif #ifndef QT_NO_REGEXP_OPTIM bool goodStringMatch(EQRegExpMatchState &matchState) const; bool badCharMatch(EQRegExpMatchState &matchState) const; #else bool bruteMatch(EQRegExpMatchState &matchState) const; #endif QVector<EQRegExpAutomatonState> s; // array of states #ifndef QT_NO_REGEXP_CAPTURE QVector<EQRegExpAtom> f; // atom hierarchy int nf; // number of atoms int cf; // current atom QVector<int> captureForOfficialCapture; #endif int officialncap; // number of captures, seen from the outside int ncap; // number of captures, seen from the inside #ifndef QT_NO_REGEXP_CCLASS QVector<EQRegExpCharClass> cl; // array of character classes #endif #ifndef QT_NO_REGEXP_LOOKAHEAD QVector<EQRegExpLookahead *> ahead; // array of lookaheads #endif #ifndef QT_NO_REGEXP_ANCHOR_ALT QVector<EQRegExpAnchorAlternation> aa; // array of (a, b) pairs of anchors #endif #ifndef QT_NO_REGEXP_OPTIM bool caretAnchored; // does the regexp start with ^? bool trivial; // is the good-string all that needs to match? #endif bool valid; // is the regular expression valid? Qt::CaseSensitivity cs; // case sensitive? bool greedyQuantifiers; // RegExp2? #ifndef QT_NO_REGEXP_BACKREF int nbrefs; // number of back-references #endif #ifndef QT_NO_REGEXP_OPTIM bool useGoodStringHeuristic; // use goodStringMatch? otherwise badCharMatch int goodEarlyStart; // the index where goodStr can first occur in a match int goodLateStart; // the index where goodStr can last occur in a match QString goodStr; // the string that any match has to contain int minl; // the minimum length of a match QVector<int> occ1; // first-occurrence array #endif /* The class Box is an abstraction for a regular expression fragment. It can also be seen as one node in the syntax tree of a regular expression with synthetized attributes. Its interface is ugly for performance reasons. */ class Box { public: Box(EQRegExpEngine *engine); Box(const Box &b) { operator=(b); } Box &operator=(const Box &b); void clear() { operator=(Box(eng)); } void set(QChar ch); void set(const EQRegExpCharClass &cc); #ifndef QT_NO_REGEXP_BACKREF void set(int bref); #endif void cat(const Box &b); void orx(const Box &b); void plus(int atom); void opt(); void catAnchor(int a); #ifndef QT_NO_REGEXP_OPTIM void setupHeuristics(); #endif #if defined(QT_DEBUG) void dump() const; #endif private: void addAnchorsToEngine(const Box &to) const; EQRegExpEngine *eng; // the automaton under construction QVector<int> ls; // the left states (firstpos) QVector<int> rs; // the right states (lastpos) QMap<int, int> lanchors; // the left anchors QMap<int, int> ranchors; // the right anchors int skipanchors; // the anchors to match if the box is skipped #ifndef QT_NO_REGEXP_OPTIM int earlyStart; // the index where str can first occur int lateStart; // the index where str can last occur QString str; // a string that has to occur in any match QString leftStr; // a string occurring at the left of this box QString rightStr; // a string occurring at the right of this box int maxl; // the maximum length of this box (possibly InftyLen) #endif int minl; // the minimum length of this box #ifndef QT_NO_REGEXP_OPTIM QVector<int> occ1; // first-occurrence array #endif }; friend class Box; /* This is the lexical analyzer for regular expressions. */ enum { Tok_Eos, Tok_Dollar, Tok_LeftParen, Tok_MagicLeftParen, Tok_PosLookahead, Tok_NegLookahead, Tok_RightParen, Tok_CharClass, Tok_Caret, Tok_Quantifier, Tok_Bar, Tok_Word, Tok_NonWord, Tok_Char = 0x10000, Tok_BackRef = 0x20000 }; int getChar(); int getEscape(); #ifndef QT_NO_REGEXP_INTERVAL int getRep(int def); #endif #ifndef QT_NO_REGEXP_LOOKAHEAD void skipChars(int n); #endif void error(const char *msg); void startTokenizer(const QChar *rx, int len); int getToken(); const QChar *yyIn; // a pointer to the input regular expression pattern int yyPos0; // the position of yyTok in the input pattern int yyPos; // the position of the next character to read int yyLen; // the length of yyIn int yyCh; // the last character read EQRegExpCharClass *yyCharClass; // attribute for Tok_CharClass tokens int yyMinRep; // attribute for Tok_Quantifier int yyMaxRep; // ditto QString yyError; // syntax error or overflow during parsing? /* This is the syntactic analyzer for regular expressions. */ int parse(const QChar *rx, int len); void parseAtom(Box *box); void parseFactor(Box *box); void parseTerm(Box *box); void parseExpression(Box *box); int yyTok; // the last token read bool yyMayCapture; // set this to false to disable capturing friend struct EQRegExpMatchState; }; #ifndef QT_NO_REGEXP_LOOKAHEAD /* The struct EQRegExpLookahead represents a lookahead a la Perl (e.g., (?=foo) and (?!bar)). */ struct EQRegExpLookahead { EQRegExpEngine *eng; // NFA representing the embedded regular expression bool neg; // negative lookahead? inline EQRegExpLookahead(EQRegExpEngine *eng0, bool neg0) : eng(eng0), neg(neg0) { } inline ~EQRegExpLookahead() { delete eng; } }; #endif EQRegExpEngine::EQRegExpEngine(const EQRegExpEngineKey &key) : cs(key.cs), greedyQuantifiers(key.patternSyntax == EQRegExp::RegExp2) { setup(); QString rx; switch (key.patternSyntax) { case EQRegExp::Wildcard: #ifndef QT_NO_REGEXP_WILDCARD rx = wc2rx(key.pattern); #endif break; case EQRegExp::FixedString: rx = EQRegExp::escape(key.pattern); break; default: rx = key.pattern; } valid = (parse(rx.unicode(), rx.length()) == rx.length()); if (!valid) { #ifndef QT_NO_REGEXP_OPTIM trivial = false; #endif error(RXERR_LEFTDELIM); } } EQRegExpEngine::~EQRegExpEngine() { #ifndef QT_NO_REGEXP_LOOKAHEAD qDeleteAll(ahead); #endif } void EQRegExpMatchState::prepareForMatch(EQRegExpEngine *eng) { /* We use one QVector<int> for all the big data used a lot in matchHere() and friends. */ int ns = eng->s.size(); // number of states int ncap = eng->ncap; #ifndef QT_NO_REGEXP_OPTIM slideTabSize = qMax(eng->minl + 1, 16); #else slideTabSize = 0; #endif bigArray.resize((3 + 4 * ncap) * ns + 4 * ncap + slideTabSize); inNextStack = bigArray.data(); memset(inNextStack, -1, ns * sizeof(int)); curStack = inNextStack + ns; nextStack = inNextStack + 2 * ns; curCapBegin = inNextStack + 3 * ns; nextCapBegin = curCapBegin + ncap * ns; curCapEnd = curCapBegin + 2 * ncap * ns; nextCapEnd = curCapBegin + 3 * ncap * ns; tempCapBegin = curCapBegin + 4 * ncap * ns; tempCapEnd = tempCapBegin + ncap; capBegin = tempCapBegin + 2 * ncap; capEnd = tempCapBegin + 3 * ncap; slideTab = tempCapBegin + 4 * ncap; this->eng = eng; } /* Tries to match in str and returns an array of (begin, length) pairs for captured text. If there is no match, all pairs are (-1, -1). */ void EQRegExpMatchState::match(const QString &str0, int pos0, bool minimal0, bool oneTest, int caretIndex) { bool matched = false; QChar char_null; #ifndef QT_NO_REGEXP_OPTIM if (eng->trivial && !oneTest) { pos = str0.indexOf(eng->goodStr, pos0, eng->cs); matchLen = eng->goodStr.length(); matched = (pos != -1); } else #endif { str = &str0; in = str0.unicode(); if (in == 0) in = &char_null; pos = pos0; caretPos = caretIndex; len = str0.length(); minimal = minimal0; matchLen = 0; oneTestMatchedLen = 0; if (eng->valid && pos >= 0 && pos <= len) { #ifndef QT_NO_REGEXP_OPTIM if (oneTest) { matched = matchHere(); } else { if (pos <= len - eng->minl) { if (eng->caretAnchored) { matched = matchHere(); } else if (eng->useGoodStringHeuristic) { matched = eng->goodStringMatch(*this); } else { matched = eng->badCharMatch(*this); } } } #else matched = oneTest ? matchHere() : eng->bruteMatch(*this); #endif } } int numCaptures = eng->numCaptures(); int capturedSize = 2 + 2 * numCaptures; captured.resize(capturedSize); if (matched) { int *c = captured.data(); *c++ = pos; *c++ = matchLen; #ifndef QT_NO_REGEXP_CAPTURE for (int i = 0; i < numCaptures; ++i) { int j = eng->captureForOfficialCapture.at(i); int len = capEnd[j] - capBegin[j]; *c++ = (len > 0) ? pos + capBegin[j] : 0; *c++ = len; } #endif } else { // we rely on 2's complement here memset(captured.data(), -1, capturedSize * sizeof(int)); } } /* The three following functions add one state to the automaton and return the number of the state. */ int EQRegExpEngine::createState(QChar ch) { return setupState(ch.unicode()); } int EQRegExpEngine::createState(const EQRegExpCharClass &cc) { #ifndef QT_NO_REGEXP_CCLASS int n = cl.size(); cl += EQRegExpCharClass(cc); return setupState(CharClassBit | n); #else Q_UNUSED(cc); return setupState(CharClassBit); #endif } #ifndef QT_NO_REGEXP_BACKREF int EQRegExpEngine::createState(int bref) { if (bref > nbrefs) { nbrefs = bref; if (nbrefs > MaxBackRefs) { error(RXERR_LIMIT); return 0; } } return setupState(BackRefBit | bref); } #endif /* The two following functions add a transition between all pairs of states (i, j) where i is fond in from, and j is found in to. Cat-transitions are distinguished from plus-transitions for capturing. */ void EQRegExpEngine::addCatTransitions(const QVector<int> &from, const QVector<int> &to) { for (int i = 0; i < from.size(); i++) mergeInto(&s[from.at(i)].outs, to); } #ifndef QT_NO_REGEXP_CAPTURE void EQRegExpEngine::addPlusTransitions(const QVector<int> &from, const QVector<int> &to, int atom) { for (int i = 0; i < from.size(); i++) { EQRegExpAutomatonState &st = s[from.at(i)]; const QVector<int> oldOuts = st.outs; mergeInto(&st.outs, to); if (f.at(atom).capture != EQRegExpAtom::NoCapture) { for (int j = 0; j < to.size(); j++) { // ### st.reenter.contains(to.at(j)) check looks suspicious if (!st.reenter.contains(to.at(j)) && qBinaryFind(oldOuts.begin(), oldOuts.end(), to.at(j)) == oldOuts.end()) st.reenter.insert(to.at(j), atom); } } } } #endif #ifndef QT_NO_REGEXP_ANCHOR_ALT /* Returns an anchor that means a OR b. */ int EQRegExpEngine::anchorAlternation(int a, int b) { if (((a & b) == a || (a & b) == b) && ((a | b) & Anchor_Alternation) == 0) return a & b; int n = aa.size(); #ifndef QT_NO_REGEXP_OPTIM if (n > 0 && aa.at(n - 1).a == a && aa.at(n - 1).b == b) return Anchor_Alternation | (n - 1); #endif aa.resize(n + 1); aa[n].a = a; aa[n].b = b; return Anchor_Alternation | n; } /* Returns an anchor that means a AND b. */ int EQRegExpEngine::anchorConcatenation(int a, int b) { if (((a | b) & Anchor_Alternation) == 0) return a | b; if ((b & Anchor_Alternation) != 0) qSwap(a, b); int aprime = anchorConcatenation(aa.at(a ^ Anchor_Alternation).a, b); int bprime = anchorConcatenation(aa.at(a ^ Anchor_Alternation).b, b); return anchorAlternation(aprime, bprime); } #endif /* Adds anchor a on a transition caracterised by its from state and its to state. */ void EQRegExpEngine::addAnchors(int from, int to, int a) { EQRegExpAutomatonState &st = s[from]; if (st.anchors.contains(to)) a = anchorAlternation(st.anchors.value(to), a); st.anchors.insert(to, a); } #ifndef QT_NO_REGEXP_OPTIM /* This function chooses between the good-string and the bad-character heuristics. It computes two scores and chooses the heuristic with the highest score. Here are some common-sense constraints on the scores that should be respected if the formulas are ever modified: (1) If goodStr is empty, the good-string heuristic scores 0. (2) If the regular expression is trivial, the good-string heuristic should be used. (3) If the search is case insensitive, the good-string heuristic should be used, unless it scores 0. (Case insensitivity turns all entries of occ1 to 0.) (4) If (goodLateStart - goodEarlyStart) is big, the good-string heuristic should score less. */ void EQRegExpEngine::heuristicallyChooseHeuristic() { if (minl == 0) { useGoodStringHeuristic = false; } else if (trivial) { useGoodStringHeuristic = true; } else { /* Magic formula: The good string has to constitute a good proportion of the minimum-length string, and appear at a more-or-less known index. */ int goodStringScore = (64 * goodStr.length() / minl) - (goodLateStart - goodEarlyStart); /* Less magic formula: We pick some characters at random, and check whether they are good or bad. */ int badCharScore = 0; int step = qMax(1, NumBadChars / 32); for (int i = 1; i < NumBadChars; i += step) { if (occ1.at(i) == NoOccurrence) badCharScore += minl; else badCharScore += occ1.at(i); } badCharScore /= minl; useGoodStringHeuristic = (goodStringScore > badCharScore); } } #endif #if defined(QT_DEBUG) void EQRegExpEngine::dump() const { int i, j; qDebug("Case %ssensitive engine", cs ? "" : "in"); qDebug(" States"); for (i = 0; i < s.size(); i++) { qDebug(" %d%s", i, i == InitialState ? " (initial)" : i == FinalState ? " (final)" : ""); #ifndef QT_NO_REGEXP_CAPTURE if (nf > 0) qDebug(" in atom %d", s[i].atom); #endif int m = s[i].match; if ((m & CharClassBit) != 0) { qDebug(" match character class %d", m ^ CharClassBit); #ifndef QT_NO_REGEXP_CCLASS cl[m ^ CharClassBit].dump(); #else qDebug(" negative character class"); #endif } else if ((m & BackRefBit) != 0) { qDebug(" match back-reference %d", m ^ BackRefBit); } else if (m >= 0x20 && m <= 0x7e) { qDebug(" match 0x%.4x (%c)", m, m); } else { qDebug(" match 0x%.4x", m); } for (j = 0; j < s[i].outs.size(); j++) { int next = s[i].outs[j]; qDebug(" -> %d", next); if (s[i].reenter.contains(next)) qDebug(" [reenter %d]", s[i].reenter[next]); if (s[i].anchors.value(next) != 0) qDebug(" [anchors 0x%.8x]", s[i].anchors[next]); } } #ifndef QT_NO_REGEXP_CAPTURE if (nf > 0) { qDebug(" Atom Parent Capture"); for (i = 0; i < nf; i++) { if (f[i].capture == EQRegExpAtom::NoCapture) { qDebug(" %6d %6d nil", i, f[i].parent); } else { int cap = f[i].capture; bool official = captureForOfficialCapture.contains(cap); qDebug(" %6d %6d %6d %s", i, f[i].parent, f[i].capture, official ? "official" : ""); } } } #endif #ifndef QT_NO_REGEXP_ANCHOR_ALT for (i = 0; i < aa.size(); i++) qDebug(" Anchor alternation 0x%.8x: 0x%.8x 0x%.9x", i, aa[i].a, aa[i].b); #endif } #endif void EQRegExpEngine::setup() { ref = 1; #ifndef QT_NO_REGEXP_CAPTURE f.resize(32); nf = 0; cf = -1; #endif officialncap = 0; ncap = 0; #ifndef QT_NO_REGEXP_OPTIM caretAnchored = true; trivial = true; #endif valid = false; #ifndef QT_NO_REGEXP_BACKREF nbrefs = 0; #endif #ifndef QT_NO_REGEXP_OPTIM useGoodStringHeuristic = true; minl = 0; occ1.fill(0, NumBadChars); #endif } int EQRegExpEngine::setupState(int match) { #ifndef QT_NO_REGEXP_CAPTURE s += EQRegExpAutomatonState(cf, match); #else s += EQRegExpAutomatonState(match); #endif return s.size() - 1; } #ifndef QT_NO_REGEXP_CAPTURE /* Functions startAtom() and finishAtom() should be called to delimit atoms. When a state is created, it is assigned to the current atom. The information is later used for capturing. */ int EQRegExpEngine::startAtom(bool officialCapture) { if ((nf & (nf + 1)) == 0 && nf + 1 >= f.size()) f.resize((nf + 1) << 1); f[nf].parent = cf; cf = nf++; f[cf].capture = officialCapture ? EQRegExpAtom::OfficialCapture : EQRegExpAtom::NoCapture; return cf; } void EQRegExpEngine::finishAtom(int atom, bool needCapture) { if (greedyQuantifiers && needCapture && f[atom].capture == EQRegExpAtom::NoCapture) f[atom].capture = EQRegExpAtom::UnofficialCapture; cf = f.at(atom).parent; } #endif #ifndef QT_NO_REGEXP_LOOKAHEAD /* Creates a lookahead anchor. */ int EQRegExpEngine::addLookahead(EQRegExpEngine *eng, bool negative) { int n = ahead.size(); if (n == MaxLookaheads) { error(RXERR_LIMIT); return 0; } ahead += new EQRegExpLookahead(eng, negative); return Anchor_FirstLookahead << n; } #endif #ifndef QT_NO_REGEXP_CAPTURE /* We want the longest leftmost captures. */ static bool isBetterCapture(int ncap, const int *begin1, const int *end1, const int *begin2, const int *end2) { for (int i = 0; i < ncap; i++) { int delta = begin2[i] - begin1[i]; // it has to start early... if (delta == 0) delta = end1[i] - end2[i]; // ...and end late if (delta != 0) return delta > 0; } return false; } #endif /* Returns true if anchor a matches at position pos + i in the input string, otherwise false. */ bool EQRegExpMatchState::testAnchor(int i, int a, const int *capBegin) { int j; #ifndef QT_NO_REGEXP_ANCHOR_ALT if ((a & EQRegExpEngine::Anchor_Alternation) != 0) return testAnchor(i, eng->aa.at(a ^ EQRegExpEngine::Anchor_Alternation).a, capBegin) || testAnchor(i, eng->aa.at(a ^ EQRegExpEngine::Anchor_Alternation).b, capBegin); #endif if ((a & EQRegExpEngine::Anchor_Caret) != 0) { if (pos + i != caretPos) return false; } if ((a & EQRegExpEngine::Anchor_Dollar) != 0) { if (pos + i != len) return false; } #ifndef QT_NO_REGEXP_ESCAPE if ((a & (EQRegExpEngine::Anchor_Word | EQRegExpEngine::Anchor_NonWord)) != 0) { bool before = false; bool after = false; if (pos + i != 0) before = isWord(in[pos + i - 1]); if (pos + i != len) after = isWord(in[pos + i]); if ((a & EQRegExpEngine::Anchor_Word) != 0 && (before == after)) return false; if ((a & EQRegExpEngine::Anchor_NonWord) != 0 && (before != after)) return false; } #endif #ifndef QT_NO_REGEXP_LOOKAHEAD if ((a & EQRegExpEngine::Anchor_LookaheadMask) != 0) { QString cstr((QChar *) in + pos + i, len - pos - i); const QVector<EQRegExpLookahead *> &ahead = eng->ahead; for (j = 0; j < ahead.size(); j++) { if ((a & (EQRegExpEngine::Anchor_FirstLookahead << j)) != 0) { EQRegExpMatchState matchState; matchState.prepareForMatch(ahead[j]->eng); matchState.match(cstr, 0, true, true, matchState.caretPos - matchState.pos - i); if ((matchState.captured.at(0) == 0) == ahead[j]->neg) return false; } } } #endif #ifndef QT_NO_REGEXP_CAPTURE #ifndef QT_NO_REGEXP_BACKREF for (j = 0; j < eng->nbrefs; j++) { if ((a & (EQRegExpEngine::Anchor_BackRef1Empty << j)) != 0) { int i = eng->captureForOfficialCapture.at(j); if (capBegin[i] != EmptyCapture) return false; } } #endif #endif return true; } #ifndef QT_NO_REGEXP_OPTIM /* The three following functions are what Jeffrey Friedl would call transmissions (or bump-alongs). Using one or the other should make no difference except in performance. */ bool EQRegExpEngine::goodStringMatch(EQRegExpMatchState &matchState) const { int k = matchState.pos + goodEarlyStart; while ((k = matchState.str->indexOf(goodStr, k, cs)) != -1) { int from = k - goodLateStart; int to = k - goodEarlyStart; if (from > matchState.pos) matchState.pos = from; while (matchState.pos <= to) { if (matchState.matchHere()) return true; ++matchState.pos; } ++k; } return false; } bool EQRegExpEngine::badCharMatch(EQRegExpMatchState &matchState) const { int slideHead = 0; int slideNext = 0; int i; int lastPos = matchState.len - minl; memset(matchState.slideTab, 0, matchState.slideTabSize * sizeof(int)); /* Set up the slide table, used for the bad-character heuristic, using the table of first occurrence of each character. */ for (i = 0; i < minl; i++) { int sk = occ1[BadChar(matchState.in[matchState.pos + i])]; if (sk == NoOccurrence) sk = i + 1; if (sk > 0) { int k = i + 1 - sk; if (k < 0) { sk = i + 1; k = 0; } if (sk > matchState.slideTab[k]) matchState.slideTab[k] = sk; } } if (matchState.pos > lastPos) return false; for (;;) { if (++slideNext >= matchState.slideTabSize) slideNext = 0; if (matchState.slideTab[slideHead] > 0) { if (matchState.slideTab[slideHead] - 1 > matchState.slideTab[slideNext]) matchState.slideTab[slideNext] = matchState.slideTab[slideHead] - 1; matchState.slideTab[slideHead] = 0; } else { if (matchState.matchHere()) return true; } if (matchState.pos == lastPos) break; /* Update the slide table. This code has much in common with the initialization code. */ int sk = occ1[BadChar(matchState.in[matchState.pos + minl])]; if (sk == NoOccurrence) { matchState.slideTab[slideNext] = minl; } else if (sk > 0) { int k = slideNext + minl - sk; if (k >= matchState.slideTabSize) k -= matchState.slideTabSize; if (sk > matchState.slideTab[k]) matchState.slideTab[k] = sk; } slideHead = slideNext; ++matchState.pos; } return false; } #else bool EQRegExpEngine::bruteMatch(EQRegExpMatchState &matchState) const { while (matchState.pos <= matchState.len) { if (matchState.matchHere()) return true; ++matchState.pos; } return false; } #endif /* Here's the core of the engine. It tries to do a match here and now. */ bool EQRegExpMatchState::matchHere() { int ncur = 1, nnext = 0; int i = 0, j, k, m; bool stop = false; matchLen = -1; oneTestMatchedLen = -1; curStack[0] = EQRegExpEngine::InitialState; int ncap = eng->ncap; #ifndef QT_NO_REGEXP_CAPTURE if (ncap > 0) { for (j = 0; j < ncap; j++) { curCapBegin[j] = EmptyCapture; curCapEnd[j] = EmptyCapture; } } #endif #ifndef QT_NO_REGEXP_BACKREF while ((ncur > 0 || !sleeping.isEmpty()) && i <= len - pos && !stop) #else while (ncur > 0 && i <= len - pos && !stop) #endif { int ch = (i < len - pos) ? in[pos + i].unicode() : 0; for (j = 0; j < ncur; j++) { int cur = curStack[j]; const EQRegExpAutomatonState &scur = eng->s.at(cur); const QVector<int> &outs = scur.outs; for (k = 0; k < outs.size(); k++) { int next = outs.at(k); const EQRegExpAutomatonState &snext = eng->s.at(next); bool inside = true; #if !defined(QT_NO_REGEXP_BACKREF) && !defined(QT_NO_REGEXP_CAPTURE) int needSomeSleep = 0; #endif /* First, check if the anchors are anchored properly. */ int a = scur.anchors.value(next); if (a != 0 && !testAnchor(i, a, curCapBegin + j * ncap)) inside = false; /* If indeed they are, check if the input character is correct for this transition. */ if (inside) { m = snext.match; if ((m & (EQRegExpEngine::CharClassBit | EQRegExpEngine::BackRefBit)) == 0) { if (eng->cs) inside = (m == ch); else inside = (QChar(m).toLower() == QChar(ch).toLower()); } else if (next == EQRegExpEngine::FinalState) { matchLen = i; stop = minimal; inside = true; } else if ((m & EQRegExpEngine::CharClassBit) != 0) { #ifndef QT_NO_REGEXP_CCLASS const EQRegExpCharClass &cc = eng->cl.at(m ^ EQRegExpEngine::CharClassBit); if (eng->cs) inside = cc.in(ch); else if (cc.negative()) inside = cc.in(QChar(ch).toLower()) && cc.in(QChar(ch).toUpper()); else inside = cc.in(QChar(ch).toLower()) || cc.in(QChar(ch).toUpper()); #endif #if !defined(QT_NO_REGEXP_BACKREF) && !defined(QT_NO_REGEXP_CAPTURE) } else { /* ((m & EQRegExpEngine::BackRefBit) != 0) */ int bref = m ^ EQRegExpEngine::BackRefBit; int ell = j * ncap + eng->captureForOfficialCapture.at(bref - 1); inside = bref <= ncap && curCapBegin[ell] != EmptyCapture; if (inside) { if (eng->cs) inside = (in[pos + curCapBegin[ell]] == QChar(ch)); else inside = (in[pos + curCapBegin[ell]].toLower() == QChar(ch).toLower()); } if (inside) { int delta; if (curCapEnd[ell] == EmptyCapture) delta = i - curCapBegin[ell]; else delta = curCapEnd[ell] - curCapBegin[ell]; inside = (delta <= len - (pos + i)); if (inside && delta > 1) { int n = 1; if (eng->cs) { while (n < delta) { if (in[pos + curCapBegin[ell] + n] != in[pos + i + n]) break; ++n; } } else { while (n < delta) { QChar a = in[pos + curCapBegin[ell] + n]; QChar b = in[pos + i + n]; if (a.toLower() != b.toLower()) break; ++n; } } inside = (n == delta); if (inside) needSomeSleep = delta - 1; } } #endif } } /* We must now update our data structures. */ if (inside) { #ifndef QT_NO_REGEXP_CAPTURE int *capBegin, *capEnd; #endif /* If the next state was not encountered yet, all is fine. */ if ((m = inNextStack[next]) == -1) { m = nnext++; nextStack[m] = next; inNextStack[next] = m; #ifndef QT_NO_REGEXP_CAPTURE capBegin = nextCapBegin + m * ncap; capEnd = nextCapEnd + m * ncap; /* Otherwise, we'll first maintain captures in temporary arrays, and decide at the end whether it's best to keep the previous capture zones or the new ones. */ } else { capBegin = tempCapBegin; capEnd = tempCapEnd; #endif } #ifndef QT_NO_REGEXP_CAPTURE /* Updating the capture zones is much of a task. */ if (ncap > 0) { memcpy(capBegin, curCapBegin + j * ncap, ncap * sizeof(int)); memcpy(capEnd, curCapEnd + j * ncap, ncap * sizeof(int)); int c = scur.atom, n = snext.atom; int p = -1, q = -1; int cap; /* Lemma 1. For any x in the range [0..nf), we have f[x].parent < x. Proof. By looking at startAtom(), it is clear that cf < nf holds all the time, and thus that f[nf].parent < nf. */ /* If we are reentering an atom, we empty all capture zones inside it. */ if ((q = scur.reenter.value(next)) != 0) { QBitArray b(eng->nf, false); b.setBit(q, true); for (int ell = q + 1; ell < eng->nf; ell++) { if (b.testBit(eng->f.at(ell).parent)) { b.setBit(ell, true); cap = eng->f.at(ell).capture; if (cap >= 0) { capBegin[cap] = EmptyCapture; capEnd[cap] = EmptyCapture; } } } p = eng->f.at(q).parent; /* Otherwise, close the capture zones we are leaving. We are leaving f[c].capture, f[f[c].parent].capture, f[f[f[c].parent].parent].capture, ..., until f[x].capture, with x such that f[x].parent is the youngest common ancestor for c and n. We go up along c's and n's ancestry until we find x. */ } else { p = c; q = n; while (p != q) { if (p > q) { cap = eng->f.at(p).capture; if (cap >= 0) { if (capBegin[cap] == i) { capBegin[cap] = EmptyCapture; capEnd[cap] = EmptyCapture; } else { capEnd[cap] = i; } } p = eng->f.at(p).parent; } else { q = eng->f.at(q).parent; } } } /* In any case, we now open the capture zones we are entering. We work upwards from n until we reach p (the parent of the atom we reenter or the youngest common ancestor). */ while (n > p) { cap = eng->f.at(n).capture; if (cap >= 0) { capBegin[cap] = i; capEnd[cap] = EmptyCapture; } n = eng->f.at(n).parent; } /* If the next state was already in nextStack, we must choose carefully which capture zones we want to keep. */ if (capBegin == tempCapBegin && isBetterCapture(ncap, capBegin, capEnd, nextCapBegin + m * ncap, nextCapEnd + m * ncap)) { memcpy(nextCapBegin + m * ncap, capBegin, ncap * sizeof(int)); memcpy(nextCapEnd + m * ncap, capEnd, ncap * sizeof(int)); } } #ifndef QT_NO_REGEXP_BACKREF /* We are done with updating the capture zones. It's now time to put the next state to sleep, if it needs to, and to remove it from nextStack. */ if (needSomeSleep > 0) { QVector<int> zzZ(2 + 2 * ncap); zzZ[0] = i + needSomeSleep; zzZ[1] = next; if (ncap > 0) { memcpy(zzZ.data() + 2, capBegin, ncap * sizeof(int)); memcpy(zzZ.data() + 2 + ncap, capEnd, ncap * sizeof(int)); } inNextStack[nextStack[--nnext]] = -1; sleeping.append(zzZ); } #endif #endif } } } #ifndef QT_NO_REGEXP_CAPTURE /* If we reached the final state, hurray! Copy the captured zone. */ if (ncap > 0 && (m = inNextStack[EQRegExpEngine::FinalState]) != -1) { memcpy(capBegin, nextCapBegin + m * ncap, ncap * sizeof(int)); memcpy(capEnd, nextCapEnd + m * ncap, ncap * sizeof(int)); } #ifndef QT_NO_REGEXP_BACKREF /* It's time to wake up the sleepers. */ j = 0; while (j < sleeping.count()) { if (sleeping.at(j)[0] == i) { const QVector<int> &zzZ = sleeping.at(j); int next = zzZ[1]; const int *capBegin = zzZ.data() + 2; const int *capEnd = zzZ.data() + 2 + ncap; bool copyOver = true; if ((m = inNextStack[next]) == -1) { m = nnext++; nextStack[m] = next; inNextStack[next] = m; } else { copyOver = isBetterCapture(ncap, nextCapBegin + m * ncap, nextCapEnd + m * ncap, capBegin, capEnd); } if (copyOver) { memcpy(nextCapBegin + m * ncap, capBegin, ncap * sizeof(int)); memcpy(nextCapEnd + m * ncap, capEnd, ncap * sizeof(int)); } sleeping.removeAt(j); } else { ++j; } } #endif #endif for (j = 0; j < nnext; j++) inNextStack[nextStack[j]] = -1; // avoid needless iteration that confuses oneTestMatchedLen if (nnext == 1 && nextStack[0] == EQRegExpEngine::FinalState #ifndef QT_NO_REGEXP_BACKREF && sleeping.isEmpty() #endif ) stop = true; qSwap(curStack, nextStack); #ifndef QT_NO_REGEXP_CAPTURE qSwap(curCapBegin, nextCapBegin); qSwap(curCapEnd, nextCapEnd); #endif ncur = nnext; nnext = 0; ++i; } #ifndef QT_NO_REGEXP_BACKREF /* If minimal matching is enabled, we might have some sleepers left. */ if (!sleeping.isEmpty()) sleeping.clear(); #endif oneTestMatchedLen = i - 1; return (matchLen >= 0); } #ifndef QT_NO_REGEXP_CCLASS EQRegExpCharClass::EQRegExpCharClass() : c(0), n(false) { #ifndef QT_NO_REGEXP_OPTIM occ1.fill(NoOccurrence, NumBadChars); #endif } EQRegExpCharClass &EQRegExpCharClass::operator=(const EQRegExpCharClass &cc) { c = cc.c; r = cc.r; n = cc.n; #ifndef QT_NO_REGEXP_OPTIM occ1 = cc.occ1; #endif return *this; } void EQRegExpCharClass::clear() { c = 0; r.resize(0); n = false; } void EQRegExpCharClass::setNegative(bool negative) { n = negative; #ifndef QT_NO_REGEXP_OPTIM occ1.fill(0, NumBadChars); #endif } void EQRegExpCharClass::addCategories(int cats) { c |= cats; #ifndef QT_NO_REGEXP_OPTIM occ1.fill(0, NumBadChars); #endif } void EQRegExpCharClass::addRange(ushort from, ushort to) { if (from > to) qSwap(from, to); int m = r.size(); r.resize(m + 1); r[m].from = from; r[m].len = to - from + 1; #ifndef QT_NO_REGEXP_OPTIM int i; if (to - from < NumBadChars) { if (from % NumBadChars <= to % NumBadChars) { for (i = from % NumBadChars; i <= to % NumBadChars; i++) occ1[i] = 0; } else { for (i = 0; i <= to % NumBadChars; i++) occ1[i] = 0; for (i = from % NumBadChars; i < NumBadChars; i++) occ1[i] = 0; } } else { occ1.fill(0, NumBadChars); } #endif } bool EQRegExpCharClass::in(QChar ch) const { #ifndef QT_NO_REGEXP_OPTIM if (occ1.at(BadChar(ch)) == NoOccurrence) return n; #endif if (c != 0 && (c & (1 << (int)ch.category())) != 0) return !n; const int uc = ch.unicode(); int size = r.size(); for (int i = 0; i < size; ++i) { const EQRegExpCharClassRange &range = r.at(i); if (uint(uc - range.from) < uint(r.at(i).len)) return !n; } return n; } #if defined(QT_DEBUG) void EQRegExpCharClass::dump() const { int i; qDebug(" %stive character class", n ? "nega" : "posi"); #ifndef QT_NO_REGEXP_CCLASS if (c != 0) qDebug(" categories 0x%.8x", c); #endif for (i = 0; i < r.size(); i++) qDebug(" 0x%.4x through 0x%.4x", r[i].from, r[i].from + r[i].len - 1); } #endif #endif EQRegExpEngine::Box::Box(EQRegExpEngine *engine) : eng(engine), skipanchors(0) #ifndef QT_NO_REGEXP_OPTIM , earlyStart(0), lateStart(0), maxl(0) #endif { #ifndef QT_NO_REGEXP_OPTIM occ1.fill(NoOccurrence, NumBadChars); #endif minl = 0; } EQRegExpEngine::Box &EQRegExpEngine::Box::operator=(const Box &b) { eng = b.eng; ls = b.ls; rs = b.rs; lanchors = b.lanchors; ranchors = b.ranchors; skipanchors = b.skipanchors; #ifndef QT_NO_REGEXP_OPTIM earlyStart = b.earlyStart; lateStart = b.lateStart; str = b.str; leftStr = b.leftStr; rightStr = b.rightStr; maxl = b.maxl; occ1 = b.occ1; #endif minl = b.minl; return *this; } void EQRegExpEngine::Box::set(QChar ch) { ls.resize(1); ls[0] = eng->createState(ch); rs = ls; #ifndef QT_NO_REGEXP_OPTIM str = ch; leftStr = ch; rightStr = ch; maxl = 1; occ1[BadChar(ch)] = 0; #endif minl = 1; } void EQRegExpEngine::Box::set(const EQRegExpCharClass &cc) { ls.resize(1); ls[0] = eng->createState(cc); rs = ls; #ifndef QT_NO_REGEXP_OPTIM maxl = 1; occ1 = cc.firstOccurrence(); #endif minl = 1; } #ifndef QT_NO_REGEXP_BACKREF void EQRegExpEngine::Box::set(int bref) { ls.resize(1); ls[0] = eng->createState(bref); rs = ls; if (bref >= 1 && bref <= MaxBackRefs) skipanchors = Anchor_BackRef0Empty << bref; #ifndef QT_NO_REGEXP_OPTIM maxl = InftyLen; #endif minl = 0; } #endif void EQRegExpEngine::Box::cat(const Box &b) { eng->addCatTransitions(rs, b.ls); addAnchorsToEngine(b); if (minl == 0) { lanchors.unite(b.lanchors); if (skipanchors != 0) { for (int i = 0; i < b.ls.size(); i++) { int a = eng->anchorConcatenation(lanchors.value(b.ls.at(i), 0), skipanchors); lanchors.insert(b.ls.at(i), a); } } mergeInto(&ls, b.ls); } if (b.minl == 0) { ranchors.unite(b.ranchors); if (b.skipanchors != 0) { for (int i = 0; i < rs.size(); i++) { int a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), b.skipanchors); ranchors.insert(rs.at(i), a); } } mergeInto(&rs, b.rs); } else { ranchors = b.ranchors; rs = b.rs; } #ifndef QT_NO_REGEXP_OPTIM if (maxl != InftyLen) { if (rightStr.length() + b.leftStr.length() > qMax(str.length(), b.str.length())) { earlyStart = minl - rightStr.length(); lateStart = maxl - rightStr.length(); str = rightStr + b.leftStr; } else if (b.str.length() > str.length()) { earlyStart = minl + b.earlyStart; lateStart = maxl + b.lateStart; str = b.str; } } if (leftStr.length() == maxl) leftStr += b.leftStr; if (b.rightStr.length() == b.maxl) { rightStr += b.rightStr; } else { rightStr = b.rightStr; } if (maxl == InftyLen || b.maxl == InftyLen) { maxl = InftyLen; } else { maxl += b.maxl; } for (int i = 0; i < NumBadChars; i++) { if (b.occ1.at(i) != NoOccurrence && minl + b.occ1.at(i) < occ1.at(i)) occ1[i] = minl + b.occ1.at(i); } #endif minl += b.minl; if (minl == 0) skipanchors = eng->anchorConcatenation(skipanchors, b.skipanchors); else skipanchors = 0; } void EQRegExpEngine::Box::orx(const Box &b) { mergeInto(&ls, b.ls); lanchors.unite(b.lanchors); mergeInto(&rs, b.rs); ranchors.unite(b.ranchors); if (b.minl == 0) { if (minl == 0) skipanchors = eng->anchorAlternation(skipanchors, b.skipanchors); else skipanchors = b.skipanchors; } #ifndef QT_NO_REGEXP_OPTIM for (int i = 0; i < NumBadChars; i++) { if (occ1.at(i) > b.occ1.at(i)) occ1[i] = b.occ1.at(i); } earlyStart = 0; lateStart = 0; str = QString(); leftStr = QString(); rightStr = QString(); if (b.maxl > maxl) maxl = b.maxl; #endif if (b.minl < minl) minl = b.minl; } void EQRegExpEngine::Box::plus(int atom) { #ifndef QT_NO_REGEXP_CAPTURE eng->addPlusTransitions(rs, ls, atom); #else Q_UNUSED(atom); eng->addCatTransitions(rs, ls); #endif addAnchorsToEngine(*this); #ifndef QT_NO_REGEXP_OPTIM maxl = InftyLen; #endif } void EQRegExpEngine::Box::opt() { #ifndef QT_NO_REGEXP_OPTIM earlyStart = 0; lateStart = 0; str = QString(); leftStr = QString(); rightStr = QString(); #endif skipanchors = 0; minl = 0; } void EQRegExpEngine::Box::catAnchor(int a) { if (a != 0) { for (int i = 0; i < rs.size(); i++) { a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), a); ranchors.insert(rs.at(i), a); } if (minl == 0) skipanchors = eng->anchorConcatenation(skipanchors, a); } } #ifndef QT_NO_REGEXP_OPTIM void EQRegExpEngine::Box::setupHeuristics() { eng->goodEarlyStart = earlyStart; eng->goodLateStart = lateStart; eng->goodStr = eng->cs ? str : str.toLower(); eng->minl = minl; if (eng->cs) { /* A regular expression such as 112|1 has occ1['2'] = 2 and minl = 1 at this point. An entry of occ1 has to be at most minl or infinity for the rest of the algorithm to go well. We waited until here before normalizing these cases (instead of doing it in Box::orx()) because sometimes things improve by themselves. Consider for example (112|1)34. */ for (int i = 0; i < NumBadChars; i++) { if (occ1.at(i) != NoOccurrence && occ1.at(i) >= minl) occ1[i] = minl; } eng->occ1 = occ1; } else { eng->occ1.fill(0, NumBadChars); } eng->heuristicallyChooseHeuristic(); } #endif #if defined(QT_DEBUG) void EQRegExpEngine::Box::dump() const { int i; qDebug("Box of at least %d character%s", minl, minl == 1 ? "" : "s"); qDebug(" Left states:"); for (i = 0; i < ls.size(); i++) { if (lanchors.value(ls[i], 0) == 0) qDebug(" %d", ls[i]); else qDebug(" %d [anchors 0x%.8x]", ls[i], lanchors[ls[i]]); } qDebug(" Right states:"); for (i = 0; i < rs.size(); i++) { if (ranchors.value(rs[i], 0) == 0) qDebug(" %d", rs[i]); else qDebug(" %d [anchors 0x%.8x]", rs[i], ranchors[rs[i]]); } qDebug(" Skip anchors: 0x%.8x", skipanchors); } #endif void EQRegExpEngine::Box::addAnchorsToEngine(const Box &to) const { for (int i = 0; i < to.ls.size(); i++) { for (int j = 0; j < rs.size(); j++) { int a = eng->anchorConcatenation(ranchors.value(rs.at(j), 0), to.lanchors.value(to.ls.at(i), 0)); eng->addAnchors(rs[j], to.ls[i], a); } } } int EQRegExpEngine::getChar() { return (yyPos == yyLen) ? EOS : yyIn[yyPos++].unicode(); } int EQRegExpEngine::getEscape() { #ifndef QT_NO_REGEXP_ESCAPE const char tab[] = "afnrtv"; // no b, as \b means word boundary const char backTab[] = "\a\f\n\r\t\v"; ushort low; int i; #endif ushort val; int prevCh = yyCh; if (prevCh == EOS) { error(RXERR_END); return Tok_Char | '\\'; } yyCh = getChar(); #ifndef QT_NO_REGEXP_ESCAPE if ((prevCh & ~0xff) == 0) { const char *p = strchr(tab, prevCh); if (p != 0) return Tok_Char | backTab[p - tab]; } #endif switch (prevCh) { #ifndef QT_NO_REGEXP_ESCAPE case '0': val = 0; for (i = 0; i < 3; i++) { if (yyCh >= '0' && yyCh <= '7') val = (val << 3) | (yyCh - '0'); else break; yyCh = getChar(); } if ((val & ~0377) != 0) error(RXERR_OCTAL); return Tok_Char | val; #endif #ifndef QT_NO_REGEXP_ESCAPE case 'B': return Tok_NonWord; #endif #ifndef QT_NO_REGEXP_CCLASS case 'D': // see QChar::isDigit() yyCharClass->addCategories(0x7fffffef); return Tok_CharClass; case 'S': // see QChar::isSpace() yyCharClass->addCategories(0x7ffff87f); yyCharClass->addRange(0x0000, 0x0008); yyCharClass->addRange(0x000e, 0x001f); yyCharClass->addRange(0x007f, 0x009f); return Tok_CharClass; case 'W': // see QChar::isLetterOrNumber() and QChar::isMark() yyCharClass->addCategories(0x7fe07f81); yyCharClass->addRange(0x203f, 0x2040); yyCharClass->addSingleton(0x2040); yyCharClass->addSingleton(0x2054); yyCharClass->addSingleton(0x30fb); yyCharClass->addRange(0xfe33, 0xfe34); yyCharClass->addRange(0xfe4d, 0xfe4f); yyCharClass->addSingleton(0xff3f); yyCharClass->addSingleton(0xff65); return Tok_CharClass; #endif #ifndef QT_NO_REGEXP_ESCAPE case 'b': return Tok_Word; #endif #ifndef QT_NO_REGEXP_CCLASS case 'd': // see QChar::isDigit() yyCharClass->addCategories(0x00000010); return Tok_CharClass; case 's': // see QChar::isSpace() yyCharClass->addCategories(0x00000380); yyCharClass->addRange(0x0009, 0x000d); return Tok_CharClass; case 'w': // see QChar::isLetterOrNumber() and QChar::isMark() yyCharClass->addCategories(0x000f807e); yyCharClass->addSingleton(0x005f); // '_' return Tok_CharClass; #endif #ifndef QT_NO_REGEXP_ESCAPE case 'x': val = 0; for (i = 0; i < 4; i++) { low = QChar(yyCh).toLower().unicode(); if (low >= '0' && low <= '9') val = (val << 4) | (low - '0'); else if (low >= 'a' && low <= 'f') val = (val << 4) | (low - 'a' + 10); else break; yyCh = getChar(); } return Tok_Char | val; #endif default: if (prevCh >= '1' && prevCh <= '9') { #ifndef QT_NO_REGEXP_BACKREF val = prevCh - '0'; while (yyCh >= '0' && yyCh <= '9') { val = (val * 10) + (yyCh - '0'); yyCh = getChar(); } return Tok_BackRef | val; #else error(RXERR_DISABLED); #endif } return Tok_Char | prevCh; } } #ifndef QT_NO_REGEXP_INTERVAL int EQRegExpEngine::getRep(int def) { if (yyCh >= '0' && yyCh <= '9') { int rep = 0; do { rep = 10 * rep + yyCh - '0'; if (rep >= InftyRep) { error(RXERR_REPETITION); rep = def; } yyCh = getChar(); } while (yyCh >= '0' && yyCh <= '9'); return rep; } else { return def; } } #endif #ifndef QT_NO_REGEXP_LOOKAHEAD void EQRegExpEngine::skipChars(int n) { if (n > 0) { yyPos += n - 1; yyCh = getChar(); } } #endif void EQRegExpEngine::error(const char *msg) { if (yyError.isEmpty()) yyError = QLatin1String(msg); } void EQRegExpEngine::startTokenizer(const QChar *rx, int len) { yyIn = rx; yyPos0 = 0; yyPos = 0; yyLen = len; yyCh = getChar(); yyCharClass = new EQRegExpCharClass; yyMinRep = 0; yyMaxRep = 0; yyError = QString(); } int EQRegExpEngine::getToken() { #ifndef QT_NO_REGEXP_CCLASS ushort pendingCh = 0; bool charPending; bool rangePending; int tok; #endif int prevCh = yyCh; yyPos0 = yyPos - 1; #ifndef QT_NO_REGEXP_CCLASS yyCharClass->clear(); #endif yyMinRep = 0; yyMaxRep = 0; yyCh = getChar(); switch (prevCh) { case EOS: yyPos0 = yyPos; return Tok_Eos; case '$': return Tok_Dollar; case '(': if (yyCh == '?') { prevCh = getChar(); yyCh = getChar(); switch (prevCh) { #ifndef QT_NO_REGEXP_LOOKAHEAD case '!': return Tok_NegLookahead; case '=': return Tok_PosLookahead; #endif case ':': return Tok_MagicLeftParen; default: error(RXERR_LOOKAHEAD); return Tok_MagicLeftParen; } } else { return Tok_LeftParen; } case ')': return Tok_RightParen; case '*': yyMinRep = 0; yyMaxRep = InftyRep; return Tok_Quantifier; case '+': yyMinRep = 1; yyMaxRep = InftyRep; return Tok_Quantifier; case '.': #ifndef QT_NO_REGEXP_CCLASS yyCharClass->setNegative(true); #endif return Tok_CharClass; case '?': yyMinRep = 0; yyMaxRep = 1; return Tok_Quantifier; case '[': #ifndef QT_NO_REGEXP_CCLASS if (yyCh == '^') { yyCharClass->setNegative(true); yyCh = getChar(); } charPending = false; rangePending = false; do { if (yyCh == '-' && charPending && !rangePending) { rangePending = true; yyCh = getChar(); } else { if (charPending && !rangePending) { yyCharClass->addSingleton(pendingCh); charPending = false; } if (yyCh == '\\') { yyCh = getChar(); tok = getEscape(); if (tok == Tok_Word) tok = '\b'; } else { tok = Tok_Char | yyCh; yyCh = getChar(); } if (tok == Tok_CharClass) { if (rangePending) { yyCharClass->addSingleton('-'); yyCharClass->addSingleton(pendingCh); charPending = false; rangePending = false; } } else if ((tok & Tok_Char) != 0) { if (rangePending) { yyCharClass->addRange(pendingCh, tok ^ Tok_Char); charPending = false; rangePending = false; } else { pendingCh = tok ^ Tok_Char; charPending = true; } } else { error(RXERR_CHARCLASS); } } } while (yyCh != ']' && yyCh != EOS); if (rangePending) yyCharClass->addSingleton('-'); if (charPending) yyCharClass->addSingleton(pendingCh); if (yyCh == EOS) error(RXERR_END); else yyCh = getChar(); return Tok_CharClass; #else error(RXERR_END); return Tok_Char | '['; #endif case '\\': return getEscape(); case ']': error(RXERR_LEFTDELIM); return Tok_Char | ']'; case '^': return Tok_Caret; case '{': #ifndef QT_NO_REGEXP_INTERVAL yyMinRep = getRep(0); yyMaxRep = yyMinRep; if (yyCh == ',') { yyCh = getChar(); yyMaxRep = getRep(InftyRep); } if (yyMaxRep < yyMinRep) qSwap(yyMinRep, yyMaxRep); if (yyCh != '}') error(RXERR_REPETITION); yyCh = getChar(); return Tok_Quantifier; #else error(RXERR_DISABLED); return Tok_Char | '{'; #endif case '|': return Tok_Bar; case '}': error(RXERR_LEFTDELIM); return Tok_Char | '}'; default: return Tok_Char | prevCh; } } int EQRegExpEngine::parse(const QChar *pattern, int len) { valid = true; startTokenizer(pattern, len); yyTok = getToken(); #ifndef QT_NO_REGEXP_CAPTURE yyMayCapture = true; #else yyMayCapture = false; #endif #ifndef QT_NO_REGEXP_CAPTURE int atom = startAtom(false); #endif EQRegExpCharClass anything; Box box(this); // create InitialState box.set(anything); Box rightBox(this); // create FinalState rightBox.set(anything); Box middleBox(this); parseExpression(&middleBox); #ifndef QT_NO_REGEXP_CAPTURE finishAtom(atom, false); #endif #ifndef QT_NO_REGEXP_OPTIM middleBox.setupHeuristics(); #endif box.cat(middleBox); box.cat(rightBox); delete yyCharClass; yyCharClass = 0; #ifndef QT_NO_REGEXP_CAPTURE for (int i = 0; i < nf; ++i) { switch (f[i].capture) { case EQRegExpAtom::NoCapture: break; case EQRegExpAtom::OfficialCapture: f[i].capture = ncap; captureForOfficialCapture.append(ncap); ++ncap; ++officialncap; break; case EQRegExpAtom::UnofficialCapture: f[i].capture = greedyQuantifiers ? ncap++ : EQRegExpAtom::NoCapture; } } #ifndef QT_NO_REGEXP_BACKREF #ifndef QT_NO_REGEXP_OPTIM if (officialncap == 0 && nbrefs == 0) { ncap = nf = 0; f.clear(); } #endif // handle the case where there's a \5 with no corresponding capture // (captureForOfficialCapture.size() != officialncap) for (int i = 0; i < nbrefs - officialncap; ++i) { captureForOfficialCapture.append(ncap); ++ncap; } #endif #endif if (!yyError.isEmpty()) return -1; #ifndef QT_NO_REGEXP_OPTIM const EQRegExpAutomatonState &sinit = s.at(InitialState); caretAnchored = !sinit.anchors.isEmpty(); if (caretAnchored) { const QMap<int, int> &anchors = sinit.anchors; QMap<int, int>::const_iterator a; for (a = anchors.begin(); a != anchors.end(); ++a) { if ( #ifndef QT_NO_REGEXP_ANCHOR_ALT (*a & Anchor_Alternation) != 0 || #endif (*a & Anchor_Caret) == 0) { caretAnchored = false; break; } } } #endif // cleanup anchors int numStates = s.count(); for (int i = 0; i < numStates; ++i) { EQRegExpAutomatonState &state = s[i]; if (!state.anchors.isEmpty()) { QMap<int, int>::iterator a = state.anchors.begin(); while (a != state.anchors.constEnd()) { if (a.value() == 0) a = state.anchors.erase(a); else ++a; } } } return yyPos0; } void EQRegExpEngine::parseAtom(Box *box) { #ifndef QT_NO_REGEXP_LOOKAHEAD EQRegExpEngine *eng = 0; bool neg; int len; #endif if ((yyTok & Tok_Char) != 0) { box->set(QChar(yyTok ^ Tok_Char)); } else { #ifndef QT_NO_REGEXP_OPTIM trivial = false; #endif switch (yyTok) { case Tok_Dollar: box->catAnchor(Anchor_Dollar); break; case Tok_Caret: box->catAnchor(Anchor_Caret); break; #ifndef QT_NO_REGEXP_LOOKAHEAD case Tok_PosLookahead: case Tok_NegLookahead: neg = (yyTok == Tok_NegLookahead); eng = new EQRegExpEngine(cs, greedyQuantifiers); len = eng->parse(yyIn + yyPos - 1, yyLen - yyPos + 1); if (len >= 0) skipChars(len); else error(RXERR_LOOKAHEAD); box->catAnchor(addLookahead(eng, neg)); yyTok = getToken(); if (yyTok != Tok_RightParen) error(RXERR_LOOKAHEAD); break; #endif #ifndef QT_NO_REGEXP_ESCAPE case Tok_Word: box->catAnchor(Anchor_Word); break; case Tok_NonWord: box->catAnchor(Anchor_NonWord); break; #endif case Tok_LeftParen: case Tok_MagicLeftParen: yyTok = getToken(); parseExpression(box); if (yyTok != Tok_RightParen) error(RXERR_END); break; case Tok_CharClass: box->set(*yyCharClass); break; case Tok_Quantifier: error(RXERR_REPETITION); break; default: #ifndef QT_NO_REGEXP_BACKREF if ((yyTok & Tok_BackRef) != 0) box->set(yyTok ^ Tok_BackRef); else #endif error(RXERR_DISABLED); } } yyTok = getToken(); } void EQRegExpEngine::parseFactor(Box *box) { #ifndef QT_NO_REGEXP_CAPTURE int outerAtom = greedyQuantifiers ? startAtom(false) : -1; int innerAtom = startAtom(yyMayCapture && yyTok == Tok_LeftParen); bool magicLeftParen = (yyTok == Tok_MagicLeftParen); #else const int innerAtom = -1; #endif #ifndef QT_NO_REGEXP_INTERVAL #define YYREDO() \ yyIn = in, yyPos0 = pos0, yyPos = pos, yyLen = len, yyCh = ch, \ *yyCharClass = charClass, yyMinRep = 0, yyMaxRep = 0, yyTok = tok const QChar *in = yyIn; int pos0 = yyPos0; int pos = yyPos; int len = yyLen; int ch = yyCh; EQRegExpCharClass charClass; if (yyTok == Tok_CharClass) charClass = *yyCharClass; int tok = yyTok; bool mayCapture = yyMayCapture; #endif parseAtom(box); #ifndef QT_NO_REGEXP_CAPTURE finishAtom(innerAtom, magicLeftParen); #endif bool hasQuantifier = (yyTok == Tok_Quantifier); if (hasQuantifier) { #ifndef QT_NO_REGEXP_OPTIM trivial = false; #endif if (yyMaxRep == InftyRep) { box->plus(innerAtom); #ifndef QT_NO_REGEXP_INTERVAL } else if (yyMaxRep == 0) { box->clear(); #endif } if (yyMinRep == 0) box->opt(); #ifndef QT_NO_REGEXP_INTERVAL yyMayCapture = false; int alpha = (yyMinRep == 0) ? 0 : yyMinRep - 1; int beta = (yyMaxRep == InftyRep) ? 0 : yyMaxRep - (alpha + 1); Box rightBox(this); int i; for (i = 0; i < beta; i++) { YYREDO(); Box leftBox(this); parseAtom(&leftBox); leftBox.cat(rightBox); leftBox.opt(); rightBox = leftBox; } for (i = 0; i < alpha; i++) { YYREDO(); Box leftBox(this); parseAtom(&leftBox); leftBox.cat(rightBox); rightBox = leftBox; } rightBox.cat(*box); *box = rightBox; #endif yyTok = getToken(); #ifndef QT_NO_REGEXP_INTERVAL yyMayCapture = mayCapture; #endif } #undef YYREDO #ifndef QT_NO_REGEXP_CAPTURE if (greedyQuantifiers) finishAtom(outerAtom, hasQuantifier); #endif } void EQRegExpEngine::parseTerm(Box *box) { #ifndef QT_NO_REGEXP_OPTIM if (yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar) parseFactor(box); #endif while (yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar) { Box rightBox(this); parseFactor(&rightBox); box->cat(rightBox); } } void EQRegExpEngine::parseExpression(Box *box) { parseTerm(box); while (yyTok == Tok_Bar) { #ifndef QT_NO_REGEXP_OPTIM trivial = false; #endif Box rightBox(this); yyTok = getToken(); parseTerm(&rightBox); box->orx(rightBox); } } /* The struct EQRegExpPrivate contains the private data of a regular expression other than the automaton. It makes it possible for many EQRegExp objects to use the same EQRegExpEngine object with different EQRegExpPrivate objects. */ struct EQRegExpPrivate { EQRegExpEngine *eng; EQRegExpEngineKey engineKey; bool min; #ifndef QT_NO_REGEXP_CAPTURE QString t; // last string passed to EQRegExp::indexIn() or lastIndexIn() QStringList capturedCache; // what EQRegExp::capturedTexts() returned last #endif EQRegExpMatchState matchState; inline EQRegExpPrivate() : eng(0), engineKey(QString(), EQRegExp::RegExp, Qt::CaseSensitive), min(false) {} inline EQRegExpPrivate(const EQRegExpEngineKey &key) : eng(0), engineKey(key), min(false) {} }; #if !defined(QT_NO_REGEXP_OPTIM) uint qHash(const EQRegExpEngineKey &key) { return qHash(key.pattern); } typedef QCache<EQRegExpEngineKey, EQRegExpEngine> EngineCache; Q_GLOBAL_STATIC(EngineCache, globalEngineCache) Q_GLOBAL_STATIC(QMutex, mutex) #endif // QT_NO_REGEXP_OPTIM static void derefEngine(EQRegExpEngine *eng, const EQRegExpEngineKey &key) { #if !defined(QT_NO_REGEXP_OPTIM) QMutexLocker locker(mutex()); #endif // QT_NO_REGEXP_OPTIM if (!--eng->ref) { #if !defined(QT_NO_REGEXP_OPTIM) if (globalEngineCache()) globalEngineCache()->insert(key, eng, 4 + key.pattern.length() / 4); else delete eng; #else Q_UNUSED(key); delete eng; #endif } } static void prepareEngine_helper(EQRegExpPrivate *priv) { bool initMatchState; { #if !defined(QT_NO_REGEXP_OPTIM) // the mutex protects both the globalEngineCache() and the priv->eng pointer QMutexLocker locker(mutex()); #endif initMatchState = !priv->eng; #if !defined(QT_NO_REGEXP_OPTIM) if (!priv->eng) { priv->eng = globalEngineCache()->take(priv->engineKey); if (priv->eng != 0) ++priv->eng->ref; } #endif // QT_NO_REGEXP_OPTIM if (!priv->eng) priv->eng = new EQRegExpEngine(priv->engineKey); } if (initMatchState) priv->matchState.captured.fill(-1, 2 + 2 * priv->eng->numCaptures()); } inline static void prepareEngine(EQRegExpPrivate *priv) { if (priv->eng) return; prepareEngine_helper(priv); } static void prepareEngineForMatch(EQRegExpPrivate *priv, const QString &str) { prepareEngine(priv); priv->matchState.prepareForMatch(priv->eng); #ifndef QT_NO_REGEXP_CAPTURE priv->t = str; priv->capturedCache.clear(); #else Q_UNUSED(str); #endif } static void invalidateEngine(EQRegExpPrivate *priv) { if (priv->eng != 0) { derefEngine(priv->eng, priv->engineKey); priv->eng = 0; priv->matchState.drain(); } } /*! \enum EQRegExp::CaretMode The CaretMode enum defines the different meanings of the caret (\bold{^}) in a regular expression. The possible values are: \value CaretAtZero The caret corresponds to index 0 in the searched string. \value CaretAtOffset The caret corresponds to the start offset of the search. \value CaretWontMatch The caret never matches. */ /*! \enum EQRegExp::PatternSyntax The syntax used to interpret the meaning of the pattern. \value RegExp A rich Perl-like pattern matching syntax. This is the default. \value RegExp2 Like RegExp, but with \l{greedy quantifiers}. This will be the default in Qt 5. (Introduced in Qt 4.2.) \value Wildcard This provides a simple pattern matching syntax similar to that used by shells (command interpreters) for "file globbing". See \l{Wildcard Matching}. \value FixedString The pattern is a fixed string. This is equivalent to using the RegExp pattern on a string in which all metacharacters are escaped using escape(). \sa setPatternSyntax() */ /*! Constructs an empty regexp. \sa isValid(), errorString() */ EQRegExp::EQRegExp() { priv = new EQRegExpPrivate; } /*! Constructs a regular expression object for the given \a pattern string. The pattern must be given using wildcard notation if \a syntax is \l Wildcard; the default is \l RegExp. The pattern is case sensitive, unless \a cs is Qt::CaseInsensitive. Matching is greedy (maximal), but can be changed by calling setMinimal(). \sa setPattern(), setCaseSensitivity(), setPatternSyntax() */ EQRegExp::EQRegExp(const QString &pattern, Qt::CaseSensitivity cs, PatternSyntax syntax) { priv = new EQRegExpPrivate(EQRegExpEngineKey(pattern, syntax, cs)); } /*! Constructs a regular expression as a copy of \a rx. \sa operator=() */ EQRegExp::EQRegExp(const EQRegExp &rx) { priv = new EQRegExpPrivate; operator=(rx); } /*! Destroys the regular expression and cleans up its internal data. */ EQRegExp::~EQRegExp() { invalidateEngine(priv); delete priv; } /*! Copies the regular expression \a rx and returns a reference to the copy. The case sensitivity, wildcard, and minimal matching options are also copied. */ EQRegExp &EQRegExp::operator=(const EQRegExp &rx) { prepareEngine(rx.priv); // to allow sharing EQRegExpEngine *otherEng = rx.priv->eng; if (otherEng) ++otherEng->ref; invalidateEngine(priv); priv->eng = otherEng; priv->engineKey = rx.priv->engineKey; priv->min = rx.priv->min; #ifndef QT_NO_REGEXP_CAPTURE priv->t = rx.priv->t; priv->capturedCache = rx.priv->capturedCache; #endif if (priv->eng) priv->matchState.prepareForMatch(priv->eng); priv->matchState.captured = rx.priv->matchState.captured; return *this; } /*! Returns true if this regular expression is equal to \a rx; otherwise returns false. Two EQRegExp objects are equal if they have the same pattern strings and the same settings for case sensitivity, wildcard and minimal matching. */ bool EQRegExp::operator==(const EQRegExp &rx) const { return priv->engineKey == rx.priv->engineKey && priv->min == rx.priv->min; } /*! \fn bool EQRegExp::operator!=(const EQRegExp &rx) const Returns true if this regular expression is not equal to \a rx; otherwise returns false. \sa operator==() */ /*! Returns true if the pattern string is empty; otherwise returns false. If you call exactMatch() with an empty pattern on an empty string it will return true; otherwise it returns false since it operates over the whole string. If you call indexIn() with an empty pattern on \e any string it will return the start offset (0 by default) because the empty pattern matches the 'emptiness' at the start of the string. In this case the length of the match returned by matchedLength() will be 0. See QString::isEmpty(). */ bool EQRegExp::isEmpty() const { return priv->engineKey.pattern.isEmpty(); } /*! Returns true if the regular expression is valid; otherwise returns false. An invalid regular expression never matches. The pattern \bold{[a-z} is an example of an invalid pattern, since it lacks a closing square bracket. Note that the validity of a regexp may also depend on the setting of the wildcard flag, for example \bold{*.html} is a valid wildcard regexp but an invalid full regexp. \sa errorString() */ bool EQRegExp::isValid() const { if (priv->engineKey.pattern.isEmpty()) { return true; } else { prepareEngine(priv); return priv->eng->isValid(); } } /*! Returns the pattern string of the regular expression. The pattern has either regular expression syntax or wildcard syntax, depending on patternSyntax(). \sa patternSyntax(), caseSensitivity() */ QString EQRegExp::pattern() const { return priv->engineKey.pattern; } /*! Sets the pattern string to \a pattern. The case sensitivity, wildcard, and minimal matching options are not changed. \sa setPatternSyntax(), setCaseSensitivity() */ void EQRegExp::setPattern(const QString &pattern) { if (priv->engineKey.pattern != pattern) { invalidateEngine(priv); priv->engineKey.pattern = pattern; } } /*! Returns Qt::CaseSensitive if the regexp is matched case sensitively; otherwise returns Qt::CaseInsensitive. \sa patternSyntax(), pattern(), isMinimal() */ Qt::CaseSensitivity EQRegExp::caseSensitivity() const { return priv->engineKey.cs; } /*! Sets case sensitive matching to \a cs. If \a cs is Qt::CaseSensitive, \bold{\\.txt$} matches \c{readme.txt} but not \c{README.TXT}. \sa setPatternSyntax(), setPattern(), setMinimal() */ void EQRegExp::setCaseSensitivity(Qt::CaseSensitivity cs) { if ((bool)cs != (bool)priv->engineKey.cs) { invalidateEngine(priv); priv->engineKey.cs = cs; } } /*! Returns the syntax used by the regular expression. The default is EQRegExp::RegExp. \sa pattern(), caseSensitivity() */ EQRegExp::PatternSyntax EQRegExp::patternSyntax() const { return priv->engineKey.patternSyntax; } /*! Sets the syntax mode for the regular expression. The default is EQRegExp::RegExp. Setting \a syntax to EQRegExp::Wildcard enables simple shell-like \l{wildcard matching}. For example, \bold{r*.txt} matches the string \c{readme.txt} in wildcard mode, but does not match \c{readme}. Setting \a syntax to EQRegExp::FixedString means that the pattern is interpreted as a plain string. Special characters (e.g., backslash) don't need to be escaped then. \sa setPattern(), setCaseSensitivity(), escape() */ void EQRegExp::setPatternSyntax(PatternSyntax syntax) { if (syntax != priv->engineKey.patternSyntax) { invalidateEngine(priv); priv->engineKey.patternSyntax = syntax; } } /*! Returns true if minimal (non-greedy) matching is enabled; otherwise returns false. \sa caseSensitivity() */ bool EQRegExp::isMinimal() const { return priv->min; } /*! Enables or disables minimal matching. If \a minimal is false, matching is greedy (maximal) which is the default. For example, suppose we have the input string "We must be <b>bold</b>, very <b>bold</b>!" and the pattern \bold{<b>.*</b>}. With the default greedy (maximal) matching, the match is "We must be \underline{<b>bold</b>, very <b>bold</b>}!". But with minimal (non-greedy) matching, the first match is: "We must be \underline{<b>bold</b>}, very <b>bold</b>!" and the second match is "We must be <b>bold</b>, very \underline{<b>bold</b>}!". In practice we might use the pattern \bold{<b>[^<]*\</b>} instead, although this will still fail for nested tags. \sa setCaseSensitivity() */ void EQRegExp::setMinimal(bool minimal) { priv->min = minimal; } /*! Returns true if \a str is matched exactly by this regular expression; otherwise returns false. You can determine how much of the string was matched by calling matchedLength(). For a given regexp string R, exactMatch("R") is the equivalent of indexIn("^R$") since exactMatch() effectively encloses the regexp in the start of string and end of string anchors, except that it sets matchedLength() differently. For example, if the regular expression is \bold{blue}, then exactMatch() returns true only for input \c blue. For inputs \c bluebell, \c blutak and \c lightblue, exactMatch() returns false and matchedLength() will return 4, 3 and 0 respectively. Although const, this function sets matchedLength(), capturedTexts(), and pos(). \sa indexIn(), lastIndexIn() */ bool EQRegExp::exactMatch(const QString &str) const { prepareEngineForMatch(priv, str); priv->matchState.match(str, 0, priv->min, true, 0); if (priv->matchState.captured.at(1) == str.length()) { return true; } else { priv->matchState.captured[0] = 0; priv->matchState.captured[1] = priv->matchState.oneTestMatchedLen; return false; } } /*! Attempts to find a match in \a str from position \a offset (0 by default). If \a offset is -1, the search starts at the last character; if -2, at the next to last character; etc. Returns the position of the first match, or -1 if there was no match. The \a caretMode parameter can be used to instruct whether \bold{^} should match at index 0 or at \a offset. You might prefer to use QString::indexOf(), QString::contains(), or even QStringList::filter(). To replace matches use QString::replace(). Example: \code QString str = "offsets: 1.23 .50 71.00 6.00"; EQRegExp rx("\\d*\\.\\d+"); // primitive floating point matching int count = 0; int pos = 0; while ((pos = rx.indexIn(str, pos)) != -1) { ++count; pos += rx.matchedLength(); } // pos will be 9, 14, 18 and finally 24; count will end up as 4 \endcode Although const, this function sets matchedLength(), capturedTexts() and pos(). If the EQRegExp is a wildcard expression (see setPatternSyntax()) and want to test a string against the whole wildcard expression, use exactMatch() instead of this function. \sa lastIndexIn(), exactMatch() */ int EQRegExp::indexIn(const QString &str, int offset, CaretMode caretMode) const { prepareEngineForMatch(priv, str); if (offset < 0) offset += str.length(); priv->matchState.match(str, offset, priv->min, false, caretIndex(offset, caretMode)); return priv->matchState.captured.at(0); } /*! Attempts to find a match backwards in \a str from position \a offset. If \a offset is -1 (the default), the search starts at the last character; if -2, at the next to last character; etc. Returns the position of the first match, or -1 if there was no match. The \a caretMode parameter can be used to instruct whether \bold{^} should match at index 0 or at \a offset. Although const, this function sets matchedLength(), capturedTexts() and pos(). \warning Searching backwards is much slower than searching forwards. \sa indexIn(), exactMatch() */ int EQRegExp::lastIndexIn(const QString &str, int offset, CaretMode caretMode) const { prepareEngineForMatch(priv, str); if (offset < 0) offset += str.length(); if (offset < 0 || offset > str.length()) { priv->matchState.captured.fill(-1); return -1; } while (offset >= 0) { priv->matchState.match(str, offset, priv->min, true, caretIndex(offset, caretMode)); if (priv->matchState.captured.at(0) == offset) return offset; --offset; } return -1; } /*! Returns the length of the last matched string, or -1 if there was no match. \sa exactMatch(), indexIn(), lastIndexIn() */ int EQRegExp::matchedLength() const { return priv->matchState.captured.at(1); } #ifndef QT_NO_REGEXP_CAPTURE /*! Returns the number of captures contained in the regular expression. */ int EQRegExp::numCaptures() const { prepareEngine(priv); return priv->eng->numCaptures(); } /*! Returns a list of the captured text strings. The first string in the list is the entire matched string. Each subsequent list element contains a string that matched a (capturing) subexpression of the regexp. For example: \code EQRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)"); int pos = rx.indexIn("Length: 36 inches"); QStringList list = rx.capturedTexts(); // list is now ("36 inches", "36", " ", "inches", "es") \endcode The above example also captures elements that may be present but which we have no interest in. This problem can be solved by using non-capturing parentheses: \code EQRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)"); int pos = rx.indexIn("Length: 36 inches"); QStringList list = rx.capturedTexts(); // list is now ("36 inches", "36", "inches") \endcode Note that if you want to iterate over the list, you should iterate over a copy, e.g. \code QStringList list = rx.capturedTexts(); QStringList::iterator it = list.begin(); while (it != list.end()) { myProcessing(*it); ++it; } \endcode Some regexps can match an indeterminate number of times. For example if the input string is "Offsets: 12 14 99 231 7" and the regexp, \c{rx}, is \bold{(\\d+)+}, we would hope to get a list of all the numbers matched. However, after calling \c{rx.indexIn(str)}, capturedTexts() will return the list ("12", "12"), i.e. the entire match was "12" and the first subexpression matched was "12". The correct approach is to use cap() in a \l{EQRegExp#cap_in_a_loop}{loop}. The order of elements in the string list is as follows. The first element is the entire matching string. Each subsequent element corresponds to the next capturing open left parentheses. Thus capturedTexts()[1] is the text of the first capturing parentheses, capturedTexts()[2] is the text of the second and so on (corresponding to $1, $2, etc., in some other regexp languages). \sa cap(), pos() */ QStringList EQRegExp::capturedTexts() { if (priv->capturedCache.isEmpty()) { prepareEngine(priv); const QVector<int> &captured = priv->matchState.captured; int n = captured.size(); for (int i = 0; i < n; i += 2) { QString m; if (captured.at(i + 1) == 0) m = QLatin1String(""); // ### Qt 5: don't distinguish between null and empty else if (captured.at(i) >= 0) m = priv->t.mid(captured.at(i), captured.at(i + 1)); priv->capturedCache.append(m); } priv->t.clear(); } return priv->capturedCache; } /*! Returns the text captured by the \a nth subexpression. The entire match has index 0 and the parenthesized subexpressions have indexes starting from 1 (excluding non-capturing parentheses). \code EQRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)"); int pos = rxlen.indexIn("Length: 189cm"); if (pos > -1) { QString value = rxlen.cap(1); // "189" QString unit = rxlen.cap(2); // "cm" // ... } \endcode The order of elements matched by cap() is as follows. The first element, cap(0), is the entire matching string. Each subsequent element corresponds to the next capturing open left parentheses. Thus cap(1) is the text of the first capturing parentheses, cap(2) is the text of the second, and so on. \sa capturedTexts(), pos() */ QString EQRegExp::cap(int nth) { return capturedTexts().value(nth); } /*! Returns the position of the \a nth captured text in the searched string. If \a nth is 0 (the default), pos() returns the position of the whole match. Example: \code EQRegExp rx("/([a-z]+)/([a-z]+)"); rx.indexIn("Output /dev/null"); // returns 7 (position of /dev/null) rx.pos(0); // returns 7 (position of /dev/null) rx.pos(1); // returns 8 (position of dev) rx.pos(2); // returns 12 (position of null) \endcode For zero-length matches, pos() always returns -1. (For example, if cap(4) would return an empty string, pos(4) returns -1.) This is a feature of the implementation. \sa cap(), capturedTexts() */ int EQRegExp::pos(int nth) { if (nth < 0 || nth >= priv->matchState.captured.size() / 2) return -1; else return priv->matchState.captured.at(2 * nth); } /*! Returns a text string that explains why a regexp pattern is invalid the case being; otherwise returns "no error occurred". \sa isValid() */ QString EQRegExp::errorString() { if (isValid()) { return QString::fromLatin1(RXERR_OK); } else { return priv->eng->errorString(); } } #endif /*! Returns the string \a str with every regexp special character escaped with a backslash. The special characters are $, (,), *, +, ., ?, [, \,], ^, {, | and }. Example: \code s1 = EQRegExp::escape("bingo"); // s1 == "bingo" s2 = EQRegExp::escape("f(x)"); // s2 == "f\\(x\\)" \endcode This function is useful to construct regexp patterns dynamically: \code EQRegExp rx("(" + EQRegExp::escape(name) + "|" + EQRegExp::escape(alias) + ")"); \endcode \sa setPatternSyntax() */ QString EQRegExp::escape(const QString &str) { static const char meta[] = "$()*+.?[\\]^{|}"; QString quoted = str; int i = 0; while (i < quoted.length()) { if (strchr(meta, quoted.at(i).toLatin1()) != 0) quoted.insert(i++, QLatin1Char('\\')); ++i; } return quoted; } /*! \fn bool EQRegExp::caseSensitive() const Use \l caseSensitivity() instead. */ /*! \fn void EQRegExp::setCaseSensitive(bool sensitive) Use \l setCaseSensitivity() instead. */ /*! \fn bool EQRegExp::wildcard() const Use \l patternSyntax() instead. \oldcode bool wc = rx.wildcard(); \newcode bool wc = (rx.patternSyntax() == EQRegExp::Wildcard); \endcode */ /*! \fn void EQRegExp::setWildcard(bool wildcard) Use \l setPatternSyntax() instead. \oldcode rx.setWildcard(wc); \newcode rx.setPatternSyntax(wc ? EQRegExp::Wildcard : EQRegExp::RegExp); \endcode */ /*! \fn bool EQRegExp::minimal() const Use \l isMinimal() instead. */ /*! \fn int EQRegExp::search(const QString &str, int from = 0, CaretMode caretMode = CaretAtZero) const Use \l indexIn() instead. */ /*! \fn int EQRegExp::searchRev(const QString &str, int from = -1, \ CaretMode caretMode = CaretAtZero) const Use \l lastIndexIn() instead. */ /*! \fn EQRegExp::EQRegExp(const QString &pattern, bool cs, bool wildcard = false) Use another constructor instead. \oldcode EQRegExp rx("*.txt", false, true); \newcode EQRegExp rx("*.txt", Qt::CaseInsensitive, EQRegExp::Wildcard); \endcode */ #ifndef QT_NO_DATASTREAM /*! \relates EQRegExp Writes the regular expression \a regExp to stream \a out. \sa {Format of the QDataStream Operators} */ QDataStream &operator<<(QDataStream &out, const EQRegExp ®Exp) { return out << regExp.pattern() << (quint8)regExp.caseSensitivity() << (quint8)regExp.patternSyntax() << (quint8)!!regExp.isMinimal(); } /*! \relates EQRegExp Reads a regular expression from stream \a in into \a regExp. \sa {Format of the QDataStream Operators} */ QDataStream &operator>>(QDataStream &in, EQRegExp ®Exp) { QString pattern; quint8 cs; quint8 patternSyntax; quint8 isMinimal; in >> pattern >> cs >> patternSyntax >> isMinimal; EQRegExp newRegExp(pattern, Qt::CaseSensitivity(cs), EQRegExp::PatternSyntax(patternSyntax)); newRegExp.setMinimal(isMinimal); regExp = newRegExp; return in; } #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/bibPreparser.h�����������������������������������������������������������������0000644�0001750�0001750�00000001622�12045520050�016616� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef BIBPREPARSER_H #define BIBPREPARSER_H #include <QObject> /** This class handles external processing of bibliographic items. It's formally an extension of the bibParser. */ class bibPreparser : public QObject { Q_OBJECT public: bibPreparser(QObject* parento = 0); inline ~bibPreparser() {} void preparse(const QString& text, QString* out_text); signals: void preparserLogAvailable(const QString& log); void statusMessage(const QString& ms); private: QString m_inp_file; QString m_out_file; }; #endif ��������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/cb2bib_conf_parameters.h.in����������������������������������������������������0000644�0001750�0001750�00000000744�12045520050�021162� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef CB2BIB_CONF_PARAMETERS_H #define CB2BIB_CONF_PARAMETERS_H const QString C2B_DATA_DIR("@C2B_INSTALL_DATA_DIR@"); #endif ����������������������������cb2bib-1.4.9/src/c2b/txt/���������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045517740�014657� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/txt/word_prefix_lexicon.txt����������������������������������������������������0000644�0001750�0001750�00000006703�12045517740�021477� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������_about_ _abso _abstra _acces _accu _acety _acid _acta _actin _activ _adapt _adso _advanc _afte _agen _alert _algor _align _analys _and_ _anion _antib _antige _applic _appr _arabid _archiv _articl _assemb _asses _assoc _at_ _atom_ _atomic _atp _autom _bacil _bact _based _basis _behav _betw _bibli _bindi _bioc _bioi _biolog _biom _biosy _blood _bound _bovine _but_ _by_ _calci _calcul _campus_ _cataly _catio _ccs _cdn _cell_ _cells _cellul _center_ _centra _cereb _cerev _changes _channe _charac _chem_ _chemi _chlor _chrom _cien _citat _classi _clini _cloni _clust _collect _colleg _communic _compara _comparis _compl _compon _composi _compou _compu _conform _conse _consis _constr _contac _contai _continu _control _conversi _coord _copy _core_ _corpo _correla _couple _crystall _cubat _cult _cyc _cyt _data_ _datab _dehy _densi _depart _depen _deriv _descri _design _deskt _detai _detec _determi _devel _dft _differ _digg_ _digit _dimensi _direc _disea _dissoc _distanc _distr _diverg _divers _dna _doctora _domains _downl _droso _dyna _edite _editi _edito _effec _effi _eigenv _elec _elemen _emai _embry _enco _endot _energ _enh _enzy _epid _epit _equa _errat _escheri _estim _eval _evidenc _evol _exam _exch _exci _experi _expr _extra _facul _false_ _family _featu _federa _fibr _fluo _for_ _formal _format _formu _fract _fragm _from_ _funct _gaussi _generali _generat _geneti _genom _geolo _geom _gluco _gluta _glyc _granul _group _growt _hamiltoni _hepa _heter _highly _hist _homolo _hormon _htm _hybr _hydr _hyper _iden _image _imagi _immu _impl _improv _inc_ _index _indu _infe _infl _info _inhi _init _inst _integ _intera _interf _interm _inters _intro_ _introd _inves _invo _isolat _issu _items _journal _kinase _kinet _labora _lact _librarie _library _licens _ligan _linea _lipid _lipop _localiz _lymph _magnet _mammal _manusc _mappi _matchi _mathem _matric _matrix _measure_ _measurem _mechanis _mediat _medica _membe _membra _metab _metad _method _methy _metri _micr _mitoc _model_ _modeli _models _modif _modu _molec _morph _multi _muscl _mutant _mutati _myco _nanop _nanos _nanot _natu _nerve _netw _neural _neuron _new_ _nitr _nmr _nonp _normal _notes_ _novel_ _nucl _numer _obj _obse _of_ _on_ _onl _oper _optical _optim _orbi _organiz _origi _oxi _oxy _paper_ _papers _parall _paramet _partia _partic _patho _pathw _patients _pattern _pdf _peak_ _pept _perfo _permis _perox _pertur _phas _phos _phot _phylo _phys _plasm _polymer_ _polymera _popu _postin _potent _pract _predict _prepr _presen _primar _principl _probab _probl _proces _produ _profes _profi _progr _promo _prope _proteas _protei _proteo _proton _pseu _pub _purificat _putat _quadra _quantit _quantu _radical _reac _recep _recog _recom _recon _reduc _refere _regio _regr _regulat _relat _repl _report_ _reports _represe _requi _resea _resis _reso _resp _revea _review _ribos _rna _rotat _saccha _scale_ _scalin _scheme_ _school_ _scienc _scient _search _second _secret _segm _selec _sensit _sequen _series _sets_ _shell_ _signa _simila _simula _singu _sites _soft _solut _south_ _space_ _speci _spectr _sph _spin_ _stabili _standard_ _stati _stimu _strep _struct _studies _study _subject _subm _subsp _subst _subun _sulf _surf _syna _synth _syst _technic _techniq _techno _tempera _termina _tetr _the_ _theorem _theoreti _theori _theory _thermo _thesis _three _throu _tissu _to_ _tox _transc _transf _transi _transm _transp _treatm _tumo _type _ultr _unit _univ _usa_ _usi _variab _vesic _vibrat _virtua _visua _vitro _with_ _within _yeas �������������������������������������������������������������cb2bib-1.4.9/src/c2b/txt/prefixes.txt���������������������������������������������������������������0000644�0001750�0001750�00000022160�12045517740�017246� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������a ab abdomin abs ac acanth acantho acar acet acetab aceto acou acous acouso acr acro actin acu ad add aden adeno adenoid adip adipo adren adreno aemia aer aero aesthesi aesthesio aeti af after ag agri al ala alb albi alg alge algesi algio algo ali aliment alkyl all allo alto alveol am amb ambi ambly ambyl ameb ametr amic amidino amino amm amni amnio amph amphi amphibi ampho amyl an ana ancylo andr andro anemo ang angi angio anis ankyl ankyle ankylo ano anomalo ant ante anter antero anth antho anthra anthro anthrop anthropo anti antr ap aph api apo aqu aqua aqui aquo ar arch archa archaeo arche archi argyr aristo arrhen arsa arshae arter arteri arterio arteriol arth arthr arthro arthron articul articulo as asco aster asthen astr at ate atel ather atm atmo atom atreto atri atrium atto audi aur auri auricul aut auto aux axi axilla aza azido azo azot bacill back bacter bacteri bacterio bactr balan bar barb baro bary basi baso bath be ben bene benzo ber bi bibli biblio bicyclo bin bio bis bisma blast blasto blenn bleph blephar blepharo bon bora brachi brachia brachio brachy brady branchi breph brev brevi brom bronch bronchi bry bryo bucc bucco cac caco caen calc calor cancer cancr canth capill capit caps caput carb carbamimidoyl carbamoyl carbox carboxy carboxylate carboxylato carcin carcino cardi cardio carn carnis carp carpal cary case cat cata cath cato cau caud caul caus cav cel cell cen cente centi centr centri cephal cephalo cer cerat cerebell cerebr cerebro cervic chalc chancr cheil cheir chel chele chem chemi chemico chemio chemo chil chir chlor chloro chloroformyl chol cholangi choledoch chondr chondrio chondro chord chori chrom chroma chromato chrome chromo chron chrono chyle chym cili cilia cine circa circum cirrho cirru cis citra clas clast cleid cleist clin clist co cocc coccyg coel coen col cole coll colo colono colp com con coni contra cor core corp corpus cort cortic cosmo cost cotyl counter crani cranio cresc cret cric crin crur cry cryo crypt cteno cucmul cumul cusp cut cuti cyan cyano cyber cyci cycl cyclo cymbo cyn cyrt cyst cysti cysto cyt cyte cytis cyto da dacrio dacry dacty dactyl dactylo de dea dec deca deci deka deliquesc dem demi demo dendr dent der derm dermato dermis des desm deuter deutero dextr dextro di dia diaza dicta dif differ digit diicosa dilia din dipl diplo dis dodec dodeca doheptaconta dohexaconta doicosa dolich dolicho dont dorm dors drom du duo duoden duodeno dur dy dynam dynamo dys e ec echin eco ect ecto ectro ef eka el ele electr electro elytr em embry emet emnea en encephal encephalo end endo ennea enneaconta ent enter entero ento entom eole ep eph epi episi equi erg ergy erot erythr erythro eso esthesio ethno ethoxy eu eury ev ex exa exo extra extro faci fasci febri femto ferr ferro feto fibr fibro fil fila fis fiss flagell flav flor flu fluct fluor foet foli for fore formyl fract front fus galact galacto gam gamet gangli gastr gastro ge gelat gemin gemm gen gene geni genu geny geo ger germa geront gibi giga giganto glia glob gloss glossa glosso glott glotto gluc gluco glut glyc glyco gn gnath gnatho gon goni gono gony granul graph grav gravid gravis gymno gyn gynae gynaeco gyne gyneco gyno gyr haem haema haemat haemato hal hallux halo halocarbonyl hapl haplo hapto hect hecta hecto hel helc heli helic hem hema hemat hemato hemi hemo hen hendeca hepar hepat hepatico hepato hept hepta heptacta heptadeca heptalia herb heter hetero hex hexa hexacta hexaicosa hexalia hibern hidr hidro hier hipp hist histio histo holo hom homeo homo horm hort hyal hybrid hydr hydro hydroperoxy hydrox hydroxy hygr hyl hymen hyp hyper hyph hypho hypno hypo hyps hypsi hyster hystero iatr ic ichthy icon icosa icosidi icosiocta icositri icter ide idea ideo idi idio ign il ile ileo ili ill im imino immuno in incret incud infero infra infro inguin ini insul inter intra intro intus iodo ir irid irido isch ischi ischio iso ite ithy ixodi jec jejun jug jugu juxta kak kali kaps kary karyo kat kata kel ken ker kerat kerato keraun kibi kilia kilo kin kine kinesi kinesio kino klept koilo kolp koly kon krym kym kyn kyph kypho kysth labi lac lachry lacri lacrim lacrimo lact lacti lacto laevo lal lamina lampro lan lapar lapis laryng laryngo lat later latero lecith lei leio lem lepid lepr lepto leuc leuco leuk leuko levo lex lien liga lign lim lin lingu linguo lio lip lipo liqu lith litho loc log loga logo longus loph loxo luc lue lumb lumi lumin lun lute ly lyc lymph lympho lys lyso lyss macr macro mag magn magna maj makro mal malac malar male malle mamm man mania marg mast masto maxilla maz mc meat mebi mechan mechano mecon med medi meg mega megal megalo meio mel mela melan melano meli men mening meningo menisc ment mer mercura mes mesa meso mesos met meta meteor meter meth metop metr metro micr micro mid migr mill mille milli mini minumus mio mis mit mito mnem mole moll mon mono mont morph morpho mort mot mov muc multi muscul musculo mut my myc mycel mycet myco myel myelo myl myo myria myring myringo myx myxo nano narc naris nas natr ne neco necr necro nem nema nemat neo neph nephr nephro ner nerv nesidi neur neuri neuro neutr niga noci noct nod nodus nomen non nona nonaconta nonacta nonadeca nonalia normo nos not novi nox nuc nucha nutri nyct nymph o oari oate ob oc occipit occlus oct octa octaconta octacta octadeca octaicosa octi octo octodeci ocul oculo odont odonto odyn odyno oedem oesophageal oesophago of oik ole olf olfact olig oligo om omni omphal onc oncho onco one oneir ont onych onycho onyx oo oophor oophoro oothec op ophidia ophthalm ophthalmo opistho ops opt opthal opthalm optic or ora orb orch orchi orchid orchido orchio organ organo ornith orrh orth ortho os osche oscu osm oss osseo ossi ost oste osteo ot oto ous out ov ovari ovario over ovi ovo oxa oxido oxo oxy pachy paed palat paleo pali palin palm palpebra palpit pan pant panto papilla par para part parvi path patho pebi pect pector ped pel pell pelv pelvi pelvo pene pent penta pentacta pentadeca pep per peri permea pero pes peta petal petr phac phaco phaeo phag phage phago phak phalan phall phan phaner phao pharmac pharmaco pharyng pharyngo phas phen pheno pheo pher phil philo phleb phlebo phleg phlogo phob phobo phon phono phor phos phospha phot photo phrag phren phreni phrenico phreno phthi phyc phyl phyll phylo phys physi phyt phyto pi pico picro piez pil pimel pinni pino pituit plan plankto plas plasm plasma plast plat platy pleo pleur pleura pleuro plex plic plumba pluri pne pneum pneuma pneumat pneumato pneumo pod podo poikilo poli polio pollex polples poly pom pon pont por porphyro port post postero prae pre presby presbyo prim primordis pro proct procto pronto pronus proprio pros prosop prot proto prox psamm pselaph pseud pseudo psor psych psyche psycho pter pterido ptoma ptyal pub puer pulm pulmo puls pur purpur py pyel pyelo pyg pyle pylor pyo pyon pyr pyret pyro quad quadr quadra quadri quarter quarti quasi quater quatr quin quinque quint r rachi radi radicul radio rami re rect recto red ren renes reno reptilis ret reticul reticulo retro revo rhabd rhabdo rhachi rhag rhe rhig rhin rhino rhiptid rhiz rhizo rhod rhodo rhyp rost rot roto rub rubr sacchar saccharo sacr salping salpingo sangui sanita sap sapr sapro sapros sarc sarco saturn saur scaph scat scel schis schist schisto schiz schizo sci scia scirrho scler sclero scolec scoli scolio scop scot scribe scrit scyt se sect secund sed selanyl selena selenocarboxy semei semi sens seps sept septa septe septi septic ser sesqui sess set sex sexdeci sexi sial sialo sicc sider sigmoid sigmoido sila sin sinap sinistr sinistro sit sito skia sol solv som soma somat somatico somato some somn son sonus sover spacel spano spasm spasmo spec spectr spectro sperm sperma spermato spermo sphaer sphen spher sphygm spic spin spinth spir spiro splanchn splanchni splanchno splen spleno spod spondyl spondylo spongi spor squam stann stanna staphyl stas stat steap stear steat stell sten steno sterc stere stereo stern steth sthen stheno stiba stom stoma stomat stomato strab strat strati strept stri strict stroph strum styl sub subter suc succ sud suf sug sulfanyl sulfeno sulfido sulfino sulfo sulfonato sum sup super supinus supra sur sursum sy syl sym syn syndesm syring sys system syto tabe tach tachy tact taenia tal talip taph tars tarso taut tax tebi techn tect teg tel tela tele tellanyl tellura telo temp tend tenia teno tenont tension tephr ter tera terat terr terti test tetan tetart tetr tetra tetraconta tetracta tetralia thall thanat thec their thel thelo thely thenar theo therap therm thermo thia thigm thio thiocarboxy thix thorac thoracico thoraco threp thrix thromb thrombo thym thyr thyro tibi toc toco ton tono top topo tors tox toxi toxico toxo tra trache trachel tracheo trachy trans tre tredo tri trich trichi trichia tricho tricta trideca triginta trigon trigono triicosa trilia tris trit trocho trop troph tub turb tuss twi tyman tympan tympano typ typhl tyr ul ula ultra un una undeci under ungu uni untriginta ur uran ureter urethro uri uric urico uro uron uter vagin valvul varic varico vas vascul vasculo vaso vect ven vent venter ventr ventricul verd vermi vertebr vesic vesico vice vig viginti vir viscer vit vita viv vivi volv vor vulv xanth xanthin xantho xen xeno xero xiph xyl yocto yotta zepto zetta zo zoa zoo zyg zygon zym zymo ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/txt/triads.txt�����������������������������������������������������������������0000644�0001750�0001750�00000005411�12045517740�016707� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������aeiloty ¦§³»¼ÀÂÉÍÑÛÜÝáþāĎďģıIJĵĶķĹļľĿŃńŅʼnƂƐƑƕƦƶǀdžǍǑǓǔǕǟǠǧǫǯǴǵȝȟȲȳȷȹȽɁɃɆɇɈɏɑɓɛɜɝɠɢɤɩɭɻɼ˙̪͍̒Ϳ΀΂ϛжџӜӫӳӷӾԁԐֱֶֻּ֭֩֯؈ؙؓؕؖآأؤحٹٽٿځچڌۋۘۙۚۛ۟ۡ۩۬ۮۯ۵ۻۿ܃܆܉܌܎܏ܘܙܧܳݣݥݧݫݰݱݵށޅދޏޚޥޱ޵޹޼߄ߜࡑࡕ࡛ࢄࢉࢍ࢓࢔࣓ࣜथ঍঒ণধফলৠਉਊਜਡਧਲਵ੉ੌੲ੺૱૵ૹૼ૾૿଀ଃ଄ଅଜଥ଩ଭଷୂୌ୙୛ଡ଼ଢ଼ୟୡ୥୧୪୫୬ୱ୵஄஑ஔச஠பயழஸு௅ே௉ௌ௎௓௔௕఑జశ఼౎ౖౠౡ౥౷౹౻಄ಅಈಭಯಲಳಶಷಸ಼ಽಾೃೈ೐೒೓ೖ೗೘೟ೡೢೣ೤೧೪೫೬೭೰ೲ೴೷೹೽ഄആഊഌഖഞതറാ෍෗ෛො฀กฐฑโ๭ແ໪໺ཏནབཛྷརལྠွ၀၁။ၓႳႴ폐ᅾᆋᆏᆖᆜᆩᆴሆቨጹᐍᐗᐠᐧᐨᐳᑍᑏᑡᑧᒙᒛᒜᒥᒳᓨᓬᔮᖅᖉᖌᖓᖔᖙᖟᖹᗇᗉᗑᗜᗞᗦᗩᗭᗱᗺᗻᗼᗾᘁᘔᘡᘪᘮᙄᙈᙉᙑᙔᙕᙗᙙᙜᙞᙢᙣᙥᙩᚱᚷᛖᛗᛞᛤᛥᛱᜋᜏ᜘᜚ᝌ᝙᝱ᝲ᝵᝷᝼᝽កជញឍទបលវឮ឴ᡡ᱂ᵱᵵᵿᶀᶒᶩᶬᶲᶴᷦᷨḋḖṃṈẲẸếểịốỒỡừἫἺὅὉὓ὞ὟὩὬὰήᾚᾶῺ ’‣‥⁅⁐₊₋ℱℳℷ℻⅀⅁⅂ⅆ⅖ⅣⅧⅫⅯⅰⅵⅶↁↅ←⇍⇒⇶∁∃∇∍∐−∗∙∝∡≳⊮⊸⊹⊽⋂⋉⋍⋭⌝⌟⌡⌣⌥〉⌬⌮⌯⌰⌲⍈⍤⎅⎉⎋⎍⎐⎒⎘⎙⎝⏖⏥⏦⏫⏭⏯⏱⏾␋␏␙␭␳␶⑙⑯⑲⑷⑺⒂⒇⒣⒥⒦⒧⒰⒱⒴⒵ⒶⒷⒽⓨ╝╡╤╦▀▆▜▞▴▸►◁◅◈◉◎◒◓◔◕◣◬☠☩☭☯☰☱☴☶☻☼♅⚃⚄⚍⚔⚜⚞⚤⚫⚭⚯⚽⛉⛍⛓⛗⛝⛣⛧⛬⛰⛱⛲✓✕✗✛✞✟✥✭✮✰✵✾✿❇❊❏❓❔❕❥❩❴➈➌⟗⠁⠱⠵⠶⠹⡂⡩⡭⡶⡷⣍⣏⣐⣑⣓⣕⣚⣟⣠⤝⤟⤨⤬⤮⥓⥗⥜⥩⥫⥭⥮⥱⥴⥷⥺⥼⥽⦷⦻⦿⧂⧃⧅⧉⧊⧋⧎⧙⧤⧯⧸⧼⧾⩵⪥⪩⪴⬋⬜⭱⭵ⵇⵉⵌⵍⵐⵓⵗⵘⵠⵢⵣ⵲⵼⵽ⶁⶄⶆⶋⶍⶕ⶗ⶭ⶯ⶱⶵⶼ⶿ⷀⷘⷡⷥⷮⷯⷴ⸌⸕⸙⸛⸝⸠⸢⸦⸧⸨⸩⸱⹶⺅⺊⺐⺙⺛⺜⺟⺢⺥⺩⺵⺹⺽⻃⻋⻏⻓⻜⻝⻩⻭⼙⼜⼝⼡⼤⼦⼧⼪⼵⼶⼷⼻⼿⽀⽁⽄⽆⽍⽐⽑⽔⽪⽺⾧⿫⿬⿭⿱⿴⿼〇〖〝〥〨〪えごすっつらろグスタチツテニネㄉㄋㄏㄙㄚㄥㄬㄴㄻㄿㅃㅆㅕㅘㅙㅝㅠㅡㅢㅧㅨㅽㆀㆍㆣㆤㆥㆧㆫㆰㆲㆶ㇁㇥㇩㇬ㇵㇹ㈂㈃㊑㊕㊘㊚㊟㊠㊫㋅㋌㋎㋵㋹㋽㌁㌂㌆㌇㌈㌩㌺㍡㍣㍥㍯㍰㍱㎞㏇㏐㏗㏘㏞㏟㏣㏧㏭㏱㏹㏽㏿㐁㐇㐋㐌㐍㑇㑉㑋㑏㑒㑔㑕㑙㑚㑛㑩㑽㒆㒉㒍㒎㒨㒺㓁㓂㔵㔹㕜㕭㖐㖡㖬㖵㘅㘇㘎㙢㙧㚇㚋㚎㚗㛈㛉㛸㛽㜅㜍㜟㜢㜣㜬㜭㜮㜰㝄㠗㣳㣷㤀㤂㥓㦏㦓㦕㦗㦚㧑㫥㭍㭐㱅㲄㲬㶍㶘㹠㹨㻩㿉䂑䄌䄵䆻䑡�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/txt/suffixes.txt���������������������������������������������������������������0000644�0001750�0001750�00000015732�12045517740�017264� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������a abilities ability able abled ablely ableness ablenesses ables abling ably ac acea aceae acean acene aceous acousia acoustic acy ad ada addy ade adenia adic adiene adiyne adol ads aemia aesthesia aesthetic against age agnosia agog agogue agra al ales algesia algia aling alis alism alisms alities alitis ality alization alizations alize alized alizer alizers alizes alizing alli allied allies allis ally allying alness als amide amidine amidyl amine aminyl an ana ance ances ancies ancy ane angle ans ant anted anthema anting antness ants ar arch arche archy ard aria arian aries arion arit arity arities arium ary as ase asis ast aster asthenia ata ate ated ateful atefulness ately ateness ates ating atings ation ational ationals ations ative atively ativeness atives ativity ato ator atored atoring ators atory atresia atriene atriyne atrophia atum atus auxe basia bility biosis biotic biotics blast ble bleness blepharia blepsia blepsy bly boom bound bounds brachia bund bus cace caine calities cality cally calness capnia cara carbaldehyde carbonitrile carbonyl carboxamide carboximidamide carboxylate carboxylic carcinoma cardia cardiac carp catharic cele cene centesis centric cephalia cephalus cephaly cera cerca cerebral chesia chezia chirurgia chondria chorea chroia chromasia chromatic chrome chylia cidal cide clasia clasis clasm clast clastic cle cleisis clinous clonia clysm cnemia coccus coele cole comma cracy crania crasia crat cratia crine crotic cular cule culum culus current cusis cy cycle cyst cystic cyte cythemia d dactylia demic dendron dermia dermic desis desma diene diide diium diol dione dipsia diyl diylidene diylylidene dom donita dorsal drome duct dynamia dynamy dynia e eabilities eability eable eableness eables eably eae eal ealed ealing ealism eality ealization ealize ealized ealizing eally ealness eals ecane echia ecin ecine ecoia ectasia ectasis ectasy ectomy ectopia ed edema edly edness ee eement eements een eence eer eered eering eers ees eg egasia ein el ella elle ellum ema eme ement emented emently ementness ements emetic emia empyema en ence enceful encephalia encephaly enchyma ency ene ened ener eness enesses ent entative entatively entativeness entatives entativity ented entful entfulness enting ently entness ents eous eously eousness epane epin epine er erative eratively erativeness ered erful erfulness ergetic ergic ergy eries ering erings erness erotic ers ery es escence escense escent ese esis esp esque ess est esthesia et etane etc ete etene eth etic etidine etine ette etum eus facient faction fast febrile fer ferent ferous fibroma fic fication fid field fields fish fishes flect flex fluent fold food foot form forme found founds fuge ful fullness fully fulness fulnesses fuls fuse fy fying gamy gen gene genesia genesis genia genic gerous geusia geustia gine glossia glycaemia gnathia gnomy gnosia gnosis gon gony gram graph grapher graphia graphy gyne h hale hedron helminth herbicide hood hound hounds hydria hydride i ia iac ial ian iasis iatric iatrician iatry ible iblely ibleness ibles iblies ibly ic ical icalism icalities icality ically icals ice iced ician icing icities icitis icity ics icus id ida idae idan ide idea ides idin idine idines idium ido idyl ie ied ier ies iest iform iforme ify il ile iliac ility illa illus ily imidamide imide imine iminyl in ina inae inane ine ineae iness inesses ing ingly ings ingy ini initio io ion ional ioned ionful ioning ionings ions ior ious irane irene iridine irine iscus ise ised ish ishly ishness ishy ising isk isks ism isms ismus ist istic ists ite ited ites iti itiative itic ities itious itis itium itol ity ium iumyl ive ivelies ively iveness ives ivities ivitis ivity ization izations ize ized izer izers izes izing kijn kin kind kinds kinesia kinesis l labe labial labile lability lable labled lablely lableness lables lably lagnia lagny lalia land lapse lateral lates lating lation lational lations lative latively lativeness lator lators latry le leability leable leableness leal led lemma leness leous lepsy leptic ler lered lering lers les less lesses lessly lessness let lexia like likes lines ling lings lipsis lite lith lithiasis lithotomy lity lobe log logia logical logist logue logy long lucent lunar ly lying lymph lyse lysin lysis lyst lyte lytic lyze ma malacia man mancy mania maniac manic manship mark marks mastia masty mazia megaly melia men ment mentative mentatively mentativeness mented mentia menting mently ments mer mere meria meric merics meter metr metria metric metries metry mimesis mixis mnesia mo moria most motor mrs myelia neonatology nephric ness nessed nesses nessing neural neure neuria neuron nik nitrile node noia noid nom noma nome nomia nomy o oate ocane ocin ocine ock ode odonita oedema of ogen oic oid oidal oidea oin ol ola olane olate ole olene olic olics olidine oline ology ols olum olus oma ome on onane one ones onia onic onin onine onio onite onites onium oniumyl ons ont ope opia opsia opsy opy or orexia organic orial ories orium ors ory os oscopy ose oside osis osmia osteon osteum ostomy ote otia otic otomy ous oused ousing ously ousness oxemia oxia oyl pachy paedic paenia pagus pancreatic para partite path pathetic pathia pathic pathy ped pede penia pennate pepsia peptic pert petal pexia pexis pexy phagia phane phasia phemia phil phile philia philias philic phily phobe phobia phone phones phonia phonic phore phoresis phoria phragm phrasia phrenia phrenic phthongia phyll phyma physical physics physis phyte picrin plakia plania plasia plasm plast plastia plastic plasty plegia plegic plex plexia plexus plexy ploid pnea pnoea pod podia poetic poiesis poo pore post potent pragia praxia praxis privia proctia proof proofs prosopia prost pselaphesia psychic psychosis pterygium ptosis ptysis pubic pulsion pyrexia renal rhachia rhage rhagia rhaphy rhea rhexis rhoea room rooms rrh rrhachia rrhage rrhagia rrhaphy rrhea rrhexis rrhoea ry s scelia schisis sclerosis scope scopy scribe script se sect sector selenal selenoic selenol selone sepsis septic ship sia sion sis site sitia solve soma somatic some someness somenesses somia spasm spermia sphere sphygmia spire spore stabile stage stalsis stasis stat state staxis stenia stenosis ster sthenuria stichia stole stoma stome stomy stone stophy strongyle sts studies style sulfenic sulfinic sulfonate sulfonic sultam sultone surgery sy synthesis t tactic taxia technics technology ted tela tellurol tension tention tetrayl th thecium thelium therapeutic therapy therm thermia thermy thetic thioic thiol thiolate thione thymia thyrea tic tically tics tion tode tome tomic tomy tonia tonic tony topia topy toxin trauma trema tresia tribe trichia triene triide trione tripsis tripsy trix triyl tron trope trophia trophic trophy tropic tropics tropos tropy tude tumescence tuse ty typia uida uide uidyl ula ular ulation ule ulent ulose ulous ulum ulus um ums ura ure urgia urgy uria uris us uses valve venous ventral verge verse vert vertebral ville volute vore vorous ward wards way ways with wood worm y yl ylene ylia ylidene ylidyne ylium yliumyl ylylidene ylylidyne yne zoa zoite zoon zyme ��������������������������������������cb2bib-1.4.9/src/c2b/collectionAnalyzer.h�����������������������������������������������������������0000644�0001750�0001750�00000005112�12045520050�020035� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef COLLECTIONANALYZER_H #define COLLECTIONANALYZER_H #include <QStringList> #include <QVarLengthArray> class settings; class collectionAnalyzer { public: collectionAnalyzer(); inline ~collectionAnalyzer() {} void reload(); void setDocumentKeywords(const QString& documentfn); void setKeywordDocuments(const QString& keyword); void setSimilarDocuments(const QString& documentfn); void skipSimilarDocument(const int i); inline int similarCount() const { return _nsimilar; } inline const QString& similar(const int i) const { return _documents[_similar[i]]; } inline const QVarLengthArray<double>& similarity() const { return _similarity; } inline double similarity(const int i) const { return _similarity[i]; } inline int sentenceCount() const { return _sentences.size(); } inline const QString& sentence(const int i) const { return _sentences[i]; } inline int keywordCount() const { return _document_keyword_ids.size(); } inline int keywordid(const int i) const { return _document_keyword_ids.at(i); } inline int documentCount() const { return _sdocuments.size(); } inline const QString& document(const int i) const { return _documents[_sdocuments[i]]; } private: int _document_id(const QString& documentfn) const; int _sentence_id(const QString& keyword) const; void grepDocuments(const QString& documentfn, QVector<int>* dsentences) const; void grepSentences(const QString& keyword, QVarLengthArray<int>* sdocuments) const; QList<int> _document_keyword_ids; QString _document_keyword; QString _documentsif_fn; QString _documentslf_fn; QString _keyword_document_fn; QString _sentencesif_fn; QString _sentenceslf_fn; QString _similar_document_fn; QVarLengthArray<QString> _documents; QVarLengthArray<QString> _sentences; QVarLengthArray<double> _similarity; QVarLengthArray<int> _sdocuments; QVarLengthArray<int> _similar; QVarLengthArray<ushort> _document_norms; int _ndocuments; int _nsentences; int _nsimilar; settings* _settingsP; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b/idMaker.h����������������������������������������������������������������������0000644�0001750�0001750�00000002774�12045520050�015563� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * Improvements and modifications: * July 2009 - Added <<author_all_abbreviated>>, (C) 2009 by Dayu Huang ***************************************************************************/ #ifndef IDMAKER_H #define IDMAKER_H #include "bibReference.h" #include <QObject> /** @author Pere Constans */ class idMaker : public QObject { Q_OBJECT public: idMaker(const QString& patternKey, QObject* parento = 0); inline ~idMaker() {} QString makeID(const bibReference& reference); private: QString _author; QString _id_pattern; QString _journal; QString _pages; QString _title; QString _title_pattern; QString _volume; QString _year; bool _is_title_underscored; const QString _pattern_key; int _title_max_length; void make_author_all_abbreviated(QString* id); void make_author_all_initials(QString* id); void make_author_first(QString* id); void make_journal_initials(QString* id); void make_pages_first(QString* id); void make_ppages_first(QString* id); void make_title(QString* id); void make_volume(QString* id); void make_year_abbreviated(QString* id); void make_year_full(QString* id); private slots: void loadSettings(); }; #endif ����cb2bib-1.4.9/src/c2b/preprocess.cpp�����������������������������������������������������������������0000644�0001750�0001750�00000002213�12045520050�016713� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "preprocess.h" #include "settings.h" preprocess::preprocess(QObject* parento) : QObject(parento) { loadSettings(); connect(settings::instance(), SIGNAL(newSettings()), this, SLOT(loadSettings())); } void preprocess::loadSettings() { FindReplaceInput = settings::instance()->value("cb2Bib/FindReplaceInput").toBool(); FindReplaceInputList = settings::instance()->value("cb2Bib/FindReplaceInputList").toStringList(); } void preprocess::preprocessText(QString* text) { if (!FindReplaceInput) return; QStringList::Iterator i = FindReplaceInputList.begin(); while (i != FindReplaceInputList.end()) { const QStringList spLine((*i).split('|')); if (spLine.count() > 1) text->replace(spLine.at(0), spLine.at(1)); ++i; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bSearchInFiles.cpp���������������������������������������������������������������0000644�0001750�0001750�00000016576�12045520050�017147� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bSearchInFiles.h" #include "c2b.h" #include "c2bUtils.h" #include <bibSearcher.h> #include <QFileInfo> #include <QTime> c2bSearchInFiles::c2bSearchInFiles(const QString& file, QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); // Set blank title to columns 0 and 4. Qt 4.4.0 needs it, otherwise it takes column number as default title. // Recheck whenever ui files are generated for 4.4 instead of current 4.2. ui.patternList->headerItem()->setText(0, QApplication::translate("c2bSearchInFiles", "", 0, QApplication::UnicodeUTF8)); ui.patternList->headerItem()->setText(4, QApplication::translate("c2bSearchInFiles", "", 0, QApplication::UnicodeUTF8)); for (int i = 0; i < ITEMS_IN_SEARCH_PATTERN; ++i) ui.patternList->resizeColumnToContents(i); ui.buttonBox->button(QDialogButtonBox::Abort)->setAutoDefault(false); ui.buttonBox->button(QDialogButtonBox::Abort)->setDefault(false); ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Close)->setAutoDefault(false); ui.buttonBox->button(QDialogButtonBox::Close)->setDefault(false); _searchB = new QPushButton(tr("Search")); ui.buttonBox->addButton(_searchB, QDialogButtonBox::ActionRole); _searchB->setAutoDefault(true); _searchB->setDefault(true); _searchB->setEnabled(false); _bibtex_file.clear(); _bibtex_dir.clear(); setBibTeXFile(file); connect(_searchB, SIGNAL(clicked()), this, SLOT(searchB_clicked())); connect(ui.allBibFiles, SIGNAL(clicked()), this, SLOT(setBibTeXFile())); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); connect(ui.pattern, SIGNAL(patternAvailable(bool)), this, SLOT(updateForm())); connect(ui.patternList, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(on_editPatternB_clicked())); connect(ui.patternList, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(updateForm())); } c2bSearchInFiles::~c2bSearchInFiles() {} void c2bSearchInFiles::updateForm() { ui.addPatternB->setEnabled(ui.pattern->isAvailable()); ui.Boolean->setEnabled((ui.patternList->topLevelItemCount() > 1) || (ui.pattern->isAvailable() && ui.patternList->topLevelItemCount() > 0)); _searchB->setEnabled(!_bibtex_dir.isEmpty() && (ui.pattern->isAvailable() || ui.patternList->topLevelItemCount() > 0)); if (ui.patternList->currentItem()) { ui.deletePatternB->setEnabled(true); ui.editPatternB->setEnabled(true); } else { ui.deletePatternB->setEnabled(false); ui.editPatternB->setEnabled(false); } ui.searchLog->setText(_search_log); } void c2bSearchInFiles::on_addPatternB_clicked() { new QTreeWidgetItem(ui.patternList, ui.pattern->patterns()); for (int i = 0; i < ITEMS_IN_SEARCH_PATTERN; ++i) ui.patternList->resizeColumnToContents(i); ui.pattern->clear(); updateForm(); } void c2bSearchInFiles::on_deletePatternB_clicked() { QTreeWidgetItem* item = ui.patternList->currentItem(); delete item; item = ui.patternList->currentItem(); if (item) ui.patternList->currentItem()->setSelected(true); updateForm(); } void c2bSearchInFiles::on_editPatternB_clicked() { QDialog editor(this); ui_editor.setupUi(&editor); QTreeWidgetItem* item = ui.patternList->currentItem(); ui_editor.pattern->setPattern(item); connect(ui_editor.pattern, SIGNAL(patternAvailable(bool)), ui_editor.buttonBox->button(QDialogButtonBox::Ok), SLOT(setEnabled(bool))); if (editor.exec() == QDialog::Accepted) { const QStringList pattern(ui_editor.pattern->patterns()); for (int i = 0; i < ITEMS_IN_SEARCH_PATTERN; ++i) item->setText(i, pattern.at(i)); for (int i = 0; i < ITEMS_IN_SEARCH_PATTERN; ++i) ui.patternList->resizeColumnToContents(i); } } void c2bSearchInFiles::searchB_clicked() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); _searchB->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(true); ui.searchLog->setText(_search_log); bibSearcher searcher(c2b::bibParser()); connect(ui.buttonBox->button(QDialogButtonBox::Abort), SIGNAL(clicked()), &searcher, SLOT(abort())); searcher.setSearchScope(_bibtex_file, _bibtex_dir, ui.allBibFiles->isChecked(), ui.documentFiles->isChecked()); searcher.setSimplifySource(ui.simplifySource->isChecked()); searcher.setBoolean(ui.Boolean->currentText() == "All"); if (ui.addPatternB->isEnabled()) { const QStringList p(ui.pattern->patterns()); searcher.addPattern(p.at(0) == "NOT", p.at(1) == "Sensitive", p.at(2), p.at(3), p.at(4).at(0), p.at(5)); } QTreeWidgetItemIterator it(ui.patternList); while (*it) { QStringList p; for (int i = 0; i < ITEMS_IN_SEARCH_PATTERN; ++i) p.append((*it)->text(i)); searcher.addPattern(p.at(0) == "NOT", p.at(1) == "Sensitive", p.at(2), p.at(3), p.at(4).at(0), p.at(5)); ++it; } if (searcher.patternsCount() == 0) return; QTime t; t.start(); searcher.exec(); QString search_status; if (searcher.hitsCount() > 0 || searcher.errorsCount() > 0) { if (searcher.hitsCount() > 0) search_status = tr("Found %1 hits from %2 references (%3s)") .arg(searcher.hitsCount()).arg(searcher.referencesCount()).arg(t.elapsed() / 1000.0); else ui.searchLog->setText(_search_log); QApplication::processEvents(); emit searchDone(_bibtex_dir, &searcher); } else if (searcher.errorsCount() < 0) search_status = tr("Search aborted"); else search_status = tr("No reference found (%1s)").arg(t.elapsed() / 1000.0); if (!search_status.isEmpty()) { ui.searchLog->setText(search_status); c2b::showMessage(search_status); } ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(false); _searchB->setEnabled(true); QApplication::restoreOverrideCursor(); } void c2bSearchInFiles::setBibTeXFile(const QString& file) { if (!file.isEmpty()) { QFileInfo fi(file); QDir d(fi.absolutePath()); if (d.exists()) { _bibtex_file = fi.absoluteFilePath(); _bibtex_dir = fi.absolutePath(); } else _bibtex_dir.clear(); } if (_bibtex_dir.isEmpty()) _search_log = tr("No existing file or directory set for searching"); else if (ui.allBibFiles->isChecked()) _search_log = tr("Search in files at %1").arg(_bibtex_dir); else _search_log = tr("Search in file %1").arg(_bibtex_file); updateForm(); } void c2bSearchInFiles::setCurrentText(const QString& text) { if (text.isEmpty()) return; ui.pattern->setText(text); updateForm(); } void c2bSearchInFiles::show() { c2bUtils::setWidgetOnTop(this); ui.pattern->setFocus(); QDialog::show(); } void c2bSearchInFiles::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2bsearch.php"); } ����������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bUpdateMetadata.h����������������������������������������������������������������0000644�0001750�0001750�00000002100�12045520050�016772� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BUPDATEMETADATA_H #define C2BUPDATEMETADATA_H #include "ui_c2bLogWidget.h" #include <QDialog> class bibReference; class c2bBibParser; class c2bUpdateMetadata : public QDialog { Q_OBJECT public: c2bUpdateMetadata(QWidget* parentw = 0); ~c2bUpdateMetadata(); void update(const QString& fn, const QString& bibtex); private slots: void aborted(); void help(); void update(); private: QPushButton* _buttonAbort; QString _bibtex; QString _fn; Ui::c2bLogWidget ui; bool _aborted; bool needsUpdating(const bibReference& ref, const bibReference& mref); c2bBibParser* _bpP; void writeDifferences(const bibReference& ref, const bibReference& mref); }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bSaveREHighlighter.h�������������������������������������������������������������0000644�0001750�0001750�00000001520�12045520050�017420� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSAVEREHIGHLIGHTER_H #define C2BSAVEREHIGHLIGHTER_H #include <QSyntaxHighlighter> /** Save RegExp SyntaxHighLighter @author Pere Constans */ class c2bColors; class c2bSaveREHighlighter : public QSyntaxHighlighter { public: c2bSaveREHighlighter(QRegExp& rx, QTextDocument* doc); ~c2bSaveREHighlighter(); protected: virtual void highlightBlock(const QString& text); private: QColor text_color; QRegExp& _current_rx; c2bColors* c; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bBibParser.cpp�������������������������������������������������������������������0000644�0001750�0001750�00000015657�12045520050�016340� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bBibParser.h" #include "c2b.h" #include "c2bSettings.h" #include <authorString.h> #include <bibPreparser.h> #include <QComboBox> #include <QMessageBox> c2bBibParser::c2bBibParser(QObject* parento) : bibParser(parento) { _c2b_mainP = c2b::mainWidget(); _bp_updates_gui = false; // Warn users if journal database file is not setup const QString journal_f(_settingsP->fileName("cb2Bib/JournalFile")); if (journal_f.isEmpty()) QMessageBox::information(_c2b_mainP, tr("Information - cb2Bib"), tr("No Abbreviation Journal file has been specified.\n\n" "Note: Abbreviation files are specified through the cb2Bib Configure dialog."), QMessageBox::Ok); else { QFile f(journal_f); if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) // jdbfile.exists wouldn't produce an errorString QMessageBox::warning(_c2b_mainP, tr("Warning - cb2Bib"), tr("Unable to open the Journal Abbreviation file %1 for reading.\nError: '%2'.\n\n" "Note: Abbreviation files are specified through the cb2Bib Configure dialog.") .arg(journal_f).arg(f.errorString()), QMessageBox::Ok); else f.close(); } // Set status messages connect(this, SIGNAL(statusMessage(const QString&)), c2b::instance(), SIGNAL(statusMessage(const QString&))); // Set preparser log connect(_preparserP, SIGNAL(preparserLogAvailable(const QString&)), this, SLOT(showLog(const QString&))); } c2bBibParser::~c2bBibParser() {} void c2bBibParser::currentReferenceUpdated() { // Current reference has been updated by the base class. // Update it in the GUI _bp_updates_gui = true; bibReferenceIterator i; for (i = _current_reference.constBegin(); i != _current_reference.constEnd(); ++i) _field_editors[i.key()]->setText(i.value()); // Set default type to article if (_current_reference.typeName.isEmpty()) _current_reference.typeName = "article"; setReferenceType(_current_reference.typeName); setCiteID(); _bp_updates_gui = false; emit bibModified(fieldCount() > 0); } void c2bBibParser::clearCurrentReference() { _bp_updates_gui = true; // Clear by setting empty QString as a workaround for bug // http://bugreports.qt.nokia.com/browse/QTBUG-7866 // Affects versions 4.6.x, expected to be fixed in 4.6.3 for (int i = 0; i < _bibliographic_fields.count(); ++i) _field_editors[_bibliographic_fields.at(i)]->setText(QString()); // _field_editors[_bibliographic_fields.at(i)]->clear(); _field_editors["id"]->setText(QString()); // _field_editors["id"]->clear(); bibParser::clearCurrentReference(); _current_reference.typeName = "article"; _type_editor->setCurrentIndex(1); _bp_updates_gui = false; emit bibModified(false); } void c2bBibParser::referenceEdited(const QString& value) { if (_bp_updates_gui) return; if (sender()) { const QString name(sender()->objectName()); if (name == "id") { _current_reference.citeidName = value; emit setDocumentFilename(); } else if (name == "typecombo") _current_reference.typeName = value; else if (name == "file") _current_reference[name] = value; else { // Attention: No name checking is done. // Only reference editors must be connected here. _current_reference[name] = value; setCiteID(); emit setDocumentFilename(); } emit bibModified(fieldCount() > 0); } } void c2bBibParser::setCiteID() { bibParser::setCiteID(); _field_editors["id"]->setText(_current_reference.citeidName); } void c2bBibParser::setField() { if (sender()) { const QString name(sender()->objectName()); if (_field_editors.contains(name)) _field_editors[name]->setText(parse(name, _field_editors.value(name)->text())); } } void c2bBibParser::setReferenceType(const QString& type) { int i(0); while (i < _type_editor->count()) { if (_type_editor->itemText(i) == type) { _type_editor->setCurrentIndex(i); return; } ++i; } _type_editor->setCurrentIndex(0); _type_editor->setItemText(0, type); } void c2bBibParser::setWidgetMapping() { // Setting Reference Types _type_editor->insertItems(0, _bibliographic_types); _type_editor->setCurrentIndex(1); _current_reference.typeName = "article"; // Tracking Field Editor Line changes // Track using textChanged instead of editTextChanged. The latter does not track line clears for (int i = 0; i < _bibliographic_fields.count(); ++i) { const QString& name = _bibliographic_fields.at(i); connect(_field_editors.value(name), SIGNAL(returnPressed()), this, SLOT(setField())); connect(_field_editors.value(name), SIGNAL(textChanged(const QString&)), this, SLOT(referenceEdited(const QString&))); } connect(_field_editors.value("id"), SIGNAL(textChanged(const QString&)), this, SLOT(referenceEdited(const QString&))); connect(_type_editor, SIGNAL(editTextChanged(const QString&)), this, SLOT(referenceEdited(const QString&))); } void c2bBibParser::showLog(const QString& log) { if (!_preparser_logP) _preparser_logP = new c2bBibPreparserLog(_c2b_mainP); _preparser_logP->append(log); _preparser_logP->show(); // Don't use exec(), it could be a recursive call if clipboard changed } void c2bBibParser::checkRegExpFile(const QString& fn) { if (fn.isEmpty()) { QMessageBox::information(_c2b_mainP, tr("Information - cb2Bib"), tr("No RegExp filename has been specified.\n\n" "Note: RegExp files are specified through the cb2Bib Configure dialog."), QMessageBox::Ok); return; } QFile f(fn); if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) QMessageBox::warning(_c2b_mainP, tr("Warning - cb2Bib"), tr("Unable to open the RegExp file %1 for reading.\nError: '%2'.\n\n" "Note: RegExp files are specified through the cb2Bib Configure dialog. " "After manual matching, patterns can be edited and stored in a " "RegExp file for future autodetection.").arg(fn).arg(f.errorString()), QMessageBox::Ok); else f.close(); } ���������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bTextBrowser.cpp�����������������������������������������������������������������0000644�0001750�0001750�00000002515�12045520050�016744� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bTextBrowser.h" #include <QAction> #include <QContextMenuEvent> #include <QMenu> #include <QScrollBar> c2bTextBrowser::c2bTextBrowser(QWidget* parentw) : QTextBrowser(parentw) { setFrameShape(QTextBrowser::StyledPanel); setFrameShadow(QTextBrowser::Raised); } c2bTextBrowser::~c2bTextBrowser() {} void c2bTextBrowser::setSource(const QUrl& /* dummy_name */) {} void c2bTextBrowser::contextMenuEvent(QContextMenuEvent* qevent) { QMenu* edit_menu = createStandardContextMenu(); edit_menu->setTitle(tr("Edit...")); QMenu* menu = new QMenu(this); menu->addMenu(edit_menu); QList<QAction*> acts = actions(); for (int i = 0; i < acts.count(); ++i) menu->addAction(acts.at(i)); menu->exec(qevent->globalPos()); delete edit_menu; delete menu; } void c2bTextBrowser::updateHtml(const QString& newHtml) { const int scrollPosition(verticalScrollBar()->value()); setHtml(newHtml); verticalScrollBar()->setValue(scrollPosition); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bReferenceList.h�����������������������������������������������������������������0000644�0001750�0001750�00000005027�12045520050�016654� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BREFERENCELIST_H #define C2BREFERENCELIST_H #include "ui_c2bReferenceList.h" #include <QWidget> class bibSearcher; class c2bCoreCiter; class c2bRLWebSearchSettings; class c2bSettings; class c2bTextBrowser; class c2bTextEdit; class c2bReferenceList : public QWidget { Q_OBJECT public: c2bReferenceList(c2bTextEdit* ed, c2bTextBrowser* br, QWidget* parentw = 0); ~c2bReferenceList(); QAction* citeEntryAction; QAction* clearSelectionsAction; QAction* openAuthorsWebSearchAction; QAction* openDOIAction; QAction* openFileAction; QAction* openTextLocalSearchAction; QAction* openTextWebSearchAction; QAction* openTitleWebSearchAction; QAction* openUrlAction; QAction* refreshListAction; QAction* webSearchSettingsAction; QStringList selectedKeys() const; void goToReference(const QString& id); void goToReference(const int position); public slots: void loadList(const QString& txt, bibSearcher* searcher = 0); void refreshList(); void setLyXPipe(); signals: void hasSelectedItems(bool); void openFile(const QString& fn); protected slots: void citeEntry(); void clearSelections(); void goToReference(QTreeWidgetItem* ref); void itemSelectionChanged(); void openAuthorWebSearch(); void openDOI(); void openFile(); void openLink(const QUrl& ln); void openTextLocalSearch(); void openTextWebSearch(); void openTitleWebSearch(); void openUrl(); void scrollToReference(const QString& id); void webSearchSettings(); private: QList<int> _positionList; QString _bib_item_html; QString _filter_mode; QString _references_html; QStringList _doiList; QStringList _fileList; QStringList _urlList; Ui::c2bReferenceList ui; c2bCoreCiter* _citerP; c2bSettings* _settingsP; c2bTextBrowser* _browserP; c2bTextEdit* _editorP; int _author_index; int _id_index; int _journal_index; int _key_index; int _title_index; int _year_index; void setupFilterBar(); private slots: void blockFilterSignals(); void filterList(); void keepFilterPattern(); void setFilterMode(QAction* mode); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bBibPreparserLog.h���������������������������������������������������������������0000644�0001750�0001750�00000001525�12045520050�017143� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BBIBPREPARSERLOG_H #define C2BBIBPREPARSERLOG_H #include "ui_c2bLogWidget.h" #include <QDialog> class QCheckBox; class c2bBibPreparserLog : public QDialog { Q_OBJECT public: c2bBibPreparserLog(QWidget* parentw = 0); ~c2bBibPreparserLog(); void append(const QString& ms); public slots: void show(); protected slots: void help(); private: QCheckBox* PreparserShowLog; Ui::c2bLogWidget ui; void closeEvent(QCloseEvent* qevent); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/findDialog.cpp���������������������������������������������������������������������0000644�0001750�0001750�00000012462�12045520050�016127� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * findDialog was originally adapted from Qt Designer * Copyright (C) 2001 Trolltech AS. All rights reserved. ***************************************************************************/ #include "findDialog.h" #include <QPlainTextEdit> #include <QPushButton> #include <QScrollBar> #include <QTextEdit> findDialog::findDialog(QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); resize(size().width(), 1); ui.buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Find")); _editor = 0; QAction* act = new QAction(this); act->setSeparator(true); addAction(act); findAction = new QAction(this); addAction(findAction); findAction->setShortcut(QKeySequence::Find); findAction->setText(tr("Find")); findAction->setStatusTip(tr("Find in text")); connect(findAction, SIGNAL(triggered()), this, SLOT(findText())); findNextAction = new QAction(this); addAction(findNextAction); findNextAction->setShortcut(QKeySequence::FindNext); findNextAction->setText(tr("Find Next")); findNextAction->setStatusTip(tr("Find next occurrence")); connect(findNextAction, SIGNAL(triggered()), this, SLOT(findNext())); findPreviousAction = new QAction(this); addAction(findPreviousAction); findPreviousAction->setShortcut(QKeySequence::FindPrevious); findPreviousAction->setText(tr("Find Previous")); findPreviousAction->setStatusTip(tr("Find previous occurrence")); connect(findPreviousAction, SIGNAL(triggered()), this, SLOT(findPrevious())); } findDialog::~findDialog() {} void findDialog::init() { ui.notFound->hide(); raise(); if (_editor->inherits("QPlainTextEdit")) ui.comboFind->setEditText(qobject_cast<QPlainTextEdit*>(_editor)->textCursor().selectedText().trimmed()); else if (_editor->inherits("QTextEdit")) ui.comboFind->setEditText(qobject_cast<QTextEdit*>(_editor)->textCursor().selectedText().trimmed()); ui.comboFind->setFocus(); } void findDialog::setEditor(QPlainTextEdit* editor) { _editor = editor; } void findDialog::setEditor(QTextEdit* editor) { _editor = editor; } int findDialog::exec() { if (!_editor) return (-1); init(); return QDialog::exec(); } void findDialog::show() { if (!_editor) return; init(); QDialog::show(); } void findDialog::accept() { if (ui.comboFind->currentText().isEmpty()) return; if (_editor) { if (findText(ui.comboFind->currentText(), ui.radioForward->isChecked(), ui.checkCase->isChecked(), ui.checkWords->isChecked())) QDialog::accept(); else ui.notFound->show(); } } void findDialog::findText() { show(); } bool findDialog::findText(const QString& pattern, bool do_forward, bool do_case_sensitive, bool do_whole_words) { if (pattern.isEmpty()) return false; m_find_pattern = pattern; m_find_case = do_case_sensitive; m_find_words = do_whole_words; QTextDocument* doc; QTextCursor c; if (_editor->inherits("QPlainTextEdit")) { QPlainTextEdit* ed = qobject_cast<QPlainTextEdit*>(_editor); doc = ed->document(); c = ed->textCursor(); } else if (_editor->inherits("QTextEdit")) { QTextEdit* ed = qobject_cast<QTextEdit*>(_editor); doc = ed->document(); c = ed->textCursor(); } else return false; QTextDocument::FindFlags options; if (c.hasSelection()) c.setPosition(do_forward ? c.position() : c.anchor(), QTextCursor::MoveAnchor); QTextCursor newCursor = c; if (!do_forward) options |= QTextDocument::FindBackward; if (m_find_case) options |= QTextDocument::FindCaseSensitively; if (m_find_words) options |= QTextDocument::FindWholeWords; newCursor = doc->find(m_find_pattern, c, options); bool found(true); if (newCursor.isNull()) { QTextCursor ac(doc); ac.movePosition(options & QTextDocument::FindBackward ? QTextCursor::End : QTextCursor::Start); newCursor = doc->find(m_find_pattern, ac, options); if (newCursor.isNull()) { newCursor = c; found = false; } } if (_editor->inherits("QPlainTextEdit")) { QPlainTextEdit* ed = qobject_cast<QPlainTextEdit*>(_editor); ed->setTextCursor(newCursor); ed->verticalScrollBar()->setValue(ed->verticalScrollBar()->maximum()); ed->ensureCursorVisible(); } else if (_editor->inherits("QTextEdit")) { QTextEdit* ed = qobject_cast<QTextEdit*>(_editor); ed->setTextCursor(newCursor); ed->verticalScrollBar()->setValue(ed->verticalScrollBar()->maximum()); ed->ensureCursorVisible(); } return found; } void findDialog::findNext() { if (m_find_pattern.isEmpty()) findText(); else findText(m_find_pattern, true, m_find_case, m_find_words); } void findDialog::findPrevious() { if (m_find_pattern.isEmpty()) findText(); else findText(m_find_pattern, false, m_find_case, m_find_words); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bCiterModel.h��������������������������������������������������������������������0000644�0001750�0001750�00000016631�12045520050�016154� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCITERMODEL_H #define C2BCITERMODEL_H #include "c2bCiter.h" #include "c2bCiterHistory.h" #include <collectionAnalyzer.h> #include <QAbstractTableModel> #include <QColor> #include <QHash> #include <QStringList> #include <QVector> class c2bCiterModel : public QAbstractTableModel { Q_OBJECT public: c2bCiterModel(QObject* parento = 0); inline ~c2bCiterModel() {} QList<int> sizeHintForColumns() const; QStringList dataSelectedCiteIds() const; QVariant data(const QModelIndex& i, int role = Qt::DisplayRole) const; c2bCiter::State currentState(const QModelIndex& current_index) const; void clearCurrentFilter(QModelIndex* current_index); void clearSelection(); void loadCitations(const QString& fn); void loadCitations(const QStringList& fns); void reloadCitations(const QStringList& fns, const c2bCiter::State& state, QModelIndex* current_index); void restoreNextState(QModelIndex* current_index); void restorePreviousState(QModelIndex* current_index); void restoreState(const c2bCiter::State& s, QModelIndex* current_index); void setDocumentFilter(const QString& documentfn, QModelIndex* current_index); void setGlossaryView(QModelIndex* current_index); void setKeywordFilter(const QString& keyword, QModelIndex* current_index); void setPatternFilter(const QString& pattern, QModelIndex* current_index, const c2bCiter::Format format); void setRelatedFilter(const QString& documentfn, QModelIndex* current_index, const c2bCiter::Format format = c2bCiter::R); void setSelectedFilter(QModelIndex* current_index); void updateFormat(const c2bCiter::Format format, QModelIndex* current_index); inline QString dataBibTeXPosition(const QModelIndex& i) const { if (_is_index_valid(i)) return _bibtex_position.at(_offset(i.row())); else return QString(); } inline QString dataBibTeXFile(const QModelIndex& i) const { return dataBibTeXPosition(i).remove(QRegExp(":(\\d+)$")); } inline QString dataFile(const QModelIndex& i) const { if (_is_index_valid(i)) return _file.key(_offset(i.row())); else return QString(); } inline QString dataUrl(const QModelIndex& i) const { if (_is_index_valid(i)) return _url.at(_offset(i.row())); else return QString(); } inline QString dataKeyword(const QModelIndex& i) const { if (_format == c2bCiter::K && _is_index_valid(i)) return _analyzer.sentence(_offset(i.row())); else return QString(); } inline c2bCiter::KeywordData keywordData(const QModelIndex& i) const { c2bCiter::KeywordData kd; if (_filter == c2bCiter::Document && _format == c2bCiter::K) { kd.bibtexfn = QString(_bibtex_position.at(_file.value(_fstring))).remove(QRegExp(":(\\d+)$")); kd.documentfn = _fstring; kd.keyword = dataKeyword(i); } else if (_filter == c2bCiter::Keyword) { kd.bibtexfn = dataBibTeXFile(i); kd.documentfn = dataFile(i); kd.keyword = _fstring; } kd.valid = !kd.bibtexfn.isEmpty() && !kd.documentfn.isEmpty() && !kd.keyword.isEmpty(); return kd; } inline bool isKeywordView() const { return _format == c2bCiter::K; } inline Qt::ItemFlags flags(const QModelIndex& /* i */) const { return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } inline int count() const { return _row_count; } inline int rowCount(const QModelIndex& /* parent */ = QModelIndex()) const { return _row_count; } inline int columnCount(const QModelIndex& /* parent */ = QModelIndex()) const { return _column_count; } inline c2bCiter::Filter currentFilter() const { return _filter; } inline c2bCiter::Format currentFormat() const { return _format; } inline c2bCiter::Format lastCitationFormat() const { return _history.lastCitationFormat(); } inline void restoreLastNonKeywordState(QModelIndex* current_index) { restoreState(_history.lastNonKeywordState(), current_index); } inline void restoreLastNonSelectedState(QModelIndex* current_index) { restoreState(_history.lastNonSelectedState(), current_index); } public slots: void selectCitation(const QModelIndex& i); signals: void patternFilterChanged(const QString& pattern); void statusLabel(const QString& label); void statusMessage(const QString& message); private: Q_DISABLE_COPY(c2bCiterModel) QColor _first_column_color; QString _display_ajyt(const int row, const int column) const; QString _display_it(const int row, const int column) const; QString _display_jya(const int row, const int column) const; QString _display_k(const int row, const int column) const; QString _display_r(const int row, const int column) const; QString _display_t(const int row, const int column) const; QString _display_yajt(const int row, const int column) const; QString(c2bCiterModel::*_display_ptr)(const int row, const int column) const; int _current_item(const QString& index_data) const; int _offset(const int i) const; void _add_citations(const QString& fn); void _clear(); void _set_mapping(); void _set_sort_indices(); void _set_table_data(); void _update_current_index(const int current_item, QModelIndex* current_index) const; void _update_format(const c2bCiter::Format format = c2bCiter::AJYT); inline bool _is_index_valid(const QModelIndex& i) const { const int r(i.row()); return _row_count > 0 && r >= 0 && r < _row_count; } inline int _current_item(const QModelIndex& current_index) const { return _is_index_valid(current_index) ? _offset(current_index.row()) : -1; } inline int _current_item(const QModelIndex* const current_index) const { return current_index ? _current_item(*current_index) : -1; } // Collection analyzer helper collectionAnalyzer _analyzer; // History helper QString _fstring; c2bCiter::Filter _filter; c2bCiter::Format _format; c2bCiterHistory _history; // Model data QHash<QString, int> _file; QList<uint> _included_date; QStringList _author_string; QStringList _bibtex_position; QStringList _citeId; QStringList _journal; QStringList _title; QStringList _url; QStringList _year; QVector<QString> _author; QVector<QString> _search_string; QVector<bool> _is_selected; QVector<bool> _matches_filter; QVector<int> _map_ajyt; QVector<int> _map_author; QVector<int> _map_filter; QVector<int> _map_it; QVector<int> _map_jya; QVector<int> _map_t; QVector<int> _map_yajt; QVector<int>* _mapping; int _author_count; int _author_max_length; int _citation_count; int _column_count; int _journal_max_length; int _keyword_count; int _related_count; int _row_count; }; #endif �������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/clipboardPoll.h��������������������������������������������������������������������0000644�0001750�0001750�00000004634�12045520050�016324� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * clipboardPoll, modified by Pere Constans for the cb2Bib, 2005 * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * * * Author and Copyright (C) 2003 by Lubos Lunak <l.lunak@kde.org> * Distributed under the GNU General Public License * * * This file is part of the KDE project * Copyright (C) 2003 by Lubos Lunak <l.lunak@kde.org> * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. ***************************************************************************/ #ifndef CLIPBOARDPOLL_H #define CLIPBOARDPOLL_H #include <QApplication> #include <QWidget> #include <QTimer> #include <X11/Xlib.h> /** @author Lubos Lunak */ class clipboardPoll : public QWidget { Q_OBJECT public: clipboardPoll(QWidget* parentw = 0); ~clipboardPoll(); inline void startT(uint interval) { timer->start(interval); } inline void stopT() { timer->stop(); } signals: void clipboardChanged(bool selectionMode); protected: virtual bool x11Event(XEvent*); private slots: void timeout(); private: struct SelectionData { Atom atom; Atom sentinel_atom; Atom timestamp_atom; Window last_owner; bool owner_is_qt; Time last_change; bool waiting_for_timestamp; Time waiting_x_time; }; Atom xa_clipboard; Atom xa_timestamp; bool changedTimestamp(SelectionData& sData, const XEvent& e); bool checkTimestamp(SelectionData& sData); QTimer* timer; SelectionData clipboard; SelectionData selection; void updateQtOwnership(SelectionData& sData); }; #endif ����������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bFileDialog.h��������������������������������������������������������������������0000644�0001750�0001750�00000005354�12045520050�016124� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BFILEDIALOG_H #define C2BFILEDIALOG_H #include <QFileDialog> #include <QFileIconProvider> class c2bSettings; class fileIconProvider; class c2bFileDialog : public QFileDialog { Q_OBJECT public: static QString getFilename(QWidget* parentw = 0, const QString& caption = QString(), const QString& path = QString(), const QString& filter = QString()); static QString getOpenFilename(QWidget* parentw = 0, const QString& caption = QString(), const QString& path = QString(), const QString& filter = QString()); static QStringList getOpenFilenames(QWidget* parentw = 0, const QString& caption = QString(), const QString& path = QString(), const QString& filter = QString()); static QString getSaveFilename(QWidget* parentw = 0, const QString& caption = QString(), const QString& path = QString(), const QString& filter = QString()); static QString getExistingDirectory(QWidget* parentw = 0, const QString& caption = QString(), const QString& path = QString()); static QString getSystemFilename(QWidget* parentw = 0, const QString& caption = QString(), const QString& path = QString(), const QString& filter = QString()); private: c2bFileDialog(QWidget* parentw, const QString& caption, const QString& fpath, const QString& ffilter); ~c2bFileDialog(); QString _current_file; c2bSettings* settings; const QString exec(const QString& path = QString()); fileIconProvider* fip; static QString _caption(const QString& generic, const QString& caption); static QString _dirpath(const QString& path); static QString _filename(const QString& path); static QString _path(const QString& path); void readSettings(); void writeSettings(); private slots: void accept(); void selectCurrentFile(); }; /*************************************************************************** Class fileIconProvider ***************************************************************************/ class fileIconProvider : public QFileIconProvider { public: fileIconProvider(); ~fileIconProvider(); inline QIcon icon(IconType it) const { return QFileIconProvider::icon(it); } QIcon icon(const QFileInfo& info) const; private: QIcon _exec_icon; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/htm/�������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045517740�014162� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/htm/references.css�����������������������������������������������������������������0000644�0001750�0001750�00000001373�12045517740�017021� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cb2Bib References CSS */ /* general */ body { font-size: 100%; font-family: sans-serif; background-color: #818B93; color: black; padding: 0; margin: 0; } a { color: #D8D7D7; text-decoration: none; } a:link { color: #D8D7D7; text-decoration: underline; } h1 { color: #C7C6C6; font-size: 20px; font-variant: small-caps; font-family: sans-serif; } /* references */ #references{ background-color: #818B93; } #references blockquote{ font-size: small; } #references span{ color: #E4E3E2; } #excerpt{ font-style: italic; } /* header */ #header { vertical-align: middle; } /* footer */ #footer { color: #C7C6C6; font-family: arial, sans-serif; font-size: small; } #footer td{ padding: 10px; padding-left: 5px; padding-right: 5px; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/htm/references-dark.css������������������������������������������������������������0000644�0001750�0001750�00000001417�12045517740�017737� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cb2Bib References CSS */ /* general */ body { font-size: 100%; font-family: sans-serif; background-color: #5C656D; color: #ECECEC; padding: 0; margin: 0; } a { color: #EDE159; text-decoration: none; } a:link { color: #EDE159; text-decoration: underline; } h1 { color: #ECECEC; font-size: 20px; font-variant: small-caps; font-family: sans-serif; } /* references */ #references{ background-color: #23445b; } #references blockquote{ font-size: small; } #references span{ color: #FFFFFF; font-weight: bold; } #excerpt{ font-style: italic; } /* header */ #header { vertical-align: middle; } /* footer */ #footer { color: #E4E3E2; font-family: arial, sans-serif; font-size: small; } #footer td{ padding: 10px; padding-left: 5px; padding-right: 5px; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/htm/bib_item.html������������������������������������������������������������������0000644�0001750�0001750�00000001060�12045517740�016617� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� <tr> <td width="5%"> <a href="Select reference GET_REFERENCE_ANCHOR_ID" name="GET_REFERENCE_ANCHOR_NAME" id="GET_REFERENCE_ANCHOR_ID" class="anchor"> <img src=":/icons/icons/select.png" alt="action" width="16" height="16" /></a></td> <td width="95%"> <p>GET_REFERENCE_AUTHOR <a href="GET_REFERENCE_LINK">GET_REFERENCE_TITLE</a>. <i>GET_REFERENCE_SOURCE</i> <b>GET_REFERENCE_VOLUME</b>GET_REFERENCE_PAGES GET_REFERENCE_YEAR </p> <blockquote> <p>GET_REFERENCE_ABSTRACT</p> </blockquote> </td> </tr>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/htm/references.html����������������������������������������������������������������0000644�0001750�0001750�00000002253�12045517740�017173� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> <title>References


    GET_REFERENCES


    cb2bib-1.4.9/src/htm/excerpts.html0000644000175000017500000000112312045517740016702 0ustar rusconirusconi GET_EXCERPTS_TITLE

    GET_EXCERPTS


    cb2bib-1.4.9/src/c2bCiterHistory.h0000644000175000017500000000603512045520050016552 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCITERHISTORY_H #define C2BCITERHISTORY_H #include "c2bCiter.h" #include #include class c2bCiterHistory { public: c2bCiterHistory(); inline ~c2bCiterHistory() {} void clear(); void saveCurrentState(const c2bCiter::Format format, const c2bCiter::Filter filter, const int iindex, const int vindex, const QString fstring); inline void saveCurrentState(const c2bCiter::Format format, const c2bCiter::Filter filter, const int iindex, const QModelIndex* const index, const QString fstring) { if (index) saveCurrentState(format, filter, iindex, index->row(), fstring); } inline void saveCurrentItemIndex(const c2bCiter::Format format, const c2bCiter::Filter filter, const int iindex) { if (format == c2bCiter::K) _last_keyword = iindex; else if (filter == c2bCiter::Selected) _last_selection_citation = iindex; else _last_citation = iindex; } inline const c2bCiter::State& lastState() const { return _states[_index[_nstates]]; } inline const c2bCiter::State& previousState() { if (_cstate == -1) _cstate = _nstates; else if (_cstate == 0) _cstate = 1; return _states[_index[--_cstate]]; } inline const c2bCiter::State& nextState() { if (_cstate == _nstates) _cstate = _nstates - 1; return _states[_index[++_cstate]]; } inline int currentState() const { return _cstate; } inline const c2bCiter::State& lastNonKeywordState() const { return _last_nonkeyword_state; } inline const c2bCiter::State& lastNonSelectedState() const { return _last_nonselected_state; } inline void saveCurrentCitationFormat(const c2bCiter::Format format) { _last_citation_format = (format == c2bCiter::R || format == c2bCiter::K) ? _last_citation_format : format; } inline c2bCiter::Format lastCitationFormat() const { return _last_citation_format; } inline int lastCitation() const { return _last_citation; } inline int lastSelectionCitation() const { return _last_selection_citation; } inline int lastKeyword() const { return _last_keyword; } private: c2bCiter::Format _last_citation_format; int _cstate; int _last_citation; int _last_keyword; int _last_selection_citation; int _nstates; c2bCiter::State _last_nonkeyword_state; c2bCiter::State _last_nonselected_state; QVarLengthArray _states; QVarLengthArray _index; }; #endif cb2bib-1.4.9/src/c2bNetworkQueryInfo.cpp0000644000175000017500000001471712045520050017756 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bNetworkQueryInfo.h" #include "c2b.h" #include "c2bBibParser.h" #include "c2bSettings.h" #include "c2bUtils.h" #include #include #include #include c2bNetworkQueryInfo::c2bNetworkQueryInfo(QObject* parento) : QObject(parento) { _bpP = c2b::instance()->bibParser(); connect(c2bSettingsP, SIGNAL(newSettings()), this, SLOT(loadSettings())); _fsw = new QFileSystemWatcher(this); connect(_fsw, SIGNAL(fileChanged(const QString&)), this, SLOT(parseBookmarks())); loadSettings(); } c2bNetworkQueryInfo::~c2bNetworkQueryInfo() {} void c2bNetworkQueryInfo::loadSettings() { const QString nfn(c2bSettingsP->fileName("cb2Bib/NetworkFile")); if (nfn == NetworkFile) return; if (QFileInfo(nfn).exists()) { if (!NetworkFile.isEmpty()) _fsw->removePath(NetworkFile); NetworkFile = nfn; _fsw->addPath(NetworkFile); } parseBookmarks(); } void c2bNetworkQueryInfo::parseBookmarks() { BookmarkList.clear(); if (NetworkFile.isEmpty()) return; QFile file(NetworkFile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QRegExp _bookmark("^bookmark="); QString line; QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); while (!stream.atEnd()) { line = stream.readLine(); if (line.contains(_bookmark)) { line.remove(_bookmark); if (line.count('|') == 0) c2bUtils::warn(tr("c2bNetworkQueryInfo::parseBookmarks: Syntax error at '%1'").arg(line)); else BookmarkList.append(line); } } file.close(); while (!BookmarkActionList.isEmpty()) delete BookmarkActionList.takeFirst(); const QRegExp rx("<<.+>>"); for (int i = 0; i < BookmarkList.count(); ++i) if (BookmarkList.at(i).contains(rx)) { const QStringList bm_parts(BookmarkList.at(i).split('|')); if (bm_parts.count() > 1) { QAction* act = new QAction(bm_parts.at(0), this); act->setData(bm_parts.at(1)); act->setStatusTip(QString("%1 [%2]").arg(bm_parts.at(0)).arg(bm_parts.at(1))); connect(act, SIGNAL(triggered()), this, SLOT(openBookmark())); BookmarkActionList.append(act); } } } QList c2bNetworkQueryInfo::bookmarkActions(const QString& selection) { _current_selection = selection; for (int i = 0; i < BookmarkActionList.count(); ++i) BookmarkActionList[i]->setVisible(false); const QRegExp rx("<<.+>>"); for (int i = 0; i < BookmarkActionList.count(); ++i) { QString bmd(BookmarkActionList.at(i)->data().toString()); const QStringList& bibliographicFields = _bpP->bibliographicFields(); for (int j = 0; j < bibliographicFields.count(); ++j) { const QString& name = bibliographicFields.at(j); const QString tag(QString("<<%1>>").arg(name)); if (bmd.contains(tag)) if (!_bpP->field(name).isEmpty()) bmd.remove(tag); } if (bmd.contains("<>")) if (!_current_selection.isEmpty()) bmd.remove("<>"); BookmarkActionList[i]->setVisible(!bmd.contains(rx)); } return BookmarkActionList; } void c2bNetworkQueryInfo::openBookmark() { QAction* act = static_cast(sender()); if (act) { const QString link(act->data().toString()); c2bUtils::openFile(encodeLink(link), c2b::mainWidget()); } } const QString c2bNetworkQueryInfo::encodeLink(const QString& ln) const { QString eln(ln); // See comment in c2bNetworkQueryInfo::bookmarksToHtml eln.replace("[[[", "<<"); eln.replace("]]]", ">>"); const QRegExp rx("<<.+>>"); if (eln.contains(rx)) { const QStringList& bibliographicFields = _bpP->bibliographicFields(); for (int j = 0; j < bibliographicFields.count(); ++j) { const QString& name = bibliographicFields.at(j); const QString tag(QString("<<%1>>").arg(name)); if (eln.contains(tag)) { QString fld; if (name == "pages") fld = _bpP->field(name).replace(QRegExp("-.+$"), QString()); else if (name == "author") { fld = _bpP->field(name); fld.replace(" and ", " "); } else if (name == "title") { fld = _bpP->field(name); fld = fld.remove('{'); fld = fld.remove('}'); } else fld = _bpP->field(name); fld = QUrl::toPercentEncoding(fld); eln.replace(tag, fld); if (!eln.contains(rx)) return eln; } } eln.replace("<>", _current_selection); } return eln; } const QString c2bNetworkQueryInfo::bookmarksToHtml() const { if (BookmarkList.count() == 0) return QString(); QString html("

    Bookmarks:

    "); for (int i = 0; i < BookmarkList.count(); ++i) { int separator(BookmarkList.at(i).indexOf('|')); if (separator == -1) continue; QString url_name(BookmarkList.at(i).mid(0, separator)); QString url(BookmarkList.at(i).mid(separator + 1)); // Tags <<.>> conflict with the Qt > 4.4.x HTML parser, even being them inside a // literal, quoted string. The substitution below works as a workaround to prevent // cb2Bib tags from clashing with the parser. // See c2bNetworkQueryInfo::encodeLink. A similar issue was resolved in // fromQtXmlString/toQtXmlString. url.replace("<<", "[[["); url.replace(">>", "]]]"); url = "" + url_name + ""; html += url + "
    "; } html += "


    "; return html; } cb2bib-1.4.9/src/c2bConfigureFR.ui0000644000175000017500000001027012045517740016471 0ustar rusconirusconi Pere Constans c2bConfigureFR 0 0 666 151 0 0 Edit Find-Replace - cb2Bib 6 6 Qt::LeftToRight true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false Qt::Horizontal QSizePolicy::Expanding 271 20 QFrame::HLine QFrame::Sunken Qt::Horizontal 0 6 Description: Find: Replace: c2bLineEdit QLineEdit
    c2bLineEdit.h
    lineEditFind lineEditReplace lineEditDescription buttonBox rejected() c2bConfigureFR reject() 637 119 104 117 buttonBox accepted() c2bConfigureFR accept() 558 122 24 118
    cb2bib-1.4.9/src/c2bNetworkQuery.cpp0000644000175000017500000000320412045520050017127 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bNetworkQuery.h" #include "c2b.h" #include c2bNetworkQuery::c2bNetworkQuery(bibParser* bp, QObject* parento) : networkQuery(bp, parento) {} c2bNetworkQuery::c2bNetworkQuery(bibParser* bp, network* net, QObject* parento) : networkQuery(bp, net, parento) {} c2bNetworkQuery::~c2bNetworkQuery() {} bool c2bNetworkQuery::checkQueryFile(const QString& fn) const { if (fn.isEmpty()) { QMessageBox::information(c2b::mainWidget(), tr("Information - cb2Bib"), tr("No Network Query file has been specified.\n\n" "Note: Network Query files are specified through the cb2Bib Configure dialog."), QMessageBox::Ok); return false; } QFile file(fn); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(c2b::mainWidget(), tr("Warning - cb2Bib"), tr("Unable to open the Network Query file %1 for reading.\nError: '%2'.\n\n" "Note: Network Query files are specified through the cb2Bib Configure dialog.") .arg(fn).arg(file.errorString()), QMessageBox::Ok); return false; } return true; } cb2bib-1.4.9/src/c2bNetworkQueryInfo.h0000644000175000017500000000222712045520050017414 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BNETWORKQUERYINFO_H #define C2BNETWORKQUERYINFO_H #include #include class QAction; class QFileSystemWatcher; class c2bBibParser; /** Manage Network Query Information */ class c2bNetworkQueryInfo : public QObject { Q_OBJECT public: c2bNetworkQueryInfo(QObject* parento = 0); ~c2bNetworkQueryInfo(); QList bookmarkActions(const QString& selection); const QString bookmarksToHtml() const; const QString encodeLink(const QString& ln) const; private: QFileSystemWatcher* _fsw; QList BookmarkActionList; QString NetworkFile; QString _current_selection; QStringList BookmarkList; const c2bBibParser* _bpP; private slots: void loadSettings(); void openBookmark(); void parseBookmarks(); }; #endif cb2bib-1.4.9/src/c2bFileDialog.cpp0000644000175000017500000001627512045520050016463 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bFileDialog.h" #include "c2bSettings.h" #include #include #include #include c2bFileDialog::c2bFileDialog(QWidget* parentw, const QString& caption, const QString& fpath, const QString& ffilter) : QFileDialog(parentw, caption, fpath, ffilter) { setModal(true); settings = c2bSettingsP; #ifdef Q_WS_X11 // Distinguish executable files fip = new fileIconProvider(); setIconProvider(fip); #endif } c2bFileDialog::~c2bFileDialog() { #ifdef Q_WS_X11 delete fip; #endif } QString c2bFileDialog::getFilename(QWidget* parentw, const QString& caption, const QString& path, const QString& filter) { c2bFileDialog* dlg = new c2bFileDialog(parentw, _caption(tr("Select a filename"), caption), _path(path), filter); dlg->setConfirmOverwrite(false); dlg->setFileMode(AnyFile); dlg->setAcceptMode(AcceptSave); dlg->setLabelText(QFileDialog::Accept, "Select"); QString fn(dlg->exec(path)); delete dlg; return fn; } QString c2bFileDialog::getOpenFilename(QWidget* parentw, const QString& caption, const QString& path, const QString& filter) { c2bFileDialog* dlg = new c2bFileDialog(parentw, _caption(tr("Select a filename"), caption), _path(path), filter); dlg->setFileMode(ExistingFile); dlg->setLabelText(QFileDialog::Accept, "Select"); QString fn(dlg->exec(path)); delete dlg; return fn; } QStringList c2bFileDialog::getOpenFilenames(QWidget* parentw, const QString& caption, const QString& path, const QString& filter) { c2bFileDialog* dlg = new c2bFileDialog(parentw, _caption(tr("Select filenames"), caption), _path(path), filter); dlg->setFileMode(ExistingFiles); dlg->setLabelText(QFileDialog::Accept, "Select"); QString fn(dlg->exec(path)); QStringList fns; if (!fn.isEmpty()) fns = dlg->selectedFiles(); delete dlg; return fns; } QString c2bFileDialog::getSaveFilename(QWidget* parentw, const QString& caption, const QString& path, const QString& filter) { c2bFileDialog* dlg = new c2bFileDialog(parentw, _caption(tr("Save As"), caption), _path(path), filter); dlg->setFileMode(AnyFile); dlg->setAcceptMode(AcceptSave); QString fn(dlg->exec(path)); delete dlg; return fn; } QString c2bFileDialog::getExistingDirectory(QWidget* parentw, const QString& caption, const QString& path) { c2bFileDialog* dlg = new c2bFileDialog(parentw, _caption("Select directory", caption), _dirpath(path), QString()); dlg->setFileMode(DirectoryOnly); dlg->setLabelText(QFileDialog::Accept, "Select"); QString fn(dlg->exec()); delete dlg; return fn; } QString c2bFileDialog::getSystemFilename(QWidget* parentw, const QString& caption, const QString& path, const QString& filter) { c2bFileDialog* dlg = new c2bFileDialog(parentw, _caption(tr("Select a filename"), caption), _path(path), filter); dlg->setFileMode(AnyFile); dlg->setLabelText(QFileDialog::Accept, "Select"); #if QT_VERSION >= 0x040400 dlg->setFilter(QDir::Drives | QDir::AllDirs | QDir::NoDotAndDotDot | QDir::System); dlg->setNameFilterDetailsVisible(false); #endif QString fn(dlg->exec(path)); delete dlg; return fn; } const QString c2bFileDialog::exec(const QString& path) { readSettings(); _current_file = path; const QStringList fnf(filters().filter(QFileInfo(path).completeSuffix() + ')', Qt::CaseInsensitive)); if (fnf.count() > 0) selectFilter(fnf.at(0)); QTimer::singleShot(250, this, SLOT(selectCurrentFile())); QString sfn; if (QFileDialog::exec() == QDialog::Accepted) { const QStringList selected(selectedFiles()); if (selected.count() > 0) sfn = selected.first(); } writeSettings(); return QDir::toNativeSeparators(QDir::cleanPath(sfn)); } void c2bFileDialog::accept() { // Set suffix for getSaveFilename dialog if (acceptMode() == AcceptSave) { QString suffix(selectedFilter()); QRegExp sre("\\*\\.([\\w\\.]+)"); if (sre.indexIn(suffix) != -1) { suffix = sre.cap(1); setDefaultSuffix(suffix); } } QFileDialog::accept(); } void c2bFileDialog::selectCurrentFile() { // Bug fix for Qt 4.4 not giving correct selection const QString fn(_filename(_current_file)); QLineEdit* le = findChild(); if (le) { le->setText(fn); le->selectAll(); } } void c2bFileDialog::readSettings() { // Size resize(settings->value("c2bFileDialog/size", sizeHint()).toSize()); // History QStringList _history(settings->value("c2bFileDialog/history").toStringList()); _history.removeAll(directory().absolutePath()); qSort(_history); setHistory(_history); } void c2bFileDialog::writeSettings() { // Size settings->setValue("c2bFileDialog/size", size()); // History if (result() == QDialog::Accepted) { // Unique paths, keeping the newest history entries QStringList _history(history()); _history.append(directory().absolutePath()); _history.removeAll(QDir::homePath()); _history.removeAll(QDir::rootPath()); QStringList chronological(settings->value("c2bFileDialog/history").toStringList()); chronological.append(_history.last()); // Discard repeated _history.clear(); for (int i = chronological.count() - 1; i > -1; --i) if (!_history.contains(chronological.at(i))) { _history.prepend(chronological.at(i)); if (_history.count() > 10) break; } settings->setValue("c2bFileDialog/history", _history); } } QString c2bFileDialog::_caption(const QString& generic, const QString& caption) { if (caption.isEmpty()) return generic + " - cb2Bib"; else return caption + " - cb2Bib"; } QString c2bFileDialog::_filename(const QString& path) { if (path.isEmpty()) return path; else return QFileInfo(path).fileName(); } QString c2bFileDialog::_path(const QString& path) { if (path.isEmpty()) return QDir::homePath(); else return QFileInfo(path).absolutePath(); } QString c2bFileDialog::_dirpath(const QString& path) { if (path.isEmpty()) return QDir::homePath(); else return QFileInfo(path + '/').absolutePath(); } /*************************************************************************** Class fileIconProvider ***************************************************************************/ fileIconProvider::fileIconProvider() : QFileIconProvider() { _exec_icon = QIcon(":/icons/icons/application-x-executable.png"); } fileIconProvider::~fileIconProvider() {} QIcon fileIconProvider::icon(const QFileInfo& info) const { if (info.isExecutable() && !info.isDir()) return _exec_icon; else return QFileIconProvider::icon(info); } cb2bib-1.4.9/src/c2bShortcutWidget.h0000644000175000017500000000243012045520050017074 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSHORTCUTWIDGET_H #define C2BSHORTCUTWIDGET_H #include "ui_c2bShortcutWidget.h" #include #include class c2bSettings; class c2bShortcutWidget : public QWidget { Q_OBJECT public: c2bShortcutWidget(QWidget* parentw = 0); inline ~c2bShortcutWidget() {} void setShortcutNames(const QString& path, const QStringList& fullnames); inline const QHash& modifiedKeysequences() const { return _modified_keysequences; } signals: void statusMessage(const QString& ms); private slots: void currentIndexChanged(const QString& name); void shortcutChanged(const QKeySequence& oldks, const QKeySequence& newks); private: QHash _modified_keysequences; QList _standard_keysequences; QString _shortcut_path; QStringList _fullnames; Ui::c2bShortcutWidget ui; c2bSettings* _settingsP; }; #endif cb2bib-1.4.9/src/c2bBibMenu.cpp0000644000175000017500000001316312045520050015776 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bBibMenu.h" #include #include c2bBibMenu::c2bBibMenu(QWidget* parentw) : QMenu(parentw), _keyboard_selection(0), _was_plus_pressed(false) { _title_action = addAction("Title"); _title_action->setData("title"); _author_action = addAction("Author"); _author_action->setData("author"); _add_author_action = addAction("Add authors"); _add_author_action->setIcon(QIcon(C2B_ICON_DIR + "add.png")); _journal_action = addAction("Journal"); _journal_action->setData("journal"); addSeparator(); _pages_action = addAction("Pages"); _pages_action->setData("pages"); _volume_action = addAction("Volume"); _volume_action->setData("volume"); _number_action = addAction("Number"); _number_action->setData("number"); _year_action = addAction("Year"); _year_action->setData("year"); addSeparator(); _abstract_action = addAction("Abstract"); _abstract_action->setData("abstract"); _keywords_action = addAction("Keywords"); _keywords_action->setData("keywords"); _file_action = addAction("File"); _file_action->setData("file"); QMenu* submenu = new QMenu("Other fields...", this); _address_action = submenu->addAction("Address"); _address_action->setData("address"); _annote_action = submenu->addAction("Annote"); _annote_action->setData("annote"); _booktitle_action = submenu->addAction("Booktitle"); _booktitle_action->setData("booktitle"); _chapter_action = submenu->addAction("Chapter"); _chapter_action->setData("chapter"); _doi_action = submenu->addAction("DOI"); _doi_action->setData("doi"); _edition_action = submenu->addAction("Edition"); _edition_action->setData("edition"); _editor_action = submenu->addAction("Editor"); _editor_action->setData("editor"); _add_editor_action = submenu->addAction("Add editors"); _add_editor_action->setIcon(QIcon(C2B_ICON_DIR + "add.png")); _eprint_action = submenu->addAction("Eprint"); _eprint_action->setData("eprint"); _institution_action = submenu->addAction("Institution"); _institution_action->setData("institution"); _isbn_action = submenu->addAction("ISBN"); _isbn_action->setData("isbn"); _issn_action = submenu->addAction("ISSN"); _issn_action->setData("issn"); _month_action = submenu->addAction("Month"); _month_action->setData("month"); _note_action = submenu->addAction("Note"); _note_action->setData("note"); _organization_action = submenu->addAction("Organization"); _organization_action->setData("organization"); _publisher_action = submenu->addAction("Publisher"); _publisher_action->setData("publisher"); _school_action = submenu->addAction("School"); _school_action->setData("school"); _series_action = submenu->addAction("Series"); _series_action->setData("series"); _url_action = submenu->addAction("URL"); _url_action->setData("url"); addSeparator(); addMenu(submenu); addSeparator(); _any_pattern_action = addAction(QString()); } QAction* c2bBibMenu::exec(const QPoint& p) { _keyboard_selection = 0; _was_plus_pressed = false; QAction* a = QMenu::exec(p); if (a) return a; else return _keyboard_selection; } void c2bBibMenu::keyPressEvent(QKeyEvent* qevent) { switch (qevent->key()) { case Qt::Key_A: if (_was_plus_pressed) _keyboard_selection = _add_author_action; else _keyboard_selection = _author_action; break; case Qt::Key_B: _keyboard_selection = _booktitle_action; break; case Qt::Key_C: _keyboard_selection = _chapter_action; break; case Qt::Key_D: _keyboard_selection = _doi_action; break; case Qt::Key_E: if (_was_plus_pressed) _keyboard_selection = _add_editor_action; else _keyboard_selection = _editor_action; break; case Qt::Key_F: _keyboard_selection = _file_action; break; case Qt::Key_I: _keyboard_selection = _isbn_action; break; case Qt::Key_J: _keyboard_selection = _journal_action; break; case Qt::Key_K: _keyboard_selection = _keywords_action; break; case Qt::Key_M: _keyboard_selection = _month_action; break; case Qt::Key_N: _keyboard_selection = _number_action; break; case Qt::Key_O: _keyboard_selection = _organization_action; break; case Qt::Key_P: _keyboard_selection = _pages_action; break; case Qt::Key_S: _keyboard_selection = _series_action; break; case Qt::Key_T: _keyboard_selection = _title_action; break; case Qt::Key_U: _keyboard_selection = _url_action; break; case Qt::Key_V: _keyboard_selection = _volume_action; break; case Qt::Key_Y: _keyboard_selection = _year_action; break; case Qt::Key_Plus: _was_plus_pressed = true; break; default: _keyboard_selection = 0; _was_plus_pressed = false; } if (_keyboard_selection) { qevent->accept(); hide(); _keyboard_selection->trigger(); } else QMenu::keyPressEvent(qevent); } cb2bib-1.4.9/src/c2bExportDialog.ui0000644000175000017500000001254612045517740016731 0ustar rusconirusconi c2bExportDialog 0 0 563 308 Dialog BibTeX File: 6 0 Select BibTeX directory :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Qt::Horizontal Copy Documents Documents Directory 6 0 Select PDF directory :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Set directory relative to the BibTeX File Directory Qt::Vertical 20 20 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help c2bLineEdit QLineEdit
    c2bLineEdit.h
    buttonBox rejected() c2bExportDialog reject() 603 259 630 156 CopyDocuments clicked(bool) DocumentsDirectoryBox setEnabled(bool) 23 80 154 134
    cb2bib-1.4.9/src/c2bExportDialog.cpp0000644000175000017500000001122612045520050017054 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bExportDialog.h" #include "c2b.h" #include "c2bFileDialog.h" #include "c2bSettings.h" #include "c2bUtils.h" #include #include c2bExportDialog::c2bExportDialog(const QString& fn, const QString& contents, const QStringList& keys, QWidget* parentw) : QDialog(parentw) { _ed.bibtex_fn = fn; if (contents.isEmpty()) _ed.bibtex_contents = c2bUtils::fileToString(fn); else _ed.bibtex_contents = contents; _ed.bibtex_keys = keys; ui.setupUi(this); setWindowTitle(tr("Export Entries - cb2Bib")); QPushButton* buttonExport = new QPushButton(tr("Export")); ui.buttonBox->addButton(buttonExport, QDialogButtonBox::ActionRole); buttonExport->setAutoDefault(true); buttonExport->setDefault(true); connect(buttonExport, SIGNAL(clicked()), this, SLOT(_export())); settings = c2bSettingsP; ui.ExportFile->setText(settings->value("c2bExportDialog/ExportFile", QString()).toString()); ui.DocumentsDirectory->setText(settings->value("c2bExportDialog/DocumentsDirectory", QString()).toString()); ui.CopyDocuments->setChecked(settings->value("c2bExportDialog/CopyDocuments").toBool()); ui.RelativeDocumentDirectory->setChecked(settings->value("c2bExportDialog/RelativeDocumentDirectory").toBool()); ui.DocumentsDirectoryBox->setEnabled(ui.CopyDocuments->isChecked()); connect(ui.ExportFileDir, SIGNAL(clicked()), this, SLOT(getExportFile())); connect(ui.DocumentsDirectoryDir, SIGNAL(clicked()), this, SLOT(getDocumentsDirectory())); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); } c2bExportDialog::~c2bExportDialog() { if (result() == QDialog::Accepted) { settings->setValue("c2bExportDialog/CopyDocuments", ui.CopyDocuments->isChecked()); settings->setValue("c2bExportDialog/DocumentsDirectory", ui.DocumentsDirectory->text()); settings->setValue("c2bExportDialog/ExportFile", ui.ExportFile->text()); settings->setValue("c2bExportDialog/RelativeDocumentDirectory", ui.RelativeDocumentDirectory->isChecked()); } } void c2bExportDialog::_export() { _ed.copy_documents = ui.CopyDocuments->isChecked(); _ed.documents_dir = ui.DocumentsDirectory->text(); _ed.export_fn = ui.ExportFile->text(); _ed.relative_dir = ui.RelativeDocumentDirectory->isChecked(); // Check files if (QFileInfo(_ed.export_fn).exists()) { const int button(QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("File %1 already exists.\nDo you want to replace it?").arg(_ed.export_fn), QMessageBox::Yes | QMessageBox::No)); if (button == QMessageBox::No) return; } if (_ed.copy_documents) { const QString ddname(c2bUtils::documentAbsoluteName(_ed.relative_dir, _ed.export_fn, _ed.documents_dir, QString()) + QDir::separator()); QDir doc_dir(ddname); if (!doc_dir.exists()) if (!doc_dir.mkpath(ddname)) { QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("Unable to create directory %1.").arg(ddname), QMessageBox::Ok); return; } } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); c2bExport e(this); e.exportEntries(_ed); QApplication::restoreOverrideCursor(); accept(); } void c2bExportDialog::getExportFile() { const QString fn(ui.ExportFile->text()); const QString new_fn(c2bFileDialog::getFilename(this, tr("Select export filename"), fn, "BibTeX (*.bib)")); if (!new_fn.isEmpty()) ui.ExportFile->setText(new_fn); } void c2bExportDialog::getDocumentsDirectory() { const QString dir(c2bUtils::documentAbsoluteName(ui.RelativeDocumentDirectory->isChecked(), ui.ExportFile->text(), ui.DocumentsDirectory->text(), QString())); QString new_dir(c2bFileDialog::getExistingDirectory(this, tr("Select documents directory"), dir)); if (!new_dir.isEmpty()) { new_dir = c2bUtils::documentDirName(ui.RelativeDocumentDirectory->isChecked(), ui.ExportFile->text(), new_dir); ui.DocumentsDirectory->setText(new_dir); } } void c2bExportDialog::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2beditor.php#export_entries"); } cb2bib-1.4.9/src/xml/0000755000175000017500000000000012045517740014172 5ustar rusconirusconicb2bib-1.4.9/src/xml/ExifTool_config0000644000175000017500000000176012045517740017177 0ustar rusconirusconi%Image::ExifTool::UserDefined::BibTeX = ( GROUPS => { 0 => 'XMP', 1 => 'XMP-bibtex', 2 => 'Reference' }, NAMESPACE => { 'bibtex' => 'http://www.molspaces.com/cb2bib' }, WRITABLE => 'string', type => { }, abstract => { }, address => { }, annote => { }, author => { }, booktitle => { }, chapter => { }, doi => { }, edition => { }, editor => { }, eprint => { }, file => { }, institution => { }, isbn => { }, issn => { }, journal => { }, keywords => { }, month => { }, note => { }, number => { }, organization => { }, pages => { }, publisher => { }, school => { }, series => { }, title => { }, url => { }, volume => { }, year => { }, ); %Image::ExifTool::UserDefined = ( 'Image::ExifTool::XMP::Main' => { bibtex => { SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::BibTeX', }, }, }, ); 1; cb2bib-1.4.9/src/xml/cb2bib.xmp0000644000175000017500000000072612045517740016050 0ustar rusconirusconi GET_BIBTEX_TAGS GET_FORMATTED_AUTHOR cb2bib-1.4.9/src/main.cpp0000644000175000017500000000731512045520050015014 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "qtsingleapplication/src/qtsingleapplication.h" #include "qtsingleapplication/src/qtsinglecoreapplication.h" #include "c2bConfigure.h" #include "c2bConsole.h" #include "c2bSettings.h" #include "cb2Bib.h" #ifdef C2B_USE_WEBKIT #include "c2bAnnote.h" #ifdef C2B_STATIC_LINKING #include Q_IMPORT_PLUGIN(qjpeg) Q_IMPORT_PLUGIN(qgif) #endif #endif int main(int argc, char* argv[]) { Q_INIT_RESOURCE(cb2bib); Q_INIT_RESOURCE(c2blib); c2bSettings* c2b_settings; // Delete before app, this avoids QVariant::save: unable to save type 67/64 int code(0); if (c2bSettings::isConsoleMode(argc, argv)) { // Cannot use QCoreApplication, QTextDocument is required by c2bUtils::fromHtmlString #ifdef Q_WS_WIN // Needs also workaround c2bSettings::decodeFilename() QApplication app(argc, argv); #else QApplication app(argc, argv, QApplication::Tty); #endif app.setOrganizationName(C2B_ORGANIZATION); app.setApplicationName(C2B_APPLICATION); c2b_settings = c2bSettings::initSettings(); if (c2b_settings->loaded()) { c2bConsole c2B; c2B.load(); code = app.exec(); } delete c2b_settings; } else if (c2bSettings::isSingleApplicationMode(argc, argv)) { // Avoid connecting to the graphic server. On Windows it would create a void window. QtSingleCoreApplication* capp = new QtSingleCoreApplication(argc, argv); const bool is_running = capp->sendMessage(QString()); delete capp; if (is_running) return code; QtSingleApplication app(argc, argv); if (app.isRunning()) // Activate local peer return code; app.setQuitOnLastWindowClosed(false); app.setOrganizationName(C2B_ORGANIZATION); app.setApplicationName(C2B_APPLICATION); c2b_settings = c2bSettings::initSettings(); if (c2b_settings->loaded()) { cb2Bib c2B; c2B.show(); QObject::connect(&app, SIGNAL(messageReceived(const QString&)), &c2B, SLOT(show())); code = app.exec(); } delete c2b_settings; } else { QApplication app(argc, argv); app.setOrganizationName(C2B_ORGANIZATION); app.setApplicationName(C2B_APPLICATION); #if QT_VERSION >= 0x040400 // Avoid flickering (e.g. white panel) at startup // Consider: QT_USE_NATIVE_WINDOWS=1 // app.setAttribute(Qt::AA_NativeWindows, true); #endif c2b_settings = c2bSettings::initSettings(); if (c2b_settings->loaded()) { if (c2b_settings->cl_cb2bib_import_mode) code = app.exec(); else if (c2b_settings->cl_configure) { c2bConfigure c2B; c2B.show(); code = app.exec(); } else if (c2b_settings->cl_view_annote) { #ifdef C2B_USE_WEBKIT c2bAnnote c2B; if (c2B.show()) code = app.exec(); #else fprintf(stdout, "The cb2Bib Annote is disabled. Recompile using WebKit library.\n"); #endif } else { cb2Bib c2B; c2B.show(); code = app.exec(); } } delete c2b_settings; } return code; } cb2bib-1.4.9/src/proxyDialog.ui0000644000175000017500000000543312045517740016237 0ustar rusconirusconi proxyDialog 0 0 454 127 Proxy Authentication - cb2Bib 6 Username: Password: QLineEdit::Password Qt::Vertical 0 0 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() proxyDialog accept() 248 254 157 274 buttonBox rejected() proxyDialog reject() 316 260 286 274 cb2bib-1.4.9/src/c2bEditor.ui0000644000175000017500000002477612045517740015566 0ustar rusconirusconi Pere Constans c2bEditor 0 0 801 600 Editor - cb2Bib :/icons/icons/cb2bib.png:/icons/icons/cb2bib.png 0 0 801 29 &Help &Edit &View &Settings &File Tools Qt::Horizontal TopToolBarArea false :/icons/icons/filesave22.png:/icons/icons/filesave22.png Save Save :/icons/icons/filesaveas22.png:/icons/icons/filesaveas22.png Save As... Save As Save As Save as... :/icons/icons/exec22.png:/icons/icons/exec22.png Exec :/icons/icons/fileclose22.png:/icons/icons/fileclose22.png Close Document Close Document Close Document Close document :/icons/icons/exit.png:/icons/icons/exit.png Exit Exit cb2Bib Exit cb2Bib Exit cb2Bib :/icons/icons/help16.png:/icons/icons/help16.png Editor Help Editor Help Editor Help Editor context help :/icons/icons/cb2bib.png:/icons/icons/cb2bib.png Toggle cb2Bib Toggle cb2Bib Toggle cb2Bib F2 Set LyX Pipe Set active LyX pipe Set LyX pipe Set active LyX pipe true :/icons/icons/edit22.png:/icons/icons/edit22.png Toggle Editing and Browsing Toggle Editing and Browsing Toggle Editing and Browsing Toggle editing and browsing modes false :/icons/icons/viewZoomIn.png:/icons/icons/viewZoomIn.png Zoom In Zoom in false :/icons/icons/viewZoomOut.png:/icons/icons/viewZoomOut.png Zoom Out Zoom out false :/icons/icons/cb2bib.png:/icons/icons/cb2bib.png cb2Bib Help cb2Bib Help cb2Bib Help cb2Bib context help Shift+F1 :/icons/icons/configure.png:/icons/icons/configure.png cb2Bib Settings cb2Bib Settings cb2Bib Settings cb2Bib settings :/icons/icons/fileopen22.png:/icons/icons/fileopen22.png Open Open Open document false false :/icons/icons/configure_bibtex.png:/icons/icons/configure_bibtex.png Export Entries Export Entries Export Entries Export selected entries false cb2bib-1.4.9/src/c2bCiterView.h0000644000175000017500000000332312045520050016020 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCITERVIEW_H #define C2BCITERVIEW_H #include "c2bCiterModel.h" #include class c2bCiterView : public QTableView { Q_OBJECT public: c2bCiterView(QWidget* parentw = 0); inline ~c2bCiterView() {} c2bCiter::State currentState() const; void reloadModel(QAbstractItemModel* citations, const QStringList& bibtex_files, const c2bCiter::State& state); void setPatternFilter(const QString& pattern); signals: void citeReferences(); void editReference(); void hideCiter(); void openFile(); void openUrl(); void patternFilterChanged(const bool mode, const QString& pattern); void statusMessage(const QString& message); protected: void keyPressEvent(QKeyEvent* qevent); void keyboardSearch(const QString& search); void resizeEvent(QResizeEvent* qevent); public slots: void updatePatternFilter(const QString& pattern); private: void clearCurrentFilter(); void keywordDocumentSearch(); void setRelatedFilter(); void showNextState(); void showPreviousState(); void toggleGlossaryView(); void toggleKeywordView(); void toggleSelectedFilter(); void updateCurrentIndex(const QModelIndex& i); void updateFormat(const c2bCiter::Format& format); void updateViewport(); QString _filter_string; bool _filter_mode; c2bCiterModel* _citationsP; }; #endif cb2bib-1.4.9/src/c2bUtils.cpp0000644000175000017500000000243712045520050015557 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bUtils.h" #include #include namespace c2bUtils { bool openFile(const QString& fn, QWidget* w) { // URL fn is decoded always, in the hope of making openFile encoding agnostic const QString decoded(QUrl::fromPercentEncoding(fn.toUtf8())); const QUrl url(stringToUrl(decoded)); if (!url.isValid()) { if (w) QMessageBox::warning(w, QObject::tr("Warning - cb2Bib"), QObject::tr("Unable to open file.\nError: URL '%1' is not valid."). arg(url.toString()), QMessageBox::Ok); return false; } if (!QDesktopServices::openUrl(url)) { if (w) QMessageBox::warning(w, QObject::tr("Warning - cb2Bib"), QObject::tr("Unable to open file '%1'."). arg(fn), QMessageBox::Ok); return false; } return true; } } // namespace c2bUtils cb2bib-1.4.9/src/c2bCiterWidget.ui0000644000175000017500000000673512045517740016545 0ustar rusconirusconi c2bCiterWidget 0 0 901 400 c2bCiter - cb2Bib 3 6 3 6 Qt::Horizontal QFrame::NoFrame QFrame::Plain false QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false Qt::NoPen false false Qt::Horizontal 7 0 0 false :/icons/icons/filter.png :/icons/icons/clipboard.png Qt::Horizontal c2bCiterView QTableView
    c2bCiterView.h
    cb2bib-1.4.9/src/c2bExportDialog.h0000644000175000017500000000200512045520050016514 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BEXPORTDIALOG_H #define C2BEXPORTDIALOG_H #include "c2bExport.h" #include "ui_c2bExportDialog.h" #include class c2bSettings; class c2bExportDialog : public QDialog { Q_OBJECT public: c2bExportDialog(const QString& fn, const QString& contents, const QStringList& keys, QWidget* parentw = 0); ~c2bExportDialog(); inline const QString exportFilename() const { return ui.ExportFile->text(); } private: Ui::c2bExportDialog ui; c2bExport::export_data _ed; c2bSettings* settings; private slots: void _export(); void getDocumentsDirectory(); void getExportFile(); void help(); }; #endif cb2bib-1.4.9/src/c2bTests.h0000644000175000017500000000253712045520050015227 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BTESTS_H #define C2BTESTS_H #include class QTextStream; class bibParser; class bibReference; /** Test cb2Bib functionality */ class c2bTests { public: c2bTests(); ~c2bTests(); int allTests(); private: QString _bibliographic_dir; QString decomposition(const QChar& c); QTextStream& cout; int _failed_test_count; int _test_count; void author_parser(); void check_test(const bool passed, const QString& input, const QString& output); void compression_check(); void heuristic(bibParser& bp, const bibReference& reference, const QString& text); void heuristic_author(); void heuristic_check_patterns(); void heuristic_journal(); void heuristic_misc(); void heuristic_pvny(); void write(const bibParser& bp, const bibReference& reference); void write_information(); inline const char* boolToStr(bool b) { if (b) return "passed"; else return "failed"; } }; #endif cb2bib-1.4.9/src/src.pro0000644000175000017500000001551412045517740014711 0ustar rusconirusconiFORMS += c2bCiterWidget.ui \ c2bConfigure.ui \ c2bConfigureFR.ui \ c2bEditor.ui \ c2bExportDialog.ui \ c2bLogWidget.ui \ c2bPdfImport.ui \ c2bRLWebSearchSettings.ui \ c2bReferenceList.ui \ c2bSaveRegExp.ui \ c2bSearchInFiles.ui \ c2bSearchInFilesPattern.ui \ c2bSearchInFilesPatternEdit.ui \ c2bShortcutWidget.ui \ cb2Bib.ui \ findDialog.ui \ proxyDialog.ui RESOURCES += cb2bib.qrc HEADERS += qtsingleapplication/src/*.h \ bookmarkPlugin.h \ c2b.h \ c2bBibHighlighter.h \ c2bBibMenu.h \ c2bBibParser.h \ c2bBibPreparserLog.h \ c2bCiter.h \ c2bCiterExcerptView.h \ c2bCiterHistory.h \ c2bCiterModel.h \ c2bCiterView.h \ c2bCiterWidget.h \ c2bClipEdit.h \ c2bClipboard.h \ c2bCollectionIndex.h \ c2bColors.h \ c2bComboBox.h \ c2bConfigure.h \ c2bConfigureFR.h \ c2bConsole.h \ c2bCoreCiter.h \ c2bEditor.h \ c2bExport.h \ c2bExportDialog.h \ c2bFileDialog.h \ c2bHighlighter.h \ c2bIdLineEdit.h \ c2bLineEdit.h \ c2bNetworkQuery.h \ c2bNetworkQueryInfo.h \ c2bPdfImport.h \ c2bPostprocess.h \ c2bREHighlighter.h \ c2bRLWebSearchSettings.h \ c2bReferenceList.h \ c2bSaveREHighlighter.h \ c2bSaveRegExp.h \ c2bSearchInFiles.h \ c2bSearchInFilesPattern.h \ c2bSettings.h \ c2bShortcutPushButton.h \ c2bShortcutWidget.h \ c2bTests.h \ c2bTextBrowser.h \ c2bTextEdit.h \ c2bUpdateMetadata.h \ c2bUtils.h \ cb2Bib.h \ clipboardPoll.h \ findDialog.h SOURCES += qtsingleapplication/src/*.cpp \ bookmarkPlugin.cpp \ c2b.cpp \ c2bBibHighlighter.cpp \ c2bBibMenu.cpp \ c2bBibParser.cpp \ c2bBibPreparserLog.cpp \ c2bCiterExcerptView.cpp \ c2bCiterHistory.cpp \ c2bCiterModel.cpp \ c2bCiterView.cpp \ c2bCiterWidget.cpp \ c2bClipEdit.cpp \ c2bClipboard.cpp \ c2bCollectionIndex.cpp \ c2bColors.cpp \ c2bComboBox.cpp \ c2bConfigure.cpp \ c2bConfigureFR.cpp \ c2bConsole.cpp \ c2bCoreCiter.cpp \ c2bEditor.cpp \ c2bExport.cpp \ c2bExportDialog.cpp \ c2bFileDialog.cpp \ c2bHighlighter.cpp \ c2bIdLineEdit.cpp \ c2bLineEdit.cpp \ c2bNetworkQuery.cpp \ c2bNetworkQueryInfo.cpp \ c2bPdfImport.cpp \ c2bPostprocess.cpp \ c2bREHighlighter.cpp \ c2bRLWebSearchSettings.cpp \ c2bReferenceList.cpp \ c2bSaveREHighlighter.cpp \ c2bSaveRegExp.cpp \ c2bSearchInFiles.cpp \ c2bSearchInFilesPattern.cpp \ c2bSettings.cpp \ c2bShortcutPushButton.cpp \ c2bShortcutWidget.cpp \ c2bTests.cpp \ c2bTextBrowser.cpp \ c2bTextEdit.cpp \ c2bUpdateMetadata.cpp \ c2bUtils.cpp \ cb2Bib.cpp \ clipboardPoll.cpp \ findDialog.cpp \ main.cpp TEMPLATE = app QT += network CONFIG += LIBS += -lc2b LIBPATH += . INCLUDEPATH += c2b . DEFINES += C2B_USE_QMAKE QTVERSION = $$[QT_VERSION] contains(QTVERSION, 4\.3.*) { message(Using Qt < 4.4 --> Added xml libs) QT += xml } else { exists($$[QT_INSTALL_HEADERS]/QtWebKit/qwebview.h) { message(Using Qt > 4.4 --> Added webkit libs) QT += webkit CONFIG += use_webkit } } QTWEBKIT_HEADERS = /usr/include/QtWebKit exists($$QTWEBKIT_HEADERS/qwebview.h) { message(Using webkit header files --> $$QTWEBKIT_HEADERS) LIBS += -lQtWebKit INCLUDEPATH += $$QTWEBKIT_HEADERS CONFIG += use_webkit } use_webkit { message(The cb2Bib will be linked against webkit library) HEADERS += c2bAnnote.h c2bWebBrowser.h SOURCES += c2bAnnote.cpp c2bWebBrowser.cpp DEFINES += C2B_USE_WEBKIT } CONFIG += use_lzo use_lzo { LIBS += -llzo2 DEFINES += C2B_USE_LZO } disable_lzo { CONFIG -= use_lzo LIBS -= -llzo2 DEFINES -= C2B_USE_LZO } unix { LIBS += -lX11 } TARGET = cb2bib DESTDIR = ../bin DEPENDPATH += . TARGETDEPS += libc2b.a QMAKE_CXXFLAGS_DEBUG += -DC2B_DEBUG DEFINES += C2B_USE_CBPOLL disable_cbpoll { message(Building without clipboardPoll) HEADERS -= clipboardPoll.h SOURCES -= clipboardPoll.cpp DEFINES -= C2B_USE_CBPOLL } CONFIG(static) { use_webkit { DEFINES += C2B_STATIC_LINKING QTPLUGIN += qjpeg qgif } } # Attention. Scripts are not set executable to avoid qmake to write a call # to strip, thus avoiding a confusing 'error (ignored)' message. As for now, # 'chmod +x' is called when 'make install' is invoked. This also gives some # other warnings on some build systems, stating that a text file is copied to # /bin directory. unix { INSTALLS += target script cb2bibdata icons desktop target.path = /usr/bin script.files += ../c2bscripts/c2bimport ../c2bscripts/c2bciter script.path = /usr/bin script.extra = chmod +x ../c2bscripts/c2bimport; chmod +x ../c2bscripts/c2bciter desktop.files += ../c2bscripts/cb2bib.desktop ../c2bscripts/c2bciter.desktop ../c2bscripts/c2bimport.desktop desktop.path = /usr/share/applications icons.files += ../src/icons/cb2bib.png icons.path = /usr/share/pixmaps cb2bibdata.files += ../AUTHORS ../COPYRIGHT ../LICENSE ../CHANGELOG ../data ../c2btools ../testPDFImport cb2bibdata.path = /usr/share/cb2bib } win32 { HEADERS -= clipboardPoll.h SOURCES -= clipboardPoll.cpp DEFINES -= C2B_USE_CBPOLL RC_FILE = ../cb2bib.rc } macx { HEADERS -= clipboardPoll.h SOURCES -= clipboardPoll.cpp DEFINES -= C2B_USE_CBPOLL ICON = ../src/icons/cb2bib.icns INSTALLS += target script cb2bibdata target.path = /Applications script.files += ../c2bscripts/c2bimport ../c2bscripts/c2bciter script.path = /Applications script.extra = chmod +x ../c2bscripts/c2bimport; chmod +x ../c2bscripts/c2bciter cb2bibdata.files += ../AUTHORS ../COPYRIGHT ../LICENSE ../CHANGELOG ../data ../c2btools ../testPDFImport cb2bibdata.path = Contents/Resources QMAKE_BUNDLE_DATA += script cb2bibdata # Set this directory if third party tools, like pdftotext are packaged # INSTALLS += externtools # externtools.files += # externtools.path = c2bExternTools # Set Library data # QMAKE_BUNDLE_DATA += externtools } cb2bib-1.4.9/src/c2bConsole.h0000644000175000017500000000141212045520050015516 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCONSOLE_H #define C2BCONSOLE_H #include /** Interface for console functionality */ class c2bConsole : public QObject { Q_OBJECT public: c2bConsole(QObject* parento = 0); ~c2bConsole(); void load(); private: int cl_cb2bib_tests(); int cl_doc2bib(); int cl_html_annote(); int cl_index(); int cl_txt2bib(); private slots: void _process(); }; #endif cb2bib-1.4.9/src/c2bSearchInFilesPatternEdit.ui0000644000175000017500000000411212045517740021141 0ustar rusconirusconi Pere Constans c2bSearchInFilesPatternEdit 0 0 637 112 Edit Pattern - cb2Bib 6 6 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok c2bSearchInFilesPattern QWidget
    c2bSearchInFilesPattern.h
    buttonBox accepted() c2bSearchInFilesPatternEdit accept() 248 254 157 274 buttonBox rejected() c2bSearchInFilesPatternEdit reject() 316 260 286 274
    cb2bib-1.4.9/src/c2bHighlighter.cpp0000644000175000017500000001162712045520050016716 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bHighlighter.h" #include "c2bSettings.h" #include #include c2bHighlighter::c2bHighlighter(QTextDocument* doc) : QSyntaxHighlighter(doc) { QPalette p; text_color = p.text().color(); c2bSettings* settings(c2bSettingsP); c = &settings->colors; connect(settings, SIGNAL(newSettings()), this, SLOT(rehighlight())); rx0 = QRegExp("\\d+"); rx0.setMinimal(true); rx1 = QRegExp("[^\\w\\d]+"); rx1.setMinimal(true); rx2 = QRegExp("<(?:NewLine|Tab)\\d+>"); rx2.setMinimal(true); rx3 = QRegExp("\\b(?:19|20)\\d\\d\\b"); rx3.setMinimal(true); rx4 = QRegExp("\\b(?:abstract|authors{0,1}|introduction|issue|keywords|key words|title|volume|vol)\\b", Qt::CaseInsensitive); rx4.setMinimal(true); rx5 = QRegExp("<<(?:abstract|address|annote|author|booktitle|chapter|" "doi|edition|editor|eprint|file|institution|isbn|issn|journal|" "keywords|month|note|number|organization|pages|publisher|" "school|series|title|url|volume|year)>>"); rx5.setMinimal(true); rx6 = QRegExp(""); rx6.setMinimal(true); rx_extracted_starts = QRegExp("\\[\\["); rx_extracted_ends = QRegExp("\\]\\]"); rx_metadata_starts = QRegExp("\\[Bibliographic Metadata"); rx_metadata_ends = QRegExp("/Bibliographic Metadata\\]"); } c2bHighlighter::~c2bHighlighter() {} void c2bHighlighter::highlightBlock(const QString& text) { const int len(text.length()); setFormat(0, len - 1, text_color); int pos(0); while (pos >= 0) { pos = rx0.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx0.matchedLength(), c->cb2bib_digit_color); pos += rx0.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx1.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx1.matchedLength(), c->cb2bib_unrelevant_color); pos += rx1.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx2.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx2.matchedLength(), c->cb2bib_unrelevant_color); pos += rx2.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx3.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx3.matchedLength(), c->cb2bib_relevant_color); pos += rx3.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx4.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx4.matchedLength(), c->cb2bib_highly_relevant_color); pos += rx4.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx5.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx5.matchedLength(), c->cb2bib_tag_color); pos += rx5.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx6.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx6.matchedLength(), c->cb2bib_unrelevant_color); pos += rx6.matchedLength(); } } setCurrentBlockState(0); int startIndexMD(0); if (previousBlockState() != 1) startIndexMD = rx_metadata_starts.indexIn(text); while (startIndexMD >= 0) { const int endIndex(rx_metadata_ends.indexIn(text, startIndexMD)); int extractedLength; if (endIndex == -1) { setCurrentBlockState(1); extractedLength = text.length() - startIndexMD; } else extractedLength = endIndex - startIndexMD + rx_metadata_ends.matchedLength(); setFormat(startIndexMD, extractedLength, c->cb2bib_metadata_color); startIndexMD = rx_metadata_starts.indexIn(text, startIndexMD + extractedLength); } int startIndexEx(0); if (previousBlockState() != 2) startIndexEx = rx_extracted_starts.indexIn(text); while (startIndexEx >= 0) { const int endIndex(rx_extracted_ends.indexIn(text, startIndexEx)); int extractedLength; if (endIndex == -1) { setCurrentBlockState(2); extractedLength = text.length() - startIndexEx; } else extractedLength = endIndex - startIndexEx + rx_extracted_ends.matchedLength(); setFormat(startIndexEx, extractedLength, c->cb2bib_unrelevant_color); startIndexEx = rx_extracted_starts.indexIn(text, startIndexEx + extractedLength); } } cb2bib-1.4.9/src/bookmarkPlugin.cpp0000644000175000017500000000747012045520050017056 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "bookmarkPlugin.h" #include "c2b.h" #include "c2bSettings.h" #include "c2bUtils.h" #include bookmarkPlugin::bookmarkPlugin(QWidget* parentw) : QMenu(parentw) { setObjectName(QString::fromUtf8("menuBookmarks")); setTitle(QApplication::translate("c2bEditor", "&Bookmarks", 0, QApplication::UnicodeUTF8)); connect(c2bSettingsP, SIGNAL(newSettings()), this, SLOT(init())); _fsw = new QFileSystemWatcher(this); connect(_fsw, SIGNAL(fileChanged(const QString&)), this, SLOT(parseBookmarks())); init(); } bookmarkPlugin::~bookmarkPlugin() {} void bookmarkPlugin::init() { const QString nfn(c2bSettingsP->fileName("cb2Bib/NetworkFile")); if (nfn == _bookmark_file) return; if (QFileInfo(nfn).exists()) { if (!_bookmark_file.isEmpty()) _fsw->removePath(_bookmark_file); _bookmark_file = nfn; _fsw->addPath(_bookmark_file); } parseBookmarks(); } void bookmarkPlugin::parseBookmarks() { clear(); const QString bmf(c2bUtils::fileToString(_bookmark_file)); QStringList bookmarks(bmf.split('\n', QString::KeepEmptyParts)); const QRegExp _bookmark("^editorbookmark="); const QRegExp _separator("^editorbookmark=\\s*$"); for (int i = 0; i < bookmarks.count(); ++i) { if (bookmarks.at(i).contains(_separator)) { addSeparator(); continue; } if (bookmarks.at(i).contains(_bookmark)) { bookmarks[i].remove(_bookmark); const QStringList bm_parts(bookmarks.at(i).split('|', QString::KeepEmptyParts)); if (bm_parts.count() != 4) { c2bUtils::warn(tr("bookmarkPlugin::parseBookmarks: Syntax error at '%1'").arg(bookmarks.at(i))); continue; } QAction* act = addAction(bm_parts.at(0), this, SLOT(openBookmark())); act->setData(bm_parts.at(1)); act->setStatusTip(QString("%1 [%2]").arg(bm_parts.at(0)).arg(bm_parts.at(1))); act->setShortcut(bm_parts.at(2)); act->setIcon(QIcon(iconProvider(bm_parts.at(1), bm_parts.at(3)))); } } addSeparator(); QAction* edit_bookmarks = addAction(tr("Edit Bookmarks"), this, SIGNAL(editBookmarks())); edit_bookmarks->setStatusTip(tr("Edit bookmarks")); edit_bookmarks->setIcon(QIcon(":/icons/icons/edit.png")); } QString bookmarkPlugin::iconProvider(const QString& fn, const QString& iconFile) { if (!iconFile.isEmpty()) return iconFile; if (fn.contains(QRegExp("\\.(tex|dvi)\\b", Qt::CaseInsensitive))) return ":/icons/icons/application-x-tex.png"; if (fn.contains(QRegExp("\\.(chm|djvu|pdf|ps)\\b", Qt::CaseInsensitive))) return ":/icons/icons/application-x-pdf.png"; if (fn.contains(QRegExp("\\.(htm|html|php)\\b", Qt::CaseInsensitive))) return ":/icons/icons/application-x-html.png"; if (fn.contains(QRegExp("\\.txt\\b", Qt::CaseInsensitive))) return ":/icons/icons/application-x-tex.png"; if (fn.contains(QRegExp("\\.bib\\b", Qt::CaseInsensitive))) return ":/icons/icons/cb2bib.png"; return ":/icons/icons/application-x-none.png"; } void bookmarkPlugin::openBookmark() { QAction* act = static_cast(sender()); if (act) { const QString fn(act->data().toString()); if (fn.endsWith(".bib")) // Open BiBTeX files internally emit openFile(fn); else c2bUtils::openFile(fn, parentWidget()); } } cb2bib-1.4.9/src/c2bPdfImport.ui0000644000175000017500000001375512045517740016237 0ustar rusconirusconi Pere Constans c2bPdfImport 0 0 869 414 true PDFImport - cb2Bib 6 6 Qt::Vertical QFrame::Raised QFrame::StyledPanel QFrame::Raised true 0 0 false Qt::Horizontal QDialogButtonBox::Abort|QDialogButtonBox::Close|QDialogButtonBox::Help Qt::Horizontal QFrame::HLine QFrame::Sunken Qt::Horizontal Miscellaneous 9 6 Qt::Horizontal 40 20 Perform network queries after automatic reference extractions Perform network queries Open document files Open document files Sequence 9 6 Qt::Horizontal 40 20 Process next after saving Process next after saving Unsupervised processing Unsupervised processing PDFlist Log OpenFiles DoNextAfterSaving buttonBox buttonBox rejected() c2bPdfImport reject() 759 428 822 323 cb2bib-1.4.9/src/c2bConfigureFR.h0000644000175000017500000000141312045520050016266 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCONFIGUREFR_H #define C2BCONFIGUREFR_H #include "ui_c2bConfigureFR.h" #include class QTreeWidgetItem; class c2bConfigureFR : public QDialog { Q_OBJECT public: c2bConfigureFR(QTreeWidgetItem* item, QWidget* parentw = 0); ~c2bConfigureFR(); private: QTreeWidgetItem* itemFindReplace; Ui::c2bConfigureFR ui; protected slots: void accept(); void reject(); }; #endif cb2bib-1.4.9/src/c2bCollectionIndex.h0000644000175000017500000000167512045520050017212 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCOLLECTIONINDEX_H #define C2BCOLLECTIONINDEX_H #include "ui_c2bLogWidget.h" #include #include class c2bCollectionIndex : public QDialog { Q_OBJECT public: c2bCollectionIndex(QWidget* parentw = 0); ~c2bCollectionIndex(); void index(); private slots: void aborted(); void addToLog(); void help(); void indexingEnded(int exit_code, QProcess::ExitStatus exit_status); void reject(); private: QProcess* _indexerP; QPushButton* _buttonAbort; Ui::c2bLogWidget ui; void closeEvent(QCloseEvent* qevent); }; #endif cb2bib-1.4.9/src/c2bColors.cpp0000644000175000017500000000742412045520050015721 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bColors.h" #include "c2bSettings.h" c2bColors::c2bColors() { colorList.insert("BibTeX delimiters", &bib_delimiter_color); colorList.insert("BibTeX reference field", &bib_reference_field_color); colorList.insert("BibTeX reference type", &bib_reference_type_color); colorList.insert("Comments and line numbers", &comment_color); colorList.insert("NetQInf command contents", &netqinf_command_content_color); colorList.insert("NetQInf command keys", &netqinf_command_key_color); colorList.insert("RegExp and NetQInf cb2Bib tags", &cb2bib_tag_color); colorList.insert("cb2Bib digits", &cb2bib_digit_color); colorList.insert("cb2Bib highly relevant text", &cb2bib_highly_relevant_color); colorList.insert("cb2Bib metadata", &cb2bib_metadata_color); colorList.insert("cb2Bib relevant text", &cb2bib_relevant_color); colorList.insert("cb2Bib unrelevant text", &cb2bib_unrelevant_color); } c2bColors::~c2bColors() {} void c2bColors::updateColor(const QColor& color, const QString& colorName) { *colorList[colorName] = color; } void c2bColors::saveColors(c2bSettings* settings) { settings->setValue("c2bColors/bib_delimiter_color", bib_delimiter_color); settings->setValue("c2bColors/bib_reference_field_color", bib_reference_field_color); settings->setValue("c2bColors/bib_reference_type_color", bib_reference_type_color); settings->setValue("c2bColors/cb2bib_digit_color", cb2bib_digit_color); settings->setValue("c2bColors/cb2bib_highly_relevant_color", cb2bib_highly_relevant_color); settings->setValue("c2bColors/cb2bib_metadata_color", cb2bib_metadata_color); settings->setValue("c2bColors/cb2bib_relevant_color", cb2bib_relevant_color); settings->setValue("c2bColors/cb2bib_tag_color", cb2bib_tag_color); settings->setValue("c2bColors/cb2bib_unrelevant_color", cb2bib_unrelevant_color); settings->setValue("c2bColors/comment_color", comment_color); settings->setValue("c2bColors/netqinf_command_content_color", netqinf_command_content_color); settings->setValue("c2bColors/netqinf_command_key_color", netqinf_command_key_color); } void c2bColors::loadColors(c2bSettings* settings) { bib_delimiter_color = settings->value("c2bColors/bib_delimiter_color", "#A9A9A9").value(); bib_reference_field_color = settings->value("c2bColors/bib_reference_field_color", "#FFE66A").value(); bib_reference_type_color = settings->value("c2bColors/bib_reference_type_color", "#5EB7F7").value(); cb2bib_digit_color = settings->value("c2bColors/cb2bib_digit_color", "#39C9FD").value(); cb2bib_highly_relevant_color = settings->value("c2bColors/cb2bib_highly_relevant_color", "#00FD00").value(); cb2bib_metadata_color = settings->value("c2bColors/cb2bib_metadata_color", "#FFE66A").value(); cb2bib_relevant_color = settings->value("c2bColors/cb2bib_relevant_color", "#008B8B").value(); cb2bib_tag_color = settings->value("c2bColors/cb2bib_tag_color", "#5AF7F4").value(); cb2bib_unrelevant_color = settings->value("c2bColors/cb2bib_unrelevant_color", "#868374").value(); comment_color = settings->value("c2bColors/comment_color", "#A5A5A5").value(); netqinf_command_content_color = settings->value("c2bColors/netqinf_command_content_color", "#FFFFFF").value(); netqinf_command_key_color = settings->value("c2bColors/netqinf_command_key_color", "#D5A805").value(); } cb2bib-1.4.9/src/c2bWebBrowser.h0000644000175000017500000000252312045520050016201 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BWEBBROWSER_H #define C2BWEBBROWSER_H #include #include class c2bWebBrowser : public QWebView { Q_OBJECT public: c2bWebBrowser(QWidget* parentw = 0); virtual ~c2bWebBrowser(); QAction* viewBackwardAction; QAction* viewForwardAction; QAction* viewHomeAction; QAction* viewReloadAction; QAction* viewZoomInAction; QAction* viewZoomOutAction; signals: void statusMessage(const QString ms); public slots: void loadPage(const QString& p_url); void setFixedFont(const QFont& qfont); void setFont(const QFont& qfont); void setHomePage(const QString& hp_url); protected: virtual QWebView* createWindow(QWebPage::WebWindowType type); protected slots: void copy(); void home(); void zoomIn(); void zoomOut(); private: QString _home_page; QString _hovered_link; private slots: void _linkHovered(const QString& link, const QString& link_title, const QString& link_text); }; #endif cb2bib-1.4.9/src/c2bSearchInFilesPattern.ui0000644000175000017500000000746112045517740020345 0ustar rusconirusconi Pere Constans c2bSearchInFilesPattern 0 0 605 68 Pattern 0 6 Qt::Horizontal 6 0 :/icons/icons/clear_left.png:/icons/icons/clear_left.png Qt::Horizontal 16 20 Type: &NOT Scope: 0 0 &Case sensitive Exact Newer Older all c2bLineEdit QLineEdit
    c2bLineEdit.h
    clearB clicked() inputPattern clear() 561 13 402 9
    cb2bib-1.4.9/src/c2bRLWebSearchSettings.ui0000644000175000017500000000760012045517740020145 0ustar rusconirusconi Pere Constans c2bRLWebSearchSettings 0 0 466 152 Web Search Settings - cb2Bib false 6 3 &Add quotes to query Qt::Vertical QSizePolicy::Expanding 20 20 Qt::Horizontal Qt::LeftToRight true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false Qt::Horizontal 121 20 Search Engine: true QComboBox::NoInsert Qt::Horizontal c2bComboBox QComboBox
    c2bComboBox.h
    addQuotes buttonBox buttonBox accepted() c2bRLWebSearchSettings accept() 455 140 157 161 buttonBox rejected() c2bRLWebSearchSettings reject() 455 146 286 161
    cb2bib-1.4.9/src/icons/0000755000175000017500000000000012045517740014505 5ustar rusconirusconicb2bib-1.4.9/src/icons/annote.png0000644000175000017500000000675012045517740016507 0ustar rusconirusconiPNG  IHDR00WsRGBbKGD pHYs11(RtIME ) hIDATh޵K]y}^fh@/(K Ĥ TJ*H&8Y{E{ERJ٤ 6a?,E0` R =<:>ݝŌ.34T{;Wp ٳg/J)[9vO۷ns$o !ra|3?|-8qO ! n?8FkMEg5EQ_{&o_Oq<B۷k^6?R:[?~baal[o}t瞇077׸87,/'| 5 ƷsS5QatJN|)*T8cY %8 !ѯ% kQ6 .$DSi  ; `E8K6ж7 8صgKATQ)ﻛlH`zNT 41TRX8q%9AS;FT򣟿ι:G"m RA&vHe<4L+#Mwd0ʣ5Waǎ ` 88$}4,SBgDR;d x嵏m$Zgs=J ʕ6LL9Y'5$}s{R+V#=M_[dGb,6#)_w3v6[aTO# J23['mqkjs> y%~p|i42Co'R)gd2ٌiK: NI0h NXY^IXZ]VV@=TI6`ed]r3R'\ (CzR +D) y+N!<#mɇ9RI|n*[I@)!(iNR@ H{-8 biKgT @>3achVM9oڌ%Ԋz@/t R:R\xVs`wHsqf%@+8VvkCBkPk#.[ec1Q!ZFŽ \\N(^@ՐjY:!r%bJ'8)2Ep8k$gwbzC*Ѫz4 !1fZeyj8.Ư)pq-7j~·xAj'/@Ŋ_2?S#b~F2ř_H"%8|4r0<ɲv{K틌FCњE/ک= ߰:KI6ĆaN똨 |iJ+XIOE =R%CEs:J0,q9V/ I dRbds5`L(%Ip8d7wGWy쩧Z=]ujP{TʾQ ;s;+ZF\oirT}6<bgJ5~6QQDj$u}X),YQ╗}zPXXxo0| 9, sXYYݿ}6EFFVEVV(oGU>{lP}1 Xa/##:''Gv99y],V(--鳢_d`bd񐖖-#((t_EZ'߿g.!8  @>>H### 660&&F8edK2 X]80H  tXl@.#Zhp80>211a5 XT{ׯ`P  4d)3?`d0l @.G**B@#02@"`ׂ bgge+(EaIJcV ̬  ZFx9?s~:T@,?f-Uyjk] "P<~2`;L8 2b07ax+,̽RR,p32?0W!޽;}}w[[[ _~oPR@182| ߯Du'Lw>ܹϝ;o66VN`@.0#\@׉ 02ة1ۨ3hK02?tƷo={\`Dmݶm3gr|+0>$ZLf\uwkފ+k&bdxAիW W5YXX,vׯMutt}#+@ YMXeE8;Tq1p1K y&M7  J-^ 4PB@@ h&` @L̜Q,@?203r2 0\}/?s' *555?*ŷxA' B$S*0;$R`pC\ 1pqq1k87n]kXī _ʞ񟉙o2nUgh,3ؕ2pp0(10g<- +_VP0`dd&??{ ߋ+ "?~e HD1baa&''m mq mee=XWo7YE: 0X2 Χ0A#IIENDB`cb2bib-1.4.9/src/icons/viewbib.png0000644000175000017500000000364312045517740016650 0ustar rusconirusconiPNG  IHDR szzbKGD pHYs  tIME 5V0IDATxڵYlT眻̽3oclL6b Ȕ%*oU**}H#"A] @-F iIU؃>\Ƙ͘~ѝss˹#1T'nM~za׉;-l^M2880D\2LxxmFJeC&[ qRo> `f铧͍RFQ1H)R (54ai}ϟ߰ˁM)G ?#KRJR\6G!3cGPVke`CGlʏ~eDcx&|e`S4' shL#A@z3XxtR<}WLs^9R c;c΍!y}߼řӃ],`_ÿ$}Wc['׭˫?s&W/fDA)1\|c#OlӞ,F.W }dcJYcd6twԩ$1+I$=VP[WCu`_75}`j"gxM?~s1Ą 5kY2ߟ"L0kvƀc@k=UYq k'@ qgl}_4NZ c+*p2zYT4Rߟ۹iW4s BqEpZ,9.MU#xan8O<Dk3V%gK9qP !ĴӖ#_֜I" {+c X^+_{P^vR:=Z31xL?Wlc*>S2N1y5d6k;Gqyy.d'|JD6jbѿo+{ұz]"}{#y˵?ꐴzU8kWpמ_5-EuKdihhhd^ IENDB`cb2bib-1.4.9/src/icons/citer_citation.png0000644000175000017500000000121012045517740020205 0ustar rusconirusconiPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDAT8jA{{zt~t3D.$;w">E}BB' n 1C({zgOƉ \*8sJ  l5`8==PUT)`*qӱ7l'"LjS0Ûpt 30i.45.p\Aj ::6NFQ9F )FPDa@/& EY7ڝ ԁ^v9 \$ eY'*IϿ"б~6yj&fFQ "z8h.4 Ð4IMHB{ӫ\t",--dY6C !2b0 s)e~~qD͈9}Yvg`gƁf@yA+}D''E}BB' n 1C({zgOƉ \*8sJ  l5`8==PUT)`*qӱ7l'"LjS0Ûpt 30i.45.p\Aj ::6NFQ9F )FPDa@/& EY7ڝ ԁ^v9 \$ eY'*IϿ"б~6yj&fFQ "z8h.4 Ð4IMHB{ӫ\t",--dY6C !2b0 s)e~~qD͈9}Yvg`gƁf@yA+}D''BE߄̈́`ihd`aZs8mkd %"$$ @FE@vNkj-DBBBBBD"ICN#????icl8VV+V]]]^3333V++VW333,]^33W]]]WWWWWWW]]W333]^333333333333333333,]^33333333333333333,,]^33333333333333333,,]^333332,,,,,,,,,,,,,]]33333+,]]33333W]33333+]33333+]33333]33333]33333]33333++W33333VVW33333+VVVW33333++++VW33333V+V+VW33333+VVW33333V+++VV+VW33333+++++++W33333]]]]]+il32˜ʛſ҇ɻ­·ȵЇ҇ччۀ ЇЇ·džͅƄӄ؄ Ϻ׹ބ  ݸŻܦĸ߄߄Ƭބؠ֭̓ٷׄԄфj΅#&""##̋ɋŋ˜_ſgídns~wd[[dȽd侪dچⳇdنdždنͅdنƄdӄd؄[ ̶նބ [ ܵ¸dۡ´d߄m߄mŨބmכʎԩ״ׄmԄdրфU|΅̋ɋŋ˜?p|}ſ8WbcexĮ|zyt6W\TSV^gpwywtoje_cjn~v?X`_a__acdgiknqrtxz|w?Ybbegikmoqsuvxz|}~x?Ycdfhj lnprtvxz{}z?Ydegij|?Zefhjkܗz?\ggikmˆړ?]hhklnˆdž?]iilmpˆͅ?^jjmopʆƄ?_kkmpqӄ?allnpr؄?ammoqr ʳԲބ 6dnnprs ڲ?jpnpssоٝHmnoqss߄HgnortsބHenprtsĤބHenpsuuחȉҦձׄHdoqsuwԄHfrsvxyф5RWY_e`΅̋ɋŋl8mkvCB3fm闑f7422CBBAGv^ it32W ƶ˼µUUm|qsx¾m s¼s?!fĭywaݎ$¾~{yɂԎف׀ل%ǽ~ԀܐҸցׁځºǁƾ݃߉ұǃρ/Ǥµ߁؁Г΀>|فЏ x̀:ƽ~݁z rȀ8yx~Հ׀z mļрzxvuttry u mŹ7~|wvqpmt z mȺkehinoqswx}~ z mɺnhjkoprswxz{ z m̿ŀƀ z m  ɂրz mˁ̓ʁ͂ЃӅԃր׀فz ḿςЁ҃ԃՁׂ؃څ܁z m΀΂ЁсҁӁԁՁւ؃څ܄u m΀΀πЁсҁӁԁՁׂ؃څ܄u m΂ЁсҁӁԁՁւ؃څ܅u m΀πЁсҁӁԁՁր׀؃څ܅umς΂Ђ҃ԃւ؃څ܅ uḿπЃ҃ԃր׀؃څ܅ u m΂Ёсҁԃք؂څ܅݂u m΀πЁсҁԃր׀؃څ܅݃umπ΀ЁсҁӁԁք؂فڃ܃ޅzmππЁсҁӁԁր׀؃فڃ܃ނ zm΂Ё҃ӃՆ؁فڃۅ܃ރzm΀πЁҁ҂؈فځۃ܅݀zm΃ЁсҀzm΀πЁсҀzm΂Ђҁzm΀Ѓҁzm΁Ё҃z mπЁ҃zm΁Ђҁz mЃҁz mЁ҃umπЁ҃ψ8 mЂҁԀӹmЃҁԀúڢmЁ҃ԀѶm΀Ё҃ԀڠmЁҁԂ ƶm΀Ёҁӄ ڞmЁׁ҃ ƶmЁ҂ր ڜmЁҁ׀ mЁҁ׀ ömπсҁ ԙmπсҁ ſƙmπҁӀ ʜmЀҁ̞mЀҁ׀ ѐmЀҁ׀ Ӊmсҁր ҅mсҁՀր ҂mҁӀրԂmҁӀր ԂmҁՁփՂmҁԁփ  Ոmрҁԁց ߱蛅 ՂmЁҁԁց*С蛍ՈmҁӁՁցؘ߯ۯֈaҁӁՁ͑黭ֈaҁԁփ򰧯̾܍ֈmҁԁր󳬽̉󷧄䍀Ո mԁր𠐁Ո mԁր 욋Ղ mӀԁր ٲ鎂ݍ Ղ mӀԁր ʨ獃֋õՂ mԁՁր ˽ɔ׋̼ʾԂ mԁՁʑΐĴؼԂ mԁփ񸮮𫛃Ԃ mԁրô褐방 Ԃ mԁրᕉɬ䑃ėт mԁր،ލԡт mԁրĴӲljɊς mԁր񺪅̵ξ ӋςmӀՁր졑Ե𶦄 ΂mӀՁ뜌͸ ΂mԁՁրꑁѸꗇ ڋ˂mԁՁ˻咄 ъ|mԁրꕅ緸-ƾ¨ˊ˂mԁր=뙉ڲ龷ݼ⪝|mԁր)۪$৙ծ|mԁր%NѨ㱣~#ћȤ|mԁր%ު~迳|mԁր踭 |mԁր|mԁր؁|mԁր؁|mԁւ |mԁր |mԁր׀|mӀօ|mсЁ Ҁva¿vYv6Bad``^`aaccddcbapɿv)KNIJLKK`ǿvHɿvAǿvdżvnżv|Ļv|Ļv|ùv|v|voy޼ixٵkD{Ӆуσ̀ʅɃȁƁŁĀ¼o41hzÄp\(!#7;686863431! ƶ˼µUUm|qsx¾m s¼s?!fĭywafm$¾~{yf&~mǁƾm|9µ~x_|5|~v Pt{3{|dLszHywxz` Hryр/zxutqpor`Hry8{{Ŀyxtronhl `+Ht{uoWSWX[]_`deijnorswxyz}}~~}{{zzyxwvttponq ` Ht{ wqUQTUWX\\^_bcfgijmnpqttuvwxyyzz{||{ yyxwvusw `*Ht{yvwxxyzz||~~ ` Ht{` Ht{ `Ht{` Ht{`Ht{[Ht{[Ht{[Ht{[Ht{`Ht{[Ht{`Ht{`Ut{`Ht{ `Ut{fUt{ ۊߒfUt{fUt{۽fUt{½fUt{ԼfUt{ fUw}ӷfUw}ٽfUw}кfUw} ׿z8Uw}ѶUw}úڢUw}ѶUw} ڠUw} ƶUw} ڞUw} ƶUw} ڜUw} Uw} öUy ԙUyſƙUyʜUy̞Ut} ѐHt} ӉUt} ҅ Ut} ҂ Ht}Ԃ Ut} ԂUt}ՂHt} Ո Ut} ܮ畆 Ղ Ht} *̞~|敆~xx}Ո Hr{֓~|xxyz߬}|حֈ Hr{ ˌy~}踩ֈHr{ 򬢬ʼz~ۆzֈHt 򰨺ʃy~yՈHt} x}zyՈ Ut x떆|yՂ Ut ׮{ۈ| ξ~Ղ Ut Ȥ|ԅ{Ղ Uy ȹƐօʺǺԂ UyǍ̋׸Ԃ U{ ο񴪫輪|y Ԃ U{亂ꬥ|{ԂU{Ȩ}‘т U{׉ȿއ{ѝтU{ѭŃ}DŽ}ςU{~ȱͽ~ ӄ{ςU{읍{Ҳ~ x}΂U{뗇z˴| x|΂U{|x϶铃| مy˂U{{xǺ Єz|U{!x峴-Żɿʃ{~˂U{?ꔄyخ轶ܹο|᧙|U{S}٦ッ࢔|Ӫ|U{'︩Уᮠ}x"yЗz~ƞ|U{!ݨ~xy罰|{xx|U{綪뾰 |U{|U{ |U{|U{|U{ |U{ |U{|UyvHtyvLkov(1MNJHHKMMNNPPMLK^ɿv <>:9;:QǿvEɿvAǿvdżvnżv|Ļv|Ļv|ùv|v|voy޼ixٵkD{Ӆуσ̀ʅɃȁƁŁĀ¼o41hzÄp\(!#7;686863431! ƶ˼µUUm|qsx¾m s¼s?!fĭywa3H#¾~{ytqrx3\k'~}qHVbǁƾ~~n6LNYZ[^ijor.nljiefjpµ|{{yz {z{{zyxwwP ?KMVXXZegijmmnnjjhg(ms|{~zyzzyxxwvvP 5FKXZXX[[_``a0ccgips~yxvu vwyzz{|{zyxxyywvE 3EJY[XXZZ\\^=_`dguyywqoppopttvx~ywxzywvB0EIY[ZYXWQQRRST[bр!zxtronihedfggh ijuw{|{ywvB0EIY[ZYWVPPQRX^{.|zvtpojifebbddeeffgitw|}{ywvB 0EIY[ZZ]\WVSUTKICBDEGHLMOPTUWX]^_`bbddfeeddccbbaa`__^\\[[XWWVSUdghi jjkmvx}}{yzxB 0EIY[ZZ]\XWTVUKH=;<ո)9>DEEEEEEEEEEEEEEEEEEFL_ո)'+01111111111111111112:Nո) 3ո).ո))ո))ո))ո))ո))ո)(ո)(ϲ)&Ũ&t܉n b{t[  .9\ckllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkc\6*  )CIPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPIC(      cb2bib-1.4.9/src/icons/clear_left.png0000644000175000017500000000060412045517740017313 0ustar rusconirusconiPNG  IHDRagAMA abKGD oFFs1 pHYs  d_tIME- TCsIDATx1n0E  !ؽri(L"7{I"1Q/YbF|ȿĚ^<4mdY9u]p1mqα+9ڶ0 ZjuzTޯ i&>e*`&Ze1ޣ_{TU#ס7 !|Boi9g)ӃQTUb$0&9S4^""o/8k]IENDB`cb2bib-1.4.9/src/icons/connect_established.png0000644000175000017500000000425212045517740021216 0ustar rusconirusconiPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?@bbh+++n\ 6 ,5PVVKKHHHd1; (W"::zŋ\mm???GgUWW_LLD:::ӦM{p&Mr(e@l ""Rɓabb2Gv@e1_DD]v;zW@)KP-t j@ĵ-0~ϟ9s={r9(%b\VVVB&&&|@ŝ@*\]]ہAjwD.5oƍN>ժU| 8ܹsnݹs}}ؽ{G'Wz90@(lٲ]]]GUUճ&((e700POʋ>ׯ_'O{Ǐ:u0@ * rpZ aaa ,985EHsUTTT޼yï_#߿O>s޽ Y򿲲rw󲚚lll.9`LA 0M*uǾ~ ߿` ۷o_|-r@,q)))SSSA 쫹 `z*ePI_f`x"8A ?~`89⿱}}@@ $L`-nnFFFRfFD`J^8eʔ322WVVv֭Ϟ= sPE !o޼XԜ4"$꺮_֭[Aĸv(jhh_TTv PO`F) @  ɓ'{߿߿l7Q*6o̙AX0onn5ӧO?&&||<(ZCn[l9J a Ǽ}_zٳg`]v?|9[@!J۶m;&338`4,%9r`a/P6~ Ǡlg?cǎ={62P A8f^ PPb9 P,P00T, P|r¹sX@ĉA0SPP[l)L> t)HBMM- X7o~zpejzgzN/9Um%"RJ6"*{\)e*BBpE$9'8  & zCX6h,ATg%I趌*ͳ}*:R)erp8deT Z'T $:iE0 {?Lzji/,^tH*Q^V9w,V@<'NѷT*RJbi=oss{70H@ZF^M ’ #GF(wb94& (]7  LLLHAeGկ}C"H""0h?Dh,"loosQ~hhǙfIJh Bs,.-WEhuXM NM1Lbii]gaa'F>X(bX^^f<~@{'H.@,nݾb<-@SFw>h44 $$YhiydzYΕ{޽{G3"ͷJ}LﵑX_ve~OceyQrÚm{C@'n@%mQ=n4LLL^+.⋊`&Ϟ=ò,* m˃vCGS )a8yaj}v|x|ЉYH2g $u}1{G}ǩ-_xyH0 Ξ=˙3gzdwL,EX___ҥK78EJ}VD ͛~XVKZ-666W^nf(CZ|tec<,ˢ^jh6lll4]c`#EV}<#R\r">>{~b}jVfff5MD)^w8۷'O,OOOK g10AGC~[T 6-yŞdxܻw.\/Dgd +| x&ҦQa6?^䍰e-@8'1h^cH s!:z " }rjIENDB`cb2bib-1.4.9/src/icons/tex.png0000644000175000017500000000426012045517740016015 0ustar rusconirusconiPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F&IDATxb?C~~EEEE߿@ A!Pp1FFFO<:uT bI012ep 1 ǯ _~(A @P@051hH24Trx F *\Ato"WSPBH̋nEKit`ەaI5bAŅ [xPM #X;ЧL3: s&W30<| Fo? Ѡ1a F#8\FHDC s /'0 1*?g`eac:X6r,(d@@DDELQK"'#Mh 1@ 42 t pX\쳿q(7(CgD wex%4'@@11sdu,gbbbPSScFQ @,X Cv#T[[[Dt Cs ۷o( Rk[Y +pOEI,/ihL3ЕO |uN;Q`v0K돿1xq2Xx `YTRVAJ/Uvxʠ'g _}g`bmfR+r2gga CnR2 Oa8} 0|AY!'Pǯ yDQB PÅ/ڒ.*R X-30pK8N6V`Ej-`o2$3xj1+`N>| *L(-7bAnkp'/N ;LW30> +ì} eq20s 0r S B \|C/[yҪaW,?0t 7830!}c l%S(r0l&@pm'G&`B?` .fΝVQ!'@=~9B"4Ɉ7V899QJ=666w1־5kV̙3$j,1?~d{5m4; =D@3 ˁ7aY#888^~܌a9MB~ ۷oa~]=@0+ @qZĂ'Aoܸgɒ%̙r FPɹ,++{B|ŋOfϞmz/7#4 :rM@Pv0HyW;IENDB`cb2bib-1.4.9/src/icons/configure_files.png0000644000175000017500000000202412045517740020354 0ustar rusconirusconiPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDAThYkG7RtѩPr2O ]eb|5%/uNL.bpIVֲzDZ3ff͘ iI@x6G////DQdm8e=:3Ƽ> "[qf7:Ԓ uĦ)91_nCuƦR 墭G^U^!Bwq 0ԺoGhd$s3(Mmk1(QMU]W(~v ӈ4M_Qv4NʈUa(FGUzwwwzp8W՛ ?58p8U Oŏs[axU1[q6IJ.|(9 " ðXkP1u&0tG__а ߙ瓓_}%JA0#_WUqp΍(nxpf'hn ֎3}/$0ƌ}Jᜳm'r+"i̺7 ëZ@QWU&AðZ`0Xn#v  Y[HLi dhrq6Ƙ x]T `@H$A rdWD|&Z;"{B$#9CdϚĕަmzF^I^__Ϝs/*,Twۜs=3yI$L$t唨jS\5kw9 A,&I9/^ n&}X",oUeH,Vr- 2u\lwVwY[]eSm (`߱;7I@x[O RIENDB`cb2bib-1.4.9/src/icons/add.png0000644000175000017500000000030212045517740015736 0ustar rusconirusconiPNG  IHDRRW pHYs  tIME5;xaIDATc P#جRpgA1Fc 7ԡ3.nb`e贄뻸 aB(1]ۏ) F;#VNIENDB`cb2bib-1.4.9/src/icons/edit16.png0000644000175000017500000000126412045517740016312 0ustar rusconirusconiPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<1IDAT8KHTQwhFȊ"6!-jS @M=E !BI&aQ"Z1A0HHih;3k1#>8|sϹbfHTˀH8K$k>ML3jffTʲ٬u<>DVW/ퟧot8q 33 13ZZZ=@%U13//\eH4IENDB`cb2bib-1.4.9/src/icons/fileclose22.png0000644000175000017500000000204012045517740017320 0ustar rusconirusconiPNG  IHDRĴl;sRGBbKGD pHYsvv}ՂtIME  T3IDAT8˵K[Y?1$(."!tfE7rۍP:JDz,&m´Iy%h˽w6d0̃û9s֚1o e֞{vj۶mqK%Rڝm۴Z- @wd޺ޙ5XeYq w4;3%)N{#R(0 \zB$CB>|@:FJI84M6`@ i(0 mp_JO"^zH) BR С,T*i /B+f*ax`۶QJQx-_|abb7odXF!@\.G*"Q,y Vd2Ifee%޼ym>uT*j5=z$w%#$Hp5J<~G"  133˗/q]L&Í7V|ׯ_S(bddu`zuzzxH$B6֭[TUr$I:/^q*NիW.ru\ÇlnnAh|聊+ vbS. ÜC&attԴփ!^t:X~:{{{DQ88:]>grrZ <{O,wӧOH)qf=ܻw5"m{$Rϟ?s&JGhBܖRn).F*1Mf1Z~,Aࡣ4B$%Uv:_ `0hFq)e)aԔRcBsnhIENDB`cb2bib-1.4.9/src/icons/package_network.png0000644000175000017500000000511512045517740020361 0ustar rusconirusconiPNG  IHDR szzgAMA7 IDATxklucg7i-"UÖUñEl#mmAO i"mC/ ȇARJrWmzТdo.].1;3sY2q6np0`9gFAmcg=ՙ9ґL伌'%a^_U6f͗)ȱ>3~nfjWyh>8]ضֆr-rKyҵ~xL@NΓO%S(ՍcJii iEIٵV͏.}:p" >;{C|ά|1 6jh6(fub6)WCS[LJ545eHfWu~=/u۝>qC FD+Ak1iI$AJiDhD0?{7ǶMGN1$\]US-:sRhmڮQ:$w#3]o,$`ė~ч?_;цfbPdi%ORR h4aD=h hgo!4JiaH74;? @<~c_gh0z% -aDibe%a,19> כ8eY()mPZ#-$ĉ&J=Y7Ëֈ o$=tg?KKA@@KgTV"hFzg~W6XX#$E~Hhz{Q*)/6d&ϯA __Da> 9"łV4#g"0tucl)%@o/}`H 2MQf`aU«ǟ>05 U abiVhE103ˇO BiY!p~Hrpс6׸4WPTIoR\N6R ±-l[ Eb6 +@UÞ{mMwvvr1ό>묮ut"xl[O=@_Of+xUsQo$?zJdh9>=fd[;2Ӕ*ey%tt bLϽpr%`zz}C j&2J)lV#"DZ6񉢘oS 4-0mik~̵5&$(NwGƵYo.:z7涸pmrF/ͪ_Cf l&Q+}BN08ıBiApcWy ߯!'оarTXZ4(*J'..^'нnNnBlrcf3&6.sy.m;-L9M+5 ;/MutO7tM ;qm|o.!$5^H:H!˒R.4f%@~ jgϞca'A cRؖk[Ms-~-Fw__}z{a"`SA"I oԢ¢/&~ᡛ\NK&Tql\2MƵy|Yνz#- r^61z V7\z?`wj۬*I_ɱVj:8Qv4l& ,2(m\!1FPHip*mݴ6 $?nnTQNNϜ36E {s3LKK{WDD$D *'%%XpYfZ?!!{bb=== Jhee:׻w_WWCWWw ;;{6P݁Ptɓ' "ҙk:ΝrppTAiMcee Bl0YPWW6ms_v{{@a_ @V-9翪^ WpPA\ Ogmٲٳgϙ3翎:2226WXyĸdƘY8_ZZO@@ &=eʔgGgP|&)@) fK.}~/^wSN_t!@()jhh(d.,,f7oƌA[DBBB_~~ׯ?~Q__2`q^ojj˟@7P z"##3.? ;vu _d/@!;l'05 p&5(0-ȑ#@ٳ_ӧ  >7n;X0g  PYhQ%%U@)#X]vcww@681ʁk׮/_EC.\N\sd&^–  9y\S̤I?~lً/qp8 @t]]]?0 H*ݻw_\uցt[[[rξ}Q Lg*@`` ylx޽n9nn.ؑ qP!X ݃ {he,;w'رc`>(=lذ5ijhq  v@HH,YժU`Àu2P  GBTK@z`| l"DPl@ d٦MWTT GȲ3gx"8Jz{{ `XBPk f9 p:X. CP*dyyyx?ap"%ӧO߶m+WAxAmPX *9졡A d8(@9۷6F%(Z@ (t@YsѢEMLL@ź% @V5zٲe`A8lhTf߳gAB%8a345 `A&` ?DžG`:- A a\ XT3(wBAG>@*P@ZZZMFG(PXYВ T)(^Xf-,,N 9V1@Jf0ÆM3408 `%5cPJ @d 4P5N@)XÁJ8`&"( @忐t) `kk; -A;g@a/,鄠,\ Ϝu@a Rd/@`WPP#++S%=#vhJ!%; @0&?PIENDB`cb2bib-1.4.9/src/icons/fileopen22.png0000644000175000017500000000143412045517740017162 0ustar rusconirusconiPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵjAS6DР(AV\$H|"t% DшD$LgRt:3ATMM}]d!y)LVEB. ...-͆"9JL{F9.TN ~0N:1}4|ϓo@UU̬p@8pn\9 A]ںrgo>|rZ ̻(2TZ~X?TQ| cJs g:-%F)}>:qg2] ߑ}:`[:'Tkl2tC)hXk Pڕ|gr|sY&O Z"P_, uJinsO˩=5<FZ7ȶzcu#FL7 5\lАR4(n 6W560v$t# 0 oŠ^pJ=(dDF`E2g" wWT| 5ï?;S0 V$`!'nMBtf͆QG(\eY^lw1Z ou"fتghꭼ<}D0#WM;JW/pj]{8tg{8xK/qTyIENDB`cb2bib-1.4.9/src/icons/exit.png0000644000175000017500000000311212045517740016161 0ustar rusconirusconiPNG  IHDR szzgAMA abKGD pHYs )ItIME CJIDATxŗmϙ{U^UR]hZ &,@# ZOY PZRI h"RCT$mn\5uwwvWo{̜;slB syM5o2pp}jJ5vէ3{Jf5֠528hkA;hu68s~޺c;MlM14&dZtx!˜@Y7x-ۙa #o<PH褘ː?GyɅ{O<ǹ矤ϹP 4^Dm?:~9c>}w/O.D"k ^OS ]q@SF3L ڬBH<$\1?[m.\/GDW]ی^&neW{y5 }OѮvP_dڗٓ"e&ۇ/|l -(PTO])b6SpX(Q1$fn;5ZtE^-B^%".\YSWŗOfRݬy i߅+=.P;R1t>PI'(2#_-@7gf‡v,m9"a+[T\u\!p湊?ڽ/Tj\ElJO7| P.eU/-@]:Lk__5~1 ^ɛW |կjy{G MB mA,p+ϓ<.M?o0?DhlYBjFv) wFF~Tg{,WR~I"m#\Y1)#,{s/D+N] b2t9|f*S4,aM4,]啢@>>< 0nSj8vJwӊ6:h_709| u⭊z"?OϧG;6Ja"ETXq,>r;sEq1۵IJEͱۆVG B)0nswl|IT;Q@}Ӛ]c;5}v{]֔ ˣf'=^Ny<\^),IENDB`cb2bib-1.4.9/src/icons/edit.png0000644000175000017500000000313312045517740016140 0ustar rusconirusconiPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb;pΗF~! 0 Ad]x??00\ w⮪ @xKDRp]tmG@_@?0x 7oĚ @L$Zƅ @K6`20|˝pc`e(Q Hr(\Y!+?@Y #% &* (n @,X @?c|;si{6 y3021m&@?0',W_~2?w@䀿ԁ ?QKۖp1 @D; 7h`(1|N '+3 Gh~2M^5Lfo e}'/v@00d- "02a:'330{PyFB! r!0 JwV0pkOz3ܿvA4/h'lA@q( :/O8XMr@ tWn(>###!lw((8T^fi9Nb? /gWP4  _ ?jH #@tbnFvP_Pd`xCA_%䟟_&_aɗO @CZ} < `ŋ } ~f;?m Xp=[ ׀ 1<p AXCb^e JF9~1e8bwЮ@dj^KGO_D ObMd`': P(fR(?@`D{{371(>ʹr!?6+(q' i D |s-( s;; ''(MR8c X|/r@ Ïj!| h)++$tFlFbဿH ,LK!gZ̕,XJ1K!pŰm< 6!,ـqDv@`~c0@(0cӀ9 `eLC; FX>(`trIENDB`cb2bib-1.4.9/src/icons/pdf.png0000644000175000017500000000362712045517740015774 0ustar rusconirusconiPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?C~~E?aJCy >\ꀀ-})SX X 9/&&!A|vvW*hڄ,, ?uu򫫹@Bw? .0003306 K20~ Q1 A a܁Ă6 w20ܼt!É 7n00 hAakPhClT-@ A|b >,(I?P,z? u$::VPrr@^Q`߿ Q]f!aA   d(9.ᏸ   `Qd ,wJ3ß't})B ZF@L $! W#|bH0C-Dr ӋgJP?@?`{ &).\ rq3f`D%0rĄj%@{X*b`Wf$p#/3 9tѾD1>.?VLB,=bPG@ 9ZzY ? d9bl &B A6?#Т}S]&2HȾrt1AR2 u/ 98v1|{ @LD% \ | R+޾``ᯚ_K`p * T2$Xvm`!"™T0?B W1pD1Te`333io  ϱrOV {2pKj 2jx޿fZ $7u}(E'a X XZ 98ȴs 8{ mإ _:F L1|o?$0..g=q,;>[3|+b`6Xv?C+.ArÁ# *(2) @8X0?< _?321_`nE/X  91) Xs"W@+` ̙3g̘@Le& X~`xR0Y>زg[GӧO*R@!o\Z؁q*R1@?;2@3Լ6m-PL@]x0ز$ፅ;CR18-LT)J2˗ȖF BT:?#>X12@$ Kpȡ8OPwvv,A9 fgf` 4V !l/|>a„ ll$,۷o&OpZJPTTT4Bo߾1>}dz׶v??2=z䤸7og9z&IENDB`cb2bib-1.4.9/src/icons/clipboard.png0000644000175000017500000000102112045517740017144 0ustar rusconirusconiPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڅSOP4qf?_j,,$+)N2q&2&I4z\~^wW%`t:+|~}8gtڀHf!(J_d28VT*Bir| !(d۶mr<UUq(IٌqLSj a|9bXM3˝ 0 Ƙp!+{1v_Ǔod~Z}4-ۉ=6/-eHCIENDB`cb2bib-1.4.9/src/icons/configure_bibtex.png0000644000175000017500000000534712045517740020542 0ustar rusconirusconiPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< dIDATh͚]U!$Yݙ/K7M03/(,}XD٧T1ĕdY0 AB,&!3q:L=]u{>=LQuϹVRfBlT$ ! - j:n[ iohXM}ZaZQ!Q› h*M3MUf[9!SU0- @84)" QkLJ"TF2"V "FR [j\ <s#wt蘦|0Bt]G X/a(d2lShIGJZ𠎎#uq=#P"oI A˲p]7rJmmcBLEID2 cRj %0X,.L 64wqqyܟu]r$]]]`f^nl\.?Ϲs8}a\5}4:Q49y$SSSe[LӤtZʕ+Au]l޼7| 6ݖ@{:k$X%49Mdƍ sNnL u'}T*3<:thy}xu]*a077iT*:loo/vb@?a;@PJeb سgccc|mKKJM"~\r>Gn3M:<UU9v9.\`lٲ+W.#4M \W^̙3Zj]P8Kڋj0M9_J"jTY+ʰRtG)'''e8s\[P!@۶qr4tuuDwhFT\MJ$G~Q_`j̰n/|k$Cͻ[,=jbHXd||||ppO4&I!x{3L$JC Ͽ \! ӯ , .#R={WՋ/@KP- qW:$8aKTX,r WI:Ik?m&Z<Ľ8z$ݻw/ @u!idl-Y{.]]]J%~ǟXV/fQ\[k˗cǎ(`YlRMQ.^xfǎ{GL&*M , o_^ 𨏔X!t3Sl'~-ޟ4.rcO/s\ro an`i# j$->z.wȚ<>.=%-ٌKgJ25\2> urYXxģK|0J q]3h'qՇ sK#=ͻT>ȸ*]%?> 5/0KAL8˳etOGDdoNZ@u7P$3I%5,Hc-iiӈ h6*+]|Ow m,ږO6/ F+**^!gpmժxۛ76YHy=;/ٹVC}IENDB`cb2bib-1.4.9/src/icons/filesaveas22.png0000644000175000017500000000232112045517740017477 0ustar rusconirusconiPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<NIDATxڵmlE{* J[l b@LK/Z*؊Zb%! /@BP 1AH  UFP- \KKzwۻٻu6Yf63>8t]`ieUO ȱm}s=N%~C((J 7[عm H`NCC]ݔc~\ ]ะ0b3veeb{#yi:!( Wҭ D.1԰g{W+oM_&<Ӏ?\D$*k]Op,LWC dYú Rlm0XZC$GoX茅g; TmcaS-o9+9_U$` `9=13i?:#&uJ.=qgzV,QXE (3y[lfױs3ޢy&xf*65A!I\Ī-R>EF~&ol%A&+ޱ,sBV^⦪du]2nL0$28"R̚ZH<4iΟ"+/;n~LKNK/OSiڗjG͵YHE D~*Sn1M|guR\m s]_ҥ%0<7|EqmjvgYK$B;`~3󜈬<09,>1;9mib\vO{wMYN5zx<Bcd1ڔTT""Vh c0sLd6 *UsED@ 9𻉪*O濺7"ݮYIENDB`cb2bib-1.4.9/src/icons/configure_documents.png0000644000175000017500000002610212045517740021256 0ustar rusconirusconiPNG  IHDR00%bKGD X pHYs7\7\Ǥ vpAg00W+IDATxڵw|TkOIT%RA(B&(Mi"%4A)  M RB EIAZh %$$M&3{?٠r<{fgGxmC̐!3"Es>|y""Gh/dL'\r)$@K+;M.Mn݆KqjGZmk<=yztYcbtaK-^q75yi5GWj_Gw6G?8L^|Gw<<}1oW>r$vpQthW.s̕2)U 7Sa=aoS1|Ti!%#.qy*]Ud dzhmN Q@u)T&r\p,tWImi>}~PNx<;'l S.vJ>1 2sLݧڨƩ}*R B6  vv$-I]U=/x^(?x'?ISx3mF[#/x/ uSr98C)>5~T9l@m>g{;YՒtQK !qJ7Y\z7:1q ?X1 ^uSpι 㮽sX}|Z> TWUB{笧ZӇ ^^! ]d њ@i P4#H4^b@/ mIGQ 7nr>P{>d uS P*CcZF-uS߳ó~ 6mIM^5QXRJ)?}0m~5a/y2VN*i{(LE%rE!UJ+~+&-ME?L xvȿiX pؑ# [&l{EMџ}IY^^u}zNE: CB @Aiu( ~2 )VM¥":A # q@dڨ6"2S{G{$YR$E |!L܎|ݲuU8<$uu +Yrs\2yV*O@1A%y+s>Z3{gpl6cq RR' ui4v÷emU'8xӞM{*Kekg}ML֨+&41Hy8 + H0S'E~9#dArU.ELe*!cۨfxxxx8?>l|gxpI]Re KddI\ `1: r%&-m=8΂+ROiU4苊j'~n@?vs@^Ԛ I+.풖%$A#rƨ U Dw$WU,$@$K2Hs rY.x/K \F[}!HÕp \DXYr_s $_]< dIF! ^qq ,1c@X:Z:޶GQURI8c|6ly?2s?} 3R[j+U ][]A HX 1Qͦeh u. c{rA.y9{l9)'A<. KL༺< cDNq(\.2ٌ.@2$S΁|-#0- JԪU#[3:mtcVO?>[vIWCcR66l#Onߟ @@N( EE!EAuRԳ:U ,Zd]rV΂6wm nI9!2W悺E.+\?%.q/$2$W9Ed.)5~O>WZG>G aLL:`Sϧ.k?k?PWF{{oڡj g7|6m6F,B*)FF`ooYbUu CJ06mp6,:ZWlM=~ D-^*CUg͍xȒcbS 2GUeuUp(Ŵe#Y$ْ &&5ߘl3@ tXR&kXb[ʷCvyk3ʋ͋Ӟ {& ZΉjhmh#7ܜޏE n }7& TUUk֩u /} QFjw}O%: _-,󀁌gHc$H Mi Ƴ6}+H}ܰ`,,]-߅Z N (q e }C;_p˜ݜAI+u^]RaobE>2x_h[H6?j@7@a#2MMtB9ȗ0R6xA>Bf )+`Fee;ЂJzm[-lKŷ@t$?(Uq7jo4 L(^2#G s4|B"S@&faz}l+`f`(f8-'1'h)A Ozڎ'67ӬH%r$IvZ[m\;͎6 BP`h h Tݪ5S_ٺ_( 5: n& H6&53BP5EH@B)қ~*S='q fp ˼7y o60{[g;+a~@kb C詆 #W?Gxj3Ԇ341b'HHsή.ЦIZ4mt- A̓@tII02@}%h @()r wOI{OPTMC#CK>x>N3{k, M5!/ぃ^'-L3vM iD#x3?,:Hi$@n߯K )5,7.UO[Wۀ6" (sņk!m|KjC^Nw :PDzb U^"PT^QJy Zee6, nWG?р^yӝygA&zjDI$JLvdL]3  7JPrPy7l~ֆjn7ƃvZZ(9!zvPy:6z_BP8->HmSpk˾}EPf3/_Uw >'/h^rV\y&\.;Cx8mmF͚F{i!-*$A -H5a+c@f&Xo d?[ Js3d6_MS֧@Fɛ Ui rXˑp,l&.K8=.m) Ó#;)4wu!M7A'{TYYxBuXa |!YH5gTO}Lf `}JPL-oT$Oэn UNuPc;;- cMm'ed6̐AM~6ChX[0J(\>%} |TJffrV w'Nh+Y`lko-=<0q|/ٱdG^C{ATA1b 铅 Ě7}Ba Ko^f6XSH h*n le YӀ;^rLc{7nB8 .v A~_$pd,u rRF0{ m@ JUWA[zAAeAq܋!Ep@Ka1⌻'`coY*HPxXml- \-f_+>4<]hY?-PDσ=kA-cKOLqt'^J[[ WUq柰Cz'&H07ZCzd〆^M`%cE-]y8'M0Û{f{4PIRCj@9Usm-PAqhKU`,=DZ׷.h ։:ԁ{< 6]:esb^wyQzM[#HuDP)SN!~UZۘNgȾqraxg:6@/2x{xK_Y6צBozT¤.r#@"r8qa o,;(|f3*i)iC.u<F })cܗ;`k]̈́s-q9r.%77zl@v; eUEiEQ`Iη.{ +^[e';8)jo H&i59Io R[uU]A")KY^ SPj@-hRFJYPYꞺ|KxMDfʉسZj 6(F' d {{Pm\WSH=5..,1Ç>9 }.[? Km2"^f`ǁBص[ǃOAEkV)x &e O'>x$~'2(ZX$Ju Jmvz;Iw~oPH- oy;f uyZO'ݥ;U9-$pTkV/e 0kO[J[J>ds7Tڀx4f0R !yI scI-~x1Xނク?Ʋˇ}no*(O; 7  qPUD;уn 6`)ƣkq`f8H&7zBizP0Ra fɮ(eHݶl>i~? GrvӠiv 7|P UYa 0g`8 Q1#8 ӰP[~=`ؗ{[1m*-wFƧaṕ߹w.^j٫euꍪ7fZ;o2~+_m9w|^ͬ2!5&Hj/z/7\\~k=2L/QPl;̃gOȄou^d퀠:^+_kFj*TJ5\ŨP{!`c0zZGu-ڗז&`5D[-kQ֢!Y„= {>,1fR'zw32l|X|%MxNG?^ C$RTnLߠjN ;>[|@©I&Q_-ߪ|Kh==\ ipNxbkBOm}8/aS;*_@ozHݨj FoăzI^T*f_KPP;!#Bz)+x^`+iOj'ک;޹}⨒\222&]rwVY}fh^{y,&j:]-_) xyoɀ:Ɗ 23{c uCB)}JM"D~Pjv5w,!(khۮ7sPS@HyC!ꢺ*J)1܆TT&yna\\heT1YFVZy|g3P[|rE'>dɐ%CLe*Szp@|vwYwg>khh ?y,.-7/R(f&`)1OzO8ς lp!ж;fQ edI'2qdLk{*ɲPjpo/nì!% ajnY./ʨPP1EOm.:źu=[7,k9svզ}4hԑSRJ-m2xVY鞻۫hu \ǥ%ݗt_p_լ~8RdEB,o $vhmm/8s}{[Hp*Ce Y :ըAR8e\1 yƾgO:3 iI-gMG#>Q¤rrr<<<2.O޿XYgݞuIqUB_=e!No87Uϫ^x[YWggWLLW)ӵTVٹgPӿVJhBhJ2$r+_cX5V)OMOMOMSwJVfOgl9H3\8 eXagSIVZKhWZO85i 륾ʿG{Q[$Tzԫ[KwVm}Nk1 kb+TUu-[[kSD'˟Dž2P|0g -KЗP~@D>DT=UOPҔsjF5v#H4YGe*SYL)S[kNbqjk}bo[oEp_q7mz;zꗫOp'f Wf]/P[+3jg_O)>O)>O)>O)>O+>O-?P,>OKrz]_^[]cinuxlcS}zhmnptqstuwuvS}zgmnoqqstuuwyS}zijnoqqstuwwyS}zjgnoqqstuwwyS}zkenoqqstuwuyw}x~rx~rx~rx~rx~rx~rx~}rx~rx~rx~rx~rx~ty}S}zkfmoqqssuwsyrx~rx~rx~rx~rx~rx~rx~rx~rx~S}zkfmooqssuuqx{rx~rx~rx~S}zkfmooqqstupwtzrx~yu{rx~S}zlgmnoqqstupwrx~rx~rx~tzS}zngmnoqqsturtrx~rx~rx~S}zrhknoqqstutsv|sy~~S}zxlimopqssutrrx~rx~rx~rx~rx~~Q{zushmooqqsturrx~w}rx~rx~tzMwzozhmnoqqsturv|{rx~rx~rx~Mwzivjmnoqqstuqrx~v|rx~rx~{Irzikkmmooqssuqrx~~rx~rx~~Irziikkmnoqqstpu{rx~rx~rx~rx~rx~v|Muzfikkmnoqqstqu{rx~rx~rx~rx~rx~w}MwzfikkmmoqqsstMwzfiikkmnoqqstMuzdhikkmnoqqssMwzdhikkmmopqqsO{zbgiikkmnpqqs˻O{zaghikkmnoqqs=Oyz`ghikkmmooqqAOyz_ggiikkmnoqqAMyzaeghikkmmooqAMyz_eggiikkmnoqAMyz^eeghikkmmooLMyz]eeggiikkmnoMyz]ceeghikkmmoMwz]ceeggiikkmnKwz\cceeghikklmKwz\bceeggiikkmKwz\acceeghiikkmu|}~Kuz\abceefghikkmmnoqqrstuvwwyy{{}}}~Iuz\aacceeggiikkmmooqqsstuwwwyy{{}}}zIuz\`abcdeeghijkkmnooqqssuuwwwyz{{}}}}xIuz\_aabceegghikklmnopqqssuuwwwyz{{}}}|xIuz[]`aacceeggiikkmmnoqqqstuuwwwyy{{}}}zwIuz\[__abcdeeghiikkmmooqqqstuuwwwyy{{}}}~{{Iuz]Z_YXYYYP|Q}R~SUUWYY[\]_aabcdefggggiooqsrz|}{Guz[Z]VSSUHr7K^9Nc!wmBZ; !w̻͟BUip[JUT]Tjë5^BgEgsn`5DV*P .1j (X?M9 @&GkK* @"\h"W&> D4I`ja;M|_Y+VXE)KRܪZ::! 72* !!0CZj4|RSF*,Uc1%Enqb9/a@6gd$XH҅;0GI_|rI,0%|2[ސY"JA>J#l*#jOzF{=KcN,k5%iRqVBi5̦ԗn<5<'}ZԪ U\iC[V%0Vb$/UJӺMr , j%Vzp}L{c We*'31ʁb1qQ ?w/;"E,rwBcfGc JF?>]< Ìc ^yAZ~ ÅP8(oHi!P\˼7l>=7FP*"u cd=YN ^KoZGAzIV `zClN̹ؽ6XZ#pvw6uVH5iFwb{ D?*z1TͩY5@Y*/CXKӒy 2bt'c]w? ȣJZk-#r;BGg˰6'G5<69638!qY fKPߨj"2  +7{]`cBj l2ZF7kT{Fi'I >PgE.a8s-m@>!59h߳Ûݾj SGP0pl+`b#91\>mxEK`2g(:\( @!=L9h09vўM$Ȏ ?W2puz 8$d|ˡ֮25.*{./)lI_"0t*E(jB,soIVM>ZCK?ުnp%v8?QYptpc+̚!5AU@X)Y+S=PIЙN$dHDI9:AXumz5u -q`|ZePpĩ{zBR 'U F|{Lޠ#̨a8^oCтiEro]'@׭@_e)TUa|Kw%:G,q0n 8^``n@] @ou.d!㰵2 -ޥގ98bub`D PBLG>dL(ʼ ej|+~Xed@mUsc*>ed#/4wa@5pA<Ћ_Hs6Hm1b N̴Ӡw`s,+LrG5 OCO*$D6dnv@L5j/nPtV%xhn@Dq(R#jPw #-5Ƚ)B΅`/4|b=Fg5c&XP0y QE6Q@C4TeANj$GY(<ꁞCASuM j1 uG|jZ#t+݀U5]M2Yۯoksr1 p`v1;7?3J[q1=1I MA@:Y$c>-Z/8Y΀D jjj@U;q$p#(R#inrKn@]zuoGL Or/!Unxp9]nWGꇹ@x:j| =5 tc7ZV\t"D4pg]Nr3X? t/E8 R]I3*[Xk&ac1x^dPoC| BC]HmZ>C5fmSQ|!匧rXo-k"me iy42Fkt~Q!-5p )2QwRvAsmځ]P$xΛ8s]Pd6ܷ~wuo+oomYF+ #%!W_~ ݻsITg#{#Jl.8%3F 5v6t` X 'vA)ƫ` n,ۥr&AqIq] e5:xJt;}s~N:{ߛT k'\JXTSu.P!4T&Pm28He $Sҡ{]>mA,AXe(R0` O jwA@#UV B(T0$8fHSZBdMwc kXET{Tw;"L8n'ZO7owc}ҼI*̫NO;mmfo=:뺨I,ҼOw,5WG|ʫ|p۾m÷b:2ʷ Z%+!9"4Bs3ό&`?clS[>۱EE g^SPip+v HoHLܷw`T6Rv{ 1Ng;;uקshJ)]LueI,/~6uP4TA_N;ޓfvq9___grf^*^*+Tr\ۧ J•ʝ_E]Tޓ]Q*omz|Rս}Ms *"繼<K(upnR*-cպr1Rk^^3e͔CVXqWOş3;1;/Qs9(R~B|%K׭9@}ۥcެ<5UUza:j~~GFu1;HiY[(u6L/+9zf՛UnV 5|ȗi1&HXVhF\ R7Az.*7钷JRjO=-g9\Ynغb s}\rv ;7h_;ךdͷ>shC [2df2;7ߓomfH})vWN:SJqZ|eӕwv04s=?_>~}QXH;RӼd ;k{]_S34i.?.(GjZ9V.)*s$u)EF猡j'+^|^=S]Bxf? k(m-۶^J+ EtL%}iZi3jx Q34֟dTIDkB*fӃ U wk \[~ yeɉ:k׬=@'B-G? J! #v+ݯ''W{Va9lkjV*C)RRP'KR)H~DpPYH<_l-vmK-m>6ml5,d*A@?iw*mCZoq %A3Qݾ xࡪ͂Prt.h)\p̅"zTXtSoftwarex+//.NN,H/J6XS\IENDB`cb2bib-1.4.9/src/icons/application-x-none.png0000644000175000017500000000113712045517740020722 0ustar rusconirusconiPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDAT8=kSahkmE -v .~qRѽY|Rui ҂.)FЛܗ؍%dM FvoVR#LGj'5c NnL!'%Z:ixq0y$4UA2!'c@ Vō㣅l__z v2V1уV0lW/lt"[D^tz~UhՎCC;SJ *""V ;jq,fFJ(el!G͓.KX*,5xTY̡)1,Nڙ۰sw75NvTOo[B"yacv>J k*`pLr &^ lqf>R݋eNE/is!9yhxD' ?S 'S??י'勚-G0EEm9: ~l{iX][ҏ3|Vre pu[u@k40t!틀vq(2X-EkV3r-H(qEȹҾ~;GZG-2XB1UܣB*Jh(z*A$YObEg6P`tH~SX%m! 7c^XxgMu` }c  1QIENDB`cb2bib-1.4.9/src/icons/viewForward.png0000644000175000017500000000062212045517740017512 0ustar rusconirusconiPNG  IHDRabKGD@ pHYs  tIME ͗tEXtCommentCreated with The GIMPd%nIDAT8˵q@D{mGe]6o H҅ȩ{렩8{=;O?{уK(t]/ DDH$$h6L IC]nda7KdDP@*ipRsW"$(+, &46آJ"͇Mۄ+XV!qĔS]XZg ?{C̦;1F?| J IENDB`cb2bib-1.4.9/src/icons/application-x-pdf.png0000644000175000017500000000370112045517740020533 0ustar rusconirusconiPNG  IHDROc#"bKGD X pHYs7\7\Ǥ vpAg\ƭIDATH-STݳ{vYrKX "Q,HS/U86$U ֨H [&!Ъ"^bk**+||kf͛5{V`O@^0cI->P!-7d" j2set0׿Kce)7 yiԣYX62y<_ZVj,5aa5a5j!NdXc7+f;WҟSR[wLQČ[J=EL&ߣRbN&yivWk†nkk|ehKEKEr_F atGD_1]ܯ'|-8b6>u 1TcMf>jJ1Jl%p.]~~~iإ__-7sbF!qleq, jQP &u.~APpl'5кRss;;~h=TVWC!0h vt)*bL BC(|"FaPH\)W.vINbN"Y|cu4V}AyP/1r yyE͔Ӱڐ"J7F1 EBx`pvim(}}vJR4ol=wN n~WU@y<E)*B X@pd>>@uU몀[KwU,,!&$mk+֞#AJ:]tg8N:^J&6u`A>e зl[0U47qgtqȝ *|L7*:uP/ʿ;p{wх;n9~tP~J)'qĢY4v :Jtf @xGo>V@̝ 3z2B{@Ty) |؂^y+sx6@q @3żൃ]ρ@xaB `l4{}aٯ򗯛qlcĖ^PS*Vik'M 5 ta=)X$iwmwZ+-kݶ_F-5zIc[/gZVwtX;xՎWV2 jk4SY|A993]zyRWqYgaҀ(k繷ϝ|`a}i/vvԺumAg󒮒۱ba? jwwt~⿖g׺ÿM/boM+l*Kx}D_jګj^r\|̘̔LӒ\1ñcDѮh@# YH}beeٔo6HL2fZ$6J) t#zBl{{vkCNË_JJɊ8}{2O͝DH55:j4 I''q?Xc}]Ifˮw\D!o炄baGXMNVS&M~auɺUU.s|!ƫƫh'''?h&Ϟ"zTXtSoftwarex+//.NN,H/J6XS\IENDB`cb2bib-1.4.9/src/icons/application-x-executable.png0000644000175000017500000000076212045517740022107 0ustar rusconirusconiPNG  IHDR7sBITUF pHYs:tEXtSoftwarewww.inkscape.org<qIDATxMQJQ ^ A(z)A1Q( 4,qx+]0u`aYka*va),qӜ,ͪb_HcuTcGu%K-+2뢇tQ [kwL! ҄>qer+DE<&C}a,"DG$ O 1!íYL:{&$PwzhY0F.‹ݑ 킩!f6[C1csvY:jriʾ`9[p{GdrE57DY{*O{* &Jq _L>AbPHrg5@PeI?H/t(IENDB`cb2bib-1.4.9/src/icons/configure_network.png0000644000175000017500000001214412045517740020747 0ustar rusconirusconiPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<IDATh{]uk}5rHq$+֫rlKv$u­մq(ESФJm" h-6M 9Q;%YJDR$޹{;zZR$݃}{oo}{OAQY:27Hn=,y;A.9nx{~xMGdV6O{G+@Ɛfj6z\z[rgsnB2X@~,""wA:Õُ}OS.f%#ȰN(css@y凼};lꝀ_Λ>;J%.(Y\dqe`nRY\it\b1H,(٦(nJQaȝ©g*ߩDD|;?urKw1J q'JO酭)ʲ vCDk8`VҊ 2t{ ϞvaN}t  yrG˟U6zD1L =6P<b QSǠ+|//۠t%"/s %&4ѣ^DQ1~4+n]^ûLoI{}f -Y(-S.јY8y&׮;j=nL|z5~--q=G9ڊV&rq S[w["ӛ?@ϜiVU,ya$ܼ6Gi=Dq@wSk!ˇvi86VRp(*ab"˱:Hsmg*.XZLS_ pXD""g_;N<07Isi8fZ:ַlSy> *م:jDSSU1"C=AЁbç/\c6Wc㳌68`Pf= lu2I "$Sx75S[;pn}P S\V+ 4$gtzyqMv!//8qߚZW~K""Ӌ͋0)c;Pv@cM8Cs"^ 0Nݲ2 ar4zz'^إ0٪wqJa1dJB4*$ͶPWpAHel:ÒFdw4$ED(j5ô?*p>x1"Jqz:*՘Fu^J+NP1F3GM7F+S?Bٽs3,+QfT+!hS:^aZG᠟'xA)Og@•6 0 J7m- ŗ[ N,EZCSĵ*E62'4!"WB!"27o1Z+x.z a0Ck3DAƋPox>." |&%<y>FTE8{dyD QE;16hBpDqcQxz Scg=YVPc T8vV%+B 2>;/sF97-5dkCC#)'.Ap  (VT ISX_1QH@<9@)! 4~Fԛ1A`p}FĿ矸;D9O'2[lJQ2a8$#xuqTJKOe"$F<6̸ygCpv3x<{ wgxFnd3Fi߽ϑk-t@^^:(kWw+1˛]Dx<o` h PƄ`3^@aEa+҆&/mqxڻ= gkyVyko"/~8̙IK^>W!j\M(_{֦{WnF~B/s\ sXqޣ h )_;(u];,9-7tjC;CՐV=9CMZ/yM(=]|>hn_i2߈seMӋ,OְjuǹJ p$[ Q]|,|Bfz<??E*xliwFID5`;bXnY| V7cD%c#2KH'g廖 &0Wq k$#% (˒:m _v;xrg~~/)6luRf JXjUw. Z@k%(%(59Q`86Sca 4(5k uZUË]+1 הN$Ou5?d3ƍG(<9 g<~O:K4(E-zycxrO/3|ZP3mJ/^c݁HCxdsxʥ \Y~y7pg84j% p" SWyƐnZ ":0B-JXlhh*S:l&Nƻ-[Zli1JYd' ߻vv6#~{}L6F݄8ĵ59\Y8";u< ֏':Nr1Zsz^byjwlݸGBxD*ҞOѯq/e&3UFy戫H .&4yB#LW U\-`Xiu6vK;((K=J >p!Yw?v|7"}S{ [> XBChﹰ5`wK B#ThE=Pk, y.o(c-ʕhA БI{j7-{wo۴?(Z82,w; 1Q(bU1WU&nfi„XtQՊ4(D:Ը~dN?v|3o;^c<*3r<&D!hMVzW6KUC#*X=[#u,WCB & QJ@')tG o\iv_LVr:*JΜZ4芢c\ijTչ,ԈP3°,g{Ql,Ѐ+LS Q6#!"κ?XZbmyYа;JkZ2b'%qm~%>)zan/\Co>v3o6}-g&_pi&jnZjrJD`:8r~RrqǷEIҾ'ۿX9Ϝk/=GUl QwW%0}i* f̱IN,7Gh-'FaN(ʒ;a0Mkߘl=O§-e3+'=%yr?JAdC@c"[v iAMϊ-eh+cL܍H/ɥ; 3WU.ִD&AS⒵^t OnbC|yer%Й`_ĕ+:$=TvQfGv%_ DХ3V<2=DqeλRWs2JL&&!AJwqt=lص]T>N }zPXXxo0| 9, sXYYݿ}6EFFVEVV(oGU>{lP}1 Xa/##:''Gv99y],V(--鳢_d`bd񐖖-#((t_EZ'߿g.!8  @>>H### 660&&F8edK2 X]80H  tXl@.#Zhp80>211a5 XT{ׯ`P  4d)3?`d0l @.G**B@#02@"`ׂ bgge+(EaIJcV ̬  ZFx9?s~:T@,?f-Uyjk] "P<~2`;L8 2b07ax+,̽RR,p32?0W!޽;}}w[[[ _~oPR@182| ߯Du'Lw>ܹϝ;o66VN`@.0#\@׉ 02ة1ۨ3hK02?tƷo={\`Dmݶm3gr~{[&o mZF0]*AEݻwG3 Ǐw`. FlG8̀EÜ{Gn>(h/= >˞0cSAC)X+nlgd?#CCC1pqq1k87nS~`8/o?P K2<`d`fo?6ڵk)@ lbvcWgxG`~z޳3ci`-a6F0O~Xcc]=/[_gf鬠z 緀ٙ hcmP L~߁G`_@~+d0>IENDB`cb2bib-1.4.9/src/icons/edit22.png0000644000175000017500000000153312045517740016306 0ustar rusconirusconiPNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<nPLTE!!!999VVVZZZaaaeeejjjkkklllpppxxx{{{|||StRNS#&MS\l>z#>IDATxmJAgvu TB+;( 򠃮vR( DKiw _yAy1N|fAr!t1 AD{b0 =dB@U`tE6R)F%b-?PN亴rqf1m+ո]KL\fFd#ma@m>СnJmhVVg֛G8.M 0ޫbmJ%eaJ~piJW!}?vNuDQx'9hs-7Q@iJJ͛:X⌴n b tאHign]R.FZ!quƆҍTM, }o;$8޽;|l6KOkN Z*eYS:;.wAiG%%%f#֢" R+gffCC?85QVVu\7jkkFۙH$O*666u]?<<; (AeVi~NwGFF 'TxTFG~>::2WVV>X'-  Y#7987JKKh+PVZ;;; ϯ!m<\Qhƀ:q괋)BW072==݌B"= TiHņCw᤺;44TWWa/+ӁفPX%.J[A=Gî 2ab_7Ȁ>CzrNtW9B:??CDQk|5oӳgADNt.c9C@h|rj`u>R $b]P(9s%gpYa"@:G /G4A |3Hwkk>ɀHRROOθ Us O,.Z\\|+4SFoj///8;;{gItLK%>z9FIENDB`cb2bib-1.4.9/src/icons/citer_citation_checked.png0000644000175000017500000000132612045517740021663 0ustar rusconirusconiPNG  IHDRasRGBbKGD pHYsu85tIME 6}VIDATxڍ]HSqsfR20001/ыO L`AA`EEaa(YJ]sLt;X[PxH`P[^y{cA#!DH/hxzxyNF{30pe(Ic _Ky2,SZG$D`2SLWōxvnvsjɒA#HK7Ƿ7YoVj*jiӑJ}2 >VHj.YH@_aJ!\a^Q.QRP`1悐$s~<5yAfyXV%c' Зyvt-rb F`.'~6OPR!7'_GHNN!33am5S4IQ" y1)5IʜUz%A+{wQ~X8#ߩ/HFUU.b?g:?IFQ6ٓ9eXzخN>":jkĵDŽcS" /:::(|'`+!QͲD`QH`dcрN`(~ IENDB`cb2bib-1.4.9/src/icons/filter.png0000644000175000017500000000065512045517740016506 0ustar rusconirusconiPNG  IHDR7sBITUF pHYs:tEXtSoftwarewww.inkscape.org<,IDAT(cI4`yRwzTXfjǸ@-_{_=w{kRF?CƲ5?&~FӋce &g6h>{7ں1(g}pu0Ag TYn|+{& ]* 1˞]+I?rd1T9_ޞYnSWgVY$VT2Oά­`u NV//i ,xE;/:IENDB`cb2bib-1.4.9/src/icons/application-x-tex.png0000644000175000017500000000126612045517740020566 0ustar rusconirusconiPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<3IDAT8J\QyA0h5 BA[g,- byAB 1pu)\u8?@ a}k6Ǩ*Ƙ 0յr{|ߒ$0` u]< Xky! tZ a&I~K1PVe=L&sW^Eu4M N(Bˬbd2FFFiMp]בe7obi @6m:SSS(twwMB I---B!$I"HJBT.IRBTr]Y[@  ~_M3_lvuu8Ӱ^e$I6] ض AHR;I,H_]R)pggg9|0nhNA4z噪Ύxy}4d2ӧo߾Φx[8&Lr…mK(;/:۶L-Mwbeeވ2/pGرc_ٴ yqnfFgr\ZpZkZ<Çfy(ul ^J ^D+GzLD_WU2i gsW{nH_|leis{G'"|=g ?xPUxJD8qT,Y|XϯKҳfrw cK\E VOdP2p%0~+ #.o~O?0od``e`ge8C_fe``:rn>0ܔgpa j PZn.v#yA>.~.ySho@5L nc+&Q@,Z @6 0H 0>00lc`dd`xL _f ԇJHB Q~ @^fx ho?]8j3k1?/``VZh9ec`&LO݋>W~3+Aâpjs@P'P`xx ×}k@f:_p"T?PAA<Ǡ|"0 v 1%Û}~.7~b=8*;Q F+Ơo Lt@YvfvPrx@AB ,BPII|߄d 7$ @1|L= 2 ˿Cх+ 9>[ o`T;ѐv @,a /`I/?X &@` XN=bg`Y Wh 1!)A k-KA߀Eϟ}C 4?/+dy%f<3k=Pt1aNb 7`!1p=bl,~}}z@C3lƏ??H Rp9}@)? ~F0 r_~@a >" }ǐNrPe`,r|:XF +ý.J2|q`22tڮbՂ ?~f&ʿ( 00F]pZx:s%.[فY(8 ( @7x$(03]6 0:ñ^d3R l_p=, 8Pp} Xu0QJc'RT,_Yhod8̟JŠ2\V&@.}2(2ppY/Y Ь )x  :8[< 2~660\l?h-ήK17?_C *:(q'Bb׿> @XZ% _R UD!Jο(YX,02 ×  @0dO#$ ,~h3 eOp,%A W&` ~H !3N/`{O#(1޽{)|D~$Ty__We\8@10Hp7=x0lt/@Ճ::p ZSr@11 0w@{()IENDB`cb2bib-1.4.9/src/icons/configure_clipboard.png0000644000175000017500000000330712045517740021216 0ustar rusconirusconiPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<DIDAThKlGGMJhT% RQrPQRpB[ P*AqA*7ZUBIB(PIDm'ce=kOw;}3]s0zR+ݻwxKseYJ)H)cw:hm p 3\$!tK\8c 1PJ91ι)o.^X 7k joK uT>~Dl%S1{]`?>:\\QL@ !G1ض JJ9\(>JQg[X__,Bf BbOL,@\7)mrccc+xCG|>P Y6R,/߰w^lAww7(+x_Ǐx@ NTO8,N謭Z"J{(ȣN:\lTóP@'mVWW~|_|QZ@M 'ePjX6߽wߝpٳg,,9764sܺuO:5wj!(c`.,-U˯c8w[ض ^5$B0V%50L|ׯ_3YT4&9oBL;&ܜhB Z T^ `lg=sιDw[76 QJJTJm۶1&(1cs![n+JZYYQ juzzzߟ/JqH(HWRw8R\7!%9Tݽ}kT*XIEbi"?2YEGmEIENDB`cb2bib-1.4.9/src/icons/bullet.png0000644000175000017500000000071212045517740016502 0ustar rusconirusconiPNG  IHDR d-gAMAOX2bKGD pHYs  tIME 92GIDATM1jP?/ ,.B'7ADG(tҞWX .DrNEj}Җ~oTj=l9c&h6dY錢(2I4Mv5Դ؀q0{}~.IENDB`cb2bib-1.4.9/src/icons/viewBackward.png0000644000175000017500000000062412045517740017626 0ustar rusconirusconiPNG  IHDRabKGD@ pHYs  tIME ƒctEXtCommentCreated with The GIMPd%nIDAT8˵1n0DInEplK &{)@Q@$3߷GV1 Ð4O{fImӟ|7Kϛf2mt}5Lw}cKL@`2yD\aecL2A` 4Af$< ^dY0oQ^xծ א0"g.M>n4MQ96T]Ihʫ\jUU% >MS8q sy3SY(C'~оIENDB`cb2bib-1.4.9/src/icons/cb2bib.png0000644000175000017500000000657012045517740016346 0ustar rusconirusconiPNG  IHDR@@iqbKGD pHYs  tIME![ IDATxݛkUzsNUuu܌066`nRHUZ* QP@lH ˆ_cz^;cc 3S]UGuUWϴgwmQRMtTsFp {/;cƌ%|Fݳgn[hf.&}m۶PJSNMGlԇjժ}Xzsmrĉǎöm\q=}}}=/Ru'|cǎ ͒=͒dp]uvtt:u @>3zB)r9<\ufK&q[ZZ^ܵkХ$wJYfeY?RJaYVP˲=^JIOOǏ~̙W_Y9s§ӅV|DF:y_YH=`v\J:ĩS<5AlNGK!Æ(Dgt= Eo陃<"oAXvDR@>Ȁ3~O:ijjs\.G[k ObH&֚}'EY꜊`s^?B7P1@9I3ڛC Q B2dljnON$/OR 5yb aaHݟfN;LnLmmiF kSMDbBc8s|e~޶93L>M@I q*SJqSHb>y7@V.5rk!@(t!T)%Kl%lRX¶,l²$R(Kb T)@P@Ch-42BӒ!p )JY/U!1"D)IF)͚2Ѡ $RFF)DH"C߁@H#!ɻND(!1`IA,[uʠ @KA((&_ՔԆ2h(D9%C `II0S 0BښEƐH0J&E2 _F(^FDA)!@Arz xQ/+<_QGGiJ#;PR$QPt)cS+S6:{3P_XK={"R"QzRj% qU " "դ ">/C\ja*)'NV= v&,,HRAҦQ[`0#A6(%+$]Bܺ2:ϖЏ6;(!G1*Ɨ~73}7Ɣ 68pU reAewAox'oƞAZj^ٓlO@,1]AK2!'40bXt- Ciiܼe #@1'o, 4qi0̬^vC@3 >^@ '7t;vXRwJ+(b3L󭭭olݺuI Z[.)c߇aXYLBsss~ҤI_1 MfG?6>Rʊ )&%Ɩ-[E¨JVm*9q.:b&(,QZ7/^xsp%^/Fm`I)%h ub8NP(=(@*~F` Ƙ8!+"]d/t*"yI )A@l"g[5M49"B,5emUH3?Ah]_)U `YVh=^C2Q͛=r7օ%KKJ fH ͌3Yz}\}͔lM}@jKNLMNCܳ9H gӆwNrL6Woz|S/<,\U_ւL  bwy?`[+v߹-,`a:!m+o D}?Ê;coC#`n T(wu>%)-=ټi=GƲmZE߾s,`=yKzϞai䛚v~ ZKߊ_1&<|Z6qwЪsI^z1 xԝ|ߞݥwÐ>>ܹ]w/[>*\H°RĈuaSo}w3ױe _ac.;5gnű|@uto\@>+~W*c ~m n~*nD[oY6{I]>1!|ppώ!o⩧J8azu/Ǟ`TTZ#H1-A oѲc<n;o@ke\?{.|~~kɱu!= )4ưf͝7nSڿw?C?ZJ,s;*>)X0R{[mbi`g6.?*. CzC*Ŭs[/-#jn5T2J;Yw IDK/y^'d+B0T(e^I߷vu؎zȦ o[&78:gBn!Jp$y;pܵǩ_֯r璥8D7oΎeӆs?֜;O~-aώnFanG' o+5_c "Fd3I{AG];nxh&'Jy?#^:yTyȻBe2u0\3Ǹ˃+61}g|^~`pl5!ac ~j+ ^:3" վ&@+ !dY7Xu/8ծ044k/1 ftOьi" QIENDB`cb2bib-1.4.9/src/icons/configure.png0000644000175000017500000000414412045517740017177 0ustar rusconirusconiPNG  IHDR szzgAMAܲIDATx{TƟ7o qQ: LMѣǞhON\le)(-NQk,A2pI yIB?Lb8n׮]Ǚ9{ڵkee2٤Ç2%"NS'NMM]RKHxxx&""㨯\.]tI/֭+uv@c>SQQ~2 p8̙3]aaa"o7Xb/JrX0UUUX8r/;V,5k\X,h/"@zFFF @SRQIII#x&¥޽+߶mOCBB^~E1˖-{W*n7aN'x<t:aQSSw+#*VcD2H$EqqhxOXaTww7GP<ޮX,q[l˲+ӧO_NKKރVx,X ͆v矫`@ԩRTqUnӣS:h4B!F#;rE"```ʕ+5M1bvDݻOIՒZ׫0G$ ( ;KVTnllZjmm%NG.Z}?%%99y~aaQQQRIN'f3aT9=vqDE<_-zٳAȵ̘t8=x)Ngkk/Xf_|}:J͊O/!rV Z;s~K,YZRRrN$tCL0|n],C|eLd\|kǞ/U ##cՉş0 ߣ"X> ~~Bx/zB^:+iRh_Դk+ y}q*MJJ+2 ^>Ё+Z.4Y87t;0׏A+_ԟ#ɢ%IX,NRm)))oٳ]j5\]&IH(@3 ges^W( aDGGx^fܙw׋i4}!cQZ(HcS\DZPh5mB (QUHA%nژ8cv;{Ow]Tis~9wGH)!9B@ej@EJNh_7 ` ?Rj FĀ-7۩ Dc!\:3{F(e` HN۶ PD/=W@9hbk@s[#M^G4䐞}T -joḵƄ #=1Xо)%b9C- ~$Ju]4nSokGiaFDc[5[͍ZݲMNNbF@`kf3_ӓbn!B<)ٽ{7y t/+.L&;rBK_[E~_~Ҕ^܏jA( 0iS* iiv=+x}tn߼fLY^: [u%)Q5~#d2BTU065WUx<Z \Z9~5x\2bmFjĊ(UWaX"-ZSUP]׃y#<eg|ُv0Hcuo]L$i ۆ`ZIR:fR?_e_qp=T=X t]r^;SQ{j0EQD"변ߑRր,pa|-nmw_6 j zo. ZXBQR-"5Ħq|'o'$ ;hhK@Ymj=~',b&mDRLߛ'wQs`xX 8,//fT*=N@}(ۦR72[ !<{(PM}VضXK P $ `l&m_1,%Dw]jJZu5ϕH(cccLoFAií<\^gJBRuۊiAK)P3e8SSS\"W0,0/ҫA oz^Jy Fٲu+SSۘ.6nOMs"KUAD"dY,[ p\AV\mYULLN ~q{s߁E.f.`ll|>j@'֢@gK-&^4d8W y#_eY>lٲL&/ DOj]C=0AD4u]ޟ$I>{%Q?c XYYZzp>={]va4Q,r8yl !ǎ;~СgY:J@x;R|+XZO[-* /^ԩSOΑor~AZ RbYCCC>aҒɇ ^05- 88[44oS!0M]׉D"q>u_h[\qa|||>O.#N9KKK XRʁlmCd0e^w3Z-8'5?8\٥>? .@TU%:euD=ϣ\unJ>gff&o߾G9嵀Ka4M^#h[a2ihm2'#Bd-AuB TV s%0"Hd^1FQ@0@:J聦k-`D0Fxpx"CUYQ]Ж_83}nGys|#19·_iӦ+,6eaAD#~9Im+~3ųEw>cNMMqW*",`J3e STȲU>.Pc``۶mϗ[+r}!)b6Ks_>cff΃ȲpQ,=pu>rlƬyV յ.c ,o* ׯ㿄ZG X[vʩS>n.|95!"tww}=[[UKwE:p "%h7M4R###z{{n| />bհ6^oyùR I8R0000Z \YǥK,ˮn)Qh4jTU:7o޺F1{B*QIRV|29TU\S\ֺ..VVJ4%cjZF(8+ĿVŴgycϣxIӔ$I(9ɡCFh;jӬ߾}}ZKQczz:9vǏB8`5LDm߾7nܸEUʕ+N>a'C;^&1IENDB`cb2bib-1.4.9/src/icons/filesave22.png0000644000175000017500000000143612045517740017161 0ustar rusconirusconiPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵ]kAMo&闔ŏkZ?oMAH?@HHJAkۚݝYa Bp朰s}lvyP׮oGQ4>lLZRJ[hig2YJ3NR`st>6>uqݼ09R(DBsA8p<\C097Y+$ƱEKM,qsѕ)d2'qXc:`fI`ݚոڗCqjQ8ma8{ʂ5'wt BPi>9ɍ S;~v\4ĹaV:r#dd̰\fw0:[dp}@VQl4?O!0T8) C<}iZًr^z{{%~!"8ȢvaCpN@XX z S pnh_o4us1c~"IIQQs[,fjoLv}/3 [ kʃHyoRO58@~;Bb4T[woN #include #include #include #include #include #include #include #include /** \page c2beditor Embedded File Editor The cb2Bib contains a practical editor suitable to manipulate the files related to a cb2Bib session. Abbreviations, bookmarks, regular expressions, and BibTeX are readily available. On BibTeX mode, the editor contains a Reference List to ease file navigation, and to extend the editor functionality. The BibTeX editor can optionally be turned to a reference browser. - \ref bookmarks - \ref update_metadata - \ref export_entries - \ref c2beditor_menu - \ref references_menu - \ref browser_menu - \ref c2beditor_qt \section bookmarks Bookmarks Bookmarks pointing to local or network files are available at the editor menu bar. They provide a fast access to external resources. Concretely, they are suitable for retrieving working documents, writing notes, or for accessing internet databases. The editor bookmark functionality had been introduced in the cb2Bib version 0.9.3. Currently, bookmarks are set manually in the netqinf.txt file, see \ref c2bconf_files. Each bookmark is an entry line with the form \htmlonly
    editorbookmark=Description|Target file name|Shortcut|Icon file name
    
    having four fields, description, target file name, shortcut, and icon file name, separated with three (required) vertical bars |.
    # Bookmark Examples:
    # - A URL:
    editorbookmark=URL Description|http://www.molspaces.com/d_cb2bib-c2beditor.php#bookmarks||
    # - A separator, which is a blank line:
    editorbookmark=
    # - A TeX document, which will be opened with its default application:
    editorbookmark=Document Description|/home/doc/chapter1.tex||
    # - An application, specifying a shortcut and an icon:
    editorbookmark=Application Description|/opt/kde3/bin/kile|Alt+K|/usr/share/icons/kile.png
    
    \endhtmlonly

     

    \section update_metadata Update Documents Metadata The Update Documents Metadata functionality is available at the Edit and context menus on the BibTeX editor mode. Documents referred in the BibTeX file tags are scanned for metadata. If the BibTeX reference does not coincide with the bibliographic metadata, the document metadata is updated. In this way, metadata is synchronized with the BibTeX file contents. A log window appears, and possible errors are reported. Reported errors are, non-existence of a document file, read-only files, mismatches between BibTeX references and the actual metadata (often due to HTML tags or other illegal characters in BibTeX), or that the writing to the document format is not implemented. Note that this process will update all documents referenced in the BibTeX file. While this process is safe, it implies writing into the documents. Therefore take the usual measures and backup your data. See also \ref metadata_write.

     

    \section export_entries Export Selected Entries Selected entries can be exported to a separate BibTeX document. Click on 'File->Export Entries' menu option, and provide an export filename at the Export Dialog. Optionally, export will copy the document files attached to the citation. The copy of documents is similar to the cb2Bib 'rename/copy/move' general procedure. See \ref c2bconf_documents, on Set directory relative to the BibTeX File Directory, for copying options. Documents will not be overwritten: copying of existing documents is skipped. Possible issues are reported in the new document, as LaTeX comments.

     

    \section c2beditor_menu Right-Click Menu Functionality \htmlonly
    Keys Action
    Ctrl+F Find in text
    Toggle word wrapping
    Selection to LaTeX
    Selection to Unicode
    Journals to full name
    Journals to abbreviated name
    Update documents metadata
    Shift+Ins Paste current BibTeX
    Alt+P Save and postprocess BibTeX file
    \endhtmlonly

     

    \section references_menu Reference List Right-Click Menu Functionality \htmlonly
    Keys Action
    Alt+C Cite selected entries
    Open document file
    Browse by DOI
    Web search by Author
    Web search by Title
    Web search settings
    Clear entry selection
    Refresh list and browser
    \endhtmlonly

     

    \section browser_menu BibTeX Browser Right-Click Menu Functionality \htmlonly
    Keys Action
    Alt+C Cite selected entries
    Local search for selected text
    Web search for selected text
    Web search settings
    Clear entry selection
    Refresh list and browser
    \endhtmlonly

     

    \section c2beditor_qt Additional Functionality \htmlonly
    Backspace Deletes the character to the left of the cursor
    Delete Deletes the character to the right of the cursor
    Ctrl+A Selects all text
    Ctrl+C Copy the selected text to the clipboard
    Ctrl+Insert Copy the selected text to the clipboard
    Ctrl+K Deletes to the end of the line
    Ctrl+V Pastes the clipboard text into text edit
    Shift+Insert Pastes the clipboard text into text edit
    Ctrl+X Deletes the selected text and copies it to the clipboard
    Shift+Delete Deletes the selected text and copies it to the clipboard
    Ctrl+Z Undoes the last operation
    Ctrl+Y Redoes the last operation
    LeftArrow Moves the cursor one character to the left
    Ctrl+LeftArrow Moves the cursor one word to the left
    RightArrow Moves the cursor one character to the right
    Ctrl+RightArrow Moves the cursor one word to the right
    UpArrow Moves the cursor one line up
    Ctrl+UpArrow Moves the cursor one word up
    DownArrow Moves the cursor one line down
    Ctrl+Down Arrow Moves the cursor one word down
    PageUp Moves the cursor one page up
    PageDown Moves the cursor one page down
    Home Moves the cursor to the beginning of the line
    Ctrl+Home Moves the cursor to the beginning of the text
    End Moves the cursor to the end of the line
    Ctrl+End Moves the cursor to the end of the text
    Alt+Wheel Scrolls the page horizontally
    Ctrl+Wheel Zooms the text
    \endhtmlonly

     

    */ c2bEditor::c2bEditor(const QString& file, const QString& mode, QWidget* main, QWidget* parentw) : QMainWindow(parentw) { _editor_fn = QDir::toNativeSeparators(file); _editor_mode = mode; _c2b_mainP = main; _searcherP = 0; initEditor(); } c2bEditor::c2bEditor(const QString& file, bibSearcher* searcher, QWidget* main, QWidget* parentw) : QMainWindow(parentw) { _editor_fn = QDir::toNativeSeparators(file); _editor_mode = "BibTeX"; _c2b_mainP = main; _searcherP = searcher; initEditor(); } c2bEditor::~c2bEditor() { if (_browserP) _settingsP->setValue("c2bEditor/BrowserFontPointSize", _browserP->font().pointSize()); } void c2bEditor::initEditor() { ui.setupUi(this); setAttribute(Qt::WA_DeleteOnClose); _settingsP = c2bSettingsP; if (_editor_mode == "BibTeX") _bpP = c2b::bibParser(); else _bpP = 0; _browserP = 0; _editorP = new c2bTextEdit(this); _referencesP = 0; _stackedWidgetP = new QStackedWidget(this); setCentralWidget(_stackedWidgetP); _stackedWidgetP->addWidget(_editorP); _textFinderP = new findDialog(this); _lineLabelP = new QLabel(); _lineLabelP->setText(tr(" Line: 1 Col: 1 ")); _lineLabelP->setAlignment(Qt::AlignVCenter | Qt::AlignRight); _lineLabelP->setFrameStyle(QFrame::NoFrame); _lineLabelP->setLineWidth(1); _lineLabelP->setFixedHeight(_lineLabelP->fontMetrics().height()); statusBar()->addWidget(_lineLabelP, 1); connect(_editorP, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged())); _overwriteLabelP = new QLabel(); _overwriteLabelP->setText(tr(" INS ")); _overwriteLabelP->setAlignment(Qt::AlignVCenter | Qt::AlignRight); _overwriteLabelP->setFrameStyle(QFrame::NoFrame); _overwriteLabelP->setLineWidth(1); _overwriteLabelP->setFixedHeight(_overwriteLabelP->fontMetrics().height()); statusBar()->addWidget(_overwriteLabelP); _editorP->setOverwriteMode(false); connect(_editorP, SIGNAL(overwriteModeChanged()), this, SLOT(overwriteModeChanged())); connect(ui.fileCloseAction, SIGNAL(triggered()), this, SLOT(close())); connect(ui.fileExecAction, SIGNAL(triggered()), this, SLOT(saveAndExecute())); connect(ui.fileExitAction, SIGNAL(triggered()), c2b::instance(), SLOT(exitRequested())); connect(ui.fileSaveAction, SIGNAL(triggered()), this, SLOT(fileSave())); connect(ui.fileSaveAsAction, SIGNAL(triggered()), this, SLOT(fileSaveAs())); connect(ui.helpEditorAction, SIGNAL(triggered()), this, SLOT(helpEditor())); connect(ui.helpCb2BibAction, SIGNAL(triggered()), this, SLOT(helpCb2Bib())); connect(ui.viewCb2BibAction, SIGNAL(triggered()), this, SLOT(viewCb2Bib())); // Standard shortcuts ui.fileCloseAction->setShortcut(QKeySequence(QKeySequence::Close)); ui.fileOpenAction->setShortcut(QKeySequence(QKeySequence::Open)); ui.fileSaveAction->setShortcut(QKeySequence(QKeySequence::Save)); ui.helpEditorAction->setShortcut(QKeySequence(QKeySequence::HelpContents)); ui.viewZoomInAction->setShortcut(QKeySequence(QKeySequence::ZoomIn)); ui.viewZoomOutAction->setShortcut(QKeySequence(QKeySequence::ZoomOut)); #if QT_VERSION >= 0x040600 ui.fileExitAction->setShortcut(QKeySequence(QKeySequence::Quit)); ui.fileSaveAsAction->setShortcut(QKeySequence(QKeySequence::SaveAs)); #endif // Editor Settings resize(_settingsP->value("c2bEditor/size", size()).toSize()); ui.menuView->addAction(ui.toolBar->toggleViewAction()); ui.setLyXPipeAction->setVisible(false); _editorP->setFont(_settingsP->c2bMonoFont); connect(ui.settingsCb2BibAction, SIGNAL(triggered()), c2b::instance(), SLOT(configure())); // Bookmarks bookmarkPlugin* bookmarks = new bookmarkPlugin(this); menuBar()->insertMenu(ui.menuSettings->menuAction(), bookmarks); connect(bookmarks, SIGNAL(openFile(const QString&)), this, SIGNAL(openFile(const QString&))); connect(bookmarks, SIGNAL(editBookmarks()), this, SIGNAL(openBookmarks())); load(); setEditorMode(); importActions(); QApplication::processEvents(); // Qt 4.7.0 emits contentsChange with position inconsistently defined, make sure it is not captured connect(_editorP->document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(isModified(int, int, int))); connect(c2b::instance(), SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); } void c2bEditor::setEditorMode() { if (_editor_mode == "RegExp") { _shP = new c2bREHighlighter(_editorP->document()); ui.fileExecAction->setText(tr("Restart Recognition")); ui.fileExecAction->setStatusTip(tr("Restart recognition")); _settingsP->setKeysequence("Shortcuts/Editor/", ui.fileExecAction); connect(this, SIGNAL(execute()), this, SIGNAL(restartEngine())); ui.toolBar->setVisible(_settingsP->value("c2bEditor/ToolBar", true).toBool()); setViewMode(true); } else if (_editor_mode == "NetQInfo") { _shP = new c2bREHighlighter(_editorP->document()); ui.fileExecAction->setText(tr("Restart Network Query")); ui.fileExecAction->setStatusTip(tr("Restart network query")); _settingsP->setKeysequence("Shortcuts/Editor/", ui.fileExecAction); connect(this, SIGNAL(execute()), this, SIGNAL(restartQuery())); ui.toolBar->setVisible(_settingsP->value("c2bEditor/ToolBar", true).toBool()); setViewMode(true); } else if (_editor_mode == "JAbbrev") { ui.fileExecAction->setVisible(false); ui.toolBar->setVisible(_settingsP->value("c2bEditor/ToolBar", true).toBool()); setViewMode(true); } else if (_editor_mode == "BibTeX") { // Editor _shP = new c2bBibHighlighter(_editorP->document()); ui.fileOpenAction->setVisible(true); connect(ui.fileOpenAction, SIGNAL(triggered()), this, SLOT(fileOpen())); _editorP->setBibTeXActions(); connect(_editorP->pasteCurrentBibTeXAction, SIGNAL(triggered()), this, SLOT(pasteCurrentBibTeX())); connect(_editorP->journalsToFullAction, SIGNAL(triggered()), this, SLOT(journalsToFull())); connect(_editorP->journalsToAbbreviatedAction, SIGNAL(triggered()), this, SLOT(journalsToAbbreviated())); connect(_editorP->updateMetadataAction, SIGNAL(triggered()), this, SLOT(updateMetadata())); connect(_c2b_mainP, SIGNAL(addedBibToFile(const QString&)), this, SLOT(reload(const QString&))); ui.fileExecAction->setText(tr("Save and Postprocess")); ui.fileExecAction->setStatusTip(tr("Save and postprocess")); _settingsP->setKeysequence("Shortcuts/Editor/", ui.fileExecAction); connect(this, SIGNAL(execute()), this, SLOT(postProcess())); // Browser _browserP = new c2bTextBrowser(this); _browserP->setFont(QFont(QFont().family(), _settingsP->value("c2bEditor/BrowserFontPointSize", QFont().pointSize()).toInt())); _stackedWidgetP->addWidget(_browserP); ui.viewEditorModeAction->setVisible(true); _settingsP->setKeysequence("Shortcuts/Editor/", ui.viewEditorModeAction); connect(ui.viewEditorModeAction, SIGNAL(triggered(bool)), this, SLOT(setViewMode(bool))); connect(ui.viewZoomInAction, SIGNAL(triggered()), _browserP, SLOT(zoomIn())); connect(ui.viewZoomOutAction, SIGNAL(triggered()), _browserP, SLOT(zoomOut())); // Reference List createReferenceList(); _referencesP->loadList(_editorP->toPlainText(), _searcherP); bool edit_mode(false); if (_searcherP) { edit_mode = (_searcherP->hitsCount() == 0 && _searcherP->errorsCount() > 0); connect(_referencesP, SIGNAL(openFile(const QString&)), this, SIGNAL(openFile(const QString&))); } if (!_edit_reference_at_position.isEmpty()) { edit_mode = true; _referencesP->goToReference(_edit_reference_at_position.toInt()); } ui.viewEditorModeAction->setChecked(edit_mode); setViewMode(edit_mode); ui.setLyXPipeAction->setVisible(true); _settingsP->setKeysequence("Shortcuts/Editor/", ui.setLyXPipeAction); // Export entries ui.fileExportEntriesAction->setVisible(true); _settingsP->setKeysequence("Shortcuts/Editor/", ui.fileExportEntriesAction); connect(ui.fileExportEntriesAction, SIGNAL(triggered()), this, SLOT(exportEntries())); connect(_referencesP, SIGNAL(hasSelectedItems(bool)), ui.fileExportEntriesAction, SLOT(setEnabled(bool))); } else c2bUtils::debug(tr("c2bEditor::setEditorMode: '%1' invalid Editor Mode.").arg(_editor_mode)); } void c2bEditor::importActions() { QList acts = _textFinderP->actions(); for (int i = 0; i < acts.count(); ++i) ui.menuEdit->addAction(acts.at(i)); acts = _editorP->actions(); for (int i = 0; i < acts.count(); ++i) ui.menuEdit->addAction(acts.at(i)); if (_browserP) { ui.menuEdit->addSeparator(); acts = _browserP->actions(); for (int i = 0; i < acts.count(); ++i) ui.menuEdit->addAction(acts.at(i)); } } void c2bEditor::createReferenceList() { _dockWidgetP = new QDockWidget(this); _dockWidgetP->setObjectName("dwRList"); _referencesP = new c2bReferenceList(_editorP, _browserP, _dockWidgetP); addDockWidget(Qt::BottomDockWidgetArea, _dockWidgetP); _dockWidgetP->setWidget(_referencesP); _dockWidgetP->setWindowTitle("Reference List"); QByteArray state = _settingsP->value("c2bEditor/state").toByteArray(); restoreState(state); ui.menuView->addAction(_dockWidgetP->toggleViewAction()); // State contains toolBar info, too, but it can be changed from non BibTeX editors // State can not be used for non BibTeX editors. They don't have referenceList. ui.toolBar->setVisible(_settingsP->value("c2bEditor/ToolBar", true).toBool()); connect(ui.setLyXPipeAction, SIGNAL(triggered()), _referencesP, SLOT(setLyXPipe())); } void c2bEditor::closeEvent(QCloseEvent* qevent) { if (closeEditor()) qevent->accept(); else qevent->ignore(); } bool c2bEditor::closeEditor() { // Use _is_modified_by_user to check if closing is possible. This way, // no question is asked to exit browsing of search results. Do not use // here ui.fileSaveAction->isEnabled(). if (_is_modified_by_user) { const int button(QMessageBox::information(this, tr("Information - cb2Bib"), tr("The document has been modified.\nDo you want to save the changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save)); if (button == QMessageBox::Save) { if (!fileSave()) return false; } else if (button == QMessageBox::Cancel) return false; } _settingsP->setValue("c2bEditor/size", size()); if (_editor_mode == "BibTeX") _settingsP->setValue("c2bEditor/state", saveState()); _settingsP->setValue("c2bEditor/ToolBar", !ui.toolBar->isHidden()); return true; } void c2bEditor::isModified(int position, int charsRemoved, int charsAdded) { if (position == 0 && charsAdded == charsRemoved) return; ui.fileSaveAction->setEnabled(true); setWindowModified(true); _is_modified_by_user = true; } void c2bEditor::fileOpen() { if (_editor_mode == "BibTeX") { const QString filename(c2bFileDialog::getOpenFilename(this, "Select a BibTeX filename", _editor_fn, "BibTeX (*.bib)")); if (!filename.isEmpty()) emit openFile(filename); } } bool c2bEditor::fileSave() { if (_editor_fn.contains("unnamed_")) return fileSaveAs(); QFile file(_editor_fn); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("Unable to open the file %1 for writing.\nError: '%2'."). arg(_editor_fn).arg(file.errorString()), QMessageBox::Ok); return false; } QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); stream << _editorP->toPlainText(); ui.fileSaveAction->setEnabled(false); _editorP->document()->setModified(false); setWindowModified(false); _is_modified_by_user = false; return true; } bool c2bEditor::fileSaveAs() { QString filename; if (_editor_mode == "BibTeX") filename = c2bFileDialog::getSaveFilename(this, QString(), _editor_fn, "BibTeX (*.bib);;All (*)"); else filename = c2bFileDialog::getSaveFilename(this, QString(), _editor_fn, "Text (*.txt);;All (*)"); if (filename.isEmpty() || filename.contains("unnamed_")) return false; const QString old_name(_editor_fn); _editor_fn = filename; setWindowTitle(tr("%1[*] - cb2Bib").arg(_editor_fn)); _editorP->setEditorFilename(_editor_fn); emit editFileRenamed(old_name, _editor_fn); return fileSave(); } void c2bEditor::saveAndExecute() { // Use ui.fileSaveAction->isEnabled() instead of _is_modified_by_user. // If browsing search results there is no file on disk. if (ui.fileSaveAction->isEnabled()) { if (fileSave()) emit execute(); } else emit execute(); } void c2bEditor::load() { bool modified_flag(false); QFileInfo fi(_editor_fn); if (_editor_fn.isEmpty() || fi.isDir()) // Set an appropriate working name { QStringList unamedList; foreach(QWidget * widget, QApplication::topLevelWidgets()) { if (widget->inherits("c2bEditor")) unamedList.append(widget->objectName()); } int i(1); while (unamedList.indexOf(QRegExp(QString(".*unnamed_%1.bib").arg(i))) > -1) ++i; _editor_fn = QDir::toNativeSeparators(QDir::cleanPath(_editor_fn + QDir::separator() + QString("unnamed_%1.bib").arg(i))); if (_searcherP) { _editorP->setPlainText(_searcherP->logString() + _searcherP->hitsString()); modified_flag = true; } } else { QRegExp edit_ref_id(":(\\d+)$"); if (edit_ref_id.indexIn(_editor_fn) > -1) { _edit_reference_at_position = edit_ref_id.cap(1); _editor_fn.remove(edit_ref_id); } QFile file(_editor_fn); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(_c2b_mainP, tr("Warning - cb2Bib"), tr("Unable to open the file %1 for reading.\nError: '%2'."). arg(_editor_fn).arg(file.errorString()), QMessageBox::Ok); } else { QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); _editorP->setPlainText(stream.readAll()); } } setWindowTitle(tr("%1[*] - cb2Bib").arg(_editor_fn)); _editorP->setEditorFilename(_editor_fn); ui.fileSaveAction->setEnabled(modified_flag); _editorP->document()->setModified(modified_flag); setWindowModified(modified_flag); _is_modified_by_user = false; } void c2bEditor::reload(const QString& fn) { // This function must be called ONLY in BibTeX mode // Pointers are undefined otherwise if (_editor_mode != "BibTeX" || _editor_fn != fn) return; if (ui.fileSaveAction->isEnabled()) { QMessageBox msgBox(this); msgBox.addButton(tr("Discard and Reload"), QMessageBox::AcceptRole); msgBox.addButton(QMessageBox::Cancel); msgBox.setDefaultButton(msgBox.addButton(QMessageBox::Save)); msgBox.setWindowTitle(tr("Information - cb2Bib")); msgBox.setText(tr("The document has been modified on disk when the reference was inserted. " "No automatic reloading is done because it also has local changes. " "To preserve local changes press Save and insert again the last reference.\n\n" "Do you want to save the changes?")); msgBox.setIcon(QMessageBox::Information); const int button(msgBox.exec()); if (button == QMessageBox::Save) { fileSave(); _referencesP->refreshList(); return; } else if (button == QMessageBox::Cancel) return; } load(); _referencesP->refreshList(); QTextCursor cur = _editorP->textCursor(); cur.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); _editorP->setTextCursor(cur); _editorP->ensureCursorVisible(); } void c2bEditor::exportEntries() { const QStringList keys(_referencesP->selectedKeys()); if (keys.count() == 0) return; c2bExportDialog ed(_editor_fn, _editorP->toPlainText(), keys, this); if (ed.exec()) emit openFile(ed.exportFilename()); } void c2bEditor::pasteCurrentBibTeX() { _editorP->insertPlainText(_bpP->toBibTeX(false)); } void c2bEditor::journalsToFull() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); const QString text(_bpP->setJournalsToFull(_editorP->toPlainText())); _editorP->updatePlainText(text); QApplication::restoreOverrideCursor(); } void c2bEditor::journalsToAbbreviated() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); const QString text(_bpP->setJournalsToAbbreviated(_editorP->toPlainText())); _editorP->updatePlainText(text); QApplication::restoreOverrideCursor(); } void c2bEditor::updateMetadata() { c2bUpdateMetadata um(this); um.update(_editor_fn, _editorP->toPlainText()); } void c2bEditor::postProcess() { c2bPostprocess* ppBib = new c2bPostprocess(_editor_fn, this); ppBib->show(); } void c2bEditor::helpEditor() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2beditor.php"); } void c2bEditor::helpCb2Bib() { c2bUtils::displayHelp("http://www.molspaces.com/cb2bib/index.html"); } void c2bEditor::viewCb2Bib() { c2bUtils::setWidgetOnTop(_c2b_mainP); } void c2bEditor::setViewMode(bool edit_mode) { QList acts; if (edit_mode) { _textFinderP->setEditor(_editorP); if (_browserP) { acts = _browserP->actions(); for (int i = 0; i < acts.count(); ++i) acts.at(i)->setVisible(false); ui.viewZoomInAction->setVisible(false); ui.viewZoomOutAction->setVisible(false); } acts = _editorP->actions(); for (int i = 0; i < acts.count(); ++i) acts.at(i)->setVisible(true); _stackedWidgetP->setCurrentWidget(_editorP); } else { // Browser defined _textFinderP->setEditor(_browserP); acts = _editorP->actions(); for (int i = 0; i < acts.count(); ++i) acts.at(i)->setVisible(false); acts = _browserP->actions(); for (int i = 0; i < acts.count(); ++i) acts.at(i)->setVisible(true); ui.viewZoomInAction->setVisible(true); ui.viewZoomOutAction->setVisible(true); _stackedWidgetP->setCurrentWidget(_browserP); } } void c2bEditor::showMessage(const QString& ms) { statusBar()->showMessage(ms, C2B_MESSAGE_TIME); } void c2bEditor::cursorPositionChanged() { int lineNumber(0); QTextBlock current = _editorP->textCursor().block(); QTextBlock b; for (b = _editorP->document()->begin(); b.isValid(); b = b.next()) { ++lineNumber; if (b == current) break; } int linePosition(_editorP->textCursor().position() - current.position() + 1); _lineLabelP->setText(tr(" Line: %1 Col: %2 ").arg(lineNumber).arg(linePosition)); } void c2bEditor::overwriteModeChanged() { if (_editorP->overwriteMode()) _overwriteLabelP->setText(tr(" OVR ")); else _overwriteLabelP->setText(tr(" INS ")); } cb2bib-1.4.9/src/c2bREHighlighter.h0000644000175000017500000000156612045520050016613 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BREHIGHLIGHTER_H #define C2BREHIGHLIGHTER_H #include /** RegExp SyntaxHighLighter @author Pere Constans */ class c2bColors; class c2bREHighlighter : public QSyntaxHighlighter { public: c2bREHighlighter(QTextDocument* doc); ~c2bREHighlighter(); protected: virtual void highlightBlock(const QString& text); private: QColor text_color; QRegExp rx0; QRegExp rx1; QRegExp rx2; QRegExp rx3; QRegExp rx4; QRegExp rx5; c2bColors* c; }; #endif cb2bib-1.4.9/src/bookmarkPlugin.h0000644000175000017500000000157212045520050016520 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef BOOKMARKPLUGIN_H #define BOOKMARKPLUGIN_H #include class QFileSystemWatcher; class bookmarkPlugin : public QMenu { Q_OBJECT public: bookmarkPlugin(QWidget* parentw = 0); ~bookmarkPlugin(); signals: void editBookmarks(); void openFile(const QString& fn); private: QFileSystemWatcher* _fsw; QString _bookmark_file; QString iconProvider(const QString& fn, const QString& iconFile); private slots: void init(); void openBookmark(); void parseBookmarks(); }; #endif cb2bib-1.4.9/src/clipboardPoll.cpp0000644000175000017500000001701012045520050016647 0ustar rusconirusconi/*************************************************************************** * clipboardPoll, modified by Pere Constans for the cb2Bib, 2005 * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * * * Author and Copyright (C) 2003 by Lubos Lunak * Distributed under the GNU General Public License * * * This file is part of the KDE project * Copyright (C) 2003 by Lubos Lunak * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. ***************************************************************************/ #include "clipboardPoll.h" #include #include #include /* The polling magic: There's no way with X11 how to find out if the selection has changed (unless its ownership is taken away from the current client). In the future, there will be hopefully such notification, which will make this whole file more or less obsolete. But for now, Klipper has to poll. In order to avoid transferring all the data on every time pulse, this file implements two optimizations: The first one is checking whether the selection owner is Qt application (using the _QT_SELECTION/CLIPBOARD_SENTINEL atoms on the root window of screen 0), and if yes, Klipper can rely on QClipboard's signals. If the owner is not Qt app, and the ownership has changed, it means the selection has changed as well. Otherwise, first only the timestamp of the last selection change is requested using the TIMESTAMP selection target, and if it's the same, it's assumed the contents haven't changed. Note that some applications (like XEmacs) does not provide this information, so Klipper has to assume that the clipboard might have changed in this case --- this is what is meant by REFUSED below. */ clipboardPoll::clipboardPoll(QWidget* parentw) : QWidget(parentw) { // kapp->installX11EventFilter( this ); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); const char* names[ 6 ] = { "_QT_SELECTION_SENTINEL", "_QT_CLIPBOARD_SENTINEL", "CLIPBOARD", "TIMESTAMP", "KLIPPER_SELECTION_TIMESTAMP", "KLIPPER_CLIPBOARD_TIMESTAMP" }; Atom atoms[ 6 ]; XInternAtoms(QX11Info::display(), const_cast< char** >(names), 6, False, atoms); selection.sentinel_atom = atoms[ 0 ]; clipboard.sentinel_atom = atoms[ 1 ]; xa_clipboard = atoms[ 2 ]; xa_timestamp = atoms[ 3 ]; selection.timestamp_atom = atoms[ 4 ]; clipboard.timestamp_atom = atoms[ 5 ]; selection.atom = XA_PRIMARY; clipboard.atom = xa_clipboard; selection.last_change = clipboard.last_change = QX11Info::appTime(); // don't trigger right after startup selection.last_owner = XGetSelectionOwner(QX11Info::display(), XA_PRIMARY); clipboard.last_owner = XGetSelectionOwner(QX11Info::display(), xa_clipboard); selection.waiting_for_timestamp = false; clipboard.waiting_for_timestamp = false; updateQtOwnership(selection); updateQtOwnership(clipboard); } clipboardPoll::~clipboardPoll() { delete timer; } bool clipboardPoll::x11Event(XEvent* e) { // note that this is also installed as app-wide filter if (e->type == SelectionNotify && e->xselection.requestor == winId()) { if (changedTimestamp(selection, *e)) { emit clipboardChanged(true); } if (changedTimestamp(clipboard, *e)) { emit clipboardChanged(false); } return true; // filter out } return false; } void clipboardPoll::updateQtOwnership(SelectionData& sData) { Atom type; int format; unsigned long nitems; unsigned long after; unsigned char* prop = NULL; if (XGetWindowProperty(QX11Info::display(), QX11Info::appRootWindow(0), sData.sentinel_atom, 0, 2, False, XA_WINDOW, &type, &format, &nitems, &after, &prop) != Success || type != XA_WINDOW || format != 32 || nitems != 2 || prop == NULL) { sData.owner_is_qt = false; if (prop != NULL) XFree(prop); return; } Window owner = reinterpret_cast< long* >(prop)[ 0 ]; // [0] is new owner, [1] is previous XFree(prop); Window current_owner = XGetSelectionOwner(QX11Info::display(), sData.atom); sData.owner_is_qt = (owner == current_owner); } void clipboardPoll::timeout() { // KlipperWidget::updateTimestamp(); if (!qApp->clipboard()->ownsSelection() && checkTimestamp(selection)) { emit clipboardChanged(true); } if (!qApp->clipboard()->ownsClipboard() && checkTimestamp(clipboard)) { emit clipboardChanged(false); } } bool clipboardPoll::checkTimestamp(SelectionData& sData) { Window current_owner = XGetSelectionOwner(QX11Info::display(), sData.atom); updateQtOwnership(sData); if (sData.owner_is_qt) { sData.last_change = CurrentTime; sData.last_owner = current_owner; sData.waiting_for_timestamp = false; return false; } if (current_owner != sData.last_owner) // owner has changed { sData.last_owner = current_owner; sData.waiting_for_timestamp = false; sData.last_change = CurrentTime; return true; } if (current_owner == None) { return false; // None also last_owner... } if (sData.waiting_for_timestamp) { // We're already waiting for the timestamp of the last check return false; } XDeleteProperty(QX11Info::display(), winId(), sData.timestamp_atom); XConvertSelection(QX11Info::display(), sData.atom, xa_timestamp, sData.timestamp_atom, winId(), QX11Info::appTime()); sData.waiting_for_timestamp = true; sData.waiting_x_time = QX11Info::appTime(); return false; } bool clipboardPoll::changedTimestamp(SelectionData& sData, const XEvent& ev) { if (ev.xselection.requestor != winId() || ev.xselection.selection != sData.atom || ev.xselection.time != sData.waiting_x_time) { return false; } sData.waiting_for_timestamp = false; if (ev.xselection.property == None) { return true; } Atom type; int format; unsigned long nitems; unsigned long after; unsigned char* prop = NULL; if (XGetWindowProperty(QX11Info::display(), winId(), ev.xselection.property, 0, 1, False, AnyPropertyType, &type, &format, &nitems, &after, &prop) != Success || format != 32 || nitems != 1 || prop == NULL) { if (prop != NULL) XFree(prop); return true; } Time timestamp = reinterpret_cast< long* >(prop)[ 0 ]; XFree(prop); if (timestamp != sData.last_change || timestamp == CurrentTime) { sData.last_change = timestamp; return true; } return false; // ok, same timestamp } cb2bib-1.4.9/src/c2bRLWebSearchSettings.cpp0000644000175000017500000000271012045520050020273 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bRLWebSearchSettings.h" #include "c2bSettings.h" c2bRLWebSearchSettings::c2bRLWebSearchSettings(QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); resize(size().width(), 1); c2bSettings* settings(c2bSettingsP); const QString searchEngine(settings->value("c2bReferenceList/SearchEngine").toString()); ui.searchEngine->addItem(searchEngine); ui.searchEngine->addItem("http://www.google.com/search?ie=UTF-8&q="); ui.searchEngine->addItem("http://scholar.google.com/scholar?ie=UTF-8&q="); ui.searchEngine->addItem("http://www.ncbi.nlm.nih.gov/pubmed?term="); ui.searchEngine->setCurrentIndex(0); ui.searchEngine->setFocus(); ui.addQuotes->setChecked(settings->value("c2bReferenceList/SearchEngineAddQuotes").toBool()); } c2bRLWebSearchSettings::~c2bRLWebSearchSettings() {} void c2bRLWebSearchSettings::accept() { c2bSettings* settings(c2bSettingsP); settings->setValue("c2bReferenceList/SearchEngine", ui.searchEngine->currentText()); settings->setValue("c2bReferenceList/SearchEngineAddQuotes", ui.addQuotes->isChecked()); QDialog::accept(); } cb2bib-1.4.9/src/c2bBibParser.h0000644000175000017500000000426112045520050015772 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BBIBPARSER_H #define C2BBIBPARSER_H #include "c2bLineEdit.h" #include "c2bBibPreparserLog.h" #include #include #include class QComboBox; /** cb2Bib interface to bibParser This class groups Bib Parser functionality related to GUI @author Pere Constans */ class c2bBibParser : public bibParser { Q_OBJECT public: c2bBibParser(QObject* parento = 0); ~c2bBibParser(); void clearCurrentReference(); void setWidgetMapping(); inline void addField(const QString& name, c2bLineEdit* editor) { _field_editors.insert(name, editor); } inline void addTypes(QComboBox* types) { _type_editor = types; } inline QString field(const QString& name) const { return _field_editors.value(name)->text(); } inline void setField(const QString& name, const QString& value) { _field_editors[name]->setText(parse(name, value)); } inline void setField(const QString& name, const QString& value, const QString& init_value) { if (name == "addauthors") _field_editors["author"]->setText(parse(name, value, init_value)); else if (name == "addeditors") _field_editors["editor"]->setText(parse(name, value, init_value)); } signals: void bibModified(bool modified); void setDocumentFilename(); private: QComboBox* _type_editor; QHash _field_editors; QPointer _preparser_logP; QWidget* _c2b_mainP; bool _bp_updates_gui; void checkRegExpFile(const QString& fn); void currentReferenceUpdated(); void setCiteID(); void setReferenceType(const QString& type); private slots: void referenceEdited(const QString& value); void setField(); void showLog(const QString& log); }; #endif cb2bib-1.4.9/src/c2bBibPreparserLog.cpp0000644000175000017500000000361712045520050017502 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bBibPreparserLog.h" #include "c2b.h" #include "c2bSettings.h" #include "c2bUtils.h" #include #include c2bBibPreparserLog::c2bBibPreparserLog(QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); setWindowTitle(tr("Clipboard Preparsing Log - cb2Bib")); PreparserShowLog = new QCheckBox(); PreparserShowLog->setObjectName(QString::fromUtf8("PreparserShowLog")); PreparserShowLog->setLayoutDirection(Qt::RightToLeft); PreparserShowLog->setText(QApplication::translate("c2bBibPreparserLog", "Do not show log", 0, QApplication::UnicodeUTF8)); ui.buttonBox->addButton(PreparserShowLog, QDialogButtonBox::ActionRole); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); connect(this, SIGNAL(finished(int)), this, SLOT(close())); } c2bBibPreparserLog::~c2bBibPreparserLog() {} void c2bBibPreparserLog::append(const QString& ms) { ui.Log->appendPlainText(ms); } void c2bBibPreparserLog::show() { resize(c2bSettingsP->value("c2bLogWidget/size", size()).toSize()); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); QDialog::show(); } void c2bBibPreparserLog::closeEvent(QCloseEvent* qevent) { ui.Log->clear(); if (PreparserShowLog->isChecked()) c2bSettingsP->setValue("cb2Bib/PreparserShowLog", false); PreparserShowLog->setChecked(false); c2bSettingsP->setValue("c2bLogWidget/size", size()); qevent->accept(); } void c2bBibPreparserLog::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-overview.php#keyboard"); } cb2bib-1.4.9/src/c2bComboBox.cpp0000644000175000017500000000214412045520050016162 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bComboBox.h" #include #include #include #include c2bComboBox::c2bComboBox(QWidget* parentw) : QComboBox(parentw) {} c2bComboBox::~c2bComboBox() {} void c2bComboBox::contextMenuEvent(QContextMenuEvent* e) { QMenu* menu = QComboBox::lineEdit()->createStandardContextMenu(); QList acts = menu->actions(); QAction* act; act = new QAction("Clear", menu); act->setEnabled(!QComboBox::lineEdit()->text().isEmpty()); connect(act, SIGNAL(triggered()), this, SLOT(clearEditText())); menu->insertAction(acts.at(7), act); acts = actions(); for (int i = 0; i < acts.count(); ++i) menu->addAction(acts.at(i)); menu->exec(e->globalPos()); delete menu; } cb2bib-1.4.9/src/c2bCoreCiter.h0000644000175000017500000000155312045520050016001 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCORECITER_H #define C2BCORECITER_H #include #include class settings; class c2bCoreCiter : public QObject { Q_OBJECT public: c2bCoreCiter(QWidget* parentw = 0); ~c2bCoreCiter(); void cite(const QStringList& keys) const; void citeToClipboard(const QStringList& keys) const; void citeToLyXPipe(const QStringList& keys) const; public slots: void setLyXPipe(); private: QString _lyxpipe; QWidget* _parentWP; settings* _settingsP; }; #endif cb2bib-1.4.9/src/findDialog.ui0000644000175000017500000001606512045517740016001 0ustar rusconirusconi Pere Constans findDialog 0 0 459 196 Find in text - cb2Bib 6 6 0 0 Options 9 6 &Case sensitive Qt::Vertical 180 16 &Whole words only 6 0 Find: comboFind 0 0 true true false Clear Text :/icons/icons/clear_left.png:/icons/icons/clear_left.png Pattern not found Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Ok 0 0 Direction 9 6 Qt::Vertical 147 16 &Backward &Forward true QFrame::HLine QFrame::Sunken Qt::Horizontal c2bComboBox QComboBox
    c2bComboBox.h
    comboFind clearB checkWords checkCase radioForward radioBackward clearB clicked() comboFind clearEditText() 380 18 244 28 buttonBox rejected() findDialog reject() 125 202 309 226 buttonBox accepted() findDialog accept() 200 202 211 170
    cb2bib-1.4.9/src/c2bSearchInFilesPattern.cpp0000644000175000017500000000705412045520050020474 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bSearchInFilesPattern.h" #include "c2b.h" #include "c2bBibParser.h" #include "c2bSettings.h" #include #include c2bSearchInFilesPattern::c2bSearchInFilesPattern(QWidget* parentw) : QWidget(parentw) { ui.setupUi(this); c2bBibParser* bp = c2b::bibParser(); ui.patternType->addItems(searchPattern::types()); ui.patternType->setCurrentIndex(c2bSettingsP->value("c2bSearchInFiles/PatternTypeIndex", 0).toInt()); ui.patternScope->addItems(bp->sortedBibliographicFields()); ui.yearScope->hide(); ui.inputPattern->setFocus(); connect(ui.clearB, SIGNAL(clicked()), this, SLOT(patternChanged())); connect(ui.inputPattern, SIGNAL(textEdited(const QString&)), this, SLOT(patternChanged())); connect(ui.patternScope, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(showYearScope(const QString&))); } c2bSearchInFilesPattern::~c2bSearchInFilesPattern() { c2bSettingsP->setValue("c2bSearchInFiles/PatternTypeIndex", ui.patternType->currentIndex()); } void c2bSearchInFilesPattern::patternChanged() { emit patternAvailable(isAvailable()); } void c2bSearchInFilesPattern::setText(const QString& text) { ui.inputPattern->setText(text); ui.inputPattern->setFocus(); } void c2bSearchInFilesPattern::clear() { ui.inputPattern->clear(); ui.inputPattern->setFocus(); } void c2bSearchInFilesPattern::setPattern(QTreeWidgetItem* pattern) { if (!pattern) return; if (pattern->columnCount() != ITEMS_IN_SEARCH_PATTERN) return; if (pattern->text(0) == "NOT") ui.NOT->setChecked(true); else ui.NOT->setChecked(false); if (pattern->text(1) == "Sensitive") ui.caseSensitive->setChecked(true); else ui.caseSensitive->setChecked(false); ui.patternType->setCurrentIndex(ui.patternType->findText(pattern->text(2))); ui.patternScope->setCurrentIndex(ui.patternScope->findText(pattern->text(3))); if (pattern->text(4) == "=") ui.yearScope->setCurrentIndex(ui.yearScope->findText("Exact")); else if (pattern->text(4) == ">") ui.yearScope->setCurrentIndex(ui.yearScope->findText("Newer")); else ui.yearScope->setCurrentIndex(ui.yearScope->findText("Older")); ui.inputPattern->setText(pattern->text(5)); } const QStringList c2bSearchInFilesPattern::patterns() { QStringList p; if (ui.NOT->isChecked()) p.append("NOT"); else p.append(QString()); if (ui.caseSensitive->isChecked()) p.append("Sensitive"); else p.append("Insensitive"); p.append(ui.patternType->currentText()); p.append(ui.patternScope->currentText()); if (ui.yearScope->isHidden()) p.append(" "); else if (ui.yearScope->currentText() == "Exact") p.append("="); else if (ui.yearScope->currentText() == "Newer") p.append(">"); else if (ui.yearScope->currentText() == "Older") p.append("<"); p.append(ui.inputPattern->text()); return p; } void c2bSearchInFilesPattern::showYearScope(const QString& scope) { if (scope == "year") ui.yearScope->show(); else ui.yearScope->hide(); } void c2bSearchInFilesPattern::setFocus() { ui.inputPattern->setFocus(); } cb2bib-1.4.9/src/qtsingleapplication/0000755000175000017500000000000012045517740017444 5ustar rusconirusconicb2bib-1.4.9/src/qtsingleapplication/src/0000755000175000017500000000000012045517740020233 5ustar rusconirusconicb2bib-1.4.9/src/qtsingleapplication/src/qtlockedfile_win.cpp0000644000175000017500000001515712045517740024273 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include "qtlockedfile.h" #include #include #define MUTEX_PREFIX "QtLockedFile mutex " // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS #define MAX_READERS MAXIMUM_WAIT_OBJECTS Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) { if (mutexname.isEmpty()) { QFileInfo fi(*this); mutexname = QString::fromLatin1(MUTEX_PREFIX) + fi.absoluteFilePath().toLower(); } QString mname(mutexname); if (idx >= 0) mname += QString::number(idx); Qt::HANDLE mutex; if (doCreate) { QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); return 0; } } else { QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { if (GetLastError() != ERROR_FILE_NOT_FOUND) qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); return 0; } } return mutex; } bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) { Q_ASSERT(mutex); DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); switch (res) { case WAIT_OBJECT_0: case WAIT_ABANDONED: return true; break; case WAIT_TIMEOUT: break; default: qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); } return false; } bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); if (!wmutex && !(wmutex = getMutexHandle(-1, true))) return false; if (!waitMutex(wmutex, block)) return false; if (mode == ReadLock) { int idx = 0; for (; idx < MAX_READERS; idx++) { rmutex = getMutexHandle(idx, false); if (!rmutex || waitMutex(rmutex, false)) break; CloseHandle(rmutex); } bool ok = true; if (idx >= MAX_READERS) { qWarning("QtLockedFile::lock(): too many readers"); rmutex = 0; ok = false; } else if (!rmutex) { rmutex = getMutexHandle(idx, true); if (!rmutex || !waitMutex(rmutex, false)) ok = false; } if (!ok && rmutex) { CloseHandle(rmutex); rmutex = 0; } ReleaseMutex(wmutex); if (!ok) return false; } else { Q_ASSERT(rmutexes.isEmpty()); for (int i = 0; i < MAX_READERS; i++) { Qt::HANDLE mutex = getMutexHandle(i, false); if (mutex) rmutexes.append(mutex); } if (rmutexes.size()) { DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), TRUE, block ? INFINITE : 0); if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { if (res != WAIT_TIMEOUT) qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky unlock(); return false; } } } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; if (m_lock_mode == ReadLock) { ReleaseMutex(rmutex); CloseHandle(rmutex); rmutex = 0; } else { foreach(Qt::HANDLE mutex, rmutexes) { ReleaseMutex(mutex); CloseHandle(mutex); } rmutexes.clear(); ReleaseMutex(wmutex); } m_lock_mode = QtLockedFile::NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); if (wmutex) CloseHandle(wmutex); } cb2bib-1.4.9/src/qtsingleapplication/src/qtlockedfile_unix.cpp0000644000175000017500000000721312045517740024453 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include #include #include #include #include "qtlockedfile.h" bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; int cmd = block ? F_SETLKW : F_SETLK; int ret = fcntl(handle(), cmd, &fl); if (ret == -1) { if (errno != EINTR && errno != EAGAIN) qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = F_UNLCK; int ret = fcntl(handle(), F_SETLKW, &fl); if (ret == -1) { qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); } cb2bib-1.4.9/src/qtsingleapplication/src/qtsinglecoreapplication.h0000644000175000017500000000526212045517740025334 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include class QtLocalPeer; class QtSingleCoreApplication : public QCoreApplication { Q_OBJECT public: QtSingleCoreApplication(int &argc, char **argv); QtSingleCoreApplication(const QString &id, int &argc, char **argv); bool isRunning(); QString id() const; public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); Q_SIGNALS: void messageReceived(const QString &message); private: QtLocalPeer* peer; }; cb2bib-1.4.9/src/qtsingleapplication/src/qtlocalpeer.h0000644000175000017500000000556512045517740022732 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include #include #include namespace QtLP_Private { #include "qtlockedfile.h" } class QtLocalPeer : public QObject { Q_OBJECT public: QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); bool isClient(); bool sendMessage(const QString &message, int timeout); QString applicationId() const { return id; } Q_SIGNALS: void messageReceived(const QString &message); protected Q_SLOTS: void receiveConnection(); protected: QString id; QString socketName; QLocalServer* server; QtLP_Private::QtLockedFile lockFile; private: static const char* ack; }; cb2bib-1.4.9/src/qtsingleapplication/src/qtlockedfile.h0000644000175000017500000000667112045517740023064 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #ifndef QTLOCKEDFILE_H #define QTLOCKEDFILE_H #include #ifdef Q_OS_WIN #include #endif #if defined(Q_WS_WIN) # if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) # define QT_QTLOCKEDFILE_EXPORT # elif defined(QT_QTLOCKEDFILE_IMPORT) # if defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # endif # define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) # elif defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) # endif #else # define QT_QTLOCKEDFILE_EXPORT #endif class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile { public: enum LockMode { NoLock = 0, ReadLock, WriteLock }; QtLockedFile(); QtLockedFile(const QString &name); ~QtLockedFile(); bool open(OpenMode mode); bool lock(LockMode mode, bool block = true); bool unlock(); bool isLocked() const; LockMode lockMode() const; private: #ifdef Q_OS_WIN Qt::HANDLE wmutex; Qt::HANDLE rmutex; QVector rmutexes; QString mutexname; Qt::HANDLE getMutexHandle(int idx, bool doCreate); bool waitMutex(Qt::HANDLE mutex, bool doBlock); #endif LockMode m_lock_mode; }; #endif cb2bib-1.4.9/src/qtsingleapplication/src/qtsingleapplication.cpp0000644000175000017500000002671512045517740025024 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include "qtsingleapplication.h" #include "qtlocalpeer.h" #include /*! \class QtSingleApplication qtsingleapplication.h \brief The QtSingleApplication class provides an API to detect and communicate with running instances of an application. This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server. By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead. The application should create the QtSingleApplication object early in the startup phase, and call isRunning() or sendMessage() to find out if another instance of this application is already running. Startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance in the sendMessage() function. If isRunning() or sendMessage() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. The application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal. The messageReceived() signal will be emitted when the application receives messages from another instance of the same application. If isRunning() or sendMessage() returns true, another instance is already running, and the application should terminate or enter client mode. If a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot. Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that). \code // Original int main(int argc, char **argv) { QApplication app(argc, argv); MyMainWidget mmw; mmw.show(); return app.exec(); } // Single instance int main(int argc, char **argv) { QtSingleApplication app(argc, argv); if (app.isRunning()) return 0; MyMainWidget mmw; app.setActivationWindow(&mmw); mmw.show(); return app.exec(); } \endcode Once this QtSingleApplication instance is destroyed(for example, when the user quits), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance. For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library. \sa QtSingleCoreApplication */ void QtSingleApplication::sysInit(const QString &appId) { actWin = 0; peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a GUIenabled are passed on to the QApplication constructor. If you are creating a console application (i.e. setting \a GUIenabled to false), you may consider using QtSingleCoreApplication instead. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) : QApplication(argc, argv, GUIenabled) { sysInit(); } /*! Creates a QtSingleApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) : QApplication(argc, argv) { sysInit(appId); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a type are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) : QApplication(argc, argv, type) { sysInit(); } #if defined(Q_WS_X11) /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be \a appId. \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(appId); } #endif /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleApplication::id() const { return peer->applicationId(); } /*! Sets the activation window of this application to \a aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window. If \a activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted. \sa activateWindow(), messageReceived() */ void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; if (activateOnMessage) connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); else disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); } /*! Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0. \sa setActivationWindow() */ QWidget* QtSingleApplication::activationWindow() const { return actWin; } /*! De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set. This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance. This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set. \sa setActivationWindow(), messageReceived(), initialize() */ void QtSingleApplication::activateWindow() { if (actWin) { actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); actWin->raise(); actWin->activateWindow(); } } /*! \fn void QtSingleApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage(), setActivationWindow(), activateWindow() */ /*! \fn void QtSingleApplication::initialize(bool dummy = true) \obsolete */ cb2bib-1.4.9/src/qtsingleapplication/src/qtlockedfile.cpp0000644000175000017500000001434112045517740023410 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include "qtlockedfile.h" /*! \class QtLockedFile \brief The QtLockedFile class extends QFile with advisory locking functions. A file may be locked in read or write mode. Multiple instances of \e QtLockedFile, created in multiple processes running on the same machine, may have a file locked in read mode. Exactly one instance may have it locked in write mode. A read and a write lock cannot exist simultaneously on the same file. The file locks are advisory. This means that nothing prevents another process from manipulating a locked file using QFile or file system functions offered by the OS. Serialization is only guaranteed if all processes that access the file use QLockedFile. Also, while holding a lock on a file, a process must not open the same file again (through any API), or locks can be unexpectedly lost. The lock provided by an instance of \e QtLockedFile is released whenever the program terminates. This is true even when the program crashes and no destructors are called. */ /*! \enum QtLockedFile::LockMode This enum describes the available lock modes. \value ReadLock A read lock. \value WriteLock A write lock. \value NoLock Neither a read lock nor a write lock. */ /*! Constructs an unlocked \e QtLockedFile object. This constructor behaves in the same way as \e QFile::QFile(). \sa QFile::QFile() */ QtLockedFile::QtLockedFile() : QFile() { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Constructs an unlocked QtLockedFile object with file \a name. This constructor behaves in the same way as \e QFile::QFile(const QString&). \sa QFile::QFile() */ QtLockedFile::QtLockedFile(const QString &name) : QFile(name) { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Opens the file in OpenMode \a mode. This is identical to QFile::open(), with the one exception that the Truncate mode flag is disallowed. Truncation would conflict with the advisory file locking, since the file would be modified before the write lock is obtained. If truncation is required, use resize(0) after obtaining the write lock. Returns true if successful; otherwise false. \sa QFile::open(), QFile::resize() */ bool QtLockedFile::open(OpenMode mode) { if (mode & QIODevice::Truncate) { qWarning("QtLockedFile::open(): Truncate mode not allowed."); return false; } return QFile::open(mode); } /*! Returns \e true if this object has a in read or write lock; otherwise returns \e false. \sa lockMode() */ bool QtLockedFile::isLocked() const { return m_lock_mode != NoLock; } /*! Returns the type of lock currently held by this object, or \e QtLockedFile::NoLock. \sa isLocked() */ QtLockedFile::LockMode QtLockedFile::lockMode() const { return m_lock_mode; } /*! \fn bool QtLockedFile::lock(LockMode mode, bool block = true) Obtains a lock of type \a mode. The file must be opened before it can be locked. If \a block is true, this function will block until the lock is aquired. If \a block is false, this function returns \e false immediately if the lock cannot be aquired. If this object already has a lock of type \a mode, this function returns \e true immediately. If this object has a lock of a different type than \a mode, the lock is first released and then a new lock is obtained. This function returns \e true if, after it executes, the file is locked by this object, and \e false otherwise. \sa unlock(), isLocked(), lockMode() */ /*! \fn bool QtLockedFile::unlock() Releases a lock. If the object has no lock, this function returns immediately. This function returns \e true if, after it executes, the file is not locked by this object, and \e false otherwise. \sa lock(), isLocked(), lockMode() */ /*! \fn QtLockedFile::~QtLockedFile() Destroys the \e QtLockedFile object. If any locks were held, they are released. */ cb2bib-1.4.9/src/qtsingleapplication/src/qtlocalpeer.cpp0000644000175000017500000001523212045517740023255 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include "qtlocalpeer.h" #include #include #if defined(Q_OS_WIN) #include #include typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); static PProcessIdToSessionId pProcessIdToSessionId = 0; #endif #if defined(Q_OS_UNIX) #include #include #endif namespace QtLP_Private { #include "qtlockedfile.cpp" #if defined(Q_OS_WIN) #include "qtlockedfile_win.cpp" #else #include "qtlockedfile_unix.cpp" #endif } const char* QtLocalPeer::ack = "ack"; QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) : QObject(parent), id(appId) { QString prefix = id; if (id.isEmpty()) { id = QCoreApplication::applicationFilePath(); #if defined(Q_OS_WIN) id = id.toLower(); #endif prefix = id.section(QLatin1Char('/'), -1); } prefix.remove(QRegExp("[^a-zA-Z]")); prefix.truncate(6); QByteArray idc = id.toUtf8(); quint16 idNum = qChecksum(idc.constData(), idc.size()); socketName = QLatin1String("qtsingleapp-") + prefix + QLatin1Char('-') + QString::number(idNum, 16); #if defined(Q_OS_WIN) if (!pProcessIdToSessionId) { QLibrary lib("kernel32"); pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); } if (pProcessIdToSessionId) { DWORD sessionId = 0; pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); socketName += QLatin1Char('-') + QString::number(sessionId, 16); } #else socketName += QLatin1Char('-') + QString::number(::getuid(), 16); #endif server = new QLocalServer(this); QString lockName = QDir(QDir::tempPath()).absolutePath() + QLatin1Char('/') + socketName + QLatin1String("-lockfile"); lockFile.setFileName(lockName); lockFile.open(QIODevice::ReadWrite); } bool QtLocalPeer::isClient() { if (lockFile.isLocked()) return false; if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) return true; bool res = server->listen(socketName); #if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) // ### Workaround if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); res = server->listen(socketName); } #endif if (!res) qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); return false; } bool QtLocalPeer::sendMessage(const QString &message, int timeout) { if (!isClient()) return false; QLocalSocket socket; bool connOk = false; for(int i = 0; i < 2; i++) { // Try twice, in case the other instance is just starting up socket.connectToServer(socketName); connOk = socket.waitForConnected(timeout/2); if (connOk || i) break; int ms = 250; #if defined(Q_OS_WIN) Sleep(DWORD(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } if (!connOk) return false; QByteArray uMsg(message.toUtf8()); QDataStream ds(&socket); ds.writeBytes(uMsg.constData(), uMsg.size()); bool res = socket.waitForBytesWritten(timeout); res &= socket.waitForReadyRead(timeout); // wait for ack res &= (socket.read(qstrlen(ack)) == ack); return res; } void QtLocalPeer::receiveConnection() { QLocalSocket* socket = server->nextPendingConnection(); if (!socket) return; while (socket->bytesAvailable() < (int)sizeof(quint32)) socket->waitForReadyRead(); QDataStream ds(socket); QByteArray uMsg; quint32 remaining; ds >> remaining; uMsg.resize(remaining); int got = 0; char* uMsgBuf = uMsg.data(); do { got = ds.readRawData(uMsgBuf, remaining); remaining -= got; uMsgBuf += got; } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); if (got < 0) { qWarning() << "QtLocalPeer: Message reception failed" << socket->errorString(); delete socket; return; } QString message(QString::fromUtf8(uMsg)); socket->write(ack, qstrlen(ack)); socket->waitForBytesWritten(1000); delete socket; emit messageReceived(message); //### (might take a long time to return) } cb2bib-1.4.9/src/qtsingleapplication/src/qtsinglecoreapplication.cpp0000644000175000017500000001275612045517740025675 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include "qtsinglecoreapplication.h" #include "qtlocalpeer.h" /*! \class QtSingleCoreApplication qtsinglecoreapplication.h \brief A variant of the QtSingleApplication class for non-GUI applications. This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library. The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage. A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application. \sa QtSingleApplication */ /*! Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc and \a argv are passed on to the QCoreApplication constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleCoreApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QCoreApplication constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleCoreApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleCoreApplication::id() const { return peer->applicationId(); } /*! \fn void QtSingleCoreApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage() */ cb2bib-1.4.9/src/qtsingleapplication/src/qtsingleapplication.h0000644000175000017500000000775512045517740024474 0ustar rusconirusconi/**************************************************************************** ** ** This file is part of a Qt Solutions component. ** ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Solutions Commercial License Agreement provided ** with the Software or, alternatively, in accordance with the terms ** contained in a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** Please note Third Party Software included with Qt Solutions may impose ** additional restrictions and it is the user's responsibility to ensure ** that they have met the licensing requirements of the GPL, LGPL, or Qt ** Solutions Commercial license and the relevant license of the Third ** Party Software they are using. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at qt-sales@nokia.com. ** ****************************************************************************/ #include class QtLocalPeer; #if defined(Q_WS_WIN) # if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) # define QT_QTSINGLEAPPLICATION_EXPORT # elif defined(QT_QTSINGLEAPPLICATION_IMPORT) # if defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # endif # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) # elif defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) # endif #else # define QT_QTSINGLEAPPLICATION_EXPORT #endif class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication { Q_OBJECT public: QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); QtSingleApplication(const QString &id, int &argc, char **argv); QtSingleApplication(int &argc, char **argv, Type type); #if defined(Q_WS_X11) QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); #endif bool isRunning(); QString id() const; void setActivationWindow(QWidget* aw, bool activateOnMessage = true); QWidget* activationWindow() const; // Obsolete: void initialize(bool dummy = true) { isRunning(); Q_UNUSED(dummy) } public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); void activateWindow(); Q_SIGNALS: void messageReceived(const QString &message); private: void sysInit(const QString &appId = QString()); QtLocalPeer *peer; QWidget *actWin; }; cb2bib-1.4.9/src/qtsingleapplication/LICENSE.LGPL0000644000175000017500000006350412045517740021216 0ustar rusconirusconi GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! cb2bib-1.4.9/src/qtsingleapplication/README.TXT0000644000175000017500000000021012045517740020773 0ustar rusconirusconiSingle Application v2.6 The QtSingleApplication component provides support for applications that can be only started once per user. cb2bib-1.4.9/src/qtsingleapplication/INSTALL.TXT0000644000175000017500000002240012045517740021151 0ustar rusconirusconiINSTALLATION INSTRUCTIONS These instructions refer to the package you are installing as some-package.tar.gz or some-package.zip. The .zip file is intended for use on Windows. The directory you choose for the installation will be referred to as your-install-dir. Note to Qt Visual Studio Integration users: In the instructions below, instead of building from command line with nmake, you can use the menu command 'Qt->Open Solution from .pro file' on the .pro files in the example and plugin directories, and then build from within Visual Studio. Unpacking and installation -------------------------- 1. Unpacking the archive (if you have not done so already). On Unix and Mac OS X (in a terminal window): cd your-install-dir gunzip some-package.tar.gz tar xvf some-package.tar This creates the subdirectory some-package containing the files. On Windows: Unpack the .zip archive by right-clicking it in explorer and choosing "Extract All...". If your version of Windows does not have zip support, you can use the infozip tools available from www.info-zip.org. If you are using the infozip tools (in a command prompt window): cd your-install-dir unzip some-package.zip 2. Configuring the package. The configure script is called "configure" on unix/mac and "configure.bat" on Windows. It should be run from a command line after cd'ing to the package directory. You can choose whether you want to use the component by including its source code directly into your project, or build the component as a dynamic shared library (DLL) that is loaded into the application at run-time. The latter may be preferable for technical or licensing (LGPL) reasons. If you want to build a DLL, run the configure script with the argument "-library". Also see the note about usage below. (Components that are Qt plugins, e.g. styles and image formats, are by default built as a plugin DLL.) The configure script will prompt you in some cases for further information. Answer these questions and carefully read the license text before accepting the license conditions. The package cannot be used if you do not accept the license conditions. 3. Building the component and examples (when required). If a DLL is to be built, or if you would like to build the examples, next give the commands qmake make [or nmake if your are using Microsoft Visual C++] The example program(s) can be found in the directory called "examples" or "example". Components that are Qt plugins, e.g. styles and image formats, are ready to be used as soon as they are built, so the rest of this installation instruction can be skipped. 4. Building the Qt Designer plugin (optional). Some of the widget components are provided with plugins for Qt Designer. To build and install the plugin, cd into the some-package/plugin directory and give the commands qmake make [or nmake if your are using Microsoft Visual C++] Restart Qt Designer to make it load the new widget plugin. Note: If you are using the built-in Qt Designer from the Qt Visual Studio Integration, you will need to manually copy the plugin DLL file, i.e. copy %QTDIR%\plugins\designer\some-component.dll to the Qt Visual Studio Integration plugin path, typically: C:\Program Files\Trolltech\Qt VS Integration\plugins Note: If you for some reason are using a Qt Designer that is built in debug mode, you will need to build the plugin in debug mode also. Edit the file plugin.pro in the plugin directory, changing 'release' to 'debug' in the CONFIG line, before running qmake. Solutions components are intended to be used directly from the package directory during development, so there is no 'make install' procedure. Using a component in your project --------------------------------- To use this component in your project, add the following line to the project's .pro file (or do the equivalent in your IDE): include(your-install-dir/some-package/src/some-package.pri) This adds the package's sources and headers to the SOURCES and HEADERS project variables respectively (or, if the component has been configured as a DLL, it adds that library to the LIBS variable), and updates INCLUDEPATH to contain the package's src directory. Additionally, the .pri file may include some dependencies needed by the package. To include a header file from the package in your sources, you can now simply use: #include or alternatively, in pre-Qt 4 style: #include Refer to the documentation to see the classes and headers this components provides. Install documentation (optional) -------------------------------- The HTML documentation for the package's classes is located in the your-install-dir/some-package/doc/html/index.html. You can open this file and read the documentation with any web browser. To install the documentation into Qt Assistant (for Qt version 4.4 and later): 1. In Assistant, open the Edit->Preferences dialog and choose the Documentation tab. Click the Add... button and select the file your-install-dir/some-package/doc/html/some-package.qch For Qt versions prior to 4.4, do instead the following: 1. The directory your-install-dir/some-package/doc/html contains a file called some-package.dcf. Execute the following commands in a shell, command prompt or terminal window: cd your-install-dir/some-package/doc/html/ assistant -addContentFile some-package.dcf The next time you start Qt Assistant, you can access the package's documentation. Removing the documentation from assistant ----------------------------------------- If you have installed the documentation into Qt Assistant, and want to uninstall it, do as follows, for Qt version 4.4 and later: 1. In Assistant, open the Edit->Preferences dialog and choose the Documentation tab. In the list of Registered Documentation, select the item com.trolltech.qtsolutions.some-package_version, and click the Remove button. For Qt versions prior to 4.4, do instead the following: 1. The directory your-install-dir/some-package/doc/html contains a file called some-package.dcf. Execute the following commands in a shell, command prompt or terminal window: cd your-install-dir/some-package/doc/html/ assistant -removeContentFile some-package.dcf Using the component as a DLL ---------------------------- 1. Normal components The shared library (DLL) is built and placed in the some-package/lib directory. It is intended to be used directly from there during development. When appropriate, both debug and release versions are built, since the run-time linker will in some cases refuse to load a debug-built DLL into a release-built application or vice versa. The following steps are taken by default to help the dynamic linker to locate the DLL at run-time (during development): Unix: The some-package.pri file will add linker instructions to add the some-package/lib directory to the rpath of the executable. (When distributing, or if your system does not support rpath, you can copy the shared library to another place that is searched by the dynamic linker, e.g. the "lib" directory of your Qt installation.) Mac: The full path to the library is hardcoded into the library itself, from where it is copied into the executable at link time, and ready by the dynamic linker at run-time. (When distributing, you will want to edit these hardcoded paths in the same way as for the Qt DLLs. Refer to the document "Deploying an Application on Mac OS X" in the Qt Reference Documentation.) Windows: the .dll file(s) are copied into the "bin" directory of your Qt installation. The Qt installation will already have set up that directory to be searched by the dynamic linker. 2. Plugins For Qt Solutions plugins (e.g. image formats), both debug and release versions of the plugin are built by default when appropriate, since in some cases the release Qt library will not load a debug plugin, and vice versa. The plugins are automatically copied into the plugins directory of your Qt installation when built, so no further setup is required. Plugins may also be built statically, i.e. as a library that will be linked into your application executable, and so will not need to be redistributed as a separate plugin DLL to end users. Static building is required if Qt itself is built statically. To do it, just add "static" to the CONFIG variable in the plugin/plugin.pro file before building. Refer to the "Static Plugins" section in the chapter "How to Create Qt Plugins" for explanation of how to use a static plugin in your application. The source code of the example program(s) will also typically contain the relevant instructions as comments. Uninstalling ------------ The following command will remove any fils that have been automatically placed outside the package directory itself during installation and building make distclean [or nmake if your are using Microsoft Visual C++] If Qt Assistant documentation or Qt Designer plugins have been installed, they can be uninstalled manually, ref. above. Enjoy! :) - The Qt Solutions Team. cb2bib-1.4.9/src/qtsingleapplication/LICENSE.GPL30000644000175000017500000010451312045517740021161 0ustar rusconirusconi GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . cb2bib-1.4.9/src/qtsingleapplication/LGPL_EXCEPTION.txt0000644000175000017500000000102612045517740022360 0ustar rusconirusconiNokia Qt LGPL Exception version 1.0 As a special exception to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that the incorporated material (i) does not exceed more than 5% of the total size of the Library; and (ii) is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates. cb2bib-1.4.9/src/c2bShortcutWidget.ui0000644000175000017500000000431012045517740017275 0ustar rusconirusconi c2bShortcutWidget 0 0 551 29 Form -1 0 0 true false Qt::NoFocus Clear key sequence :/icons/icons/clear_left.png:/icons/icons/clear_left.png Qt::NoFocus Reset key sequence to default value :/icons/icons/edit-undo.png:/icons/icons/edit-undo.png c2bShortcutPushButton QPushButton
    c2bShortcutPushButton.h
    cb2bib-1.4.9/src/c2bLogWidget.ui0000644000175000017500000000400012045517740016177 0ustar rusconirusconi Pere Constans c2bLogWidget 0 0 827 347 Process Log - cb2Bib 6 6 QFrame::StyledPanel QFrame::Raised true QFrame::HLine QFrame::Sunken Qt::Horizontal Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Help Log buttonBox rejected() c2bLogWidget reject() 797 330 830 305 cb2bib-1.4.9/src/c2bWebBrowser.cpp0000644000175000017500000001231112045520050016530 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bWebBrowser.h" #include "c2bUtils.h" #include #include #include #include #include c2bWebBrowser::c2bWebBrowser(QWidget* parentw) : QWebView(parentw) { // Avoid flickering (Qt 4.3) setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_OpaquePaintEvent, true); // Set default background to application page()->setPalette(qApp->palette()); // Actions setContextMenuPolicy(Qt::ActionsContextMenu); viewBackwardAction = new QAction(QIcon(QString::fromUtf8(":/icons/icons/viewBackward.png")), tr("Backward"), this); viewBackwardAction->setShortcut(QKeySequence("Left")); viewBackwardAction->setStatusTip(tr("Backward")); addAction(viewBackwardAction); viewForwardAction = new QAction(QIcon(QString::fromUtf8(":/icons/icons/viewForward.png")), tr("Forward"), this); viewForwardAction->setShortcut(QKeySequence("Right")); viewForwardAction->setStatusTip(tr("Forward")); addAction(viewForwardAction); c2bUtils::addSeparator(this); viewHomeAction = new QAction(QIcon(QString::fromUtf8(":/icons/icons/viewHome.png")), tr("Home"), this); viewHomeAction->setShortcut(QKeySequence("Esc")); viewHomeAction->setStatusTip(tr("Home page")); addAction(viewHomeAction); c2bUtils::addSeparator(this); viewReloadAction = new QAction(QIcon(QString::fromUtf8(":/icons/icons/viewReload.png")), tr("Reload"), this); viewReloadAction->setShortcut(QKeySequence("R")); viewReloadAction->setStatusTip(tr("Reload current page")); addAction(viewReloadAction); c2bUtils::addSeparator(this); viewZoomInAction = new QAction(QIcon(QString::fromUtf8(":/icons/icons/viewZoomIn.png")), tr("Zoom In"), this); viewZoomInAction->setShortcut(QKeySequence(QKeySequence::ZoomIn)); viewZoomInAction->setStatusTip(tr("Zoom in")); addAction(viewZoomInAction); viewZoomOutAction = new QAction(QIcon(QString::fromUtf8(":/icons/icons/viewZoomOut.png")), tr("Zoom Out"), this); viewZoomOutAction->setShortcut(QKeySequence(QKeySequence::ZoomOut)); viewZoomOutAction->setStatusTip(tr("Zoom out")); addAction(viewZoomOutAction); connect(viewForwardAction, SIGNAL(triggered()), this, SLOT(forward())); connect(viewBackwardAction, SIGNAL(triggered()), this, SLOT(back())); connect(viewHomeAction, SIGNAL(triggered()), this, SLOT(home())); connect(viewReloadAction, SIGNAL(triggered()), this, SLOT(reload())); connect(viewZoomInAction, SIGNAL(triggered()), this, SLOT(zoomIn())); connect(viewZoomOutAction, SIGNAL(triggered()), this, SLOT(zoomOut())); QShortcut* copy_shortcut = new QShortcut(QKeySequence(QKeySequence::Copy), this); connect(copy_shortcut, SIGNAL(activated()), this, SLOT(copy())); connect(page(), SIGNAL(linkHovered(const QString&, const QString&, const QString&)), this, SLOT(_linkHovered(const QString&, const QString&, const QString&))); connect(this, SIGNAL(titleChanged(const QString&)), this, SLOT(setWindowTitle(const QString&))); connect(page(), SIGNAL(statusBarMessage(const QString&)), this, SIGNAL(statusMessage(const QString&))); } c2bWebBrowser::~c2bWebBrowser() {} void c2bWebBrowser::setHomePage(const QString& hp_url) { _home_page = hp_url; home(); } void c2bWebBrowser::setFont(const QFont& qfont) { QWebSettings* wsettings = settings(); wsettings->setFontFamily(QWebSettings::StandardFont, qfont.family()); wsettings->setFontSize(QWebSettings::DefaultFontSize, qfont.pointSize()); } void c2bWebBrowser::setFixedFont(const QFont& qfont) { QWebSettings* wsettings = settings(); wsettings->setFontFamily(QWebSettings::FixedFont, qfont.family()); wsettings->setFontSize(QWebSettings::DefaultFixedFontSize, qfont.pointSize()); } void c2bWebBrowser::copy() { page()->triggerAction(QWebPage::Copy); } void c2bWebBrowser::home() { if (!_home_page.isEmpty()) load(c2bUtils::stringToUrl(_home_page)); } void c2bWebBrowser::loadPage(const QString& p_url) { if (!p_url.isEmpty()) load(c2bUtils::stringToUrl(p_url)); } void c2bWebBrowser::zoomIn() { setTextSizeMultiplier(textSizeMultiplier() + 0.1); } void c2bWebBrowser::zoomOut() { setTextSizeMultiplier(textSizeMultiplier() - 0.1); } QWebView* c2bWebBrowser::createWindow(QWebPage::WebWindowType type) { // Open external links, e. g. links target="_blank", through QDesktopServices if (type == QWebPage::WebBrowserWindow) { c2bUtils::openFile(_hovered_link, this); return 0; } else return QWebView::createWindow(type); } void c2bWebBrowser::_linkHovered(const QString& link, const QString& /* link_title */, const QString& link_text) { _hovered_link = link; if (_hovered_link.isEmpty()) emit statusMessage(QString()); else emit statusMessage(QString("%1 [%2]").arg(link_text).arg(_hovered_link)); } cb2bib-1.4.9/src/c2bSaveRegExp.ui0000644000175000017500000001102212045517740016325 0ustar rusconirusconi c2bSaveRegExp 0 0 845 584 Edit and Save Pattern - cb2Bib 6 Name: Choose a name to identify your reference recognition pattern Type: Fields: RegExp: Input Text: QFrame::Raised Qt::Horizontal Pattern Information: QFrame::Raised false true Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Save c2bLineEdit QLineEdit
    c2bLineEdit.h
    buttonBox accepted() c2bSaveRegExp accept() 620 452 3 394 buttonBox rejected() c2bSaveRegExp reject() 730 444 759 341
    cb2bib-1.4.9/src/c2bShortcutWidget.cpp0000644000175000017500000001111612045520050017430 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bShortcutWidget.h" #include "c2bSettings.h" c2bShortcutWidget::c2bShortcutWidget(QWidget* parentw) : QWidget(parentw) { ui.setupUi(this); _settingsP = c2bSettingsP; _standard_keysequences.append(QKeySequence::Close); _standard_keysequences.append(QKeySequence::Copy); _standard_keysequences.append(QKeySequence::Cut); _standard_keysequences.append(QKeySequence::Find); _standard_keysequences.append(QKeySequence::FindNext); _standard_keysequences.append(QKeySequence::FindPrevious); _standard_keysequences.append(QKeySequence::HelpContents); _standard_keysequences.append(QKeySequence::Open); _standard_keysequences.append(QKeySequence::Paste); _standard_keysequences.append(QKeySequence::Redo); _standard_keysequences.append(QKeySequence::Refresh); _standard_keysequences.append(QKeySequence::Save); _standard_keysequences.append(QKeySequence::SelectAll); _standard_keysequences.append(QKeySequence::Undo); _standard_keysequences.append(QKeySequence::ZoomIn); _standard_keysequences.append(QKeySequence::ZoomOut); _standard_keysequences.append(Qt::Key_F2); #if QT_VERSION >= 0x040600 _standard_keysequences.append(QKeySequence::Quit); _standard_keysequences.append(QKeySequence::SaveAs); #endif connect(ui.Clear, SIGNAL(clicked()), ui.Shortcut, SLOT(clear())); connect(ui.Reset, SIGNAL(clicked()), ui.Shortcut, SLOT(reset())); } void c2bShortcutWidget::setShortcutNames(const QString& path, const QStringList& fullnames) { disconnect(ui.Shortcut, SIGNAL(shortcutChanged(const QKeySequence&, const QKeySequence&)), this, SLOT(shortcutChanged(const QKeySequence&, const QKeySequence&))); disconnect(ui.Description, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(currentIndexChanged(const QString&))); _modified_keysequences.clear(); _shortcut_path = path; _fullnames = fullnames.filter(path); const int n(_fullnames.count()); const int p(path.length()); for (int i = 0; i < n; ++i) if (_fullnames.at(i).startsWith(path)) ui.Description->addItem(_fullnames.at(i).mid(p)); ui.Shortcut->setKeysequence(_settingsP->keysequence(_shortcut_path + ui.Description->currentText())); ui.Shortcut->setDefaultKeysequence(_settingsP->defaultKeysequence(_shortcut_path + ui.Description->currentText())); connect(ui.Shortcut, SIGNAL(shortcutChanged(const QKeySequence&, const QKeySequence&)), this, SLOT(shortcutChanged(const QKeySequence&, const QKeySequence&))); connect(ui.Description, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(currentIndexChanged(const QString&))); } void c2bShortcutWidget::currentIndexChanged(const QString& name) { const QString fullname(_shortcut_path + name); if (_modified_keysequences.contains(fullname)) ui.Shortcut->setKeysequence(_modified_keysequences.value(fullname)); else ui.Shortcut->setKeysequence(_settingsP->keysequence(fullname)); ui.Shortcut->setDefaultKeysequence(_settingsP->defaultKeysequence(fullname)); } void c2bShortcutWidget::shortcutChanged(const QKeySequence& oldks, const QKeySequence& newks) { const QString fullname(_shortcut_path + ui.Description->currentText()); if (!newks.isEmpty()) { if (_standard_keysequences.contains(newks)) { ui.Shortcut->setKeysequence(oldks); ui.Shortcut->setChecked(true); emit statusMessage(tr("Key sequence %1 is used by standard shortcuts").arg(newks.toString(QKeySequence::NativeText))); return; } if (_modified_keysequences.size() == 0) { const int n(_fullnames.count()); for (int i = 0; i < n; ++i) _modified_keysequences.insert(_fullnames.at(i), _settingsP->keysequence(_fullnames.at(i))); } if (_modified_keysequences.values().contains(newks) && _modified_keysequences.value(fullname) != newks) { ui.Shortcut->setKeysequence(oldks); ui.Shortcut->setChecked(true); emit statusMessage(tr("Key sequence %1 is already assigned").arg(newks.toString(QKeySequence::NativeText))); return; } } _modified_keysequences[fullname] = newks; emit statusMessage(QString()); } cb2bib-1.4.9/src/c2bSettings.h0000644000175000017500000000407112045520050015720 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSETTINGS_H #define C2BSETTINGS_H #include "c2bColors.h" #include #include #include class QAction; class QProgressBar; class QShortcut; class c2bSettings : public settings { Q_OBJECT public: ~c2bSettings(); QFont c2bMonoFont; c2bColors colors; void notify(); void update(); static c2bSettings* initSettings(); void setKeysequence(const QString& fullname, QShortcut* shortcut); void setKeysequence(const QString& path, QAction* action); void setKeysequences(const QHash& keysequences); inline QKeySequence keysequence(const QString& fullname) const { return value(fullname).value(); } inline QKeySequence defaultKeysequence(const QString& fullname) const { return _default_keysequences.value(fullname); } inline QByteArray ksname(const QString& fullname) const { return value(fullname).value().toString(QKeySequence::NativeText).toLatin1(); } inline QStringList shortcutNames() const { return _default_keysequences.keys(); } signals: void newSettings(); private: c2bSettings(const QString& organization, const QString& application, QObject* parento = 0); c2bSettings(const QString& fn, QObject* parento = 0); QMap _default_keysequences; QProgressBar* _progress_bar; void init(); void processReferenceFile(); void setDefaults(); #ifdef Q_WS_WIN QString decodeFilename(const QString& fn) const; #endif private slots: void guiExits(); void processReferenceFileEvent(); }; #define c2bSettingsP (static_cast(settings::instance())) #endif cb2bib-1.4.9/src/c2bUtils.h0000644000175000017500000000361612045520050015224 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BUTILS_H #define C2BUTILS_H #include #include #include #include /** General cb2Bib Utils: GUI related utilities */ namespace c2bUtils { extern bool openFile(const QString& fn, QWidget* w = 0); inline void displayHelp(const QString& url) { openFile(url); } inline QUrl stringToUrl(const QString& fn) { // Avoid cross-platform pitfalls regarding string to url conversions // Avoid possible issues regarding QUrl and local files not starting with 'file://' if (QFileInfo(fn).exists()) return QUrl::fromLocalFile(fn); else return QUrl(fn, QUrl::TolerantMode); } inline QString fromHtmlString(const QString& str, const bool addMetadata = false) { QTextDocument converter; converter.setHtml(str); if (addMetadata) { const QString md(converter.metaInformation(QTextDocument::DocumentTitle).trimmed()); if (md.isEmpty()) return converter.toPlainText(); else return "Document Title: " + md + "\n\n" + converter.toPlainText(); } else return converter.toPlainText(); } inline void addSeparator(QWidget* w) { // Adds separator to widget w QAction* action = new QAction(w); action->setSeparator(true); w->addAction(action); } inline void setWidgetOnTop(QWidget* w) { if (w) { if (w->isHidden()) w->show(); if (w->isMinimized()) w->showNormal(); w->raise(); w->activateWindow(); } } } // namespace c2bUtils #endif cb2bib-1.4.9/src/c2bSearchInFiles.ui0000644000175000017500000002165512045517740017010 0ustar rusconirusconi Pere Constans c2bSearchInFiles 0 0 731 478 Search in files - cb2Bib 6 6 Modifier 9 6 &Simplify source Qt::Horizontal 40 20 Search scope 9 6 Scan &linked documents Scan all &BibTeX files Qt::Horizontal 16 22 Search for ... Qt::Horizontal Qt::Horizontal Qt::Horizontal Qt::NoFocus Qt::Horizontal QDialogButtonBox::Abort|QDialogButtonBox::Close|QDialogButtonBox::Help Pattern 9 6 Qt::Horizontal 0 0 Composite pattern 9 6 false &Edit false &Delete false Qt::PreventContextMenu &Add 0 0 true false true Case Type Scope Pattern Qt::Vertical 75 91 false All Any c2bSearchInFilesPattern QWidget
    c2bSearchInFilesPattern.h
    patternList addPatternB deletePatternB allBibFiles documentFiles buttonBox buttonBox rejected() c2bSearchInFiles reject() 325 565 286 274
    cb2bib-1.4.9/src/c2bClipboard.h0000644000175000017500000000257112045520050016022 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCLIPBOARD_H #define C2BCLIPBOARD_H #include #include #include /** cb2Bib Clipboard Implements clipboard functionality as required by cb2Bib This should fix acrobat, mozilla, qt 3.3.3 issues Using clipboardPoll @author Pere Constans */ #ifdef C2B_USE_CBPOLL class clipboardPoll; #endif class c2bClipboard : public QObject { Q_OBJECT public: c2bClipboard(QObject* parento = 0); ~c2bClipboard(); const QString text(); void setConnected(bool); signals: void cbDataChanged(const QString&); private: QClipboard* _cb; QString _cb_text; QString _cbs_text; bool _is_connected; bool _supports_selection; uint _interval; #ifdef C2B_USE_CBPOLL clipboardPoll* _poll; #else #ifdef Q_WS_X11 QTimer* _timer; #endif #endif private slots: void checkClipboardData(); void checkData(); void checkSelectionData(); void dataChanged(); void newClipboardData(bool selectionMode); void selectionChanged(); }; #endif cb2bib-1.4.9/src/c2bCiterHistory.cpp0000644000175000017500000000353412045520050017106 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bCiterHistory.h" static const int _maximum_history_states(35); c2bCiterHistory::c2bCiterHistory() { _last_citation_format = c2bCiter::AJYT; _index.resize(_maximum_history_states); _states.resize(_maximum_history_states); clear(); } void c2bCiterHistory::clear() { _last_citation = 0; _last_keyword = 0; _last_selection_citation = 0; _last_nonkeyword_state = c2bCiter::State(); _last_nonselected_state = c2bCiter::State(); _cstate = -1; _nstates = -1; for (int i = 0; i < _maximum_history_states; ++i) _index[i] = i; } void c2bCiterHistory::saveCurrentState(const c2bCiter::Format format, const c2bCiter::Filter filter, const int iindex, const int vindex, const QString fstring) { if (_cstate != -1) _nstates = _cstate - 1; _cstate = -1; const c2bCiter::State s(format, filter, vindex, fstring); if (_nstates > -1 && s == _states[_index[_nstates]]) return; if (++_nstates >= _maximum_history_states) { // Move, e.g., 0 1 2 3 4 to 1 2 3 4 0 const int oldest(_index[0]); for (int i = 0; i < _maximum_history_states - 1; ++i) _index[i] = _index[i+1]; _index[--_nstates] = oldest; } _states[_index[_nstates]] = s; if (format != c2bCiter::K) { _last_nonkeyword_state = s; if (filter != c2bCiter::Selected) _last_nonselected_state = s; } saveCurrentItemIndex(format, filter, iindex); } cb2bib-1.4.9/src/cb2Bib.ui0000644000175000017500000007021612045517740015022 0ustar rusconirusconi Pere Constans cb2Bib 0 0 906 606 cb2Bib :/icons/icons/cb2bib.png:/icons/icons/cb2bib.png 6 6 6 0 :/icons/icons/cb2bib.png:/icons/icons/cb2bib.png 32 32 :/icons/icons/configure.png:/icons/icons/configure.png 32 32 :/icons/icons/tex.png:/icons/icons/tex.png 32 32 :/icons/icons/pdf.png:/icons/icons/pdf.png 32 32 Qt::Horizontal QSizePolicy::Fixed 20 20 :/icons/icons/exit.png:/icons/icons/exit.png 32 32 Qt::Horizontal QSizePolicy::Expanding 205 20 :/icons/icons/connect_established.png:/icons/icons/connect_established.png 32 32 :/icons/icons/package_network.png:/icons/icons/package_network.png 32 32 :/icons/icons/viewbib.png:/icons/icons/viewbib.png 32 32 :/icons/icons/filesaveas.png:/icons/icons/filesaveas.png 32 32 :/icons/icons/edit.png:/icons/icons/edit.png 32 32 0 0 :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png 0 0 true true Add to: Qt::Horizontal Qt::Horizontal 0 0 QTabWidget::South QTabWidget::Rounded 0 Main 9 6 Keywords File 0 0 true true false Type Year Number Volume Abstract Pages Journal Author Title CITEID 0 0 false false false false false false false false false false false Other Fields 9 6 Book Title Annote DOI Chapter Address Eprint Editor Edition ISSN ISBN Institution Organization Note Month Series School Publisher URL false false false false false false false false false false false false false false false false false false Clear All Fields Insert Regular Expression Insert regular expression Edit Bookmarks Edit bookmarks Edit Regular Expressions Edit regular expressions Guess Bibliographic Fields Guess bibliographic fields Postprocess BibTeX Preparse Clipboard Preparse clipboard Restart Recognition true View Tagged Clipboard Data View Tagged Clipboard Data View tagged clipboard data Open Document Open document Edit Journal Abbreviations Edit journal abbreviations Select Document File Select document file Start Annote Start Annote Check Repeated Check repeated c2bLineEdit QLineEdit
    c2bLineEdit.h
    c2bComboBox QComboBox
    c2bComboBox.h
    tabWidget id typecombo title author journal pages volume number year abstract keywords file bibtexfile BibTeXDir ViewAboutB ConfigureB SearchInFilesB PdfImportB ExitB ConnectB MakeNetworkQueryB ViewBibB AddBibB EditBibTeXB booktitle annote address edition institution month publisher url chapter editor isbn note school doi eprint issn organization series
    cb2bib-1.4.9/src/c2bAnnote.h0000644000175000017500000000204012045520050015336 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BANNOTE_H #define C2BANNOTE_H #include class QFileSystemWatcher; class c2bSettings; class c2bWebBrowser; class texToHtml; class c2bAnnote : public QMainWindow { Q_OBJECT public: c2bAnnote(QWidget* parentw = 0); ~c2bAnnote(); bool show(); private: QFileSystemWatcher* _fsw; QString _annote_filename; QString _html_filename; c2bSettings* _settingsP; c2bWebBrowser* _view_port; texToHtml* _t2h; private slots: void annote(); void configure(); void edit(); void help(); void loadSettings(); void setWindowTitle(const QString& title); void showMessage(const QString& ms); void update(); }; #endif cb2bib-1.4.9/src/c2bRLWebSearchSettings.h0000644000175000017500000000133212045520050017737 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BRLWEBSEARCHSETTINGS_H #define C2BRLWEBSEARCHSETTINGS_H #include "ui_c2bRLWebSearchSettings.h" #include class c2bRLWebSearchSettings : public QDialog { Q_OBJECT public: c2bRLWebSearchSettings(QWidget* parentw = 0); ~c2bRLWebSearchSettings(); private: Ui::c2bRLWebSearchSettings ui; protected slots: void accept(); }; #endif cb2bib-1.4.9/src/c2bSearchInFiles.h0000644000175000017500000000242112045520050016574 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSEARCHINFILES_H #define C2BSEARCHINFILES_H #include "ui_c2bSearchInFiles.h" #include "ui_c2bSearchInFilesPatternEdit.h" #include class bibSearcher; class c2bSearchInFiles : public QDialog { Q_OBJECT public: c2bSearchInFiles(const QString& file, QWidget* parentw = 0); ~c2bSearchInFiles(); void setCurrentText(const QString& text); public slots: void setBibTeXFile(const QString& file = QString()); void show(); signals: void searchDone(const QString& filename, bibSearcher* searcher); private slots: void help(); void on_addPatternB_clicked(); void on_deletePatternB_clicked(); void on_editPatternB_clicked(); void searchB_clicked(); void updateForm(); private: QPushButton* _searchB; QString _bibtex_dir; QString _bibtex_file; QString _search_log; Ui::c2bSearchInFiles ui; Ui::c2bSearchInFilesPatternEdit ui_editor; }; #endif cb2bib-1.4.9/src/win/0000755000175000017500000000000012045520050014153 5ustar rusconirusconicb2bib-1.4.9/src/win/win.pro0000644000175000017500000000012612045517740015505 0ustar rusconirusconiQT = core CONFIG += console TEMPLATE = app TARGET = ../c2bconsole SOURCES += main.cpp cb2bib-1.4.9/src/win/main.cpp0000644000175000017500000000132412045520050015603 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include #include int main(int argc, char* argv[]) { if (argc < 1) return 1; QFileInfo fi(argv[0]); const QString exe(fi.absolutePath() + "/cb2bib.exe"); QStringList arguments; for (int i = 1; i < argc; ++i) arguments.append(argv[i]); const int code(QProcess::execute(exe, arguments)); return code; } cb2bib-1.4.9/src/win/CMakeLists.txt0000644000175000017500000000125412045517740016731 0ustar rusconirusconi#------------------------------------------------------------------------------- # cb2bib cmake build script # - build c2bconsole #------------------------------------------------------------------------------- if(MINGW) find_package(Qt4 ${CB2BIB_MINIMUM_REQUIRED_QT} COMPONENTS QtCore REQUIRED) include(${QT_USE_FILE}) add_executable(c2bconsole WIN32 main.cpp) target_link_libraries(c2bconsole c2b ${QT_LIBRARIES} "-Wl,-subsystem,console") set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../../../bin) install(TARGETS c2bconsole RUNTIME DESTINATION ${C2B_INSTALL_BIN_DIR}) endif(MINGW) #-------------------------------------------------------------------------------cb2bib-1.4.9/src/c2bConfigureFR.cpp0000644000175000017500000000212612045520050016623 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bConfigureFR.h" #include c2bConfigureFR::c2bConfigureFR(QTreeWidgetItem* item, QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); itemFindReplace = item; ui.lineEditFind->setText(itemFindReplace->text(0)); ui.lineEditReplace->setText(itemFindReplace->text(1)); ui.lineEditDescription->setText(itemFindReplace->text(2)); ui.lineEditFind->setFocus(); } c2bConfigureFR::~c2bConfigureFR() {} void c2bConfigureFR::reject() { QDialog::reject(); } void c2bConfigureFR::accept() { itemFindReplace->setText(0, ui.lineEditFind->text()); itemFindReplace->setText(1, ui.lineEditReplace->text()); itemFindReplace->setText(2, ui.lineEditDescription->text()); QDialog::accept(); } cb2bib-1.4.9/src/c2bCiterExcerptView.h0000644000175000017500000000125012045520050017350 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCITEREXCERPTVIEW_H #define C2BCITEREXCERPTVIEW_H #include class c2bTextBrowser; class c2bCiterExcerptView : public QDialog { Q_OBJECT public: c2bCiterExcerptView(const QString& html, QWidget* parentw = 0); ~c2bCiterExcerptView(); private: c2bTextBrowser* _browserP; }; #endif cb2bib-1.4.9/src/c2bTests.cpp0000644000175000017500000012236212045520050015561 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #define C2B_CHECK_CAPITALIZATION 0 #define C2B_CHECK_CODE_DECOMPOSITION 0 #define C2B_CHECK_JOURNALS 0 #define C2B_CHECK_PATTERNS 0 #define C2B_CHECK_PDF_CODES 0 #include "c2bTests.h" #include #include #include #include #include #include c2bTests::c2bTests() : cout(*(new QTextStream(stdout))) { cout << "============" << endl; cout << "cb2Bib tests" << endl; cout << "============" << endl; _bibliographic_dir = QFileInfo(settings::instance()->fileName("cb2Bib/BibTeXFile")).absolutePath(); } c2bTests::~c2bTests() { cout << endl; cout << "=================" << endl; cout << "cb2Bib tests done" << endl; cout << "=================" << endl << endl; delete &cout; } int c2bTests::allTests() { _test_count = 0; _failed_test_count = 0; #if C2B_CHECK_JOURNALS heuristic_journal(); #else author_parser(); heuristic_pvny(); heuristic_misc(); heuristic_author(); heuristic_check_patterns(); compression_check(); write_information(); #endif cout << endl << endl; cout << "Tests done. Tests: " << _test_count << " Failed: " << _failed_test_count << endl; return 0; } void c2bTests::compression_check() { QString test; test += QChar(100); test += QChar(200); test += QChar(8700); test += QChar(56200); test += QChar(57000); test += QChar(10); test += QChar(100); test += QChar(200); test += QChar(8700); test += QChar(56200); test += QChar(57000); test += QChar(10); QByteArray ba = test.toUtf8(); bool passed(c2bUtils::fromUtf8(ba) == QString::fromUtf8(ba)); cout << endl; if (passed) { cout << "-------------------------" << endl; cout << "Check for c2b utf8 passed" << endl; } else { cout << "-------------------------------------------------------------" << endl; cout << "WARNING: Check for c2b utf8 FAILED! Please report it as a bug" << endl; ++_failed_test_count; } ++_test_count; ba += "--------------------------------------"; QByteArray cba(c2bUtils::compress(ba)); QByteArray uba(c2bUtils::uncompress(cba)); passed = ba == uba && ba.length() > cba.length(); if (passed) { cout << "Check for zlib/lzo passed" << endl; cout << "-------------------------" << endl; } else { cout << "WARNING: Check for zlib/lzo FAILED! Please report it as a bug" << endl; cout << "-------------------------------------------------------------" << endl; ++_failed_test_count; } ++_test_count; } void c2bTests::write_information() { cout << endl; cout << "-------------------------" << endl; cout << "Miscellaneous information" << endl; cout << "-------------------------" << endl; cout << endl; cout << "Version: cb2bib " << C2B_VERSION << endl; #if C2B_USE_LZO cout << "Compression: lzo2" << endl; #else cout << "Compression: zlib" << endl; #endif #if C2B_USE_WEBKIT cout << "Compiled against QtWebKit: yes" << endl; #else cout << "Compiled against QtWebKit: no" << endl; #endif #if C2B_USE_CBPOLL cout << "Clipboard polling: yes" << endl; #else cout << "Clipboard polling: no" << endl; #endif cout << "Application binary path: " << QCoreApplication::instance()->applicationDirPath() << endl; cout << "Application hardcoded data path: " << C2B_DATA_DIR << endl; #ifdef Q_WS_MACX QString C2B_DATA_DIR_MAC(C2B_DATA_DIR); if (QDir(C2B_DATA_DIR + "/data/").exists()) C2B_DATA_DIR_MAC = QDir::cleanPath(C2B_DATA_DIR + '/'); else if (QDir(QCoreApplication::instance()->applicationDirPath() + "/../Resources/data/").exists()) C2B_DATA_DIR_MAC = QDir::cleanPath(QCoreApplication::instance()->applicationDirPath() + "/../Resources/"); cout << "Application macosx data path: " << C2B_DATA_DIR_MAC << endl; #endif cout << endl; } void c2bTests::heuristic_author() { cout << endl; cout << "---------------------------------" << endl; cout << "Test heuristic author recognition" << endl; cout << "---------------------------------" << endl; QFileInfoList flist = QDir(_bibliographic_dir).entryInfoList(QStringList() << "*.bib"); bibParser bp; bibReference reference; QStringList fields; fields.append("author"); fields.append("editor"); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); #if C2B_CHECK_CAPITALIZATION for (int f = 0; f < flist.count(); ++f) { const QString bib_file(flist.at(f).absoluteFilePath()); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); cout << "File: " << bib_file << endl; while (bp.referencesIn(c2bUtils::fileToString(bib_file), &reference)) { const QString author(reference.value("author")); if (author.isEmpty()) continue; bp.clearCurrentReference(); bp.guessFields(author); const QString guess(bp.currentReference().value("author")); const bool passed(guess == author); ++_test_count; if (!passed) ++_failed_test_count; cout << QString("[%1]\t'%2'\n").arg(boolToStr(passed)).arg(author); if (!passed) cout << QString("\t'%1'\n").arg(guess); } } return; #endif #if C2B_CHECK_CODE_DECOMPOSITION for (int u = 1; u < 78790; ++u) { const QChar c(u); if (!c.isLetter()) continue; if (c.decompositionTag() == QChar::NoDecomposition) continue; const QString dc(c.decomposition()); if (dc.length() != 2) continue; if (dc.at(0).isLetter() && dc.at(1).isLetter()) cout << '[' << c << ']' << " u: " << u << " decompose: " << decomposition(c) << " category: " << c.category() << endl; } return; #endif #if C2B_CHECK_PDF_CODES QMap charfreq; long long char_count = 0; for (int f = 0; f < flist.count(); ++f) { const QString bib_file(flist.at(f).absoluteFilePath()); fields.append("file"); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); cout << "File: " << bib_file << endl; while (bp.referencesIn(c2bUtils::fileToString(bib_file), &reference)) { const QString file(reference.value("file")); document d(file, document::Raw); const QString doc(d.toString()); for (int i = 0; i < doc.length(); ++i) { if (doc.at(i).unicode() > 800 && doc.at(i).unicode() < 900) { cout << "At file: " << file << endl; cout << '[' << doc.at(i) << "] " << doc.mid(i - 10, 20) << endl; } charfreq.insert(doc.at(i), 1 + charfreq.value(doc.at(i), 0)); } char_count += doc.length(); } } QList cl = charfreq.keys(); for (int i = 0; i < cl.count(); ++i) cout << '[' << cl.at(i) << ']' << " u: " << cl.at(i).unicode() << " letter: " << cl.at(i).isLetter() << " decompose: " << decomposition(cl.at(i)) << " category: " << cl.at(i).category() << " f: " << charfreq.value(cl.at(i)) << endl; cout << "\nTotal characters: " << char_count << endl; return; #endif cout << endl; cout << "----------------------------------------" << endl; cout << "Test heuristic author recognition on PDF" << endl; cout << "----------------------------------------" << endl; cout << endl; cout << "Checking files at: " << _bibliographic_dir << endl; const QStringList excluded(c2bUtils::fileToString(_bibliographic_dir + "/c2b_test_exclude.txt") .split(QRegExp("[\\n\\r]"), QString::SkipEmptyParts)); QHash doc_cache; const QString doc_cache_fn(_bibliographic_dir + "/c2b_test.cache"); if (QFileInfo(doc_cache_fn).exists()) { cout << "Reading from cache" << endl; QFile file(doc_cache_fn); file.open(QIODevice::ReadOnly); QDataStream ds(&file); ds >> doc_cache; } else { for (int f = 0; f < flist.count(); ++f) { const QString bib_file(flist.at(f).absoluteFilePath()); fields.append("file"); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); cout << "File: " << bib_file << endl; while (bp.referencesIn(c2bUtils::fileToString(bib_file), &reference)) { const QString file(reference.value("file")); if (excluded.contains(file) || file.contains("/stacks/")) continue; document d(file); const QString doc(d.toString()); doc_cache.insert(reference.value("file"), doc); } } if (doc_cache.size() > 0) { QFile file(doc_cache_fn); file.open(QIODevice::WriteOnly); QDataStream ds(&file); ds << doc_cache; cout << "Writing cache " << doc_cache_fn << endl; cout << "Delete cache when done" << endl; } } cout << "Check authors" << endl; int n_pdf(0); int n_failed_pdf(0); for (int f = 0; f < flist.count(); ++f) { const QString bib_file(flist.at(f).absoluteFilePath()); fields.append("file"); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); cout << "File: " << bib_file << endl; while (bp.referencesIn(c2bUtils::fileToString(bib_file), &reference)) { const QString file(reference.value("file")); if (file.isEmpty()) continue; if (excluded.contains(file) || file.contains("/stacks/")) continue; const QString doc(doc_cache.value(reference.value("file"))); QString check_doc(doc); check_doc.remove(c2bUtils::nonAsciiLetter); if (check_doc.isEmpty()) continue; const QString author(reference.value("author")); bp.clearCurrentReference(); bp.guessFields(doc); const QString guess(bp.currentReference().value("author")); bool passed(guess == author); if (!passed) { QString author_ascii(c2bUtils::toAscii(author, c2bUtils::Cleanup)); QString guess_ascii(c2bUtils::toAscii(guess, c2bUtils::Cleanup)); passed = guess_ascii == author_ascii; if (passed) cout << QString("[%1*] '%2'\n").arg(boolToStr(passed)).arg(author); else cout << QString("[%1] '%2'\n").arg(boolToStr(passed)).arg(author); if (!passed) { qDebug() << author; qDebug() << guess; qDebug() << reference.value("file"); qDebug() << "DOCUMENT: \n" << doc << endl << endl; // for (int i = 0; i < doc.count(); ++i) // cout << '[' << doc.at(i) << ']' << " u: " << doc.at(i).unicode() << " letter: " << // doc.at(i).isLetter() << endl; } cout << QString(" '%1'\n").arg(guess); } else cout << QString("[%1] '%2'\n").arg(boolToStr(passed)).arg(author); ++n_pdf; if (!passed) ++n_failed_pdf; } } cout << "PDF Tests: " << n_pdf << endl; cout << "Succeded: " << n_pdf - n_failed_pdf << endl; _test_count += n_pdf; _failed_test_count += n_failed_pdf; } void c2bTests::heuristic_journal() { #if C2B_CHECK_JOURNALS cout << endl; cout << "-----------------------------------------" << endl; cout << "Test heuristic journal recognition on PDF" << endl; cout << "-----------------------------------------" << endl; cout << endl; cout << "Checking files at: " << _bibliographic_dir << endl; QFileInfoList flist = QDir(_bibliographic_dir).entryInfoList(QStringList() << "*.bib"); bibParser bp; bibReference reference; QStringList fields; fields.append("journal"); fields.append("file"); const QStringList excluded(c2bUtils::fileToString(_bibliographic_dir + "/c2b_test_exclude.txt") .split(QRegExp("[\\n\\r]"), QString::SkipEmptyParts)); QHash doc_cache; const QString doc_cache_fn(_bibliographic_dir + "/c2b_test.cache"); if (QFileInfo(doc_cache_fn).exists()) { cout << "Reading from cache" << endl; QFile file(doc_cache_fn); file.open(QIODevice::ReadOnly); QDataStream ds(&file); ds >> doc_cache; } else { cout << "No cache. Return" << doc_cache_fn << endl; return; } cout << "Check journals" << endl; int n_pdf(0); int n_failed_pdf(0); for (int f = 0; f < flist.count(); ++f) { const QString bib_file(flist.at(f).absoluteFilePath()); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); cout << "File: " << bib_file << endl; while (bp.referencesIn(c2bUtils::fileToString(bib_file), &reference)) { const QString file(reference.value("file")); if (file.isEmpty()) continue; if (excluded.contains(file) || file.contains("/stacks/")) continue; const QString doc(doc_cache.value(file)); QString check_doc(doc); check_doc.remove(c2bUtils::nonAsciiLetter); if (check_doc.isEmpty()) continue; const QString journal(bp.abbreviatedJournal(reference.value("journal"))); if (journal.isEmpty()) continue; if (journal == bp.fullJournal(journal) && (journal.count('.') > 0 || journal.count(' ') > 0)) { qDebug() << "not in db:" << journal; continue; } bp.clearCurrentReference(); bp.guessFields(doc); const QString guess(bp.abbreviatedJournal(bp.currentReference().value("journal"))); if (guess.isEmpty()) continue; bool passed(guess == journal); if (!passed) { cout << QString("[%1] '%2'\n").arg(boolToStr(passed)).arg(journal); cout << QString(" '%1'\n").arg(guess); qDebug() << "jn:" << journal; qDebug() << "gn:" << guess; qDebug() << reference.value("file"); qDebug() << "DOCUMENT: \n" << doc << endl << endl; } else cout << QString("[%1] '%2'\n").arg(boolToStr(passed)).arg(journal); ++n_pdf; if (!passed) ++n_failed_pdf; } } cout << "PDF Tests: " << n_pdf << endl; cout << "Succeded: " << n_pdf - n_failed_pdf << endl; _test_count += n_pdf; _failed_test_count += n_failed_pdf; #endif } void c2bTests::author_parser() { cout << endl; cout << "------------------" << endl; cout << "Test author parser" << endl; cout << "------------------" << endl; bibParser bp; QString author; QString input; author = "J.-L. Smith and R. Jones and K. McGibbons"; input = "SMITH, J.-L., R. JONES, AND K. MCGIBBONS"; check_test(author == bp.parse("author", input), input, author); input = "Smith, J.-L., Jones, R., and McGibbons, K."; check_test(author == bp.parse("author", input), input, author); input = "Smith, J.-L., Jones, R., McGibbons, K."; check_test(author == bp.parse("author", input), input, author); author = "J. L. Brooks Jr"; input = "Brooks Jr, John L"; check_test(author == bp.parse("author", input), input, author); author = "E. B. Melissa and W. F. Tohnson Jr and C. Z. Ortiz and S. J. van der Burgh"; input = "Melissa, Elizabeth Baines; Tohnson, Walter F., Jr.; Zapa Ortiz, Carlos; van der Burgh, S. J."; check_test(author == bp.parse("author", input), input, author); input = "Melissa, E.B., Tohnson Jr, Walter F., Zapa Ortiz, C., van der Burgh, S. J."; check_test(author == bp.parse("author", input), input, author); input = "Melissa, E.B., Tohnson Jr, Walter F., Zapa Ortiz, C., and van der Burgh, S. J."; check_test(author == bp.parse("author", input), input, author); author = "B. B. Aaaaaaa"; input = "Aaaaaaa, BB"; check_test(author == bp.parse("author", input), input, author); author = "J. R. Aaaaaaa"; // input = "Aaaaaaa, JR"; // Gives wrong processing of the initials JR // check_test(author == bp.parse("author", input), input, author); author = "J. Pi"; input = "Joan Pi"; check_test(author == bp.parse("author", input), input, author); input = "JOAN PI"; check_test(author == bp.parse("author", input), input, author); author = "P. I. Joan"; input = "Joan PI"; check_test(author == bp.parse("author", input), input, author); author = "C. V. Pi"; input = "Carles Vidal Pi"; check_test(author == bp.parse("author", input), input, author); input = "Carles VIDAL PI"; check_test(author == bp.parse("author", input), input, author); input = "Vidal Pi, Carles"; check_test(author == bp.parse("author", input), input, author); input = "Pi, Carles Vidal"; check_test(author == bp.parse("author", input), input, author); input = "PI, CARLES VIDAL"; check_test(author == bp.parse("author", input), input, author); author = "C. V. Pi and M. R. Catala"; input = "Carles Vidal Pi, Maria Rosa Catala"; check_test(author == bp.parse("author", input), input, author); input = "Vidal Pi, Carles and Catala, Maria Rosa"; check_test(author == bp.parse("author", input), input, author); input = "Vidal Pi, Carles and Catala, MR"; check_test(author == bp.parse("author", input), input, author); input = "VIDAL PI, Carles and CATALA, MR"; check_test(author == bp.parse("author", input), input, author); input = "Vidal Pi, Carles and Catala, M.R."; check_test(author == bp.parse("author", input), input, author); author = "C. V. Pi and M. R. Catala"; input = "Carles Vidal Pi, Maria Ros Catala"; check_test(author == bp.parse("author", input), input, author); input = "Carles VIDAL PI, Maria ROS CATALA"; check_test(author == bp.parse("author", input), input, author); input = "Vidal Pi, Carles and Ros Catala, Maria"; check_test(author == bp.parse("author", input), input, author); author = "M. R. R. Catala"; input = "Maria Rosa Ros Catala"; check_test(author == bp.parse("author", input), input, author); input = "Ros Catala, MR"; check_test(author == bp.parse("author", input), input, author); input = "Ros Catala, M R"; check_test(author == bp.parse("author", input), input, author); input = "Ros Catala, M. R."; check_test(author == bp.parse("author", input), input, author); author = "M. d'Errico"; input = "Monica d'Errico"; check_test(author == bp.parse("author", input), input, author); author = "J. V. Mael Jr"; input = "JAMES V. MAEL, Jr."; check_test(author == bp.parse("author", input), input, author); author = "J. V. Mael III"; input = "JAMES V. MAEL, III"; check_test(author == bp.parse("author", input), input, author); author = "V. Yu. Dmitri and A. Karpoff"; input = "VICTOR Yu. DMITRI,3 ANDRIY KARPOFF"; check_test(author == bp.parse("author", input), input, author); author = "Yu. Dmitri and A. Karpoff"; input = "Yu. Dmitri,3 Andriy Karpoff"; check_test(author == bp.parse("author", input), input, author); input = "Yu. DMITRI,3 ANDRIY KARPOFF"; check_test(author == bp.parse("author", input), input, author); input = "YU. DMITRI,3 ANDRIY KARPOFF"; check_test(author == bp.parse("author", input), input, author); cout << "From medline:" << endl; author = "C. L. Maggi III"; input = "Maggi, Carla L., III"; check_test(author == bp.parse("author", input), input, author); input = "Maggi III CL"; check_test(author == bp.parse("author", input), input, author); check_test(author == bp.parse("author", author::fromMedline(input)), input, author); input = "Maggi, Carla L 3rd"; check_test(author == bp.parse("author", author::fromMedline(input)), input, author); input = "Maggi CL 3rd"; check_test(author == bp.parse("author", author::fromMedline(input)), input, author); author = "A. M. C. Lourtau"; input = "Carr Lourtau, A M"; check_test(author == bp.parse("author", input), input, author); check_test(author == bp.parse("author", author::fromMedline(input)), input, author); input = "Carr Lourtau, AM"; check_test(author == bp.parse("author", input), input, author); input = "Carr Lourtau AM"; // Gives 'L. A. Carr' (rare AU formatting) // check_test(author == bp.parse("author", author::fromMedline(input)), input, author); author = "B. de Rivas"; input = "de Rivas, Beatriz"; check_test(author == bp.parse("author", author::fromMedline(input)), input, author); input = "de Rivas B"; check_test(author == bp.parse("author", author::fromMedline(input)), input, author); author = "B. De Baets"; input = " De Baets, B "; check_test(author == bp.parse("author", author::fromMedline(input)), input, author); } void c2bTests::heuristic_pvny() { cout << endl; cout << "---------------------------------------------------------" << endl; cout << "Test heuristic pages - volume - number - year recognition" << endl; cout << "---------------------------------------------------------" << endl; bibParser bp; bibReference reference; /**************************************************************** journal-pages-volume ****************************************************************/ reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "927")); reference.insert("volume", bp.parse("volume", "120")); write(bp, reference); heuristic(bp, reference, "Science. 120: 927"); heuristic(bp, reference, "Science. 120, 927"); heuristic(bp, reference, "Science 120, 927"); heuristic(bp, reference, "Science 120, pp. 927"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "927 - 993")); reference.insert("volume", bp.parse("volume", "120")); write(bp, reference); heuristic(bp, reference, "Science. 120: 927 - 993"); heuristic(bp, reference, "Science. 120, 927 - 93"); heuristic(bp, reference, "Science 120, 927 - 993"); heuristic(bp, reference, "Science 120, pp. 927 - 993"); /**************************************************************** journal-pages-volume-number ****************************************************************/ reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "927")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1 - 3")); write(bp, reference); heuristic(bp, reference, "Science 120(1 - 3), 927"); heuristic(bp, reference, "Science 120(1 - 3), pp. 927"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "927 - 993")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1 - 3")); write(bp, reference); heuristic(bp, reference, "Science 120(1 - 3), 927 - 993"); heuristic(bp, reference, "Science 120(1 - 3), pp. 927 - 993"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "927 - 993")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1")); write(bp, reference); heuristic(bp, reference, "Science, Volume 120, Number 1, 927 - 993"); /**************************************************************** journal-pages-volume-year ****************************************************************/ reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "1922")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 2007, 120, 1922"); heuristic(bp, reference, "Science 2007 120: 1922"); heuristic(bp, reference, "Science. 120: 1922, 2007"); heuristic(bp, reference, "(2007) Science 120: 1922"); heuristic(bp, reference, "Science 120, 1922 2007"); heuristic(bp, reference, "Science 120, 1922(2007)"); heuristic(bp, reference, "Science 120(2007) 1922"); heuristic(bp, reference, "Science 2007;120:1922."); heuristic(bp, reference, "Science 2007 May 2;120:1922"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "22")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 2007, 120, 22"); heuristic(bp, reference, "Science 2007 120: 22"); heuristic(bp, reference, "Science 2007 May 2, 120: 22"); heuristic(bp, reference, "Science. 120: 22, 2007"); heuristic(bp, reference, "(2007) Science 120: 22"); heuristic(bp, reference, "Science 120, 22 2007"); heuristic(bp, reference, "Science 120, 22(2007)"); heuristic(bp, reference, "Science 120(2007) 22"); // Usual pages reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "3 - 7")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science. 120, 3 - 7(2007)"); heuristic(bp, reference, "Science. 120: 3 - 7, 2007"); heuristic(bp, reference, "Science, 120(2007), pp. 3 - 7"); heuristic(bp, reference, "Science 120(2007) 3 - 7"); heuristic(bp, reference, "2007 Science 120 3 - 7"); heuristic(bp, reference, "Science. 2007, 120, 3 - 7"); heuristic(bp, reference, "Science. 2007 120: 3 - 7"); heuristic(bp, reference, "Science. 2007 May 2, 120: 3 - 7"); heuristic(bp, reference, "Science. 2007, 120, 3 - 5pp"); heuristic(bp, reference, "Science 2007;120: 3 - 7"); // Pages susceptible to be confused by years reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "1997 - 2001")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science. 120, 1997 - 2001(2007)"); heuristic(bp, reference, "Science. 120, 1997 - 2001, 2007"); heuristic(bp, reference, "Science. 120: 1997 - 2001, 2007"); heuristic(bp, reference, "Science, 120(2007), pp. 1997 - 2001"); heuristic(bp, reference, "Science 120(2007) 1997 - 2001"); heuristic(bp, reference, "2007 Science 120 1997 - 2001"); heuristic(bp, reference, "Science. 2007, 120, 1997 - 2001"); heuristic(bp, reference, "Science. 2007 May 2, 120, 1997 - 2001"); heuristic(bp, reference, "Science. 2007 120: 1997 - 2001"); heuristic(bp, reference, "Science. 2007, 120, 1997 - 5pp"); heuristic(bp, reference, "Science 2007;120: 1997 - 2001"); // Pages starting by zero reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "044103 - 044110")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science. 120, 044103 - 044110(2007)"); heuristic(bp, reference, "Science. 120: 044103 - 044110, 2007"); heuristic(bp, reference, "Science, 120(2007), pp. 044103 - 044110"); heuristic(bp, reference, "Science 120(2007) 044103 - 044110"); heuristic(bp, reference, "2007 Science 120 044103 - 044110"); heuristic(bp, reference, "Science. 2007, 120, 044103 - 044110"); heuristic(bp, reference, "Science. 2007 May 2; 120, 044103 - 044110"); heuristic(bp, reference, "Science. 2007 120: 044103 - 044110"); heuristic(bp, reference, "Science 2007;120: 044103 - 044110"); /**************************************************************** journal-pages-volume-number-year ****************************************************************/ // Usual pages reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "117")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1), 117(2007)"); heuristic(bp, reference, "Science 120(1), 117(2007)"); heuristic(bp, reference, "Science 120(1): 117, 2007"); heuristic(bp, reference, "Science 2007, 120(1): 117"); heuristic(bp, reference, "Science 2007 120(1): 117"); heuristic(bp, reference, "Science 2007, 120(1), 117"); heuristic(bp, reference, "Science, 2007, 120 (1), p 117"); heuristic(bp, reference, "Science 2007 January 25; 120(1), 117"); heuristic(bp, reference, "Science 2007 January 25 120(1), 117"); heuristic(bp, reference, "Science 2007 May 25 120(1), 117"); heuristic(bp, reference, "Science (2007), 120, 1, 117"); heuristic(bp, reference, "Science, Vol. 120, No. 1 (2007) 117"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "10 - 17")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1), 10 - 17(2007)"); heuristic(bp, reference, "Science 120(1), 10 - 17(2007)"); heuristic(bp, reference, "Science 120(1): 10 - 17, 2007"); heuristic(bp, reference, "Science 2007, 120(1): 10 - 17"); heuristic(bp, reference, "Science. 2007, 120(1): 10 - 7"); heuristic(bp, reference, "Science. 2007 120(1): 10 - 7"); heuristic(bp, reference, "Science. 2007, 120(1): 10 8pp"); heuristic(bp, reference, "Science. 2007, 120(1), 10 - 17"); heuristic(bp, reference, "Science. 2007, 120(1), pp 10 - 17"); heuristic(bp, reference, "Science. 2007 January 25, 120(1), pp 10 - 17"); heuristic(bp, reference, "Science (2007), 120, 1, pp. 10-17"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "117")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1 - 6")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1 - 6), 117(2007)"); heuristic(bp, reference, "Science 120(1 - 6), 117(2007)"); heuristic(bp, reference, "Science 120(1 - 6): 117, 2007"); heuristic(bp, reference, "Science 2007, 120(1 - 6): 117"); heuristic(bp, reference, "Science 2007 120(1 - 6): 117"); heuristic(bp, reference, "Science 2007 May 25 120(1 - 6): 117"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "10 - 17")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1 - 6")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1 - 6), 10 - 17(2007)"); heuristic(bp, reference, "Science 120(1 - 6), 10 - 17(2007)"); heuristic(bp, reference, "Science 120(1 - 6): 10 - 17, 2007"); heuristic(bp, reference, "Science 2007, 120(1 - 6): 10 - 17"); heuristic(bp, reference, "Science. 2007, 120(1 - 6): 10 - 7"); heuristic(bp, reference, "Science. 2007, 120(1 - 6): 10 8pp"); heuristic(bp, reference, "Science 2007 120(1 - 6): 10 8pp"); heuristic(bp, reference, "Science 2007 May 25 120(1 - 6): 10 8pp"); // Pages susceptible to be confused by years reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "1922")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1), 1922(2007)"); heuristic(bp, reference, "Science 120(1), 1922(2007)"); heuristic(bp, reference, "Science 120(1): 1922, 2007"); heuristic(bp, reference, "Science 2007, 120(1): 1922"); heuristic(bp, reference, "Science 2007, 120(1), 1922"); heuristic(bp, reference, "Science 2007 120(1): 1922"); heuristic(bp, reference, "Science 2007 May 25 120(1): 1922"); heuristic(bp, reference, "Science, Vol. 120, No. 1 (2007) 1922"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "1922 - 1927")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1), 1922 - 1927(2007)"); heuristic(bp, reference, "Science 120(1), 1922 - 1927(2007)"); heuristic(bp, reference, "Science 120(1): 1922 - 1927, 2007"); heuristic(bp, reference, "Science 2007, 120(1): 1922 - 1927"); heuristic(bp, reference, "Science. 2007, 120(1): 1922 - 1927"); heuristic(bp, reference, "Science. 2007, 120(1): 1922 6pp"); heuristic(bp, reference, "Science. 2007 120(1): 1922 6pp"); heuristic(bp, reference, "Science. 2007, 120(1), 1922 - 1927"); heuristic(bp, reference, "Science. 2007, 120(1), pp 1922 - 1927"); heuristic(bp, reference, "Science. 2007 May 25, 120(1), pp 1922 - 1927"); heuristic(bp, reference, "Science (2007), 120, 1, pp. 1922-1927"); heuristic(bp, reference, "Science, Vol. 120, No. 1 (2007) 1922 - 1927"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "1922")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1 - 6")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1 - 6), 1922(2007)"); heuristic(bp, reference, "Science 120(1 - 6), 1922(2007)"); heuristic(bp, reference, "Science 120(1 - 6): 1922, 2007"); heuristic(bp, reference, "Science 2007, 120(1 - 6): 1922"); heuristic(bp, reference, "Science 2007 120(1 - 6): 1922"); heuristic(bp, reference, "Science 2007 May 25 120(1 - 6): 1922"); reference.clearReference(); reference.insert("journal", bp.parse("journal", "Science")); reference.insert("pages", bp.parse("pages", "1922 - 1927")); reference.insert("volume", bp.parse("volume", "120")); reference.insert("number", bp.parse("number", "1 - 6")); reference.insert("year", bp.parse("year", "2007")); write(bp, reference); heuristic(bp, reference, "Science 120(1 - 6), 1922 - 1927(2007)"); heuristic(bp, reference, "Science 120(1 - 6), 1922 - 1927(2007)"); heuristic(bp, reference, "Science 120(1 - 6): 1922 - 1927, 2007"); heuristic(bp, reference, "Science 2007, 120(1 - 6): 1922 - 1927"); heuristic(bp, reference, "Science 2007 120(1 - 6): 1922 - 1927"); heuristic(bp, reference, "Science. 2007, 120(1 - 6): 1922 - 7"); heuristic(bp, reference, "Science. 2007, 120(1 - 6): 1922 6pp"); heuristic(bp, reference, "Science. 2007 May 25, 120(1 - 6): 1922 6pp"); } void c2bTests::heuristic_misc() { cout << endl; cout << "-----------------------------" << endl; cout << "Test miscellaneous heuristics" << endl; cout << "-----------------------------" << endl; bibParser bp; bibReference reference; // abstract reference.clearReference(); reference.insert("abstract", bp.parse("abstract", "Some text.")); write(bp, reference); heuristic(bp, reference, "...\n\nAbstract. Some text.\n"); heuristic(bp, reference, "...\n\nAbstract.\n Some text.\n"); heuristic(bp, reference, "...\n\nAbstract:\n Some text.\n"); heuristic(bp, reference, "...\n\nAbstract\n Some text.\n"); heuristic(bp, reference, "...\n\nSummary. Some text.\n"); heuristic(bp, reference, "...\n\nSummary:\n Some text.\n"); heuristic(bp, reference, "...\n\nSummary\n Some text.\n"); // keywords reference.clearReference(); reference.insert("keywords", bp.parse("keywords", "Some text.")); write(bp, reference); heuristic(bp, reference, "...\n\nKeywords:\n Some text.\n"); heuristic(bp, reference, "...\n\nKeywords. Some text.\n"); // title reference.clearReference(); reference.insert("title", bp.parse("title", "Some text.")); write(bp, reference); heuristic(bp, reference, "...\n\nTitle: Some text.\n"); heuristic(bp, reference, "...\n\nTitle:\n Some text.\n"); } void c2bTests::heuristic(bibParser& bp, const bibReference& reference, const QString& text) { bp.clearCurrentReference(); bp.guessFields(text); const bool passed(bp.toBibTeX() == bp.toBibTeX(reference)); ++_test_count; if (!passed) ++_failed_test_count; cout << QString("[%1]\t'%2'\n").arg(boolToStr(passed)).arg(text); if (!passed) qDebug() << "Guessed:\n" << bp.toBibTeX(); } void c2bTests::check_test(const bool passed, const QString& input, const QString& output) { ++_test_count; if (!passed) ++_failed_test_count; cout << QString("[%1]\t'%2'\n").arg(boolToStr(passed)).arg(input); if (!passed) qDebug() << output; } void c2bTests::write(const bibParser& bp, const bibReference& reference) { cout << endl; const QStringList& bibliographicFields = bp.bibliographicFields(); for (int i = 0; i < bibliographicFields.count(); ++i) { const QString fvalue(reference.value(bibliographicFields.at(i))); if (!fvalue.isEmpty()) { const QString& fd = bibliographicFields.at(i); const QString padding(QString().fill(' ', 12 - fd.length())); cout << (fd + padding + " = {" + fvalue + '}') << endl; } } } #if C2B_CHECK_PATTERNS #include "frequentPatterns.h" #endif void c2bTests::heuristic_check_patterns() { #if C2B_CHECK_PATTERNS frequentPatterns fp; fp.process(); return; #endif cout << endl; cout << "-----------------------------------------------------" << endl; cout << "Check pattern clashes in heuristic author recognition" << endl; cout << "-----------------------------------------------------" << endl; cout << endl; QFileInfoList flist = QDir(_bibliographic_dir).entryInfoList(QStringList() << "*.bib"); bibParser bp; bibReference reference; QStringList fields; fields.append("author"); QHash adictionary; for (int f = 0; f < flist.count(); ++f) { const QString bib_file(flist.at(f).absoluteFilePath()); bp.initReferenceParsing(_bibliographic_dir, fields, &reference); while (bp.referencesIn(c2bUtils::fileToString(bib_file), &reference)) { const QString a(c2bUtils::toAscii(reference.value("author"), c2bUtils::Collation)); const QStringList as(a.split(c2bUtils::nonLetter)); for (int i = 0; i < as.count(); ++i) adictionary.insert(as.at(i), 1 + adictionary.value(as.at(i), 0)); } } QStringList word_prefix_lexicon(c2bUtils::fileToString(":/txt/txt/word_prefix_lexicon.txt").split(c2bUtils::nonLetter, QString::SkipEmptyParts)); for (int i = 0; i < word_prefix_lexicon.count(); ++i) word_prefix_lexicon[i].replace('_', "\\b"); QStringList anames(adictionary.keys()); QRegExp wre; for (int i = 0; i < word_prefix_lexicon.count(); ++i) for (int j = 0; j < anames.count(); ++j) { const QString& wp = word_prefix_lexicon.at(i); const QString& a = anames.at(j); wre.setPattern(wp); if (a.contains(wre)) cout << "LEXICON CLASH: " << wp << ' ' << a << endl; } } QString c2bTests::decomposition(const QChar& c) { // Write char decomposition const QString d(c.decomposition()); QString wd; for (int i = 0; i < d.length(); ++i) wd += '[' + d.at(i) + ']'; return wd; } cb2bib-1.4.9/src/c2bCoreCiter.cpp0000644000175000017500000000540512045520050016334 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * The LyX pipe procedure in citeToLyXPipe has been adapted from Tellico * (Tellico (C) 2003-2005 by Robby Stephenson) ***************************************************************************/ #include "c2bCoreCiter.h" #include "c2bFileDialog.h" #include #include #include #include #include // fifo to lyx #include #include c2bCoreCiter::c2bCoreCiter(QWidget* parentw) : QObject(parentw) { _parentWP = parentw; _settingsP = settings::instance(); _settingsP->setDefaultValue("c2bCoreCiter/LyXPipe", QDir::cleanPath(QDir::homePath() + QDir::separator() + ".lyx/lyxpipe.in")); _lyxpipe = _settingsP->value("c2bCoreCiter/LyXPipe").toString(); } c2bCoreCiter::~c2bCoreCiter() {} void c2bCoreCiter::cite(const QStringList& keys) const { QByteArray pipe = QFile::encodeName(_lyxpipe); if (QFile::exists(pipe)) citeToLyXPipe(keys); else citeToClipboard(keys); } void c2bCoreCiter::citeToClipboard(const QStringList& keys) const { const QString c("\\cite{" + keys.join(", ").trimmed() + '}'); QClipboard* cb = QApplication::clipboard(); cb->setText(c, QClipboard::Clipboard); } void c2bCoreCiter::citeToLyXPipe(const QStringList& keys) const { // This procedure was adapted from Tellico // Tellico (C) 2003-2005 by Robby Stephenson QByteArray pipe = QFile::encodeName(_lyxpipe); const QString errorStr(tr("Unable to write to the server pipe at '%1'.").arg(QString(pipe))); if (!QFile::exists(pipe)) { QMessageBox::warning(_parentWP, tr("Warning - cb2Bib"), errorStr, QMessageBox::Ok); return; } int pipeFd = ::open(pipe, O_WRONLY); QFile file(QString::fromUtf8(pipe)); if (file.open(pipeFd, QIODevice::WriteOnly)) { // pybliographer uses comma-space, and pyblink expects the space there const QString c(keys.join(", ").trimmed()); QTextStream st(&file); st << QString::fromLatin1("LYXCMD:cb2bib:citation-insert:%1\n").arg(c).toLatin1(); file.flush(); file.close(); } else QMessageBox::warning(_parentWP, tr("Warning - cb2Bib"), errorStr, QMessageBox::Ok); ::close(pipeFd); } void c2bCoreCiter::setLyXPipe() { const QString new_pn(c2bFileDialog::getSystemFilename(_parentWP, "Select LyX pipe", _lyxpipe, "All (*)")); if (!new_pn.isEmpty()) { _lyxpipe = new_pn; _settingsP->setValue("c2bCoreCiter/LyXPipe", _lyxpipe); } } cb2bib-1.4.9/src/c2bConfigure.cpp0000644000175000017500000013250012045520050016373 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bConfigure.h" #include "c2b.h" #include "c2bConfigureFR.h" #include "c2bFileDialog.h" #include "c2bSettings.h" #include "c2bUtils.h" #include #include #include /** \page c2bconf Configuration - \ref c2bconf_annote - \ref c2bconf_bibtex - \ref c2bconf_clipboard - \ref c2bconf_documents - \ref c2bconf_files - \ref c2bconf_fonts - \ref c2bconf_network - \ref c2bconf_shortcuts - \ref c2bconf_utilities

     

    \section c2bconf_annote Configuring Annote - Annote Cascading Style Sheet (CSS) \n This file contains the style sheet to personalize the appearance of the HTML notes generated by the cb2Bib. The cb2Bib distribution includes the tex2html.css file as a CSS template. - jsMath Directory \n The mathematical notation in the text notes is displayed by \htmlonly
    jsMath. \endhtmlonly The jsMath is a Java Script library. Its location must be specified inside the HTML files in order to be known by the browser. - Include CSS in HTML \n Styles for the notes will be included, if checked, into the HTML file. In this way, all the information, text and layout, is contained in one single file. - Use relative links \n If checked, linked local files will be set relative to the current HTML document. - Annote Viewer Fonts \n Selects default and monospaced fonts for the Annote viewer. Changes in the fonts might need restarting the viewer unless using some of the latest QtWebKit libraries. The viewer is disabled if the cb2Bib was not compiled and linked against WebKit. Note also that fonts specified in the CSS prevail over this selection. \section c2bconf_bibtex Configuring BibTeX - CiteID Pattern \n Specifies the pattern for formatting cite's ID. Predefined placeholders are available as a context menu, by right-clicking this edit line. Placeholders will be substituted by the actual reference field values. See \ref idplaceholders for descriptions. - Author and Editor Name Format \n Sets Authors and Editor names in abbreviated or full form, if the latter is available. - Journal Name Format \n Sets output journal names in abbreviated or full form. Note that this feature only works if journal names are found in the Journal Abbreviation List file. - Number Separator \n Sets number separator, e.g., ' - ' or ' -- '. Spaces count. It applies to pages, multiple volume, number, and year cases. - Convert entry strings to LaTeX \n If checked, cb2Bib converts special characters to LaTeX commands. Most BibTeX import filters do not process LaTeX escaped characters. Therefore, keeping this box unchecked can be appropriate when using cb2Bib as a temporary media to transfer references to non BibTeX reference managers. - Set 'title' in double braces \n If checked, it writes extra braces in title. This will keep capitalization as is, when processed by BibTeX. - Postprocess 'month' \n If checked, cb2Bib elaborates the 'month' string on a BibTeX fashion. E.g., 'April 1' becomes '"1~" # apr'. No processing is done if the input string is not written in English. - Try Heuristic Guess if recognition fails \n If checked, when automatic recognition fails, cb2Bib tries to catch some of the fields of the reference through an heuristic set of rules. See \ref heuristicguess. - Check Repeated On Save \n If checked, cb2Bib looks for existing references in the BibTeX directory similar to the one being saved. The search is based on exact cite ID match, or on reference contents, by considering title and author field values, or, if empty, booktitle and editor, and using the \htmlonly approximate string \endhtmlonly search pattern. If similar references are found, the current reference is not saved, and the similar ones are displayed. Pressing the save button one second time will proceed to actually saving the current reference. Note that this feature is not applied in command line mode, when using cb2bib --txt2bib or cb2bib --doc2bib. See also \ref keyboard. - External BibTeX Postprocessing \n Use this box to select a BibTeX postprocessing external tool. The name of the executable, the command arguments and the output file extension are required fields. Arguments, any number, are passed to the executable. For the sake of generality, it is required to specify the \%finput and \%foutput placeholders. The first one is later substituted by the current BibTeX filename. The second one is substituted by the current filename with the specified output extension. Caution: Be careful if using the same file extension for input and output, e.g., using bib because you want to use a beautifier or a sorting script. The cb2Bib has no control on external disk modifications. Therefore, if the script failed, the input data would possibly be lost. See also \ref keyboard. \section c2bconf_clipboard Configuring Clipboard - Replace/Remove from Input Stream \n If checked, input stream is preprocessed by performing a customizable set of string substitutions/removals. This option is mainly intended to remove image HTML alt tags. Although not visible, alt tags reach the clipboard when selecting and copying text. Author lists with email icons may contain alt strings that would interfere with the author names processing. In addition, this option is also appropriate to help translating special characters to Unicode and LaTeX. Use it carefully, as to avoid unwanted or unsuspected substitutions. See also \ref bibproc. - External Clipboard Preparsing Command \n Preparses input stream through an external, user-defined tool. Use the box bellow to specify its name and path. cb2Bib executes the command tool_name tmp_inputfile tmp_outputfile. You might consider a wrapper shell script to fullfill this particular syntax requirement. Two examples, isi2bib and ris2bib are provided. To test them, make sure the \htmlonly BibUtils Package \endhtmlonly is available on your machine. Otherwise, modify these scripts according to your needs. See also \ref keyboard, \ref bibproc, and the examples \ref ex_isi_format and \ref ex_ris. - Perform always, as part of an automatic extraction \n Performs preparsing each time the recognition engine is invoked. Caution: cb2Bib, when not in disconnected mode, starts the recognition engine each time the clipboard changes. Thus, it might send arbitrary data to the external parsing tool. The tool might not be prepared to handle 'any data' and might fall into a sort of 'infinite loop'. cb2Bib kills the external tool after a reasonable waiting. But, if the tool is called through a wrapper script, killing the script will not end the tool itself. Therefore, check this box only when needed. If you write your own preparser, design it as to write no data to output file whenever it can not process an input properly. When the preparser produces no data, the cb2Bib sends instead the input stream to the recognition engine. In this way, preparsing and normal cb2Bib functioning will work harmoniously. - Do not show log \n If unchecked, the external process messages, and the input and output streams are shown in a log window. Showing output logs is useful for debugging purposes. - Add document metadata to Input Stream \n When checked, if the document linked to a reference contains relevant metadata, then metadata will be added to the current clipboard contents. The metadata is included at the time of adding the document to the current reference, e. g., when dropping a file into the cb2Bib panel. If the document has BibTeX information, the cb2Bib will automatically set the corresponding fields. If it has not, but relevant bibliographic information is found, this data is only added to the clipboard panel. To insert it in the edit lines, activate the Heuristic Guess (Alt+G). The option Prepend or Append to the clipboard contents is provided for conveniently writing regular expressions considering metadata contents. File documents are linked to the references by the BibTeX tag 'file'. See also \ref metadata. \section c2bconf_documents Configuring Documents - Rename and Copy/Move document files to Directory \n If selected, each file 'drag and dropped' onto the cb2Bib main window is renamed to DocumentID.pdf (or DocumentID.ps, DocumentID.dvi, etc.) and moved to the storage directory. If unselected, the file URL is written to the file BibTeX keyword, without any renaming or moving of the file. The actual copy/move action is scheduled and performed once the reference is accepted, e.g., once it is saved. - Copy or Move document files \n Choose whether copy or move Network Files dropped onto the cb2Bib main window. See also Use External Network Client. - Set directory relative to the BibTeX File Directory \n If checked, the document file is copied/moved to the current BibTeX file directory. If the Documents Directory box contains a relative directory it will be added to the file name. For example, if it contains articles, files will be copied to /current_bibtex_path/articles/. An absolute path in the Documents Directory box will be ignored in this context. Note that the file dialog returns here relative file addresses. Consequently, only the necessary portion of the full name, instead of the fullpath filename, is written to the BibTeX entry. File retrieving from within the cb2Bib browser will be relative to the BibTeX file absolute location. \n Use this option if you plan to store in a same or a related directory the BibTeX and document files. This option is appropriate for storing bibliographic collections in removal devices. Likewise, when the cb2Bib is launched in USB mode, by means of the command line switch '--conf', the alternate option is not available. See \ref relnotes084 and \ref export_entries. - Insert BibTeX metadata to document files \n If checked, the cb2Bib will write bibliographic metadata to the linked document, once the current reference is accepted and saved. See also \ref metadata. - DocumentID Pattern \n Specifies the pattern for formatting the document's filenames. Predefined placeholders are available as a context menu, by right-clicking this edit line. Placeholders will be substituted by the actual reference field values. See \ref idplaceholders for descriptions. - ExifTool Metadata writer \n The cb2Bib uses \htmlonly ExifTool \endhtmlonly for writing bibliographic metadata to the attached documents. Select here the ExifTool path name. On Windows, remember renaming exiftool(-k).exe to exiftool.exe for command line use. See also \ref metadata_write. \section c2bconf_files Configuring Files - Journal Abbreviation List File \n This file contains a list of journal names equivalences: a capital-letter acronym, standard abbreviated form, and full name of the journal. If an input journal name is recognized, cb2Bib will use the standard abbreviated form for the journal bibkey. If your usual journal were not within the distributed, default abbreviations.txt, you could edit this file, or point to a personalized abbreviation file. Note: Changes in the abbreviation file only take place after reestarting cb2Bib. - Regular Expression List File \n The cb2Bib distribution includes the file regexps.txt with a few set of rules for reference extraction. This includes most of the scientific literature. Extracting from email alerts or publisher abstract pages is a volatile task. Information does not follow a standardized structure. Extraction pattern may then change as often as the web design needs to. Besides, such extraction from the clipboard is system dependent, in a way that produces different formatting of the text copies on different systems. You can use your personalized regexps.txt file, for testing, debugging -regular expressions are reloaded each time the automatic recognition engine executes-, and fullfiling your particular extraction needs. - Bookmarks and Network Query Info File \n The cb2Bib distribution includes the file netqinf.txt that contains bookmarks data, and server related information for bibliographic querying. Note that the cb2Bib treats bibliographic queries as generalized net bookmarks. This allows accessing almost any online bibliographic resource. Check this file for implementations details and customization. - Browser Cascading Style Sheet (CSS) \n This file contains the style sheet to configure the appearance of the bibliographic references when viewed in browser mode. The cb2Bib distribution includes the references.css and references-dark.css file as a CSS examples. - Part Of Speech (POS) Lexicon \n This box must contain the address to the cb2Bib distribution file lexicon.pos. This file contains a set of patterns and related POS information required to Index Documents, i. e., to extract keywords from documents for the c2bCiter module. - Search In Files Cache Directory \n Directory containing internal data for Search In Files functionality. If an existing directory is selected the cb2Bib will write all internal data on it. If otherwise, cache data will be written on the same directory from where BibTeX are searched. It might be, therefore, convenient to group all this files in a separate directory that does not need to be backup, and that can easily be deleted whenever desired. \section c2bconf_fonts Configuring Fonts - Font Selector \n Selects the main window and editor font family and size. - Context Colors \n Doubleclick on context color items to select syntax highlighter font color. Besides syntax highlighting, and to ease manual bibliographic extractions, cb2Bib has the following coloring convention. 'cb2Bib unrelevant text' colors non-word, non-digit, and cb2Bib's internal tags. 'cb2Bib relevant text' refers to the reference's year. 'cb2Bib highly relevant' attempts to guess text sectioning, highlighting 'abstract', 'introduction', and 'keywords'. \section c2bconf_network Configuring Network - Use External Network Client \n The cb2Bib manages local and network files in an equivalent manner. Network file retrieving, however, requires sometimes password and/or cookies administration. The KDE desktop incorporates kfmclient utility. A command kfmclient (copy|move|exec) source [destination] permits copying or moving files, with kfmclient taking care of advanced browsing preferences. By checking this box, cb2Bib will use the specified file manger client. - Use Proxy \n If checked, the cb2Bib will access the network through a proxy host. Set the Host name, the Port, and the proxy Type. A login dialog will appear if the proxy requires authentication. Login data is not stored, it must be entered at each session. - Perform Network Queries after automatic reference extractions \n Network queries can be used to complete a partial reference extraction. For instance, provided a reference 'J. Name, 25, 103' and an appropriate pattern to extract it, cb2Bib will attempt to complete the reference automatically. No query is performed if automatic reference extraction was tagged as BibTeX. - Download document if available \n If checked, cb2Bib downloads document files to the directory specified in Rename and Copy/Move document files to Directory. See also the file netqinf.txt for details. Download is scheduled and performed once the reference is accepted, e.g., once it is saved. Note that when document file is local, e.g., when PDFImport or switch --doc2bib is used, no document is downloaded. - Keep Query temporary files (Debug Only) \n cb2Bib may use up to three temporary files to perform a network query. If this box is checked, the temporary files are not deleted. This facilitates the testing and customization of the information file netqinf.txt. \section c2bconf_shortcuts Configuring Shortcuts - Customizes most key sequences for actions shortcuts. Concretely, cb2Bib specific actions are configurable, but not standard actions such as 'Open', 'Exit', 'Copy', or 'Paste', which are already predefined to the standard, specific key sequences for each platform. Shortcuts are customizable for the cb2Bib main panel, editor, and reference list actions. Single-key shortcuts, i.e., for manual reference extraction and shortcuts in c2bCiter, are non-configurable, since they they closely map non-translatable BibTeX keywords. \section c2bconf_utilities Configuring Utilities - To plain text converter \n Selects the external some_format_to_text tool that cb2Bib uses to convert document files prior to reference extraction and searching. cb2Bib executes the line command converter [options] inputfile tmp_output.txt, where [options] are user defined arguments. As a default, cb2Bib launches pdftotext, a PDF to text utility found in many platforms. Default arguments are -f 1 -l 1 to extract only the first, title page when used within PDFImport, and -raw, to convert the complete document when used within Search in Files. Appropriate for PDFImport could also be a document metadata extractor. Often metadata contains structured information regarding document authors, title, and source. A simple shell script wrapper could be the following any2text_search: \verbatim #!/bin/csh # Convert documents to text according to filename extension # any2text_search input_fn.ext output_fn.txt set ext = $1:e if ( $ext == 'djvu' ) then /usr/bin/djvutxt "$1" "$2" if ($status) exit 1 else if ( $ext == 'chm' ) then (/usr/local/bin/archmage -c text "$1" "$2") >& /dev/null if ($status) exit 1 else /usr/bin/pdftotext -raw -enc UTF-8 "$1" "$2" if ($status) exit 1 endif \endverbatim

     

    */ c2bConfigure::c2bConfigure(QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); resize(QSize(1, 1)); // Set it at minimum size settings = c2bSettingsP; for (int i = 0; i < ui.contentsWidget->count(); ++i) ui.contentsWidget->item(i)->setStatusTip(tr("Configure %1").arg(ui.contentsWidget->item(i)->text())); connect(ui.contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(changePage(QListWidgetItem*, QListWidgetItem*))); ui.contentsWidget->setCurrentItem(ui.contentsWidget->item(settings->value("c2bConfigure/CurrentPage", 0).toInt())); ui.buttonBox->button(QDialogButtonBox::Apply)->setAutoDefault(false); ui.buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); ui.buttonBox->button(QDialogButtonBox::Help)->setAutoDefault(false); connect(ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply())); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); populateFontCombos(); // Annote ui.AnnoteCssFile->setText(settings->fileName("c2bAnnote/AnnoteCssFile")); connect(ui.AnnoteCssDir, SIGNAL(clicked()), this, SLOT(getAnnoteCssFile())); ui.jsMathDirectory->setText(settings->fileName("c2bAnnote/jsMathDirectory")); connect(ui.jsMathDir, SIGNAL(clicked()), this, SLOT(getjsMathDirectory())); ui.IncludeCSS->setChecked(settings->value("c2bAnnote/IncludeCSS").toBool()); ui.UseRelativeLinks->setChecked(settings->value("c2bAnnote/UseRelativeLinks").toBool()); fontSelection(settings->value("c2bAnnote/Font").value(), ui.af_familycombo, ui.af_psizecombo); fontSelection(settings->value("c2bAnnote/FixedFont").value(), ui.aff_familycombo, ui.aff_psizecombo); #ifndef C2B_USE_WEBKIT ui.AnnoteViewerFont->setDisabled(true); ui.AnnoteViewerFixedFont->setDisabled(true); #endif // BibTeX ui.CiteIdPattern->setText(settings->value("cb2Bib/CiteIdPattern").toString()); ui.UseAbbreviatedNames->setChecked(!settings->value("cb2Bib/UseFullNames").toBool()); ui.UseFullNames->setChecked(settings->value("cb2Bib/UseFullNames").toBool()); ui.SetJournalsToAbbreviated->setChecked(!settings->value("cb2Bib/SetJournalsToFullname").toBool()); ui.SetJournalsToFullname->setChecked(settings->value("cb2Bib/SetJournalsToFullname").toBool()); ui.PageNumberSeparator->setText(settings->value("cb2Bib/PageNumberSeparator").toString()); ui.ConvertReferenceToLaTeX->setChecked(settings->value("cb2Bib/ConvertReferenceToLaTeX").toBool()); ui.UseDoubleBraces->setChecked(settings->value("cb2Bib/UseDoubleBraces").toBool()); ui.PostprocessMonth->setChecked(settings->value("cb2Bib/PostprocessMonth").toBool()); ui.DoHeuristicGuess->setChecked(settings->value("cb2Bib/DoHeuristicGuess").toBool()); ui.CheckRepeatedOnSave->setChecked(settings->value("cb2Bib/CheckRepeatedOnSave").toBool()); ui.PostprocessBibTeXBin->setText(settings->fileName("cb2Bib/PostprocessBibTeXBin")); ui.PostprocessBibTeXArg->setText(settings->value("cb2Bib/PostprocessBibTeXArg").toString()); ui.PostprocessBibTeXExt->setText(settings->value("cb2Bib/PostprocessBibTeXExt").toString()); connect(ui.PostprocessBibTeXDir, SIGNAL(clicked()), this, SLOT(getPostprocessBibTeXBin())); // Clipboard ui.FindReplaceInput->setChecked(settings->value("cb2Bib/FindReplaceInput").toBool()); connect(ui.FindReplaceInput, SIGNAL(toggled(bool)), this, SLOT(updateFindReplaceInputButtons())); updateFindReplaceInputButtons(); QStringList FindReplaceInputList(settings->value("cb2Bib/FindReplaceInputList").toStringList()); QStringList::Iterator i = FindReplaceInputList.begin(); while (i != FindReplaceInputList.end()) { const QStringList spLine((*i).split('|')); new QTreeWidgetItem(ui.FindReplaceList, spLine); ++i; } connect(ui.FindReplaceList, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(FindReplaceDialog_Edit())); connect(ui.FindReplaceList, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(updateFindReplaceInputButtons())); connect(ui.FRNew, SIGNAL(clicked()), this, SLOT(FindReplaceDialog_New())); connect(ui.FREdit, SIGNAL(clicked()), this, SLOT(FindReplaceDialog_Edit())); connect(ui.FRDelete, SIGNAL(clicked()), this, SLOT(FindReplaceDialog_Delete())); ui.AddMetadata->setChecked(settings->value("cb2Bib/AddMetadata").toBool()); const QString PreAppendMetadata(settings->value("cb2Bib/PreAppendMetadata").toString()); if (PreAppendMetadata == "prepend") ui.Prepend->setChecked(true); else if (PreAppendMetadata == "append") ui.Append->setChecked(true); if (ui.AddMetadata->isChecked()) ui.PreAppendMetadata->setEnabled(true); else ui.PreAppendMetadata->setEnabled(false); connect(ui.AddMetadata, SIGNAL(toggled(bool)), ui.PreAppendMetadata, SLOT(setEnabled(bool))); ui.PreparserAutomatic->setChecked(settings->value("cb2Bib/PreparserAutomatic").toBool()); ui.PreparserShowLog->setChecked(!settings->value("cb2Bib/PreparserShowLog").toBool()); ui.PreparserBin->setText(settings->fileName("cb2Bib/PreparserBin")); connect(ui.PreparserDir, SIGNAL(clicked()), this, SLOT(getPreparserBin())); // Documents ui.MovePdf->setChecked(settings->value("cb2Bib/MovePdf").toBool()); ui.PdfDirectory->setText(settings->fileName("cb2Bib/PdfDirectory")); connect(ui.PdfDir, SIGNAL(clicked()), this, SLOT(getPdfDirectory())); const QString CopyMovePdf(settings->value("cb2Bib/CopyMovePdf").toString()); if (CopyMovePdf == "copy") ui.Copy->setChecked(true); else if (CopyMovePdf == "move") ui.Move->setChecked(true); if (ui.MovePdf->isChecked()) { ui.RenameCopyMovePdf->setEnabled(true); ui.DocumentIdPatternBox->setEnabled(true); } else { ui.RenameCopyMovePdf->setEnabled(false); ui.DocumentIdPatternBox->setEnabled(false); } connect(ui.MovePdf, SIGNAL(toggled(bool)), ui.RenameCopyMovePdf, SLOT(setEnabled(bool))); ui.RelativePdfDirectory->setChecked(settings->value("cb2Bib/RelativePdfDirectory").toBool()); ui.RelativePdfDirectory->setDisabled(settings->isUsbConfiguredMode()); ui.InsertMetadata->setChecked(settings->value("cb2Bib/InsertMetadata").toBool()); ui.DocumentIdPattern->setDocumentIDEdit(); ui.DocumentIdPattern->setText(settings->value("cb2Bib/DocumentIdPattern").toString()); connect(ui.MovePdf, SIGNAL(toggled(bool)), ui.DocumentIdPatternBox, SLOT(setEnabled(bool))); ui.ExifToolBin->setText(settings->fileName("cb2Bib/ExifToolBin")); connect(ui.ExifToolDir, SIGNAL(clicked()), this, SLOT(getExifToolBin())); // Files ui.JournalFile->setText(settings->fileName("cb2Bib/JournalFile")); connect(ui.JournalDir, SIGNAL(clicked()), this, SLOT(getJournalFile())); ui.RegularExpressionFile->setText(settings->fileName("cb2Bib/RegularExpressionFile")); connect(ui.RegularExpressionDir, SIGNAL(clicked()), this, SLOT(getRegularExpressionFile())); ui.NetworkFile->setText(settings->fileName("cb2Bib/NetworkFile")); connect(ui.NetworkDir, SIGNAL(clicked()), this, SLOT(getNetworkFile())); ui.BrowserCssFile->setText(settings->fileName("cb2Bib/BrowserCssFile")); connect(ui.BrowserCssDir, SIGNAL(clicked()), this, SLOT(getBrowserCssFile())); ui.PosLexiconFile->setText(settings->fileName("cb2Bib/PosLexiconFile")); connect(ui.PosLexiconDir, SIGNAL(clicked()), this, SLOT(getPosLexiconFile())); ui.CacheDirectory->setText(settings->fileName("cb2Bib/CacheDirectory")); connect(ui.CacheDir, SIGNAL(clicked()), this, SLOT(getCacheDirectory())); // Fonts c2bMonoFont = settings->c2bMonoFont; ui.samplelineedit->setFont(c2bMonoFont); fontSelection(c2bMonoFont, ui.familycombo, ui.psizecombo); connect(ui.familycombo, SIGNAL(activated(const QString&)), this, SLOT(comboFamilyChanged(const QString&))); connect(ui.psizecombo, SIGNAL(activated(const QString&)), this, SLOT(comboSizeChanged(const QString&))); colors.loadColors(settings); QHashIterator cit(colors.colorList); while (cit.hasNext()) { cit.next(); QTreeWidgetItem* item = new QTreeWidgetItem(QStringList(cit.key())); item->setData(0, Qt::DecorationRole, *cit.value()); item->setData(0, Qt::TextColorRole, *cit.value()); ui.ColorList->insertTopLevelItem(0, item); } ui.ColorList->header()->setSortIndicatorShown(false); ui.ColorList->viewport()->setCursor(QCursor(static_cast(Qt::PointingHandCursor))); ui.ColorList->sortItems(0, Qt::AscendingOrder); connect(ui.ColorList, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(changeContextColor(QTreeWidgetItem*))); connect(ui.ColorList, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(changeContextColor(QTreeWidgetItem*))); // Network ui.FmClient->setChecked(settings->value("cb2Bib/FmClient").toBool()); ui.clientGroupBox->setEnabled(settings->value("cb2Bib/FmClient").toBool()); ui.FmClientCopyBin->setText(settings->fileName("cb2Bib/FmClientCopyBin")); ui.FmClientCopyArg->setText(settings->value("cb2Bib/FmClientCopyArg").toString()); ui.FmClientMoveBin->setText(settings->fileName("cb2Bib/FmClientMoveBin")); ui.FmClientMoveArg->setText(settings->value("cb2Bib/FmClientMoveArg").toString()); connect(ui.FmClientCopyDir, SIGNAL(clicked()), this, SLOT(getFmClientCopyBin())); connect(ui.FmClientMoveDir, SIGNAL(clicked()), this, SLOT(getFmClientMoveBin())); ui.UseProxy->setChecked(settings->value("cb2Bib/UseProxy").toBool()); ui.proxyGroupBox->setEnabled(settings->value("cb2Bib/UseProxy").toBool()); ui.ProxyHostName->setText(settings->value("cb2Bib/ProxyHostName", QString()).toString()); QValidator* proxyPortValidator = new QIntValidator(0, 999999, this); ui.ProxyPort->setValidator(proxyPortValidator); ui.ProxyPort->setText(settings->value("cb2Bib/ProxyPort").toString()); ui.ProxyType->setCurrentIndex(settings->value("cb2Bib/ProxyType").toInt()); ui.AutomaticQuery->setChecked(settings->value("cb2Bib/AutomaticQuery").toBool()); ui.AutomaticPdfDownload->setChecked(settings->value("cb2Bib/AutomaticPdfDownload").toBool()); ui.KeepTmpNQFiles->setChecked(settings->value("cb2Bib/KeepTmpNQFiles").toBool()); // Shortcuts ui.cb2BibShortcuts->setShortcutNames("Shortcuts/cb2Bib/", settings->shortcutNames()); connect(ui.cb2BibShortcuts, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); ui.EditorShortcuts->setShortcutNames("Shortcuts/Editor/", settings->shortcutNames()); connect(ui.EditorShortcuts, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); // Utilities ui.PdfImportPdf2TextBin->setText(settings->fileName("c2bPdfImport/Pdf2TextBin")); ui.PdfImportPdf2TextArg->setText(settings->value("c2bPdfImport/Pdf2TextArg").toString()); connect(ui.PdfImportPdf2TextDir, SIGNAL(clicked()), this, SLOT(getPdfImportPdf2TextBin())); ui.BibSearcherPdf2TextBin->setText(settings->fileName("c2bBibSearcher/Pdf2TextBin")); ui.BibSearcherPdf2TextArg->setText(settings->value("c2bBibSearcher/Pdf2TextArg").toString()); connect(ui.BibSearcherPdf2TextDir, SIGNAL(clicked()), this, SLOT(getBibSearcherPdf2TextBin())); } c2bConfigure::~c2bConfigure() {} void c2bConfigure::setPage(int index) { ui.contentsWidget->setCurrentItem(ui.contentsWidget->item(index)); } void c2bConfigure::accept() { apply(); QDialog::accept(); } void c2bConfigure::apply() { settings->setValue("c2bConfigure/CurrentPage", ui.contentsWidget->row(ui.contentsWidget->currentItem())); // Annote settings->setFilename("c2bAnnote/AnnoteCssFile", ui.AnnoteCssFile->text()); settings->setFilename("c2bAnnote/jsMathDirectory", ui.jsMathDirectory->text()); settings->setValue("c2bAnnote/IncludeCSS", ui.IncludeCSS->isChecked()); settings->setValue("c2bAnnote/UseRelativeLinks", ui.UseRelativeLinks->isChecked()); settings->setValue("c2bAnnote/Font", selectedFont(ui.af_familycombo, ui.af_psizecombo)); settings->setValue("c2bAnnote/FixedFont", selectedFont(ui.aff_familycombo, ui.aff_psizecombo)); // BibTeX settings->setValue("cb2Bib/CiteIdPattern", ui.CiteIdPattern->text()); settings->setValue("cb2Bib/UseFullNames", ui.UseFullNames->isChecked()); settings->setValue("cb2Bib/SetJournalsToFullname", ui.SetJournalsToFullname->isChecked()); settings->setValue("cb2Bib/PageNumberSeparator", ui.PageNumberSeparator->text()); settings->setValue("cb2Bib/ConvertReferenceToLaTeX", ui.ConvertReferenceToLaTeX->isChecked()); settings->setValue("cb2Bib/UseDoubleBraces", ui.UseDoubleBraces->isChecked()); settings->setValue("cb2Bib/PostprocessMonth", ui.PostprocessMonth->isChecked()); settings->setValue("cb2Bib/DoHeuristicGuess", ui.DoHeuristicGuess->isChecked()); settings->setValue("cb2Bib/CheckRepeatedOnSave", ui.CheckRepeatedOnSave->isChecked()); settings->setFilename("cb2Bib/PostprocessBibTeXBin", ui.PostprocessBibTeXBin->text()); settings->setValue("cb2Bib/PostprocessBibTeXArg", ui.PostprocessBibTeXArg->text()); settings->setValue("cb2Bib/PostprocessBibTeXExt", ui.PostprocessBibTeXExt->text()); // Clipboard QStringList FindReplaceInputList; QTreeWidgetItemIterator it(ui.FindReplaceList); while (*it) { QTreeWidgetItem* item = *it; FindReplaceInputList.append(QString("%1|%2|%3").arg(item->text(0)).arg(item->text(1)).arg(item->text(2))); ++it; } if (FindReplaceInputList.isEmpty()) { FindReplaceInputList = C2B_FIND_REPLACE_LIST.split("^e"); settings->setValue("cb2Bib/FindReplaceInput", false); } else settings->setValue("cb2Bib/FindReplaceInput", ui.FindReplaceInput->isChecked()); settings->setValue("cb2Bib/FindReplaceInputList", FindReplaceInputList); QString PreAppendMetadata; if (ui.Prepend->isChecked()) PreAppendMetadata = "prepend"; else PreAppendMetadata = "append"; settings->setValue("cb2Bib/PreAppendMetadata", PreAppendMetadata); settings->setValue("cb2Bib/AddMetadata", ui.AddMetadata->isChecked()); settings->setValue("cb2Bib/PreparserAutomatic", ui.PreparserAutomatic->isChecked()); settings->setValue("cb2Bib/PreparserShowLog", !ui.PreparserShowLog->isChecked()); settings->setFilename("cb2Bib/PreparserBin", ui.PreparserBin->text()); // Documents QString CopyMovePdf; if (ui.Copy->isChecked()) CopyMovePdf = "copy"; else CopyMovePdf = "move"; settings->setValue("cb2Bib/CopyMovePdf", CopyMovePdf); settings->setValue("cb2Bib/MovePdf", ui.MovePdf->isChecked()); settings->setFilename("cb2Bib/PdfDirectory", ui.PdfDirectory->text()); settings->setValue("cb2Bib/RelativePdfDirectory", ui.RelativePdfDirectory->isChecked()); settings->setValue("cb2Bib/InsertMetadata", ui.InsertMetadata->isChecked()); settings->setValue("cb2Bib/DocumentIdPattern", ui.DocumentIdPattern->text()); settings->setFilename("cb2Bib/ExifToolBin", ui.ExifToolBin->text()); // Files settings->setFilename("cb2Bib/JournalFile", ui.JournalFile->text()); settings->setFilename("cb2Bib/RegularExpressionFile", ui.RegularExpressionFile->text()); settings->setFilename("cb2Bib/NetworkFile", ui.NetworkFile->text()); settings->setFilename("cb2Bib/BrowserCssFile", ui.BrowserCssFile->text()); settings->setFilename("cb2Bib/PosLexiconFile", ui.PosLexiconFile->text()); settings->setFilename("cb2Bib/CacheDirectory", ui.CacheDirectory->text()); // Fonts settings->setValue("cb2Bib/MonoFont", c2bMonoFont); colors.saveColors(settings); // Network settings->setValue("cb2Bib/FmClient", ui.FmClient->isChecked()); settings->setFilename("cb2Bib/FmClientCopyBin", ui.FmClientCopyBin->text()); settings->setFilename("cb2Bib/FmClientMoveBin", ui.FmClientMoveBin->text()); settings->setValue("cb2Bib/FmClientCopyArg", ui.FmClientCopyArg->text().simplified()); settings->setValue("cb2Bib/FmClientMoveArg", ui.FmClientMoveArg->text().simplified()); settings->setValue("cb2Bib/UseProxy", ui.UseProxy->isChecked()); settings->setValue("cb2Bib/ProxyHostName", ui.ProxyHostName->text().trimmed()); settings->setValue("cb2Bib/ProxyPort", ui.ProxyPort->text().trimmed()); settings->setValue("cb2Bib/ProxyType", ui.ProxyType->currentIndex()); settings->setValue("cb2Bib/AutomaticQuery", ui.AutomaticQuery->isChecked()); settings->setValue("cb2Bib/AutomaticPdfDownload", ui.AutomaticPdfDownload->isChecked()); settings->setValue("cb2Bib/KeepTmpNQFiles", ui.KeepTmpNQFiles->isChecked()); // Shortcuts settings->setKeysequences(ui.cb2BibShortcuts->modifiedKeysequences()); settings->setKeysequences(ui.EditorShortcuts->modifiedKeysequences()); // Utilities settings->setValue("c2bPdfImport/Pdf2TextArg", ui.PdfImportPdf2TextArg->text().simplified()); settings->setFilename("c2bPdfImport/Pdf2TextBin", ui.PdfImportPdf2TextBin->text()); settings->setValue("c2bBibSearcher/Pdf2TextArg", ui.BibSearcherPdf2TextArg->text().simplified()); settings->setFilename("c2bBibSearcher/Pdf2TextBin", ui.BibSearcherPdf2TextBin->text()); // Notify settings settings->notify(); } void c2bConfigure::comboFamilyChanged(const QString& family) { ui.samplelineedit->setFont(QFont(family, ui.psizecombo->currentText().toInt())); c2bMonoFont.setFamily(family); } void c2bConfigure::comboSizeChanged(const QString& pt) { ui.samplelineedit->setFont(QFont(ui.familycombo->currentText(), pt.toInt())); c2bMonoFont.setPointSize(pt.toInt()); } void c2bConfigure::FindReplaceDialog_Delete() { QTreeWidgetItem* item = ui.FindReplaceList->currentItem(); delete item; item = ui.FindReplaceList->currentItem(); if (item) item->setSelected(true); updateFindReplaceInputButtons(); } void c2bConfigure::FindReplaceDialog_Edit() { QTreeWidgetItem* item = ui.FindReplaceList->currentItem(); if (item) { c2bConfigureFR* frD = new c2bConfigureFR(item, this); frD->exec(); delete frD; } } void c2bConfigure::FindReplaceDialog_New() { QStringList newlist; newlist << QString() << QString() << QString(); QTreeWidgetItem* fri = new QTreeWidgetItem(ui.FindReplaceList, newlist); c2bConfigureFR* frD = new c2bConfigureFR(fri, this); if (frD->exec() != QDialog::Accepted) delete fri; delete frD; } void c2bConfigure::updateFindReplaceInputButtons() { if (!ui.FindReplaceInput->isChecked()) { ui.FindReplaceList->setEnabled(false); ui.FRNew->setEnabled(false); ui.FREdit->setEnabled(false); ui.FRDelete->setEnabled(false); return; } else { ui.FindReplaceList->setEnabled(true); ui.FRNew->setEnabled(true); if (ui.FindReplaceList->topLevelItemCount() > 0) { ui.FREdit->setEnabled(true); ui.FRDelete->setEnabled(true); } else { ui.FREdit->setEnabled(false); ui.FRDelete->setEnabled(false); } } } void c2bConfigure::getAnnoteCssFile() { const QString fn(ui.AnnoteCssFile->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, tr("Select CSS filename"), fn, tr("Cascading Style Sheets (*.css);;All (*)"))); if (!new_fn.isEmpty()) ui.AnnoteCssFile->setText(new_fn); } void c2bConfigure::getjsMathDirectory() { const QString new_dir(c2bFileDialog::getExistingDirectory(this, tr("Select jsMath directory"), ui.jsMathDirectory->text())); if (!new_dir.isEmpty()) ui.jsMathDirectory->setText(new_dir); } void c2bConfigure::getJournalFile() { const QString fn(ui.JournalFile->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, tr("Select a filename (Restart to apply changes)"), fn, tr("cb2Bib Journal Lists (*.txt);;All (*)"))); if (!new_fn.isEmpty()) ui.JournalFile->setText(new_fn); } void c2bConfigure::getRegularExpressionFile() { const QString fn(ui.RegularExpressionFile->text()); const QString new_fn(c2bFileDialog::getFilename(this, QString(), fn, tr("cb2Bib RegExp Lists (*.txt);;All (*)"))); if (!new_fn.isEmpty()) ui.RegularExpressionFile->setText(new_fn); } void c2bConfigure::getNetworkFile() { const QString fn(ui.NetworkFile->text()); const QString new_fn(c2bFileDialog::getFilename(this, QString(), fn, tr("cb2Bib Network Query Info (*.txt);;All (*)"))); if (!new_fn.isEmpty()) ui.NetworkFile->setText(new_fn); } void c2bConfigure::getBrowserCssFile() { const QString fn(ui.BrowserCssFile->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, tr("Select a filename (Restart browser to apply changes)"), fn, tr("Cascading Style Sheets (*.css);;All (*)"))); if (!new_fn.isEmpty()) ui.BrowserCssFile->setText(new_fn); } void c2bConfigure::getFmClientCopyBin() { const QString fn(ui.FmClientCopyBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("File Manager Client executable (*)"))); if (!new_fn.isEmpty()) ui.FmClientCopyBin->setText(new_fn); } void c2bConfigure::getPreparserBin() { const QString fn(ui.PreparserBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("External Parser executable (*)"))); if (!new_fn.isEmpty()) ui.PreparserBin->setText(new_fn); } void c2bConfigure::getFmClientMoveBin() { const QString fn(ui.FmClientMoveBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("File Manager Client executable (*)"))); if (!new_fn.isEmpty()) ui.FmClientMoveBin->setText(new_fn); } void c2bConfigure::getPostprocessBibTeXBin() { const QString fn(ui.PostprocessBibTeXBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("BibTeX Postprocess executable (*)"))); if (!new_fn.isEmpty()) ui.PostprocessBibTeXBin->setText(new_fn); } void c2bConfigure::getPdfImportPdf2TextBin() { const QString fn(ui.PdfImportPdf2TextBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("PDF to text converter (*)"))); if (!new_fn.isEmpty()) ui.PdfImportPdf2TextBin->setText(new_fn); } void c2bConfigure::getBibSearcherPdf2TextBin() { const QString fn(ui.BibSearcherPdf2TextBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("PDF to text converter (*)"))); if (!new_fn.isEmpty()) ui.BibSearcherPdf2TextBin->setText(new_fn); } void c2bConfigure::getExifToolBin() { const QString fn(ui.ExifToolBin->text()); const QString new_fn(c2bFileDialog::getOpenFilename(this, QString(), fn, tr("ExifTool (*)"))); if (!new_fn.isEmpty()) ui.ExifToolBin->setText(new_fn); } void c2bConfigure::getPosLexiconFile() { const QString fn(ui.PosLexiconFile->text()); const QString new_fn(c2bFileDialog::getFilename(this, QString(), fn, tr("cb2Bib Part Of Speech Lexicon (*.pos);;All (*)"))); if (!new_fn.isEmpty()) ui.PosLexiconFile->setText(new_fn); } void c2bConfigure::getCacheDirectory() { const QString new_dir(c2bFileDialog::getExistingDirectory(this, tr("Select a cache directory"), ui.CacheDirectory->text())); if (!new_dir.isEmpty()) ui.CacheDirectory->setText(new_dir); } void c2bConfigure::getPdfDirectory() { const QString dir(c2bUtils::documentAbsoluteName(ui.RelativePdfDirectory->isChecked(), settings->fileName("cb2Bib/BibTeXFile"), ui.PdfDirectory->text(), QString())); QString new_dir(c2bFileDialog::getExistingDirectory(this, tr("Select documents directory"), dir)); if (!new_dir.isEmpty()) { new_dir = c2bUtils::documentDirName(ui.RelativePdfDirectory->isChecked(), settings->fileName("cb2Bib/BibTeXFile"), new_dir); ui.PdfDirectory->setText(new_dir); } } void c2bConfigure::populateFontCombos() { QFontDatabase db; QList sizes = db.standardSizes(); QList::Iterator it = sizes.begin(); while (it != sizes.end()) { ui.psizecombo->insertItem(0, QString::number(*it)); ui.af_psizecombo->insertItem(0, QString::number(*it)); ui.aff_psizecombo->insertItem(0, QString::number(*it)); it++; } } void c2bConfigure::fontSelection(const QFont& f, QFontComboBox* fc, QComboBox* sc) { fc->setCurrentFont(f); const int p_font_size(f.pointSize()); int i(0); while (i < sc->count()) { if (sc->itemText(i) == QString::number(p_font_size)) { sc->setCurrentIndex(i); break; } i++; } } QFont c2bConfigure::selectedFont(QFontComboBox* fc, QComboBox* sc) const { QFont f = fc->currentFont(); f.setPointSize(sc->currentText().toInt()); return f; } void c2bConfigure::changeContextColor(QTreeWidgetItem* item) { QColor newColor = QColorDialog::getColor(item->textColor(0), this); if (newColor.isValid()) { item->setData(0, Qt::TextColorRole, newColor); item->setData(0, Qt::DecorationRole, newColor); colors.updateColor(newColor, item->text(0)); } } void c2bConfigure::changePage(QListWidgetItem* current, QListWidgetItem* previous) { if (!current) current = previous; setWindowTitle(tr("Configure %1 - cb2Bib").arg(current->text())); ui.pagesWidget->setCurrentIndex(ui.contentsWidget->row(current)); } void c2bConfigure::showMessage(const QString& ms) { ui.statusBar->showMessage(ms, C2B_MESSAGE_TIME); } bool c2bConfigure::event(QEvent* qevent) { if (qevent->type() == QEvent::StatusTip) { ui.statusBar->showMessage(static_cast(qevent)->tip()); return true; } else return QDialog::event(qevent); } void c2bConfigure::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2bconf.php#c2bconf_" + ui.contentsWidget->currentItem()->text().toLower()); } cb2bib-1.4.9/src/c2bClipEdit.cpp0000644000175000017500000000754312045520050016157 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bClipEdit.h" #include "c2b.h" #include "c2bBibHighlighter.h" #include "c2bHighlighter.h" #include #include #include #include #include c2bClipEdit::c2bClipEdit(const Mode mode, QWidget* parentw) : QPlainTextEdit(parentw) { setFrameShape(QPlainTextEdit::StyledPanel); setFrameShadow(QPlainTextEdit::Raised); viewport()->setAcceptDrops(false); _has_selecting_ended = false; _is_tagged_view = false; if (mode == Editor) { new c2bHighlighter(document()); setReadOnly(false); connect(this, SIGNAL(selectionChanged()), this, SLOT(selectionHasChanged())); } else if (mode == Browser) { new c2bBibHighlighter(document()); setReadOnly(true); } } c2bClipEdit::~c2bClipEdit() {} void c2bClipEdit::setText(const QString& text, const QString& tagged_text) { _text = text; if (tagged_text.isEmpty()) _tagged_text = text; else _tagged_text = tagged_text; if (_is_tagged_view) setPlainText(_tagged_text); else setPlainText(_text); } void c2bClipEdit::insertTag(const QString& tag) { if (_is_tagged_view) insertPlainText(tag); else insertPlainText("[[" + textCursor().selectedText() + "]]"); } void c2bClipEdit::setTaggedViewMode(bool tagged_view) { _is_tagged_view = tagged_view; if (_is_tagged_view) { _text = toPlainText(); setPlainText(_tagged_text); } else { _tagged_text = toPlainText(); setPlainText(_text); } } void c2bClipEdit::updatePlainText(const QString& text) { const int scrollPosition(verticalScrollBar()->value()); setPlainText(text); verticalScrollBar()->setValue(scrollPosition); } void c2bClipEdit::keyPressEvent(QKeyEvent* qevent) { _has_selecting_ended = false; QPlainTextEdit::keyPressEvent(qevent); } void c2bClipEdit::keyReleaseEvent(QKeyEvent* qevent) { QPlainTextEdit::keyReleaseEvent(qevent); if (_has_selecting_ended && qevent->key() == Qt::Key_Shift) if (textCursor().hasSelection()) { _has_selecting_ended = false; emit userEndedSelection(mapToGlobal(cursorRect().topLeft())); } } void c2bClipEdit::mouseReleaseEvent(QMouseEvent* qevent) { QPlainTextEdit::mouseReleaseEvent(qevent); if (qevent->button() == Qt::LeftButton) if (textCursor().hasSelection()) emit userEndedSelection(QCursor::pos()); _has_selecting_ended = false; } void c2bClipEdit::selectionHasChanged() { _has_selecting_ended = textCursor().hasSelection(); } void c2bClipEdit::contextMenuEvent(QContextMenuEvent* qevent) { QMenu* edit_menu = createStandardContextMenu(); edit_menu->setTitle(tr("Edit...")); QList acts = edit_menu->actions(); if (!isReadOnly()) { QAction* act; act = new QAction(tr("Clear"), edit_menu); act->setEnabled(acts.last()->isEnabled()); // As is Select All connect(act, SIGNAL(triggered()), this, SLOT(clear())); edit_menu->insertAction(acts.at(7), act); } QMenu* menu = new QMenu(this); menu->addMenu(edit_menu); menu->addSeparator(); acts = c2b::netqinf()->bookmarkActions(textCursor().selectedText()); for (int i = 0; i < acts.count(); ++i) menu->addAction(acts.at(i)); acts = actions(); for (int i = 0; i < acts.count(); ++i) menu->addAction(acts.at(i)); menu->exec(qevent->globalPos()); delete edit_menu; delete menu; } cb2bib-1.4.9/src/c2bConfigure.ui0000644000175000017500000017504612045517740016256 0ustar rusconirusconi Pere Constans c2bConfigure 0 0 966 655 Configure - cb2Bib Qt::Horizontal 0 0 200 16777215 PointingHandCursor true QFrame::Raised QAbstractItemView::NoSelection QAbstractItemView::SelectColumns 32 32 QListView::Static 5 QListView::ListMode 0 true Annote :/icons/icons/annote.png:/icons/icons/annote.png BibTeX :/icons/icons/configure_bibtex.png:/icons/icons/configure_bibtex.png Clipboard :/icons/icons/configure_clipboard.png:/icons/icons/configure_clipboard.png Documents :/icons/icons/configure_documents.png:/icons/icons/configure_documents.png Files :/icons/icons/configure_files.png:/icons/icons/configure_files.png Fonts :/icons/icons/configure_fonts.png:/icons/icons/configure_fonts.png Network :/icons/icons/configure_network.png:/icons/icons/configure_network.png Shortcuts :/icons/icons/configure_shortcuts.png:/icons/icons/configure_shortcuts.png Utilities :/icons/icons/configure_utilities.png:/icons/icons/configure_utilities.png Qt::Vertical 4 1 Annote Cascading Style Sheet (CSS) Select Annote CSS file :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png jsMath Directory Select jsMath root directory :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png HTML Output Include CSS in HTML Use relative links Qt::Horizontal 40 20 Annote Viewer Font Family true false Size 0 0 true true false Annote Viewer Fixed Font Family true false QFontComboBox::MonospacedFonts Size 0 0 true true false Qt::Vertical 20 41 1 CiteID Pattern 9 6 Rightclick to edit pattern placeholders Author and Editor Format 9 6 Qt::Horizontal 40 20 Full Name Abbreviated Journal Format 9 6 Full Name Abbreviated Qt::Horizontal QSizePolicy::Expanding 95 31 Number Separator 9 6 Keep empty for default dash. Blank spaces count LaTeX Conversions 9 6 Qt::Horizontal QSizePolicy::Expanding 182 20 Postprocess 'month' Set 'title' in double braces Convert entry strings to LaTe&X Reference Extraction 9 6 Tr&y Heuristic Guess if recognition fails Reference Check 9 6 Check Repeated On Save External BibTeX Postprocessing 9 6 Aguments: Select external postprocess tool :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Command: Output Extension: Qt::Vertical 20 20 1 Clipboard Preprocessing 9 6 Replace/Remove from Input Stream 0 6 &Edit Alt+E Qt::Vertical 20 40 &Delete Alt+D QFrame::Raised QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked true QAbstractItemView::SingleSelection false true true 3 Find Replace Description &New Alt+N External Clipboard Preparsing Command 9 6 6 0 Select external parser tool :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Perform always, as part of an automatic extraction Do not show log Qt::Horizontal 40 20 Add document metadata to Input Stream 9 6 Qt::Horizontal 40 20 Append Prepend 1 Rename and Copy/Move document files Document Options 9 6 Documents Directory: Insert BibTeX metadata to document files Set directory relative to the BibTeX File Directory 6 0 Select PDF directory :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png 9 6 Qt::Horizontal 40 20 Move (local source files) Copy DocumentID Pattern 9 6 Rightclick to edit pattern placeholders ExifTool Metadata writer 9 6 Select ExifTool executable :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Command: Qt::Vertical 20 16 1 Journal Abbreviation List File Select journal abbreviation file :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Regular Expression List File Select regular expression file :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Bookmarks and Network Query Info File Select network informantion file :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Browser Cascading Style Sheet (CSS) Select CSS file :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Qt::Vertical 31 20 Part Of Speech (POS) Lexicon Select POS lexicon file :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Search In Files Cache Directory Select cache directory :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png 1 Family true false Size 0 0 true true false 0 0 Sample Text Qt::AlignHCenter QFrame::Raised true false true true 1 Context Colors 1 Use E&xternal Network Client Copy: kfmclient Select external copy executable :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Copy Aguments: Move: kfmclient Select external move executable :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Move Aguments: Use Proxy false false Host: Port: 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Type: Http Socks5 Queries 9 6 Download document if available &Keep Query temporary files (Debug Only) Perform Network Queries after automatic reference extractions Alt+Q Qt::Vertical 20 16 1 Main panel Editor and reference list Qt::Vertical 20 398 1 PDF Import: To plain text converter 9 6 Select external convert tool :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Aguments: Command: BibTeX search: To plain text converter 9 6 Select external convert tool :/icons/icons/mimeFolder.png:/icons/icons/mimeFolder.png Aguments: Command: Qt::Vertical 20 40 Qt::Horizontal 0 0 false Qt::Horizontal Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Save c2bLineEdit QLineEdit
    c2bLineEdit.h
    c2bIdLineEdit QLineEdit
    c2bIdLineEdit.h
    c2bShortcutWidget QWidget
    c2bShortcutWidget.h
    1
    buttonBox buttonBox accepted() c2bConfigure accept() 427 578 612 561 buttonBox rejected() c2bConfigure reject() 385 578 342 524 FmClient toggled(bool) clientGroupBox setEnabled(bool) 549 46 549 106 UseProxy toggled(bool) proxyGroupBox setEnabled(bool) 235 162 276 190
    cb2bib-1.4.9/src/c2bReferenceList.cpp0000644000175000017500000006015212045520050017207 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bReferenceList.h" #include "c2b.h" #include "c2bBibParser.h" #include "c2bCoreCiter.h" #include "c2bRLWebSearchSettings.h" #include "c2bSettings.h" #include "c2bTextBrowser.h" #include "c2bTextEdit.h" #include "c2bUtils.h" #include #include #include #include #include class TreeWidgetItem : public QTreeWidgetItem { // Reimplement sorting public: TreeWidgetItem(const QStringList& strings) : QTreeWidgetItem(strings) {} bool operator< (const QTreeWidgetItem& other) const { const int sortCol(treeWidget()->sortColumn()); const QString str(c2bUtils::toAscii(text(sortCol), c2bUtils::Collation)); const QString other_str(c2bUtils::toAscii(other.text(sortCol), c2bUtils::Collation)); return str < other_str; } }; c2bReferenceList::c2bReferenceList(c2bTextEdit* ed, c2bTextBrowser* br, QWidget* parentw) : QWidget(parentw) { ui.setupUi(this); _editorP = ed; _browserP = br; _citerP = new c2bCoreCiter(this); _settingsP = c2bSettingsP; _settingsP->setDefaultValue("c2bReferenceList/SearchEngine", "http://www.google.com/search?ie=UTF-8&q="); _settingsP->setDefaultValue("c2bReferenceList/SearchEngineAddQuotes", false); setupFilterBar(); _key_index = 0; _id_index = 1; _year_index = 2; _journal_index = 3; _author_index = 4; _title_index = 5; QStringList header; header.append(tr("Key")); header.append(tr("ID")); header.append(tr("Year")); header.append(tr("Journal")); header.append(tr("Author")); header.append(tr("Title")); ui.listView->sortItems(_key_index, Qt::AscendingOrder); ui.listView->setHeaderLabels(header); ui.listView->hideColumn(_id_index); ui.listView->setContextMenuPolicy(Qt::ActionsContextMenu); citeEntryAction = new QAction(this); citeEntryAction->setText(tr("Cite Selected Entries")); _settingsP->setKeysequence("Shortcuts/Editor/", citeEntryAction); connect(citeEntryAction, SIGNAL(triggered()), this, SLOT(citeEntry())); ui.listView->addAction(citeEntryAction); c2bUtils::addSeparator(ui.listView); openFileAction = new QAction(this); openFileAction->setText(tr("Open Document File")); openFileAction->setStatusTip(tr("Open document file")); _settingsP->setKeysequence("Shortcuts/Editor/", openFileAction); connect(openFileAction, SIGNAL(triggered()), this, SLOT(openFile())); ui.listView->addAction(openFileAction); openUrlAction = new QAction(this); openUrlAction->setText(tr("Open Document URL")); openUrlAction->setStatusTip(tr("Open document URL")); _settingsP->setKeysequence("Shortcuts/Editor/", openUrlAction); connect(openUrlAction, SIGNAL(triggered()), this, SLOT(openUrl())); ui.listView->addAction(openUrlAction); openDOIAction = new QAction(this); openDOIAction->setText(tr("Browse Reference by DOI")); openDOIAction->setStatusTip(tr("Browse reference by DOI")); _settingsP->setKeysequence("Shortcuts/Editor/", openDOIAction); connect(openDOIAction, SIGNAL(triggered()), this, SLOT(openDOI())); ui.listView->addAction(openDOIAction); c2bUtils::addSeparator(ui.listView); openAuthorsWebSearchAction = new QAction(this); openAuthorsWebSearchAction->setText(tr("Web Search by Author")); openAuthorsWebSearchAction->setStatusTip(tr("Web search by Author")); _settingsP->setKeysequence("Shortcuts/Editor/", openAuthorsWebSearchAction); connect(openAuthorsWebSearchAction, SIGNAL(triggered()), this, SLOT(openAuthorWebSearch())); ui.listView->addAction(openAuthorsWebSearchAction); openTitleWebSearchAction = new QAction(this); openTitleWebSearchAction->setText(tr("Web Search by Title")); openTitleWebSearchAction->setStatusTip(tr("Web search by Title")); _settingsP->setKeysequence("Shortcuts/Editor/", openTitleWebSearchAction); connect(openTitleWebSearchAction, SIGNAL(triggered()), this, SLOT(openTitleWebSearch())); ui.listView->addAction(openTitleWebSearchAction); c2bUtils::addSeparator(ui.listView); webSearchSettingsAction = new QAction(this); webSearchSettingsAction->setText(tr("Web Search Settings")); webSearchSettingsAction->setStatusTip(tr("Web search settings")); _settingsP->setKeysequence("Shortcuts/Editor/", webSearchSettingsAction); connect(webSearchSettingsAction, SIGNAL(triggered()), this, SLOT(webSearchSettings())); ui.listView->addAction(webSearchSettingsAction); c2bUtils::addSeparator(ui.listView); clearSelectionsAction = new QAction(this); clearSelectionsAction->setText(tr("Clear Entry Selection")); clearSelectionsAction->setStatusTip(tr("Clear entry selection")); _settingsP->setKeysequence("Shortcuts/Editor/", clearSelectionsAction); connect(clearSelectionsAction, SIGNAL(triggered()), this, SLOT(clearSelections())); ui.listView->addAction(clearSelectionsAction); c2bUtils::addSeparator(ui.listView); refreshListAction = new QAction(this); refreshListAction->setShortcut(QKeySequence(QKeySequence::Refresh)); refreshListAction->setText(tr("Refresh List and Browser")); refreshListAction->setStatusTip(tr("Refresh list and browser")); connect(refreshListAction, SIGNAL(triggered()), this, SLOT(refreshList())); ui.listView->addAction(refreshListAction); connect(ui.listView, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(goToReference(QTreeWidgetItem*))); // Actions dependent on selection and availability itemSelectionChanged(); connect(ui.listView, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged())); // Browser functionality _references_html = c2bUtils::fileToString(":/htm/htm/references.html"); _references_html.replace("GET_CB2BIB_VERSION_NUMBER", C2B_VERSION); _bib_item_html = c2bUtils::fileToString(":/htm/htm/bib_item.html"); QString references_css(c2bUtils::fileToString(_settingsP->fileName("cb2Bib/BrowserCssFile"))); if (references_css.isEmpty()) references_css = c2bUtils::fileToString(":/htm/htm/references.css"); _browserP->document()->setDefaultStyleSheet(references_css); openTextLocalSearchAction = new QAction(this); openTextLocalSearchAction->setText(tr("Local Search for Selected Text")); openTextLocalSearchAction->setStatusTip(tr("Local search for selected text")); _settingsP->setKeysequence("Shortcuts/Editor/", openTextLocalSearchAction); connect(openTextLocalSearchAction, SIGNAL(triggered()), this, SLOT(openTextLocalSearch())); openTextLocalSearchAction->setEnabled(false); connect(_browserP, SIGNAL(copyAvailable(bool)), openTextLocalSearchAction, SLOT(setEnabled(bool))); openTextWebSearchAction = new QAction(this); openTextWebSearchAction->setText(tr("Web Search for Selected Text")); openTextWebSearchAction->setStatusTip(tr("Web search for selected text")); _settingsP->setKeysequence("Shortcuts/Editor/", openTextWebSearchAction); connect(openTextWebSearchAction, SIGNAL(triggered()), this, SLOT(openTextWebSearch())); openTextWebSearchAction->setEnabled(false); connect(_browserP, SIGNAL(copyAvailable(bool)), openTextWebSearchAction, SLOT(setEnabled(bool))); QList al = ui.listView->actions(); for (int i = 0; i < 2; ++i) _browserP->addAction(al.at(i)); _browserP->addAction(openTextLocalSearchAction); _browserP->addAction(openTextWebSearchAction); c2bUtils::addSeparator(_browserP); for (int i = 6; i < al.count(); ++i) _browserP->addAction(al.at(i)); _browserP->setContextMenuPolicy(Qt::ActionsContextMenu); connect(_browserP, SIGNAL(anchorClicked(const QUrl&)), this, SLOT(openLink(const QUrl&))); connect(_browserP, SIGNAL(highlighted(const QString&)), parentw->parent(), SLOT(showMessage(const QString&))); } c2bReferenceList::~c2bReferenceList() {} void c2bReferenceList::loadList(const QString& txt, bibSearcher* searcher) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); c2bBibParser* bpP = c2b::bibParser(); QString references_html(_references_html); QString references; QStringList fields; fields.append("abstract"); fields.append("author"); fields.append("booktitle"); fields.append("doi"); fields.append("editor"); fields.append("file"); fields.append("journal"); fields.append("pages"); fields.append("title"); fields.append("url"); fields.append("volume"); fields.append("year"); bibReference ref; bpP->initReferenceParsing(_editorP->editorFilename(), fields, &ref); const QRegExp initials1("\\b\\w\\b"); const QRegExp initials2("[^\\w\\s]"); const QRegExp nonletters("[^\\w\\s-]"); int ref_counter(0); while (bpP->referencesIn(txt, &ref)) { ref_counter++; QString author(ref.anyAuthor()); QString author_long; if (!author.isEmpty()) { author = bpP->authorFromBibTeX(author); author_long = author; author_long.remove(nonletters); author_long.replace(" and ", ", "); c2bUtils::simplifyString(author_long); author_long += '.'; author.remove(initials1); author.remove(initials2); author.replace(" and ", ", "); c2bUtils::simplifyString(author); } QString title(ref.anyTitle()); c2bUtils::cleanTitle(title, true); QString doi(ref.value("doi")); if (!doi.isEmpty()) if (!doi.startsWith("http://")) doi = "http://dx.doi.org/" + QUrl::toPercentEncoding(doi); const QString file(ref.value("file")); const QString url(ref.value("url")); QString link; if (!file.isEmpty()) link = QDir::cleanPath(file); else if (!url.isEmpty()) link = url; else if (!doi.isEmpty()) link = doi; QString ID; ID.setNum(ref_counter); QString year(ref.value("year")); const QString abstract(ref.value("abstract")); const QString journal(ref.anyJournal()); const QString key(ref.citeidName); _doiList.append(doi); _fileList.append(file); _urlList.append(url); _positionList.append(ref.positionValue); QStringList dataList; dataList.append(key); dataList.append(ID); dataList.append(year); dataList.append(journal); dataList.append(author); dataList.append(title); TreeWidgetItem* qi = new TreeWidgetItem(dataList); qi->setStatusTip(_journal_index, bpP->fullJournal(journal)); qi->setStatusTip(_author_index, author_long); qi->setStatusTip(_title_index, title); ui.listView->insertTopLevelItem(0, qi); QString pages(ref.value("pages")); const QString volume(ref.value("volume")); if (!pages.isEmpty()) { if (!volume.isEmpty()) pages = ", " + pages; else pages = ' ' + pages; } if (!year.isEmpty()) year = '(' + year + ")."; QString bib_item_html(_bib_item_html); bib_item_html.replace("GET_REFERENCE_ANCHOR_ID", ID); bib_item_html.replace("GET_REFERENCE_ANCHOR_NAME", ID); bib_item_html.replace("GET_REFERENCE_AUTHOR", author_long); bib_item_html.replace("GET_REFERENCE_LINK", link); bib_item_html.replace("GET_REFERENCE_PAGES", pages); bib_item_html.replace("GET_REFERENCE_SOURCE", journal); bib_item_html.replace("GET_REFERENCE_TITLE", c2bUtils::toHtmlString(title)); bib_item_html.replace("GET_REFERENCE_VOLUME", volume); bib_item_html.replace("GET_REFERENCE_YEAR", year); if (searcher) bib_item_html.replace("GET_REFERENCE_ABSTRACT", searcher->highlight(abstract) + searcher->hitValue(ref.rawReference)); else bib_item_html.replace("GET_REFERENCE_ABSTRACT", c2bUtils::toHtmlString(abstract)); references += bib_item_html; } ui.listView->sortItems(ui.listView->sortColumn(), ui.listView->header()->sortIndicatorOrder()); ui.listView->resizeColumnToContents(_year_index); references_html.replace("GET_REFERENCES", references); _browserP->updateHtml(references_html); QApplication::restoreOverrideCursor(); c2b::showMessage(tr("Parsed %1 references.").arg(ref_counter)); } void c2bReferenceList::citeEntry() { QStringList keys; QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { if (!(*it)->text(_key_index).isEmpty()) keys.append((*it)->text(_key_index)); ++it; } _citerP->cite(keys); } void c2bReferenceList::openDOI() { bool zdoi(false); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { const QString doi(_doiList.at((*it)->text(_id_index).toInt() - 1)); if (!doi.isEmpty()) { zdoi = true; c2bUtils::openFile(doi, parentWidget()); } ++it; } if (!zdoi) c2b::showMessage(tr("No DOI entry among selected references.")); } void c2bReferenceList::openFile() { bool zfile(false); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { const QString file(_fileList.at((*it)->text(_id_index).toInt() - 1)); if (!file.isEmpty()) { zfile = true; c2bUtils::openFile(file, parentWidget()); } ++it; } if (!zfile) c2b::showMessage(tr("No file entry among selected references.")); } void c2bReferenceList::openUrl() { bool zurl(false); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { const QString url(_urlList.at((*it)->text(_id_index).toInt() - 1)); if (!url.isEmpty()) { zurl = true; c2bUtils::openFile(url, parentWidget()); } ++it; } if (!zurl) c2b::showMessage(tr("No URL entry among selected references.")); } void c2bReferenceList::openLink(const QUrl& ln) { QString ln_str(ln.toString()); if (ln_str.isEmpty()) c2b::showMessage(tr("No link available for this reference.")); else if (ln_str.startsWith("Select reference ")) scrollToReference(ln_str.remove(QRegExp("\\D"))); else if (ln_str.startsWith("Edit reference")) emit openFile(ln_str.replace(QRegExp("^.+\\[(.+)\\]$"), "\\1")); else c2bUtils::openFile(ln_str, parentWidget()); } void c2bReferenceList::openAuthorWebSearch() { const QString searchEngine(_settingsP->value("c2bReferenceList/SearchEngine").toString()); bool zwebs(false); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { if (!(*it)->text(_author_index).isEmpty()) { zwebs = true; QString webs((*it)->text(_author_index)); webs.remove(','); webs = searchEngine + webs.simplified(); c2bUtils::openFile(webs, parentWidget()); } ++it; } if (!zwebs) c2b::showMessage(tr("No author entry among selected references.")); } void c2bReferenceList::openTitleWebSearch() { const QString searchEngine(_settingsP->value("c2bReferenceList/SearchEngine").toString()); const bool addQuotes(_settingsP->value("c2bReferenceList/SearchEngineAddQuotes").toBool()); bool zwebs(false); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { if (!(*it)->text(_title_index).isEmpty()) { zwebs = true; QString webs((*it)->text(_title_index)); if (addQuotes) webs = '\"' + webs + '\"'; webs = searchEngine + webs; c2bUtils::openFile(webs, parentWidget()); } ++it; } if (!zwebs) c2b::showMessage(tr("No title entry among selected references.")); } void c2bReferenceList::openTextWebSearch() { const QString searchEngine(_settingsP->value("c2bReferenceList/SearchEngine").toString()); QString webs(_browserP->textCursor().selectedText()); if (_settingsP->value("c2bReferenceList/SearchEngineAddQuotes").toBool()) webs = '\"' + webs + '\"'; webs = searchEngine + webs; c2bUtils::openFile(webs, parentWidget()); } void c2bReferenceList::webSearchSettings() { c2bRLWebSearchSettings searchSettings(this); searchSettings.exec(); } void c2bReferenceList::openTextLocalSearch() { const QString text(_browserP->textCursor().selectedText()); const QString fn(_editorP->editorFilename()); c2b::doSearchInFiles(text, fn); } void c2bReferenceList::refreshList() { _doiList.clear(); _fileList.clear(); _urlList.clear(); _positionList.clear(); ui.listView->clear(); ui.comboFilter->clearEditText(); loadList(_editorP->toPlainText()); } void c2bReferenceList::goToReference(const QString& id) { QTextCursor tc(_editorP->textCursor()); tc.setPosition(_positionList.at(id.toInt() - 1)); _editorP->setTextCursor(tc); _editorP->verticalScrollBar()->setValue(_editorP->verticalScrollBar()->maximum()); _editorP->ensureCursorVisible(); _browserP->scrollToAnchor(id); int scrollPosition(_browserP->verticalScrollBar()->value()); _browserP->verticalScrollBar()->setValue(scrollPosition - 10); } void c2bReferenceList::goToReference(const int position) { // Maps position to internal reference id. It is needed by the search browser, when a // citation is edited in the original file. If this file is changed multiple times, // positions in the search browser get outdated, so the mapping position-id is inexact. // Thus, search for the closet reference. int ip(0); int pdiff_min(1000000); for (int i = 0; i < _positionList.count(); ++i) { int p(_positionList.at(i)); if (p == position) { ip = i; break; } int pdiff(abs(p - position)); if (pdiff < pdiff_min) { pdiff_min = pdiff; ip = i; } } QString id; goToReference(id.setNum(ip + 1)); } void c2bReferenceList::goToReference(QTreeWidgetItem* ref) { if (ref == 0) return; const QString id(ref->text(_id_index)); goToReference(id); } void c2bReferenceList::scrollToReference(const QString& id) { if (id.isEmpty()) return; QList items = ui.listView->findItems(id, Qt::MatchExactly, 1); QTreeWidgetItem* item = items.at(0); ui.listView->setFocus(); item->setSelected(!item->isSelected()); ui.listView->scrollToItem(item); QTextCursor tc(_editorP->textCursor()); tc.setPosition(_positionList.at(id.toInt() - 1)); _editorP->setTextCursor(tc); _editorP->verticalScrollBar()->setValue(_editorP->verticalScrollBar()->maximum()); _editorP->ensureCursorVisible(); } void c2bReferenceList::clearSelections() { disconnect(ui.listView, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged())); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected); while (*it) { (*it)->setSelected(false); ++it; } itemSelectionChanged(); connect(ui.listView, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged())); } void c2bReferenceList::itemSelectionChanged() { int entries(0); int doi(0); int file(0); int url(0); int author(0); int title(0); QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { if (!_doiList.at((*it)->text(_id_index).toInt() - 1).isEmpty()) ++doi; if (!_fileList.at((*it)->text(_id_index).toInt() - 1).isEmpty()) ++file; if (!_urlList.at((*it)->text(_id_index).toInt() - 1).isEmpty()) ++url; if (!(*it)->text(_author_index).isEmpty()) ++author; if (!(*it)->text(_title_index).isEmpty()) ++title; ++entries; ++it; } citeEntryAction->setEnabled(entries > 0); citeEntryAction->setStatusTip(tr("Cite selected entries. %1 Entries selected.").arg(entries)); openDOIAction->setEnabled(doi > 0); openDOIAction->setStatusTip(tr("Browse reference by DOI. %1 DOIs in selected entries.").arg(doi)); openFileAction->setEnabled(file > 0); openFileAction->setStatusTip(tr("Open document file. %1 Files in selected entries.").arg(file)); openUrlAction->setEnabled(url > 0); openUrlAction->setStatusTip(tr("Open document URL. %1 URLs in selected entries.").arg(url)); openAuthorsWebSearchAction->setEnabled(author > 0); openAuthorsWebSearchAction->setStatusTip(tr("Web search by Author. %1 Entries selected.").arg(author)); openTitleWebSearchAction->setEnabled(title > 0); openTitleWebSearchAction->setStatusTip(tr("Web search by Title. %1 Entries selected.").arg(title)); emit hasSelectedItems(entries > 0); } QStringList c2bReferenceList::selectedKeys() const { QStringList keys; QTreeWidgetItemIterator it(ui.listView, QTreeWidgetItemIterator::Selected | QTreeWidgetItemIterator::NotHidden); while (*it) { if (!(*it)->text(_key_index).isEmpty()) keys.append((*it)->text(_key_index)); ++it; } return keys; } void c2bReferenceList::setLyXPipe() { _citerP->setLyXPipe(); } /*************************************************************************** Filter Bar ***************************************************************************/ void c2bReferenceList::setupFilterBar() { const QStringList types(searchPattern::types()); _filter_mode = _settingsP->value("c2bReferenceList/FilterMode", types.first()).toString(); QActionGroup* filterMode = new QActionGroup(this); filterMode->setExclusive(true); for (int i = 0; i < types.count(); ++i) { const QString& t = types.at(i); QAction* act = filterMode->addAction(t); act->setCheckable(true); if (_filter_mode == t) act->setChecked(true); } QMenu* filterModeM = new QMenu(this); filterModeM->addActions(filterMode->actions()); ui.filterB->setMenu(filterModeM); connect(filterMode, SIGNAL(triggered(QAction*)), this, SLOT(setFilterMode(QAction*))); connect(ui.comboFilter, SIGNAL(editTextChanged(const QString&)), this, SLOT(blockFilterSignals())); } void c2bReferenceList::setFilterMode(QAction* mode) { _filter_mode = mode->text(); _settingsP->setValue("c2bReferenceList/FilterMode", _filter_mode); filterList(); } void c2bReferenceList::blockFilterSignals() { ui.comboFilter->blockSignals(true); QTimer::singleShot(500, this, SLOT(filterList())); } void c2bReferenceList::filterList() { const QString text(ui.comboFilter->currentText()); if (text.isEmpty()) { QTreeWidgetItemIterator it(ui.listView); while (*it) { (*it)->setHidden(false); ++it; } } else { searchPattern pattern(text, _filter_mode); QTreeWidgetItemIterator it(ui.listView); while (*it) { QTreeWidgetItem* item = *it; if (pattern.matches(item->text(_author_index)) || pattern.matches(item->text(_title_index))) item->setHidden(false); else item->setHidden(true); ++it; } QTimer::singleShot(5000, this, SLOT(keepFilterPattern())); } itemSelectionChanged(); ui.comboFilter->blockSignals(false); } void c2bReferenceList::keepFilterPattern() { const QString text(ui.comboFilter->currentText()); if (!text.isEmpty()) if (ui.comboFilter->findText(text) < 0) ui.comboFilter->addItem(text); } cb2bib-1.4.9/src/cb2Bib.cpp0000644000175000017500000030542412045520050015155 0ustar rusconirusconi/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "cb2Bib.h" #include "c2b.h" #include "c2bBibMenu.h" #include "c2bBibParser.h" #include "c2bCiterWidget.h" #include "c2bClipEdit.h" #include "c2bClipboard.h" #include "c2bEditor.h" #include "c2bFileDialog.h" #include "c2bNetworkQuery.h" #include "c2bPdfImport.h" #include "c2bPostprocess.h" #include "c2bSaveRegExp.h" #include "c2bSearchInFiles.h" #include "c2bSettings.h" #include "c2bTextBrowser.h" #include "c2bUtils.h" #include #include #include /** \page overview Overview The cb2Bib is a free, open source, and multiplatform application for rapidly extracting unformatted, or unstandardized bibliographic references from email alerts, journal Web pages, and PDF files. The cb2Bib facilitates the capture of single references from unformatted and non standard sources. Output references are written in BibTeX. Article files can be easily linked and renamed by dragging them onto the cb2Bib window. Additionally, it permits editing and browsing BibTeX files, citing references, searching references and the full contents of the referenced documents, inserting bibliographic metadata to documents, and writing short notes that interrelate several references. See \ref relnotes147. Current version: cb2Bib GET_VERSION. (See \ref changelog for a detailed list of changes and acknowledgments, and \ref relnotes for additional notes and information.)

     

    \section contents Contents: - \ref descrip - \ref usage - \ref detail - \ref requirements - \ref credits

     

    \section descrip Description The cb2Bib reads the clipboard text contents and process it against a set of predefined patterns. If this automatic detection is successful, cb2Bib formats the clipboard data according to the structured BibTeX reference syntax. Otherwise, if no predefined format pattern is found or if detection proves to be difficult, manual data extraction is greatly simplified by cb2Bib. In most cases, such manual data extraction will provide with a new, personalized pattern to be included within the predefined pattern set for future automatic extractions. Once the bibliographic reference is correctly extracted, it is added to a specified BibTeX database file. Optionally, document files are renamed to a DocumentID filename and moved to a desired directory as a personal article library, and their metadata is updated with the bibliographic reference. See \ref metadata section. The cb2Bib facilitates writing short notes related to bibliographic collections. Notes are written using a minimalist markup on a plain text editor, and can latter be converted to HTML. Related references and links become easily accessible on any browser or by the embedded cb2Bib viewer. See \ref relnotes110.

     

    \section usage Using cb2Bib \subsection procedure Procedure - Select the reference to import from the email or web browser \n On Unix machines, cb2Bib automatically detects mouse selections and clipboard changes. On Windows machines, copy or Ctrl-C is necessary to activate cb2Bib automatic processing. - cb2Bib automatic processing \n Once text is selected cb2Bib initiates the automatic reference extraction. It uses the predefined patterns from file regexp.txt to attempt automatic extraction. See \ref c2bconf_files section for setting the user predefined pattern matching expression file. After a successful detection bibliographic fields appear on the cb2Bib item line edits. Manual editing is possible at this stage. - cb2Bib manual processing \n If no predefined format pattern is found or if detection proves to be difficult, a manual data extraction must be performed. Select, either using mouse or Shift+arrow keys, the reference fields from the cb2Bib clipboard area. A popup menu will appear after selection is made. Choose the corresponding bibliographic field. See \ref entrytype. If operating with the keyboard, first letter of the field is set as a menu shortcut. Thus, typing 'A' sets selection to 'author', or '+A' to 'add authors'. Selection is postprocessed and added to the cb2Bib item line edit. cb2Bib field tags will show on the cb2Bib clipboard area. Once the manual processing is done, cb2Bib clipboard area will contain the matching pattern. The pattern can be further edited and stored to the regexp.txt file using Insert Regular Expression, Alt+I. See the \ref bibproc and \ref regexpedit sections. - Download reference to cb2Bib \n The cb2Bib has the built-in functionality to interact with publishers "Download reference to Citation Manager" service. Choose BibTeX format, or any other format that you can translate using External Clipboard Preparsing Command. See \ref keyboard, Alt C. Click "Download" from your browser. When asked "Open with..." select cb2Bib. The cb2Bib will be launched if no running instance is found. If already running, it will place the downloaded reference to the clipboard, and it will start processing. Make sure your running instance is aware of clipboard changes. See \ref c2bbuttons. For convenience, the shell script c2bimport, and the desktop config file c2bimport.desktop are also provided. - Adding documents \n PDF and other documents can be added to the BibTeX reference by dragging the file icon and dropping it into the cb2Bib's panel. Optionally, document files, are renamed to a DocumentID filename and moved to a desired directory as a personal article library (See \ref c2bconf_documents section). Linked to a reference documents correspond to the BibTeX tag file. Usual reference manager software will permit to retrieve and visualize these files. Download, copy and/or moving is scheduled and performed once the reference is accepted, e.g., once it is saved by pressing Save Reference button. - Multiple retrieving from PDF files \n Multiple PDF or convertible to text files can be sequentially processed by dragging a set of files into cb2Bib's PDFImport dialog. By starting the processing button, files are sequentially converted to text and send to cb2Bib clipboard panel for reference extraction. See \ref c2bpdfimport for details. - Journal-Volume-Page Queries \n Takes input Journal, Volume, and first page from the corresponding edit lines and attempts to complete the reference. Additionally, queries consider Title, DOI, and an excerpt, which is a simplified clipboard panel contents. See \ref c2bconf_network section, the distribution file netqinf.txt, and \ref relnotes035 for customization and details. - BibTeX Editor \n cb2Bib includes a practical text editor suitable for corrections and additions. cb2Bib capabilities are readily available within the editor. E.g., the reference is first sent to cb2Bib by selecting it, and later retrieved from cb2Bib to the editor using 'right click' + 'Paste Current BibTeX'. Interconversions Unicode <-> LaTeX, long <-> abbreviated journal name, and adding/renaming PDF files are easily available. BibTeX Editor is also accessible through a shell command line. See \ref commandline and \ref c2beditor. \subsection c2bbuttons Buttons Functionality - \b About \n About cb2Bib, bookmarks, and online help - \b Configure \n Configure cb2Bib. See \ref c2bconf section. - Search references \n Opens the cb2Bib's search dialog. The search is performed either on the current BibTeX file, or for all BibTeX files on the current directory. Optionally, the search is extended to reference's files. Hits are displayed on an editor window. See \ref c2bsearch. See also \ref c2bconf_utilities section to configure the external to text converter. - \b PDFImport \n Launches cb2Bib's PDFImport window. Files dragged into PDFImport window are sequentially translated to text and sent to cb2Bib clipboard panel. The cb2Bib automatic and manual capabilities are then easily available to extract and supervise reference extractions. See \ref c2bpdfimport. - \b Exit \n Exits the cb2Bib - Dis/Connect Clipboard \n Toggles automatic cb2Bib and desktop clipboard connection. While the automatic cb2Bib-clipboard connection permits reducing keystrokes, the disconnected mode is needed in cases where multiple mouse selections or copies are required to complete a reference extraction. See also \ref relnotes041 and \ref relnotes021 if you experience problems with this feature. - Network Reference Query \n Starts Network Query. It usually takes input Journal, Volume, and first page from the corresponding edit lines and attempts to complete the reference. See \ref c2bconf_network network section to customize querying. See the distribution file netqinf.txt and also \ref relnotes035 for the details. - View BibTeX Reference \n View current reference as will be output to the BibTeX file. Eventual manual changes should be done on the item line edit. - Save Reference \n Inserts the current bibliographic reference to the output BibTeX file. This action decides whether or not a reference is accepted. Scheduled actions such as PDF downloading, copying or renaming will be performed at this time. - Open BibTeX File \n Opens the current BibTeX output file. Right click within the BibTeX Editor window for its particular functionality. See also \ref c2beditor. \subsection keyboard Additional, Keyboard Functionality Most keyboard shortcuts are customizable. See \ref c2bconf_shortcuts. In the following, default shortcuts are used to describe functionality. - Alt A \n Starts cb2Bib Annote. Specify the note's filename in the dialog. A new note is created if the file name does not exist. The cb2Bib Annote is opened as a separate program. Exiting cb2Bib will not exit the note's viewer. On the viewer, pressing key E launches the default text editor. The viewer will track the editor, and will update the note's display each time the editor saves it. The viewer's functionality is disabled if the cb2Bib was not compiled and linked against WebKit. See \ref commandline to use Annote in command line mode. - Alt B \n Edits the Bookmarks and Network Query Info file netqinf.txt. - Alt C \n Preparses cb2Bib's clipboard through a user specified external script or tool. Preparsing is necessary to catch formatted references that can not be easily extracted using recognition patterns, or that are written in ambiguous formats. Many available scripts or specific user-written tools can be incorporated to cb2Bib through this external preparsing capability. In addition, simple, one-line scripts can be used within PDFImport to provide, for instance, the journal name when missing from the PDF first page. The cb2Bib distribution contains the sample scripts isi2bib and ris2bib that convert ISI and RIS formatted strings to BibTeX. See \ref c2bconf_clipboard for details. - Alt D \n Deletes temporary BibTeX output file. This permits using cb2Bib output files as temporary media to transfer references to a preferred reference manager and preferred format. Caution: This feature is not intended for the users who actually store their references in one or several BibTeX files. Remember to import references prior to delete cb2Bib output file. - Alt E \n Edits the regular expression file. It permits an easy access and modification of stored extraction patterns. New patterns are conveniently added to to the regular expression file by using the RegExp Editor button functionality. - Alt F \n Launches a file dialog for selecting the source file name for the BibTeX entry file. Selected files are displayed either, as the actual source filename, or, as the target filename, depending on the file copy/rename/move settings. See \ref c2bconf_documents. Alternatively to Alt F, documents can be easily linked to a reference by dragging the document file and dropping it to the cb2Bib panel. - Alt I \n Edits and optionally inserts the current regular expression pattern. See the \ref bibproc and \ref regexpedit sections. - Alt J \n Edits the Journal Abbreviations file. - Alt O \n Opens the currently linked document for browsing. Documents can be easily linked to a reference by dragging the document file and dropping it to the cb2Bib panel, or with Alt F. Linked documents correspond to the BibTeX tag file. - Alt P \n Postprocess BibTeX output file. It launches a user specified script or program to postprocess the current BibTeX file. The cb2Bib distribution contains two sample scripts. One, bib2pdf is a shell script for running latex and bibtex; this permits to check the BibTeX file for possible errors, and to easily produce a suitable output for printing. The other one, bib2end.bat is a batch script for running bib2xml and xml2end, which converts references into Endnote format. See \ref c2bconf_bibtex for details. - Alt R \n Restarts the cb2Bib automatic engine. Takes input data not from the system clipboard but from the cb2Bib clipboard panel. This permits editting the input stream from poorly translated PDF captions, correcting for author superscripts, or helps in debugging regular expressions. - Alt W \n Writes current reference to the source document file. This option is intended for writing and updating bibliographic metadata to document files without needing to use BibTeX files. Only local and writable files are considered. - Alt X \n Check Repeated looks for existing references in the BibTeX directory similar to the current one. The search is done for exact cite ID, and for title and author field values, or, if empty, for booktitle and editor,using the \htmlonly approximate string \endhtmlonly search pattern. See also \ref c2bconf_bibtex. - F4 \n Toggles between Main and Other Fields reference edit tabs. - Esc \n Quits cb2Bib popup menu. The cb2Bib menu pops up each time a selection in made in the clipboard panel. This saves keystrokes in a normal bibliographic extraction. Press Esc or Right Click mouse button if you need to gain access to the editor cut/copy/paste functionality instead.

     

    \section detail Advanced features Advanced features, and processing and extraction details are described in the following sections: - \ref faq_automatic_extraction - \ref bibproc - \ref authorproc - \ref journalproc - \ref heuristicguess - \ref regexpedit Configuration information is described in the following sections: - \ref c2bconf - \ref idplaceholders Utilities and modules are described in the following sections: - \ref c2bsearch - \ref c2beditor - \ref c2bpdfimport - \ref commandline - \ref metadata - \htmlonly The cb2Bib Annote \endhtmlonly - \ref c2bciter

     

    \section requirements Requirements \subsection requirements_comp Compilation To compile cb2Bib, the following libraries must be present and accessible: - Qt 4.4.0 or higher from \htmlonly Qt Project. \endhtmlonly On a Linux platform with Qt preinstalled, make sure that the devel packages and Qt tools are also present. - WebKit library (optional) to compile cb2Bib Annote viewer. It is already included in Qt > 4.4.0 library. No special action/flag is needed during compilation. - LZO 2.03 library and headers available at \htmlonly http://www.oberhumer.com/opensource/lzo. \endhtmlonly If LZO2 were unavailable on a particular platform, type configure --disable-lzo or, equivalently, qmake -config disable-lzo before compiling. - X11 header files if compiling on Unix platforms. Concretely, headers X11/Xlib.h and X11/Xatom.h are needed. - The header files fcntl.h and unistd.h from glibc-devel package are also required. Otherwise compilation will fail with referencelist.cpp:227: `::close' undeclared. \subsection requirements_run Deployment Although not needed for running cb2Bib, the following tools extend cb2Bib applicability: - jsMath, available at \htmlonly http://www.math.union.edu/~dpvc/jsMath, \endhtmlonly for displaying mathematical notation. Simply, download and unzip it in a desired directory. - ExifTool, version 7.31 or later, available at \htmlonly http://www.sno.phy.queensu.ca/~phil/exiftool. \endhtmlonly - pdftotext, found packaged as xpdf, and downloadable from \htmlonly http://www.foolabs.com/xpdf. \endhtmlonly - The bib2xml and xml2end \htmlonly BibUtils, \endhtmlonly to test the postprocess script bib2end.bat on Windows platforms. - ... and LaTeX and friends, to check for BibTeX file correctness and to get a nice printing through the shell script bib2pdf.

     

    \section credits Credits and License The cb2Bib icons are taken from the Oxygen, Crystal SVG, and Noia icon sets, to be found at the \htmlonly KDE Desktop Environment. \endhtmlonly Several people has contributed with suggestions, bug reports or patches. For a detailed list of acknowledgments see the \ref changelog. The cb2Bib program is licensed under the terms of the \htmlonly GNU General Public License \endhtmlonly version 3.

     

    The cb2Bib, Pere Constans, Copyright © 2004-2012.\n First released, version 0.1.0 on 2004-06-29. \n GET_UPDATEDON */ /** \page relnotes Release Notes \section relnotes147 Release Note cb2Bib 1.4.7 Approximate and context searches effectively locate our references of interest. As collections grow in size, and low performance devices, netbooks and tablets, start being used, complete document searches become demanding. Besides, it is often not clear what to query for, and then a glossary of terms provides guidance. Often too, interest lies on subsetting documents by being similar to a given one. Version 1.4.7 adds a pragmatic term or keyword extraction from the document contents. Accepted keywords are set as the substrings appearing at least twice in one document, appearing at least in three documents, and conforming to predefined part-of-speech (POS) sequences. Keyword extraction is performed by either clicking on Index Documents at the c2bciter desktop tray menu, or, by typing cb2bib --index [bibdirname] on a shell. During extraction, the Part Of Speech (POS) Lexicon distribution file must be available and readable. On termination, indexing files are saved on the Search In Files Cache Directory. Simply copying this directory will synchronize keyword indexing to a second computer. After refreshing c2bciter module, pressing key G displays the glossary of terms. On a reference, pressing K displays its list of keywords. Pressing R on a keyword lists the references related to that keyword. Pressing R on a reference lists similarly related references. Similarity is assessed based on keyword occurrences. Left and Right keys provide previous and next navigation. Pressing V on either a reference keyword, or a keyword reference, visualizes the keyword excerpts from the reference's document. To close excerpt dialog press Esc or Left keys. See also \ref c2bciter, \ref c2bconf_files, and \ref commandline.

     

    */ /** \page relnotes Release Notes \section relnotes140 Release Note cb2Bib 1.4.0 The c2bciter module was introduced in version 1.3.0. Its name, as it was described, states its purpose of being "aimed to ease inserting citation IDs into documents". In fact, it does have such functionality. And, it has also another, equally important one: it provides a very fast way to retrieve a given work from our personal collections. Retrieving is accomplished through pre-sorted views of the references and filtering. Both, views and filtering, scale on the (tens of) thousands references. Usually, we recall a work from its publication year, a few words from its title, or (some of the letters of) one of its authors names. Often, what we remember is when a reference was included into our collection. Therefore, having such a chronological view was desirable. The implementation of this sorted-by-inclusion-date view was not done during the 1.3.x series, but postponed to version 1.4.0; somehow, to indicate that some sort of 'proprietary' BibTeX tag might be required to specify inclusion timestamps. I have been reluctant through the cb2Bib's life span to introduce 'cb2Bib-only' tags in the BibTeX outputs. I believe that there is little gain, and it costs, possibly, breaking interoperability. In the end, the choice was to not write any 'timestamp' tag in references. Instead, c2bciter checks for the last modified date of the linked documents to build an approximated chronological view. The advantage is that all, not just 'version 1.4.0 or later', references are sorted. Furthermore, if a reference is later corrected, and the document metadata is updated too, the modification date is reflected in the view. The obvious inconvenience is that no such sorting can be done for references without an attached document. See also \ref c2bciter.

     

    */ /** \page relnotes Release Notes \section relnotes130 Release Note cb2Bib 1.3.0 When version 0.2.7 came up, it was mentioned in \ref relnotes027, that the cb2Bib 'doesn't have the means to automatically discern an author name from a department or street name'. I forgot mentioning, that I did not expect the cb2Bib would have had such a feature. Since the last \ref relnotes110, the cb2Bib internals had changed significantly. Some changes, such heuristic recognition for interlaced authors and affiliations, get easily noticed. Other changes, however, do not, and need additional explanation. From version 1.2.3, the switches --txt2bib and --doc2bib set the cb2Bib to work on console mode. The non-exact nature of the involved extractions makes logging necessary. On Windows, graphic or console modes must be decided not at run time, but when the application is built. So far, logging and globing were missing. This release adds the convenience wrapper c2bconsole. Typing c2bconsole --txt2bib i*.txt out.bib, for instance, will work as it does in the other platforms. Lists of references are now sorted case and diacritic insensitive. For some languages such a choice is not the expected one, and some operating systems offer local-aware collation. Due to usual inconsistencies and inaccuracies in references, this decision was taken to group together 'Density Matrix' with 'Density-matrix', and \htmlonly Møller \endhtmlonly with Moller, which, in a personal collection, most probably, refer to the same concept and to the same person. Additionally, document to text converted strings are now clean from extraneous, non-textual symbols. Therefore, recreating cache files is recommended. Finally, this release introduces a new module, named c2bciter, and aimed to ease inserting citation IDs into documents. The module should ideally stay idle at the system tray, and be recalled as needed by pressing a global, desktop shortcut. This functionality, while desirable, and usual in dictionaries, is platform and desktop dependent. On KDE there are currently known issues when switching among virtual desktops. See also \ref c2bciter, and \ref commandline.

     

    */ /** \page relnotes Release Notes \section relnotes110 Release Note cb2Bib 1.1.0 A frequent request from cb2Bib users has been to expand the command line functionality. So far few progress has been seen in this regard. First, the addition of in-document searches and reading/inserting metadata were priorities. Second, the cb2Bib is not the tool to interconvert among bibliographic formats. And third, the cb2Bib is designed to involve the user in the search process, in the archiving and validation of the discovered works and references. For the latter reason, and for not knowing a priori how would such a tool be designed, the cb2Bib internals had been interlaced to its graphical interface. At the time of version 0.7.0, when the graphical libraries changed, and a major refactoring was required, the code started moving toward a better modularization and structure. The current release pushes code organization further. As a result, it adds two new command line switches: --html-annote and --view-annote. The new cb2Bib module is named after the BibTeX key 'annote'. Annote is not for a 'one reference annotation' though. Instead, Annote is for short notes that interrelate several references. Annote takes a plain text note, with minimal or no markup, inserts the bibliographic citations, and converts it to a HTML page with links to the referenced documents. From within the cb2Bib, to write your notes, type Alt+A, enter a filename, either new or existing, and once in Annote, type E to launch your default text editor. For help, type F1. Each time you save the document the viewer will be updated. To display mathematical notations, install \htmlonly jsMath \endhtmlonly locally. And, remember, code refactoring introduces bugs. See also an annote's \htmlonly screenshot, The cb2Bib Annote, \endhtmlonly and \ref commandline.

     

    */ /** \page relnotes Release Notes \section relnotes100 Release Note cb2Bib 1.0.0 Approximately four years ago the first cb2Bib was released. It included the possibility of easily linking a document to its bibliographic reference, in a handy way, by dragging the file to the main (at that time, single) panel. Now, in version 1.0.0, when a file is dropped, the cb2Bib scans the document for metadata packets, and checks, in a rather experimental way, whether or not they contain relevant bibliographic information. Publishers metadata might or might not be accurate. Some, for instance, assign the DOI to the key Title. The cb2Bib extracts possibly relevant key-value pairs and adds them to clipboard panel. Whenever key-value pairs are found accurate, just pressing Alt+G imports them to the line edits. If keys with the prefix bibtex are found, then, most probable the data was written by JabRef or the cb2Bib itself, and then, the values are automatically imported. The preparsed metadata that is added to the clipboard panel begins with [Bibliographic Metadata and ends with /Bibliographic Metadata]. Therefore, if you are using PDFImport together with a set of regular expressions, such that they contain the begin (^) or end ($) anchors, you can safely replace them by the above tags. In this manner, existing regular expressions remain useful with this minor change. And, with the advantage that, if recognition fails for a given document, metadata might give the hardest fields to extract from a PDF article, which are author and title. See also \ref metadata.

     

    */ /** \page relnotes Release Notes \section relnotes084 Release Note cb2Bib 0.8.4 The previous cb2Bib release added the command line option --conf [full_path]cb2bib.conf to specify the settings location. This feature was intended, mainly, as a clean way to run the program on a host computer from a removable drive. The work done focused on arranging the command line and settings related code. It was left for a later release to solve some requirements regarding the managing of file pathnames and temporary files. This release addresses these two points. Now, when the cb2Bib is launched as cb2bib --conf --without a configuration filename-- it treats filenames as being relative to the cb2Bib actual location. Temporary files, if needed, will be placed at this location as well. Therefore, no data is being written on the host, and the cb2Bib works independently of the actual address that the host assigns to the removable drive. The Windows' un/installer cleans/sets configuration data on the registry. Being aware of this particular, it might be better not to install the program directly to the USB drive. Just copy the cb2Bib base directory from a home/own computer to the removable drive, and then run it on the host computer as cb2bib --conf.

     

    */ /** \page relnotes Release Notes \section relnotes083 Release Note cb2Bib 0.8.3 The cb2Bib accepts several arguments on its command line to access specific functionality. So far, the command cb2bib tmp_ref permits importing references from the browser, whenever a download to reference manager choice is available. In addition, the command cb2bib --bibedit ref.bib directly launches the BibTeX editor for file browsing and editing. This release adds the command line option --conf [full_path]cb2bib.conf to specifically set a file where all internal settings are being retrieved and stored. This has two interesting applications. On one hand, it easily permits switching from several sets of extraction rules, since the files abbreviations.txt, regexps.txt, and netqinf.txt are all stored in the cb2Bib's settings. And, on the other hand, it allows installing the program on a USB flash drive, and cleanly running it on any (e. g., library) computer. Settings can be stored and kept on the external device, and therefore, no data will be written on the registry or settings directory of the host computer. So far, however, this feature should be regarded as experimental. The Qt library to which the cb2Bib is linked does read/write access to system settings in a few places (concretely, in file and color dialogs). On Unix and Mac OS systems this access can be modified by setting the environment variable DAG_CONFIG_HOME. No such workaround is presently available in Windows. See \ref commandline for a detailed syntax description.

     

    */ /** \page relnotes Release Notes \section relnotes081 Release Note cb2Bib 0.8.1 Several changes in this release affect installation and deployment. First, the cb2Bib internals for settings management has been reorganized. Version 0.8.1 will not read previous settings, as user colors, file locations, etc. On Unix, settings are stored at ~/.config/MOLspaces/cb2Bib.conf. This file can be removed, or renamed. On Windows, it is recommended to uninstall previous versions before upgrading. Second, cb2Bib tags are not shown by default. Instead, it is shown plain, raw clipboard data, as it is easier to identify with the original source. To write a regular expression, right click, on the menu, check 'View Tagged Clipboard Data', and perform the extraction from this view. And finally, the cb2Bib adds the tag <> for network queries. It takes a simplified version of the clipboard contents and sends it to, e.g. Google Scholar. From there, one can easily import BibTeX references related to that contents. Therefore one should unchecked in most cases the 'Perform Network Queries after automatic reference extractions' box.

     

    */ /** \page relnotes Release Notes \section relnotes072 Release Note cb2Bib 0.7.2 The cb2Bib reads the clipboard contents, processes it, and places it to the main cb2Bib's panel. If clipboard contents can be recognized as a reference, it writes the corresponding BibTeX entry. If not, the user can interact from the cb2Bib panel and complete or correct the reference. Additionally, this process permits to write down a regular expression matching the reference's pattern. To ease pattern writing, cb2Bib preprocesses the raw input data. This can consider format conversion by external tools and general substitutions, in addition to including some special tags. The resulting preprocessed data is usually less readable. A particularly illustrating case is when input data comes from a PDF article. The cb2Bib now optionally presents input data, as raw, unprocessed data. This preserves the block text format of the source, and thus identifying the relevant bibliographic fields by visual inspection is more straightforward. In this raw mode view panel, interaction works in a similar manner. Except that, no conversions or substitutions are seen there, and that no regular expression tags are written.

     

    */ /** \page relnotes Release Notes \section relnotes070 Release Note cb2Bib 0.7.0 This release moves forward cb2Bib base requirement to Qt 4.2.0. Compilation errors related to rehighlight() library calls, kindly reported by Bongard, Seemann, and Luisser, should not appear anymore. File/URL opening is carried now by this library, in a desktop integrated manner. Additionally, Gnome users will enjoy better integration, as Cleanlooks widget style is available. All known regressions in 0.6.9x series have been fixed. Also, a few minor improvements have been included. In particular, file selection dialogs display navigation history, and BibTeX output file can be conveniently selected from the list of '*.bib' files at the current directory. Such a feature will be specially useful to users that sort references in thematic files located at a given directory.

     

    */ /** \page relnotes Release Notes \section relnotes0691 Release Note cb2Bib 0.6.91 This release fixes a regression in the cb2Bib network capabilities. Network, and hence querying was erratic, both for the internal HTTP routines and for external clients. In addition to this fix, the netqinf.txt has been updated. PubMed is working again. Queries are also extended to include DOI's. A possible applicability will be for indexing a set of PDF articles with PDFImport. If the article contains its DOI number, and 'Perform Network Queries after automatic reference extractions' is checked, chances are that automatic extractions will work smooth.

     

    */ /** \page relnotes Release Notes \section relnotes0690 Release Note cb2Bib 0.6.90 The cb2Bib has been ported from Qt3 to Qt4, a migration in its underlying system library. Qt experienced many changes and improvements in this major release upgrade. Relevant to cb2Bib, these changes will provide a better file management, word completion, faster searches, and better desktop integration. Upgrading to Qt4 it is not a "plug and recompile" game. Thorough refactoring and rewriting was required. The resulting cb2Bib code is cleaner and more suitable to further development. As one might expect, major upgrades introduce new bugs that must be fixed. The cb2Bib 0.6.90 is actually a preview version. It has approximately the same functionality than its predecessor. So, no additions were considered at this point. Its use, bug reporting, and feedback are encouraged. This will help to get sooner a stable cb2Bib 0.7. To compile it, type ./configure as usual. The configure script calls the qmake tool to generate an appropriate Makefile. To make sure the right, Qt4 qmake is invocated, you can setup QTDIR environment variable prior to ./configure. The configure's call statement will then be '$QTDIR/bin/qmake'. E. g., type 'setenv QTDIR /usr' if qmake happens to be at the directory/usr/bin.

     

    */ /** \page relnotes Release Notes \section relnotes060 Release Note cb2Bib 0.6.0 The cb2Bib uses the internal tags <> and <> to ease the creation of regular expressions for reference extraction. New line and tabular codes from the input stream are substituted by these numbered tags. Numbering new lines and tabulars gives an extra safety when writing down a regular expression. E. g., suppose field title is 'anything' between '<> and <>'. We can then easily write 'anything' as '.+' without the risk of overextending the caption to several '\\n' codes. On the other hand, one still can use <> if not interested in a specific numbering. All these internal tags are later removed, once cb2Bib postprocesses the entry fields. The cb2Bib identified so far new lines by checking for '\\n' codes. I was unaware that this was a platform dependent, as well as a not completely accurate way of detecting new lines. McKay Euan reported that <> tags were not appearing as expected in the MacOSX version. I later learn that MacOSX uses '\\r' codes, and that Windows uses '\\r\\n', instead of '\\n' for new line encoding. This release addresses this issue. It is supposed now that the cb2Bib regular expressions will be more transferable among the different platforms. Extraction from plain text sources is expected to be completely platform independent. Extraction from web pages will still remain browser dependent. In fact, each browser adds its peculiar interpretation of a given HTML source. For example, in Wiley webpages we see the sectioning header 'Abstract' in its source and in several browsers, but we see, and get, 'ABSTRACT' if using Konqueror. What we pay for this more uniform approach is, however, a break in compatibility with previous versions of cb2Bib. Unix/Linux users should not expect many differences, though. Only one from the nine regular expressions in the examples needed to be modified, and the two contributed regular expressions work perfectly without any change. Windows users will not see a duplication of <> tags. To update previous expressions it should be enough just shifting the <> numbering. And, of course, any working regular expression that does not uses <> tags will still be working in this new version. Finally, just to mention that I do not have a MacOSX to test any of the cb2Bib releases in this particular platform. I am therefore assuming that these changes will fix the problem at hand. If otherwise, please, let me know. Also, let me know if release 0.6.0 'break' your own expressions. I consider this release a sort of experimental or beta version, and the previous version 0.5.3, will still be available during this testing period.

     

    */ /** \page relnotes Release Notes \section relnotes050 Release Note cb2Bib 0.5.0 Two issues had appeared regarding cb2Bib installation and deployment on MacOSX platforms. First, if you encounter a 'nothing to install'-error during installation on MacOSX 10.4.x using the cb2Bib binary installer available at \htmlonly http://naranja.umh.es/~atg/, \endhtmlonly please delete the cb2bib-receipts from /Library/Receipts and then rerun the installer. See also M. Bongard's clarifying note 'MACOSX 10.4.X "NOTHING TO INSTALL"-ERROR' for details. Second, and also extensible to other cb2Bib platform versions, if PDFImport issues the error message 'Failed to call some_format_to_text' tool, make sure such a tool is installed and available. Go to Configure->PDFImport, click at the 'Select External Convert Tool' button, and navigate to set its full path. Since version 0.5.0 the default full path for the MacOSX is already set, and pointing to /usr/local/bin/pdftotext.

     

    */ /** \page relnotes Release Notes \section relnotes041 Release Note cb2Bib 0.4.1 Qt/KDE applications emit notifications whenever they change the clipboard contents. The cb2Bib uses these notifications to automatically start its 'clipboard to BibTeX' processing. Other applications, however, does not notify about them. Since version 0.2.1, see \ref relnotes021, cb2Bib started checking the clipboard periodically. This checking was later disabled as a default, needing a few lines of code to be uncomented to activate it. Without such a checking, the cb2Bib appears unresponsive when selecting/copying from e.g., acroread or Mozilla. This release includes the class clipboardpoll written by L. Lunak for the KDE's Klipper. Checking is performed in a very optimized way. This checking is enabled by default. If you experience problems with this feature, or if the required X11 headers aren't available, consider disabling it by typing ./configure --disable-cbpoll prior to compilation. This will disable checking completely. If the naive, old checking is preferred, uncomment the four usual lines, ./configure --disable-cbpoll, and compile.

     

    */ /** \page relnotes Release Notes \section relnotes035 Release Note cb2Bib 0.3.5 Releases 0.3.3 and 0.3.4 brought querying functionality to cb2Bib. In essence, cb2Bib was rearranged to accommodate copying and opening of network files. Queries were then implemented as user customizable HTML posts to journal databases. In addition, these arrangements permitted defining convenience, dynamic bookmarks that were placed at the cb2Bib's 'About' panel. cb2Bib contains three viewing panels: 'About', 'Clipboard' and 'View BibTeX', being the 'Clipboard' panel the main working area. To keep cb2Bib simple, only two buttons, 'About' and 'View BibTeX', are set to navigate through the panels. The 'About' and 'View BibTeX' buttons are toggle buttons for momentarily displaying their corresponding panels. Guidance was so far provided by enabling/disabling the buttons. After the bookmark introduction, the 'About' panel has greatly increased its usefullness. Button functionality has been slightly redesigned now to avoid as many keystrokes and mouse clicks as possible. The buttons remain switchable, but they no longer disable the other buttons. User is guided by icon changes instead. Hopefully these changes will not be confusing or counterintuitive. Bookmarks and querying functionality are customizable through the netqinf.txt file, which is editable by pressing the Alt+B keys. Supported queries are of the form 'Journal-Volume-First Page'. cb2Bib parses netqinf.txt each time a query is performed. It looks for journal=Full_Name|[code] to obtain the required information for a specific journal. Empty, 'journal=' entries have a meaning of 'any journal'. New in this release, cb2Bib will test all possible queries for a given journal instead of giving up at the first No article found message. The query process stops at the first successfull hit or, otherwise, once netqinf.txt is parsed completely (in an equivalent way as the automatic pattern recognition works). This permits querying multiple -and incomplete- journal databases. Users should order the netqinf.txt file in a way it is more convenient. E.g., put PubMed in front of JACS if desired an automatic extraction. Or JACS in front of PubMed and extract from the journal web page, if author accented characters are wanted. So far, this querying functionality is still tagged as experimental. Either the querying itself or its syntax seem quite successful. However, downloading of PDF files, on windows OS + T1 network, was found to freeze once progress reaches the 30-50%. Any feedback on this issue will be greatly appreciated. Also, information on kfmclient equivalent tools for non KDE desktops would be worth to be included in the cb2Bib documentation.

     

    */ /** \page relnotes Release Notes \section relnotes030 Release Note cb2Bib 0.3.0 cb2Bib considers the whole set of authors as an author-string pattern. This string is later postprocessed, without requirements on the actual number of authors it may contain, or on how the names are written. Once considered author-string patterns, the extraction of bibliographic references by means of regular expressions becomes relatively simple. There are situations, however, where several author-strings are required. The following box shows one of these cases. Authors are grouped according to their affiliations. Selecting from 'F. N. First' to 'F. N. Fifth' would include 'First Affiliation' within the author string. Cleaning up whatever wording 'First Affiliation' may contain is a rather ill-posed problem. Instead, cb2Bib includes an Add Authors option. The way of operation is then to select 'F. N. First, F. N. Second, F. N. Third' and chose Authors and right after, select 'F. N. Fourth and F. N. Fifth' and chose Add Authors. \htmlonly \endhtmlonly At this point in the manual extraction, the user was faced with a red <> tag in the cb2Bib clipboard panel. The <> tag was intended to warn the user about the fact that cb2Bib would not be able to consider the resulting extraction pattern as a valid, general regular expression. Usual regular expressions are built up from an a priori known level of nesting. In these cases, however, the level of nesting is variable. It depends on the number of different affiliations occurring in a particular reference. So far the <> tag has become a true FAQ about cb2Bib and a source of many confusions. There is no real need, however, for such an user warning. The <> has therefore been removed and cb2Bib has taken an step further, to its 0.3.0 version. The cb2Bib 0.3.0 manual extraction works as usual. By clicking Authors the Authors edit line is reseted and selection contents moved there. Alternatively, if Add Authors is clicked, selection contents is added to the author field. On this version, however, both operations are tagged as <> (singular form, as it is the BibTeX keyword for Authors). The generated extraction pattern can now contain any number of <> fields. In automatic mode, cb2Bib now adds all author captions to Authors. In this way, cb2Bib can treat interlaced author-affiliation cases. Obviously, users needing such extractions will have to write particular regular expressions for cases with one set of authors, for two sets, and so on. Eventhough it is not rare a work having a hundred of authors, it would be quite umprobable that they were working on so many different institutions. Therefore, few regular expressions should actually be required in practice. Although not elegant, this breaks what was a cb2Bib limitation and broadens its use when extracting from PDF sources. Remember here to sort these regular expressions in decreasing order, since at present, cb2Bib stops at the first hit. Also, consider Any Pattern to get ride of the actual affiliation contents, as you might not want to extract authors addresses.

     

    */ /** \page relnotes Release Notes \section relnotes027 Release Note cb2Bib 0.2.7 The cb2Bib 0.2.7 release introduces multiple retrieving from PDF files. PDF documents are becoming more and more widely used, not only to transfer and printing articles, but also are substituting the personal paper files and classifiers for the electronic equivalents. cb2Bib is intended to help updating personal databases of papers. It is a tool focused on what is left behind in database retrieving. Cases such as email alerts, or inter colleague references and PDF sharing are example situations. Though in an electronic format, sources are not standardized or not globally used as to permit using habitual import filters in reference managers. cb2Bib is designed to consider a direct user intervention, either by creating its own useful filters or by a simple copy-paste assistance when handtyping. Hopefully someday cb2Bib will be able to take that old directory, with perhaps a few hundreds of papers, to automatically index the references and rename the files by author, in a consistent manner. The required mechanism is already there, in this version. But I guess that this new feature will manifest some present limitations in cb2Bib. For instance, most printed and PDF papers interlace author names and affiliations. cb2Bib doesn't have the means to automatically discern an author name from a department or street name. So far one needs to manually use the 'Add to Authors' feature to deal with these situations. Also, the managing of regular expressions needs developing, specially thinking in the spread variety of design patterns in publications. In summary, this current version is already useful in classifying and extracting the reference of that couple of papers that someone send right before submitting a work. A complete unsupervised extraction is still far away, however.

     

    */ /** \page relnotes Release Notes \section relnotes021 Release Note cb2Bib 0.2.1 The cb2Bib mechanism 'select-and-catch' failed in some cases. Acrobat and Mozilla selections were not always notified to the cb2Bib. Indeed, this 'window manager - application' connection seems to be broken on a KDE 3.3.0 + Qt 3.3.3 system. The cb2Bib 0.2.1 continues to listen to system clipboard change notifications, whenever they are received and whenever cb2Bib is on connected mode. Additionally, the cb2Bib 0.2.1 periodically checks for changes in the system clipboard. Checks are performed every second, approximately. This permits cb2Bib to work as usual, although one could experience 1-2 seconds delays in systems where the automatic notification is broken. If the 'select-and-catch' functionality appears 'sticky', possibly happening while using non KDE applications from where text is selected, check the source file c2bclipboard.cpp, look for 'Setting timer', and set variable interval to 1000. This is the interval of time in ms that cb2Bib will use to check for clipboard changes.

     

    */ cb2Bib::cb2Bib(QWidget* parentw) : QMainWindow(parentw) { _settingsP = c2bSettingsP; ui.setupUi(this); connect(ui.id, SIGNAL(textChanged(const QString&)), this, SLOT(setWindowTitle(const QString&))); // Creating cb2Bib global resources c2b* c2b_resources = new c2b(this, this); connect(c2b_resources, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); connect(c2b_resources, SIGNAL(searchInFiles(const QString&, const QString&)), this, SLOT(doSearchInFiles(const QString&, const QString&))); // Actions and shortcuts c2bUtils::addSeparator(this); addAction(ui.checkRepeatedAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.checkRepeatedAction); c2bUtils::addSeparator(this); addAction(ui.clearFieldsAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.clearFieldsAction); addAction(ui.guessFieldsAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.guessFieldsAction); addAction(ui.startEngineAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.startEngineAction); c2bUtils::addSeparator(this); addAction(ui.preparseClipboardAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.preparseClipboardAction); addAction(ui.postprocessBibTeXAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.postprocessBibTeXAction); c2bUtils::addSeparator(this); addAction(ui.editBookmarksAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.editBookmarksAction); addAction(ui.editAbbreviationsAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.editAbbreviationsAction); addAction(ui.editRegExpsAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.editRegExpsAction); c2bUtils::addSeparator(this); addAction(ui.openAnnoteAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.openAnnoteAction); #ifndef C2B_USE_WEBKIT ui.openAnnoteAction->setDisabled(true); #endif c2bUtils::addSeparator(this); addAction(ui.insertRegExpAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.insertRegExpAction); addAction(ui.viewTaggedClipEditAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.viewTaggedClipEditAction); setAcceptDrops(true); c2bUtils::addSeparator(ui.file); ui.file->addAction(ui.selectFileAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.selectFileAction); ui.file->addAction(ui.openFileDocumentAction); _settingsP->setKeysequence("Shortcuts/cb2Bib/", ui.openFileDocumentAction); ui.openFileDocumentAction->setEnabled(false); QShortcut* sc(new QShortcut(this)); _settingsP->setKeysequence("Shortcuts/cb2Bib/Delete Temporary BibTeX File", sc); connect(sc, SIGNAL(activated()), this, SLOT(deleteTmpBib())); sc = new QShortcut(this); _settingsP->setKeysequence("Shortcuts/cb2Bib/Write Metadata to Document", sc); connect(sc, SIGNAL(activated()), this, SLOT(addMetadata())); sc = new QShortcut(this); _settingsP->setKeysequence("Shortcuts/cb2Bib/Toggle Reference Tabs", sc); connect(sc, SIGNAL(activated()), this, SLOT(toggleReferenceTabs())); sc = new QShortcut(QKeySequence(Qt::Key_F2), this); // Made consistent with c2bCiter and c2bEditor connect(sc, SIGNAL(activated()), this, SLOT(hide())); ClipEdit = new c2bClipEdit(c2bClipEdit::Editor, this); ClipEdit->setObjectName("ClipEdit"); ClipEdit->addActions(actions()); ui.stackedWidget->addWidget(ClipEdit); AboutBrowser = new c2bTextBrowser(this); AboutBrowser->setObjectName("AboutBrowser"); AboutBrowser->addActions(actions()); ui.stackedWidget->addWidget(AboutBrowser); BibBrowser = new c2bClipEdit(c2bClipEdit::Browser, this); BibBrowser->setObjectName("BibBrowser"); BibBrowser->addActions(actions()); ui.stackedWidget->addWidget(BibBrowser); connect(AboutBrowser, SIGNAL(anchorClicked(const QUrl&)), this, SLOT(linkClicked(const QUrl&))); connect(AboutBrowser, SIGNAL(highlighted(const QString&)), this, SLOT(showLink(const QString&))); // Connect Actions connect(ui.checkRepeatedAction, SIGNAL(triggered()), this, SLOT(checkRepeated())); connect(ui.clearFieldsAction, SIGNAL(triggered()), this, SLOT(c2bInit())); connect(ui.editAbbreviationsAction, SIGNAL(triggered()), this, SLOT(abbreviationsEditor())); connect(ui.editBookmarksAction, SIGNAL(triggered()), this, SLOT(bookmarksEditor())); connect(ui.editRegExpsAction, SIGNAL(triggered()), this, SLOT(regExpsEditor())); connect(ui.guessFieldsAction, SIGNAL(triggered()), this, SLOT(guessFields())); connect(ui.insertRegExpAction, SIGNAL(triggered()), this, SLOT(insertRegExp())); connect(ui.openAnnoteAction, SIGNAL(triggered()), this, SLOT(openAnnote())); connect(ui.openFileDocumentAction, SIGNAL(triggered()), this, SLOT(openFileDocument())); connect(ui.postprocessBibTeXAction, SIGNAL(triggered()), this, SLOT(postprocessBibTeX())); connect(ui.preparseClipboardAction, SIGNAL(triggered()), this, SLOT(preparseClipboard())); connect(ui.selectFileAction, SIGNAL(triggered()), this, SLOT(selectFile())); connect(ui.startEngineAction, SIGNAL(triggered()), this, SLOT(restartEngine())); connect(ui.viewTaggedClipEditAction, SIGNAL(triggered(bool)), this, SLOT(setTaggedClipEditMode(bool))); setBibMenu(); _pdfImportP = 0; _searchInFilesP = 0; setTaggedClipEditMode(false); // Set checkRepeated ui.checkRepeatedAction->setVisible(false); _is_check_repeated_done = false; connect(ui.author, SIGNAL(textChanged(const QString&)), this, SLOT(updateCheckRepeatedAction())); connect(ui.booktitle, SIGNAL(textChanged(const QString&)), this, SLOT(updateCheckRepeatedAction())); connect(ui.editor, SIGNAL(textChanged(const QString&)), this, SLOT(updateCheckRepeatedAction())); connect(ui.id, SIGNAL(textChanged(const QString&)), this, SLOT(updateCheckRepeatedAction())); connect(ui.title, SIGNAL(textChanged(const QString&)), this, SLOT(updateCheckRepeatedAction())); // cb2Bib Settings loadSettings(); connect(_settingsP, SIGNAL(newSettings()), this, SLOT(loadSettings())); resize(_settingsP->value("cb2Bib/size", size()).toSize()); ui.bibtexfile->completer()->setCompletionMode(QCompleter::PopupCompletion); updateBibfile(_settingsP->fileName("cb2Bib/BibTeXFile")); // Setting Bibliographic Parser _bpP = c2b::bibParser(); setWidgetMapping(); _modified = false; ui.AddBibB->setEnabled(_modified); // Setting cb2bib network queries _netQP = new c2bNetworkQuery(_bpP, c2b::net(), this); connect(_netQP, SIGNAL(statusMessage(const QString&)), c2b_resources, SIGNAL(statusMessage(const QString&))); connect(_netQP, SIGNAL(queryEnded(bool, const QString&, const QString&)), this, SLOT(netQueryEnded(bool, const QString&, const QString&))); // Set citer if (_settingsP->cl_citer) { _citerP = new c2bCiterWidget; _citerP->setTrayIcon(); _citerP->load(); connect(_citerP, SIGNAL(openFile(const QString&)), this, SLOT(bibEditor(const QString&))); } else _citerP = 0; // Connecting cb2Bib clipboard and start c2bClipboard* cbP = c2b::clipboard(); connect(cbP, SIGNAL(cbDataChanged(const QString&)), this, SLOT(dataChanged(const QString&))); _connected = false; on_ConnectB_clicked(); // Set button and update _connected dataChanged(cbP->text()); if (_settingsP->cl_bibedit) initAsBibTeXEditor(); } cb2Bib::~cb2Bib() { delete _citerP; delete _searchInFilesP; } /**************************************************************************** GUI FUNCTIONALITY *****************************************************************************/ void cb2Bib::show() { if (_settingsP->cl_citer && _citerP) _citerP->toggleVisible(); else if (!_settingsP->cl_bibedit) QMainWindow::show(); } void cb2Bib::on_ViewAboutB_clicked() { if (ui.stackedWidget->currentWidget() == AboutBrowser) { ui.stackedWidget->setCurrentWidget(ClipEdit); ClipEdit->setFocus(); } else { const QColor linkColor(palette().buttonText().color()); const QString sheet(QString::fromLatin1("a { text-decoration: underline; color: %1 }").arg(linkColor.name())); AboutBrowser->document()->setDefaultStyleSheet(sheet); const QString AboutS( tr( "

    cb2Bib %1

    " "

    " "A tool for rapidly extracting unformatted bibliographic references from email " "alerts, journal web pages, and PDF files.
    " "

    " "

    " "" "cb2Bib Help and User's Guide


    " "

    Additional Functionality:

    " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
    KeysDescription
    " + _settingsP->ksname("Shortcuts/cb2Bib/Check Repeated") + "Check repeated
    " + _settingsP->ksname("Shortcuts/cb2Bib/Delete Temporary BibTeX File") + "Delete temporary BibTeX file
    " + _settingsP->ksname("Shortcuts/cb2Bib/Edit Bookmarks") + "Edit bookmarks
    " + _settingsP->ksname("Shortcuts/cb2Bib/Edit Journal Abbreviations") + "Edit journal abbreviations
    " + _settingsP->ksname("Shortcuts/cb2Bib/Edit Regular Expressions") + "Edit regular expressions
    " + _settingsP->ksname("Shortcuts/cb2Bib/Insert Regular Expression") + "Insert regular expression
    " + _settingsP->ksname("Shortcuts/cb2Bib/Open Document") + "Open document
    " + _settingsP->ksname("Shortcuts/cb2Bib/Postprocess BibTeX") + "Postprocess BibTeX
    " + _settingsP->ksname("Shortcuts/cb2Bib/Preparse Clipboard") + "Preparse clipboard
    " + _settingsP->ksname("Shortcuts/cb2Bib/Restart Recognition") + "Restart recognition
    " + _settingsP->ksname("Shortcuts/cb2Bib/Select Document File") + "Select document file
    " + _settingsP->ksname("Shortcuts/cb2Bib/Start Annote") + "Open cb2Bib Annote
    " + _settingsP->ksname("Shortcuts/cb2Bib/Toggle Reference Tabs") + "Toggle reference tabs
    " + _settingsP->ksname("Shortcuts/cb2Bib/Write Metadata to Document") + "Write metadata to document
    EscQuit cb2Bib popup menu
    Right ClickShow cb2Bib main panel popup menu" "
    " "
    %2
    " "

    Copyright (C) 2004-2012 by Pere Constans
    " "" "http://www.molspaces.com/cb2bib

     " "

    The cb2Bib is licensed under the terms of the " "" "GNU General Public License version 3" "

     ") .arg(C2B_VERSION).arg(c2b::netqinf()->bookmarksToHtml())); const int scrollPosition(AboutBrowser->verticalScrollBar()->value()); AboutBrowser->setHtml(AboutS); AboutBrowser->verticalScrollBar()->setValue(scrollPosition); ui.stackedWidget->setCurrentWidget(AboutBrowser); AboutBrowser->setFocus(); } updateViewButtons(); } void cb2Bib::on_ConfigureB_clicked() { c2b::configure(); } void cb2Bib::on_SearchInFilesB_clicked() { doSearchInFiles(); } void cb2Bib::on_PdfImportB_clicked() { if (!_pdfImportP) { _pdfImportP = new c2bPdfImport; _pdfImportP->setAttribute(Qt::WA_DeleteOnClose); connect(this, SIGNAL(addedBibToFile(const QString&)), _pdfImportP, SLOT(processNext())); connect(this, SIGNAL(endedProcessing(bool)), _pdfImportP, SLOT(referenceExtacted(bool))); connect(_pdfImportP, SIGNAL(textProcessed(const QString&)), this, SLOT(forceDataChange(const QString&))); connect(_pdfImportP, SIGNAL(fileProcessed(const QString&)), this, SLOT(fileDropped(const QString&))); connect(_pdfImportP, SIGNAL(saveReferenceRequest()), this, SLOT(on_AddBibB_clicked())); connect(_pdfImportP, SIGNAL(setClipboardDisabled(bool)), ui.ConnectB, SLOT(setDisabled(bool))); showMessage(tr("PDF Import launched.")); } _pdfImportP->show(); } void cb2Bib::on_ExitB_clicked() { c2b::instance()->exitRequested(); } void cb2Bib::on_ConnectB_clicked() { if (_connected) { ui.ConnectB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_DISCONNECT_B)); ui.ConnectB->setStatusTip(buttonStatusTip(tr("Connect clipboard"), ui.ConnectB->shortcut())); _connected = false; } else { ui.ConnectB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_CONNECT_B)); ui.ConnectB->setStatusTip(buttonStatusTip(tr("Disconnect clipboard"), ui.ConnectB->shortcut())); _connected = true; } } void cb2Bib::on_MakeNetworkQueryB_clicked() { makeNetQuery(); } void cb2Bib::on_ViewBibB_clicked() { if (ui.stackedWidget->currentWidget() == BibBrowser) { ui.stackedWidget->setCurrentWidget(ClipEdit); ClipEdit->setFocus(); } else { BibBrowser->updatePlainText(_bpP->toBibTeX()); ui.stackedWidget->setCurrentWidget(BibBrowser); BibBrowser->setFocus(); } updateViewButtons(); } void cb2Bib::on_AddBibB_clicked() { // Prepare Save Reference to file ui.AddBibB->setEnabled(false); if (!_is_check_repeated_done && _settingsP->value("cb2Bib/CheckRepeatedOnSave").toBool()) { _is_check_repeated_done = true; if (isReferenceRepeated()) { ui.AddBibB->setEnabled(_modified); return; } } QFile bibtexfile(ui.bibtexfile->currentText()); bool is_writable; if (bibtexfile.exists()) is_writable = bibtexfile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); else is_writable = bibtexfile.open(QIODevice::WriteOnly | QIODevice::Text); if (!is_writable) { QMessageBox::information(this, tr("Information - cb2Bib"), tr("Unable to open file %1 for writing.\nError: '%2'."). arg(ui.bibtexfile->currentText()).arg(bibtexfile.errorString()), QMessageBox::Ok); ui.AddBibB->setEnabled(_modified); return; } if (_dropped_document_file.isEmpty() || ui.file->text().isEmpty() || !_settingsP->value("cb2Bib/MovePdf").toBool()) { _target_document_file.clear(); addToFile(true); } else { _target_document_file = c2bUtils::documentAbsoluteName(_settingsP->value("cb2Bib/RelativePdfDirectory").toBool(), ui.bibtexfile->currentText(), _settingsP->fileName("cb2Bib/PdfDirectory"), ui.file->text()); const QString doc_dir_name(QFileInfo(_target_document_file).absolutePath()); QDir doc_dir(doc_dir_name); if (!doc_dir.exists()) if (!doc_dir.mkpath(doc_dir_name)) { QMessageBox::information(this, tr("Information - cb2Bib"), tr("Unable to create directory %1.").arg(doc_dir_name), QMessageBox::Ok); ui.AddBibB->setEnabled(_modified); return; } const network::Action CopyMovePdf(network::actionType(_settingsP->value("cb2Bib/CopyMovePdf").toString())); c2b::net()->getFile(_dropped_document_file, _target_document_file, CopyMovePdf, this, SLOT(addToFile(bool))); } } void cb2Bib::on_EditBibTeXB_clicked() { bibEditor(ui.bibtexfile->currentText()); } void cb2Bib::on_BibTeXDir_clicked() { const QString fn(c2bFileDialog::getFilename(this, "Select a BibTeX filename", ui.bibtexfile->currentText(), "BibTeX (*.bib);;All (*)")); if (!fn.isEmpty()) updateBibfile(fn); } void cb2Bib::loadSettings() { ClipEdit->setFont(_settingsP->c2bMonoFont); BibBrowser->setFont(_settingsP->c2bMonoFont); AboutBrowser->setFont(_settingsP->c2bMonoFont); ui.AddBibB->setShortcut(QKeySequence::Save); ui.EditBibTeXB->setShortcut(QKeySequence::Open); ui.SearchInFilesB->setShortcut(QKeySequence::Find); #if QT_VERSION >= 0x040600 ui.ExitB->setShortcut(QKeySequence::Quit); #endif ui.BibTeXDir->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Select BibTeX File")); ui.ConfigureB->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Button Configure")); ui.ConnectB->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Button Toggle Connection")); ui.MakeNetworkQueryB->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Button Network Query")); ui.PdfImportB->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Button Start PDFImport")); ui.ViewAboutB->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Button About and Bookmarks")); ui.ViewBibB->setShortcut(_settingsP->keysequence("Shortcuts/cb2Bib/Button View BibTeX")); ui.AddBibB->setStatusTip(buttonStatusTip(tr("Save reference to BibTeX file"), ui.AddBibB->shortcut())); ui.BibTeXDir->setStatusTip(buttonStatusTip(tr("Select BibTeX file"), ui.BibTeXDir->shortcut())); ui.ConfigureB->setStatusTip(buttonStatusTip(tr("Configure cb2Bib"), ui.ConfigureB->shortcut())); ui.ConnectB->setStatusTip(buttonStatusTip(_connected ? tr("Disconnect clipboard") : tr("Connect clipboard"), ui.ConnectB->shortcut())); ui.EditBibTeXB->setStatusTip(buttonStatusTip(tr("Open BibTeX file"), ui.EditBibTeXB->shortcut())); ui.ExitB->setStatusTip(buttonStatusTip(tr("Close all windows and exit"), ui.ExitB->shortcut())); ui.MakeNetworkQueryB->setStatusTip(buttonStatusTip(tr("Network query for current reference"), ui.MakeNetworkQueryB->shortcut())); ui.PdfImportB->setStatusTip(buttonStatusTip(tr("Import references from a set of PDF files"), ui.PdfImportB->shortcut())); ui.SearchInFilesB->setStatusTip(buttonStatusTip(tr("Search BibTeX file for references"), ui.SearchInFilesB->shortcut())); updateViewButtons(); } QString cb2Bib::buttonStatusTip(const QString& ms, const QKeySequence& ks) const { if (ks.isEmpty()) return ms; else return ms + QLatin1String(" - ") + ks.toString(QKeySequence::NativeText); } void cb2Bib::updateViewButtons() { QWidget* viewing = ui.stackedWidget->currentWidget(); if (viewing == BibBrowser) { ui.ViewBibB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_VIEWC2B_B)); ui.ViewAboutB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_ABOUT_B)); ui.ViewBibB->setStatusTip(buttonStatusTip(tr("View cb2Bib clipboard"), ui.ViewBibB->shortcut())); ui.ViewAboutB->setStatusTip(buttonStatusTip(tr("About cb2bib and cb2bib bookmarks"), ui.ViewAboutB->shortcut())); } else if (viewing == AboutBrowser) { ui.ViewBibB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_VIEWBIB_B)); ui.ViewAboutB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_ABOUT_B_BACK)); ui.ViewBibB->setStatusTip(buttonStatusTip(tr("View BibTeX for current reference"), ui.ViewBibB->shortcut())); ui.ViewAboutB->setStatusTip(buttonStatusTip(tr("Back to cb2Bib clipboard"), ui.ViewAboutB->shortcut())); } else { ui.ViewBibB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_VIEWBIB_B)); ui.ViewAboutB->setIcon(QIcon(C2B_ICON_DIR + C2B_ICON_ABOUT_B)); ui.ViewBibB->setStatusTip(buttonStatusTip(tr("View BibTeX for current reference"), ui.ViewBibB->shortcut())); ui.ViewAboutB->setStatusTip(buttonStatusTip(tr("About cb2bib and cb2bib bookmarks"), ui.ViewAboutB->shortcut())); } } void cb2Bib::toggleReferenceTabs() { if (ui.tabWidget->currentIndex() == 0) ui.tabWidget->setCurrentIndex(1); else ui.tabWidget->setCurrentIndex(0); } void cb2Bib::updateBibfile(const QString& fn) { ui.bibtexfile->clear(); QFileInfo fi(fn); const QStringList flist(fi.isDir() ? c2bUtils::filesInDir(fn, QStringList() << "*.bib") : c2bUtils::filesInDir(fi.absolutePath(), QStringList() << "*.bib")); for (int i = 0; i < flist.count(); ++i) ui.bibtexfile->addItem(flist.at(i)); const int index(ui.bibtexfile->findText(fn)); if (index == -1) ui.bibtexfile->setEditText(fn); else ui.bibtexfile->setCurrentIndex(index); } void cb2Bib::showLink(const QString& ln) { statusBar()->showMessage(c2b::encodeLink(ln), C2B_MESSAGE_TIME); } void cb2Bib::showMessage(const QString& ms) { statusBar()->showMessage(ms, C2B_MESSAGE_TIME); } void cb2Bib::dragEnterEvent(QDragEnterEvent* qevent) { if (qevent->mimeData()->hasUrls()) qevent->acceptProposedAction(); } void cb2Bib::dropEvent(QDropEvent* qevent) { QList fns = qevent->mimeData()->urls(); if (fns.count() > 0) { if (fns.at(0).scheme() == "file") { c2bUtils::setWidgetOnTop(this); fileDroppedByUser(fns.at(0).toLocalFile().trimmed()); } else fileDroppedByUser(fns.at(0).toString().trimmed()); } qevent->acceptProposedAction(); } void cb2Bib::fileDroppedByUser(const QString& fn) { if (fn.isEmpty()) return; bool has_bibtex(false); if (_settingsP->value("cb2Bib/AddMetadata").toBool()) { const QString metadata(c2b::documentMetadata(fn)); if (!metadata.isEmpty()) { QString text(ClipEdit->toPlainText()); if (_settingsP->value("cb2Bib/PreAppendMetadata").toString() == "prepend") text = metadata + text; else text = text + '\n' + metadata; has_bibtex = _bpP->hasBibTeX(metadata); if (has_bibtex) forceDataChange(text); else ClipEdit->setText(text); } } fileDropped(fn); if (!has_bibtex) showMessage(tr("Scheduled inclusion of file '%1'.").arg(fn)); if (QFileInfo(fn).exists()) _settingsP->setFilename("cb2Bib/LastDroppedFile", fn); } void cb2Bib::fileDropped(const QString& fn) { if (fn.isEmpty()) return; _dropped_document_file = fn.trimmed(); ui.openFileDocumentAction->setEnabled(true); ui.openFileDocumentAction->setText(tr("Open '%1'").arg(_dropped_document_file)); setDocumentFilename(); if (_settingsP->value("cb2Bib/MovePdf").toBool()) ui.file->setStatusTip(tr("From file '%1'.").arg(_dropped_document_file)); } void cb2Bib::closeEvent(QCloseEvent* qevent) { if (_pdfImportP) _pdfImportP->close(); if (_searchInFilesP) _searchInFilesP->close(); _settingsP->setValue("cb2Bib/size", size()); _settingsP->setFilename("cb2Bib/BibTeXFile", QFileInfo(ui.bibtexfile->currentText()).absoluteFilePath()); qevent->accept(); } void cb2Bib::setTaggedClipEditMode(bool tagged) { _taggedViewMode = tagged; ui.insertRegExpAction->setEnabled(tagged); ClipEdit->setTaggedViewMode(tagged); if (_taggedViewMode) _bib_menu->setAnyPatternText(tr("Any Pattern")); else _bib_menu->setAnyPatternText(tr("Delete")); ui.stackedWidget->setCurrentWidget(ClipEdit); ClipEdit->setFocus(); updateViewButtons(); } void cb2Bib::doSearchInFiles(const QString& string, const QString& fn) { if (!_searchInFilesP) { _searchInFilesP = new c2bSearchInFiles(ui.bibtexfile->currentText()); connect(ui.bibtexfile, SIGNAL(editTextChanged(const QString&)), _searchInFilesP, SLOT(setBibTeXFile(const QString&))); connect(_searchInFilesP, SIGNAL(searchDone(const QString&, bibSearcher*)), this, SLOT(bibEditor(const QString&, bibSearcher*))); showMessage(tr("BibTeX Search launched.")); } if (fn.isEmpty()) _searchInFilesP->setBibTeXFile(ui.bibtexfile->currentText()); else _searchInFilesP->setBibTeXFile(fn); _searchInFilesP->setCurrentText(string); _searchInFilesP->show(); } void cb2Bib::setWindowTitle(const QString& title) { if (title.isEmpty()) QMainWindow::setWindowTitle(tr("cb2Bib")); else QMainWindow::setWindowTitle(tr("%1 - cb2Bib").arg(title)); } /**************************************************************************** CB2BIB FUNCTIONALITY *****************************************************************************/ void cb2Bib::setWidgetMapping() { _bpP->addField("abstract", ui.abstract); _bpP->addField("address", ui.address); _bpP->addField("annote", ui.annote); _bpP->addField("author", ui.author); _bpP->addField("booktitle", ui.booktitle); _bpP->addField("chapter", ui.chapter); _bpP->addField("doi", ui.doi); _bpP->addField("edition", ui.edition); _bpP->addField("editor", ui.editor); _bpP->addField("eprint", ui.eprint); _bpP->addField("file", ui.file); _bpP->addField("id", ui.id); _bpP->addField("institution", ui.institution); _bpP->addField("isbn", ui.isbn); _bpP->addField("issn", ui.issn); _bpP->addField("journal", ui.journal); _bpP->addField("keywords", ui.keywords); _bpP->addField("month", ui.month); _bpP->addField("note", ui.note); _bpP->addField("number", ui.number); _bpP->addField("organization", ui.organization); _bpP->addField("pages", ui.pages); _bpP->addField("publisher", ui.publisher); _bpP->addField("school", ui.school); _bpP->addField("series", ui.series); _bpP->addField("title", ui.title); _bpP->addField("url", ui.url); _bpP->addField("volume", ui.volume); _bpP->addField("year", ui.year); _bpP->addTypes(ui.typecombo); _bpP->setWidgetMapping(); connect(_bpP, SIGNAL(bibModified(bool)), this, SLOT(bibModified(bool))); } void cb2Bib::setBibMenu() { _bib_menu = new c2bBibMenu(this); connect(_bib_menu->addAuthorAction(), SIGNAL(triggered()), this, SLOT(addAuthors())); connect(_bib_menu->addEditorAction(), SIGNAL(triggered()), this, SLOT(addEditors())); connect(_bib_menu->anyPatternAction(), SIGNAL(triggered()), this, SLOT(anyPattern())); connect(ClipEdit, SIGNAL(userEndedSelection(const QPoint&)), this, SLOT(readField(const QPoint&))); } void cb2Bib::readField(const QPoint& position) { QAction* action = _bib_menu->exec(position); if (!action) return; const QString field(action->data().toString()); if (field.isEmpty()) return; _bpP->setField(field, ClipEdit->textCursor().selectedText()); ClipEdit->insertTag("<<" + field + ">>"); } void cb2Bib::addAuthors() { _bpP->setField("addauthors", ClipEdit->textCursor().selectedText(), ui.author->text()); ClipEdit->insertTag("<>"); if (_taggedViewMode) showMessage(tr("Info: Creating a pattern with multiple author sets.")); } void cb2Bib::addEditors() { _bpP->setField("addeditors", ClipEdit->textCursor().selectedText(), ui.editor->text()); ClipEdit->insertTag("<>"); if (_taggedViewMode) showMessage(tr("Info: Creating a pattern with multiple ui.editor sets.")); } void cb2Bib::anyPattern() { if (_taggedViewMode) ClipEdit->insertTag(""); else ClipEdit->insertPlainText(QString()); } void cb2Bib::preparseClipboard() { c2bPreparse(_raw_input_data); } void cb2Bib::restartEngine() { const QString text(ClipEdit->toPlainText()); if (!text.isEmpty()) c2bParse(text); } void cb2Bib::guessFields() { const QString text(ClipEdit->toPlainText()); if (!text.isEmpty()) { const QString keep_dropped_article_file(_dropped_document_file); c2bInit(); _bpP->guessFields(text); fileDropped(keep_dropped_article_file); processingEnded(); } } void cb2Bib::dataChanged(const QString& str) { bool do_allow(isVisible()); if (ui.stackedWidget->currentWidget() == ClipEdit) { if (ClipEdit->textCursor().hasSelection()) do_allow = false; } else if (ui.stackedWidget->currentWidget() == BibBrowser) { if (BibBrowser->textCursor().hasSelection()) do_allow = false; } if (_connected && ui.ConnectB->isEnabled() && do_allow) forceDataChange(str); } void cb2Bib::forceDataChange(const QString& str) { if (!str.isEmpty()) { _raw_input_data = str.trimmed(); if (_settingsP->value("cb2Bib/PreparserAutomatic").toBool()) c2bPreparse(str); else c2bParse(str); } } void cb2Bib::c2bInit() { _dropped_document_file.clear(); ui.openFileDocumentAction->setEnabled(false); ui.openFileDocumentAction->setText(tr("Open File Document")); ui.file->setStatusTip(QString()); disconnect(_bpP, SIGNAL(setDocumentFilename()), this, SLOT(setDocumentFilename())); _bpP->clearCurrentReference(); _is_check_repeated_done = false; _modified = false; ui.AddBibB->setEnabled(_modified); } void cb2Bib::c2bParse(const QString& text) { c2bInit(); QString out_text, out_tagtext; _bpP->parse(text, &out_text, &out_tagtext); ClipEdit->setText(out_text, out_tagtext); processingEnded(); } void cb2Bib::c2bPreparse(const QString& text) { QString out_text; _bpP->preparse(text, &out_text); if (!out_text.isEmpty()) c2bParse(out_text); } void cb2Bib::deleteTmpBib() { QMessageBox msgBox(this); QPushButton* deleteButton = msgBox.addButton(tr("&Delete"), QMessageBox::DestructiveRole); msgBox.setDefaultButton(msgBox.addButton(QMessageBox::Cancel)); msgBox.setWindowTitle(tr("Confirmation - cb2Bib")); msgBox.setText(tr("Delete temporary BibTeX file %1 ?").arg(ui.bibtexfile->currentText())); msgBox.setIcon(QMessageBox::Question); msgBox.exec(); if (msgBox.clickedButton() == deleteButton) { QFile BibFile(ui.bibtexfile->currentText()); if (BibFile.remove()) showMessage(tr("File %1 deleted.").arg(ui.bibtexfile->currentText())); else QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("Unable to delete the file %1.\nError: '%2'"). arg(ui.bibtexfile->currentText()).arg(BibFile.errorString()), QMessageBox::Ok); } } void cb2Bib::insertRegExp() { QStringList pattern; // Extracting Reference Type pattern.append(ui.typecombo->currentText()); // Extracting Field Order QString order(ClipEdit->toPlainText()); QRegExp rx("<<(" + _bpP->bibliographicFields().join("|") + ")>>"); QStringList list; int ipos(0); while (ipos >= 0) { ipos = rx.indexIn(order, ipos); if (ipos > -1) { list += rx.cap(1); ipos += rx.matchedLength(); c2bUtils::debug(rx.cap(1)); } } order = list.join(" "); c2bUtils::debug(order); pattern.append(order); // Parsing Regular Expression QString str('^' + QRegExp::escape(ClipEdit->toPlainText()) + '$'); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<
    >"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp(""), ".+"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(\\d+)"); str.replace(QRegExp("<>"), "(10\\.[\\d\\.]+/\\S+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(\\S+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(\\d+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "([\\d\\-" + QString(QChar(8211)) + "\\s]+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<>"), "(.+)"); str.replace(QRegExp("<<url>>"), "(\\S+)"); str.replace(QRegExp("<<volume>>"), "(\\d+)"); str.replace(QRegExp("<<year>>"), "(\\d\\d\\d\\d)"); c2bUtils::debug(str); pattern.append(str); // User Editting c2bSaveRegExp Sdiag(pattern, _raw_input_data, this); connect(c2b::clipboard(), SIGNAL(cbDataChanged(const QString&)), &Sdiag, SLOT(updateInput(const QString&))); connect(&Sdiag, SIGNAL(savePatternInfo(const QString&, const QString&)), this, SLOT(savePattern(const QString&, const QString&))); ui.ConnectB->setDisabled(true); if (Sdiag.exec() == QDialog::Rejected) showMessage(tr("Cancelled.")); ui.ConnectB->setDisabled(false); } void cb2Bib::savePattern(const QString& rx, const QString& rxname) { const QString regular_expression_f(_settingsP->fileName("cb2Bib/RegularExpressionFile")); QFile file(regular_expression_f); bool fopen; if (file.exists()) fopen = file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); else fopen = file.open(QIODevice::WriteOnly | QIODevice::Text); if (fopen) { QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); stream << ("# cb2Bib " + C2B_VERSION + " Pattern:") << endl << rxname << endl << rx << endl << endl; file.close(); showMessage(tr("Pattern '%1' added to %2.").arg(rxname).arg(regular_expression_f)); } else QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("Unable to open the file %1 for writing.\nError: '%2'."). arg(regular_expression_f).arg(file.errorString()), QMessageBox::Ok); c2bUtils::debug("signal:"); c2bUtils::debug(rx); c2bUtils::debug(rxname); } void cb2Bib::setDocumentFilename() { disconnect(_bpP, SIGNAL(setDocumentFilename()), this, SLOT(setDocumentFilename())); if (_dropped_document_file.isEmpty()) return; ui.file->setText(_bpP->documentFilename(_dropped_document_file, ui.bibtexfile->currentText())); connect(_bpP, SIGNAL(setDocumentFilename()), this, SLOT(setDocumentFilename())); } void cb2Bib::addToFile(bool ready) { if (!ready) { QMessageBox::information(this, tr("Information - cb2Bib"), tr("Not ready to add reference.\n%2"). arg(c2b::net()->errorString()), QMessageBox::Ok); ui.AddBibB->setEnabled(_modified); return; } QFile file(ui.bibtexfile->currentText()); bool fopen; if (file.exists()) fopen = file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); else fopen = file.open(QIODevice::WriteOnly | QIODevice::Text); if (fopen) { QTextStream stream(&file); stream.setCodec("UTF-8"); stream.setAutoDetectUnicode(true); stream << _bpP->toBibTeX(); file.close(); c2b::showMessage(tr("Bib Item %1 added to %2.").arg(ui.id->text()).arg(ui.bibtexfile->currentText())); if (_settingsP->value("cb2Bib/InsertMetadata").toBool()) if (!_target_document_file.isEmpty()) if (!c2b::metaParser()->insertMetadata(_bpP->currentReference(), _target_document_file)) c2b::showMessage(tr("Unable to insert metadata to file %1.").arg(_target_document_file)); _is_check_repeated_done = false; _modified = false; ui.AddBibB->setEnabled(_modified); emit addedBibToFile(ui.bibtexfile->currentText()); } else QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("Unable to open file %1 for writing.\nError: '%2'."). arg(ui.bibtexfile->currentText()).arg(file.errorString()), QMessageBox::Ok); } void cb2Bib::addMetadata() { if (!_dropped_document_file.isEmpty()) { if (QFileInfo(_dropped_document_file).isWritable() && c2b::metaParser()->insertMetadata(_bpP->currentReference(), _dropped_document_file)) c2b::showMessage(tr("Inserted metadata to file %1.").arg(_dropped_document_file)); else c2b::showMessage(tr("Unable to insert metadata to file %1.").arg(_dropped_document_file)); } } void cb2Bib::postprocessBibTeX() { c2bPostprocess* ppBib = new c2bPostprocess(ui.bibtexfile->currentText(), this); showMessage(tr("BibTeX Postprocessing launched.")); if (ppBib->exec() != QDialog::Accepted) showMessage(tr("BibTeX Postprocessing exited.")); } void cb2Bib::bookmarksEditor() { if (_openDocuments.contains("bookmark_network_editor")) { c2bUtils::setWidgetOnTop(_openDocuments.value("bookmark_network_editor")); return; } c2bEditor* ed = new c2bEditor(_settingsP->fileName("cb2Bib/NetworkFile"), "NetQInfo", this); ed->setObjectName("bookmark_network_editor"); _openDocuments.insert("bookmark_network_editor", ed); ui.editBookmarksAction->setEnabled(false); connect(ed, SIGNAL(restartQuery()), this, SLOT(makeNetQuery())); connect(ed, SIGNAL(destroyed(QObject*)), this, SLOT(updateOpenDocuments(QObject*))); connect(ed, SIGNAL(openFile(const QString&)), this, SLOT(bibEditor(const QString&))); ed->show(); showMessage(tr("Bookmark File Editor launched.")); } void cb2Bib::abbreviationsEditor() { c2bEditor* ed = new c2bEditor(_settingsP->fileName("cb2Bib/JournalFile"), "JAbbrev", this); ed->setObjectName("journal_abbreviations_editor"); _openDocuments.insert("journal_abbreviations_editor", ed); ui.editAbbreviationsAction->setEnabled(false); connect(ed, SIGNAL(destroyed(QObject*)), this, SLOT(updateOpenDocuments(QObject*))); connect(ed, SIGNAL(openFile(const QString&)), this, SLOT(bibEditor(const QString&))); connect(ed, SIGNAL(openBookmarks()), this, SLOT(bookmarksEditor())); ed->show(); showMessage(tr("Journal Abbreviations Editor launched.")); } void cb2Bib::regExpsEditor() { c2bEditor* ed = new c2bEditor(_settingsP->fileName("cb2Bib/RegularExpressionFile"), "RegExp", this); ed->setObjectName("regular_expression_editor"); _openDocuments.insert("regular_expression_editor", ed); ui.editRegExpsAction->setEnabled(false); connect(ed, SIGNAL(restartEngine()), this, SLOT(restartEngine())); connect(ed, SIGNAL(destroyed(QObject*)), this, SLOT(updateOpenDocuments(QObject*))); connect(ed, SIGNAL(openFile(const QString&)), this, SLOT(bibEditor(const QString&))); connect(ed, SIGNAL(openBookmarks()), this, SLOT(bookmarksEditor())); ed->show(); showMessage(tr("RegExp File Editor launched.")); } void cb2Bib::initAsBibTeXEditor() { for (int i = 0; i < _settingsP->cl_bibedit_filenames.count(); ++i) bibEditor(_settingsP->cl_bibedit_filenames.at(i)); } void cb2Bib::bibEditor(const QString& bibtexfile, bibSearcher* searcher) { if (bibtexfile.isEmpty()) return; if (_openDocuments.contains(bibtexfile)) { c2bUtils::setWidgetOnTop(_openDocuments.value(bibtexfile)); return; } c2bEditor* ed = new c2bEditor(bibtexfile, searcher, this); ed->setObjectName(ed->editorFilename()); _openDocuments.insert(ed->editorFilename(), ed); connect(ed, SIGNAL(destroyed(QObject*)), this, SLOT(updateOpenDocuments(QObject*))); connect(ed, SIGNAL(openFile(const QString&)), this, SLOT(bibEditor(const QString&))); connect(ed, SIGNAL(openBookmarks()), this, SLOT(bookmarksEditor())); connect(ed, SIGNAL(editFileRenamed(const QString&, const QString&)), this, SLOT(updateOpenDocuments(const QString&, const QString&))); ed->show(); showMessage(tr("BibTeX Editor launched.")); } void cb2Bib::updateOpenDocuments(QObject* obj) { _openDocuments.remove(obj->objectName()); if (!_openDocuments.contains("bookmark_network_editor")) ui.editBookmarksAction->setEnabled(true); if (!_openDocuments.contains("journal_abbreviations_editor")) ui.editAbbreviationsAction->setEnabled(true); if (!_openDocuments.contains("regular_expression_editor")) ui.editRegExpsAction->setEnabled(true); if (_settingsP->cl_bibedit && _openDocuments.count() == 0 && isHidden()) close(); } void cb2Bib::updateOpenDocuments(const QString& old_name, const QString& new_name) { c2bEditor* ed = _openDocuments.take(old_name); if (ed) { if (ed->objectName() == "bookmark_network_editor" || ed->objectName() == "journal_abbreviations_editor" || ed->objectName() == "regular_expression_editor") return; ed->setObjectName(new_name); _openDocuments.insert(new_name, ed); updateBibfile(new_name); } } void cb2Bib::bibModified(bool modified) { _modified = modified; ui.AddBibB->setEnabled(_modified); if (ui.stackedWidget->currentWidget() == BibBrowser) BibBrowser->updatePlainText(_bpP->toBibTeX()); } void cb2Bib::updateCheckRepeatedAction() { // Do not use anyAuthor/anyTitle, _bpP->currentReference() might not yet be set ui.checkRepeatedAction->setVisible(!ui.author->text().isEmpty() || !ui.title->text().isEmpty() || !ui.editor->text().isEmpty() || !ui.booktitle->text().isEmpty() || !ui.id->text().isEmpty()); } void cb2Bib::checkRepeated() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); isReferenceRepeated(); QApplication::restoreOverrideCursor(); } bool cb2Bib::isReferenceRepeated() { QFileInfo fi(ui.bibtexfile->currentText()); showMessage(tr("Checking for similar references at %1.").arg(fi.absolutePath())); bibSearcher searcher(_bpP, fi.absolutePath()); searcher.exec(); const bool repeated(searcher.hitsCount() > 0); if (repeated) { QApplication::processEvents(); bibEditor(fi.absolutePath(), &searcher); QApplication::processEvents(); if (searcher.hitsCount() == 1) c2b::showMessage(tr("Found %1 similar reference.").arg(searcher.hitsCount())); else c2b::showMessage(tr("Found %1 similar references.").arg(searcher.hitsCount())); } else showMessage(tr("No similar references found at %1.").arg(fi.absolutePath())); return repeated; } /**************************************************************************** NETWORK FUNCTIONALITY *****************************************************************************/ void cb2Bib::makeNetQuery() { if (!ui.MakeNetworkQueryB->isEnabled()) { showMessage(tr("Currently processing previous query. Resubmit later.")); return; } ui.MakeNetworkQueryB->setEnabled(false); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); _netQP->submitQuery(_bpP->currentReference(), ClipEdit->toPlainText(), !_pdfImportP); } void cb2Bib::netQueryEnded(bool succeeded, const QString& targetPDF, const QString& targetBib) { if (!succeeded) { emit endedProcessing(false); c2b::showMessage(tr("Query submission error. %1").arg(_netQP->errorString())); } else if (targetPDF.isEmpty() && targetBib.isEmpty()) { emit endedProcessing(false); c2b::showMessage(tr("Query submitted. %1").arg(_netQP->errorString())); } else { const QString previous_article_file(_dropped_document_file); // Keep dropped file in case this is auto recognized forceDataChange(targetBib); if (_bpP->isAutoRecognized() && !targetPDF.isEmpty()) fileDropped(targetPDF); else if (_bpP->isAutoRecognized()) fileDropped(previous_article_file); } QApplication::restoreOverrideCursor(); ui.MakeNetworkQueryB->setEnabled(true); } void cb2Bib::processingEnded() { if (_settingsP->value("cb2Bib/AutomaticQuery").toBool()) if (ui.MakeNetworkQueryB->isEnabled() && !_bpP->autoRecognizedString().contains("BibTeX")) { makeNetQuery(); return; } if (_pdfImportP) fileDropped(_pdfImportP->processedFile); emit endedProcessing(_bpP->isAutoRecognized()); } void cb2Bib::linkClicked(const QUrl& ln) { // Encode link sets dynamic link. c2bUtils::openFile(c2b::encodeLink(ln.toString()), this); } void cb2Bib::openFileDocument() { if (!_dropped_document_file.isEmpty()) c2bUtils::openFile(_dropped_document_file, this); } void cb2Bib::selectFile() { const QString fn(c2bFileDialog::getOpenFilename(this, QString(), _settingsP->fileName("cb2Bib/LastDroppedFile"), "Portable Document Format (*.pdf);;DjVu (*.djvu);;Post Script (*.ps);;TeX (*.tex);;All (*)")); if (!fn.isEmpty()) fileDroppedByUser(fn); } void cb2Bib::openAnnote() { const QString fn(c2bFileDialog::getFilename(this, QString(), _settingsP->fileName("cb2Bib/LastAnnoteFile"), "Annote HTML output (*.tex.html);;LaTeX (*.tex);;All (*)")); if (fn.isEmpty()) return; const QString tex_fn(QString(fn).remove(QRegExp("\\.html$"))); if (!QFileInfo(tex_fn).exists()) { const QString empty_note("%\\c2b_bibtex_directory{" + QFileInfo(ui.bibtexfile->currentText()).absolutePath() + "}\n%\\c2b_makeindex\n\n\n\\title{New Note}\n\n\n\n"); if (!c2bUtils::stringToFile(empty_note, tex_fn)) { QMessageBox::information(this, tr("Information - cb2Bib"), tr("Unable to create new note %1.\nCheck writing permission.").arg(tex_fn), QMessageBox::Ok); return; } } _settingsP->setFilename("cb2Bib/LastAnnoteFile", fn); const QStringList flags(QStringList() << "--view-annote" << fn << _settingsP->confCommandFlags()); QProcess::startDetached(QCoreApplication::applicationFilePath(), flags); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bEditor.h������������������������������������������������������������������������0000644�0001750�0001750�00000005254�12045520050�015352� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BEDITOR_H #define C2BEDITOR_H #include "ui_c2bEditor.h" #include <QMainWindow> #include <QPointer> class QDockWidget; class QLabel; class QStackedWidget; class QSyntaxHighlighter; class bibSearcher; class c2bBibParser; class c2bReferenceList; class c2bSettings; class c2bTextBrowser; class c2bTextEdit; class findDialog; class c2bEditor : public QMainWindow { Q_OBJECT public: c2bEditor(const QString& file, const QString& mode, QWidget* main, QWidget* parentw = 0); c2bEditor(const QString& file, bibSearcher* searcher, QWidget* main, QWidget* parentw = 0); ~c2bEditor(); inline QString editorFilename() const { return _editor_fn; } bool closeEditor(); signals: void editFileRenamed(const QString& old_name, const QString& new_name); void execute(); void openBookmarks(); void openFile(const QString& fn); void restartEngine(); void restartQuery(); protected: virtual void closeEvent(QCloseEvent* qevent); protected slots: bool fileSave(); bool fileSaveAs(); void cursorPositionChanged(); void exportEntries(); void fileOpen(); void helpCb2Bib(); void helpEditor(); void isModified(int position, int charsRemoved, int charsAdded); void journalsToAbbreviated(); void journalsToFull(); void load(); void overwriteModeChanged(); void pasteCurrentBibTeX(); void postProcess(); void reload(const QString& fn); void saveAndExecute(); void setViewMode(bool edit_mode); void showMessage(const QString& ms); void updateMetadata(); void viewCb2Bib(); private: QDockWidget* _dockWidgetP; QLabel* _lineLabelP; QLabel* _overwriteLabelP; QPointer<bibSearcher> _searcherP; QStackedWidget* _stackedWidgetP; QString _edit_reference_at_position; QString _editor_fn; QString _editor_mode; QSyntaxHighlighter* _shP; QWidget* _c2b_mainP; Ui::c2bEditor ui; bool _is_modified_by_user; c2bBibParser* _bpP; c2bReferenceList* _referencesP; c2bSettings* _settingsP; c2bTextBrowser* _browserP; c2bTextEdit* _editorP; findDialog* _textFinderP; void createReferenceList(); void importActions(); void initEditor(); void setEditorMode(); QMenu* createPopupMenu() // to avoid default context menu { return 0; } }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bPdfImport.h���������������������������������������������������������������������0000644�0001750�0001750�00000002653�12045520050�016030� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BPDFIMPORT_H #define C2BPDFIMPORT_H #include "ui_c2bPdfImport.h" #include <QDialog> class c2bSettings; class c2bPdfImport : public QDialog { Q_OBJECT public: c2bPdfImport(QWidget* parentw = 0); ~c2bPdfImport(); QString processedFile; public slots: void processNext(); void referenceExtacted(bool status); void show(); void showMessage(const QString& ms); signals: void fileProcessed(const QString& filename); void saveReferenceRequest(); void setClipboardDisabled(bool disable); void textProcessed(const QString& text); protected: bool event(QEvent* qevent); void dragEnterEvent(QDragEnterEvent* qevent); void dropEvent(QDropEvent* qevent); private slots: void abort(); void help(); void loadSettings(); void processOneFile(); void saveSettings(); void selectFiles(); private: QPushButton* buttonProcess; QPushButton* buttonSelectFiles; Ui::c2bPdfImport ui; bool c2bAutomaticQuery; bool m_aborted; c2bSettings* settings; void processDocument(); }; #endif �������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bCiterExcerptView.cpp������������������������������������������������������������0000644�0001750�0001750�00000004405�12045520050�017710� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bCiterExcerptView.h" #include "c2bSettings.h" #include "c2bTextBrowser.h" #include "c2bUtils.h" #include <QGridLayout> c2bCiterExcerptView::c2bCiterExcerptView(const QString& html, QWidget* parentw) : QDialog(parentw) { setWindowTitle(tr("Document Excerpt - cb2Bib")); QGridLayout* gl; gl = new QGridLayout(this); gl->setContentsMargins(0, 0, 0, 0); _browserP = new c2bTextBrowser(this); gl->addWidget(_browserP, 0, 0, 1, 1); c2bSettings* settings(c2bSettingsP); resize(settings->value("c2bCiterExcerptView/size", QSize(500, 500)).toSize()); move(settings->value("c2bCiterExcerptView/position", pos()).toPoint()); _browserP->setFont(QFont(QFont().family(), settings->value("c2bCiterExcerptView/BrowserFontPointSize", QFont().pointSize()).toInt())); QString css(c2bUtils::fileToString(settings->fileName("cb2Bib/BrowserCssFile"))); if (css.isEmpty()) css = c2bUtils::fileToString(":/htm/htm/references.css"); _browserP->document()->setDefaultStyleSheet(css); QAction* c(new QAction(this)); c->setShortcut(QKeySequence(Qt::Key_Left)); addAction(c); connect(c, SIGNAL(triggered()), this, SLOT(close())); QAction* vzi(new QAction(this)); vzi->setShortcut(QKeySequence(QKeySequence::ZoomIn)); addAction(vzi); connect(vzi, SIGNAL(triggered()), _browserP, SLOT(zoomIn())); QAction* vzo(new QAction(this)); vzo->setShortcut(QKeySequence(QKeySequence::ZoomOut)); addAction(vzo); connect(vzo, SIGNAL(triggered()), _browserP, SLOT(zoomOut())); _browserP->updateHtml(html); } c2bCiterExcerptView::~c2bCiterExcerptView() { c2bSettings* settings(c2bSettingsP); if (!isFullScreen()) { settings->setValue("c2bCiterExcerptView/position", pos()); settings->setValue("c2bCiterExcerptView/size", size()); } settings->setValue("c2bCiterExcerptView/BrowserFontPointSize", _browserP->font().pointSize()); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bClipboard.cpp�������������������������������������������������������������������0000644�0001750�0001750�00000007224�12045520050�016355� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bClipboard.h" #ifdef C2B_USE_CBPOLL #include "clipboardPoll.h" #endif #include <QApplication> c2bClipboard::c2bClipboard(QObject* parento) : QObject(parento) { // Connecting clipboard _cb = QApplication::clipboard(); _supports_selection = _cb->supportsSelection(); _is_connected = false; _cb_text = _cb->text(QClipboard::Clipboard); if (_supports_selection) _cbs_text = _cb->text(QClipboard::Selection); // Setting timer _interval = 1000; #ifdef C2B_USE_CBPOLL _poll = new clipboardPoll(); connect(_poll, SIGNAL(clipboardChanged(bool)), this, SLOT(newClipboardData(bool))); #else #ifdef Q_WS_X11 _timer = new QTimer(this); connect(_timer, SIGNAL(timeout()), this, SLOT(checkData())); #endif #endif } c2bClipboard::~c2bClipboard() { #ifdef C2B_USE_CBPOLL delete _poll; #endif } void c2bClipboard::checkData() { if (_supports_selection) { if (_cb_text != _cb->text(QClipboard::Clipboard)) { _cb_text = _cb->text(QClipboard::Clipboard); _cbs_text = _cb->text(QClipboard::Selection); emit cbDataChanged(_cb_text); } else if (_cbs_text != _cb->text(QClipboard::Selection)) { _cbs_text = _cb->text(QClipboard::Selection); emit cbDataChanged(_cbs_text); } } else { if (_cb_text != _cb->text(QClipboard::Clipboard)) { _cb_text == _cb->text(QClipboard::Clipboard); emit cbDataChanged(_cb_text); } } } void c2bClipboard::dataChanged() { _cb_text = _cb->text(QClipboard::Clipboard); emit cbDataChanged(_cb_text); } void c2bClipboard::selectionChanged() { _cbs_text = _cb->text(QClipboard::Selection); emit cbDataChanged(_cbs_text); } void c2bClipboard::setConnected(bool zconn) { _is_connected = zconn; if (_is_connected) { _cb_text = _cb->text(QClipboard::Clipboard); connect(_cb, SIGNAL(dataChanged()), this, SLOT(dataChanged())); if (_supports_selection) { _cbs_text = _cb->text(QClipboard::Selection); connect(_cb, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); } #ifdef C2B_USE_CBPOLL _poll->startT(_interval); #else #ifdef Q_WS_X11 _timer->start(_interval); #endif #endif } else { #ifdef C2B_USE_CBPOLL _poll->stopT(); #else #ifdef Q_WS_X11 _timer->stop(); #endif #endif disconnect(_cb, SIGNAL(dataChanged()), this, SLOT(dataChanged())); if (_supports_selection) disconnect(_cb, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); } } const QString c2bClipboard::text() { return _cb->text(QClipboard::Clipboard); } void c2bClipboard::newClipboardData(bool selectionMode) { if (selectionMode) checkSelectionData(); else checkClipboardData(); } void c2bClipboard::checkSelectionData() { if (_supports_selection) if (_cbs_text != _cb->text(QClipboard::Selection)) { _cbs_text = _cb->text(QClipboard::Selection); emit cbDataChanged(_cbs_text); } } void c2bClipboard::checkClipboardData() { if (_cb_text != _cb->text(QClipboard::Clipboard)) { _cb_text = _cb->text(QClipboard::Clipboard); emit cbDataChanged(_cb_text); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bLineEdit.cpp��������������������������������������������������������������������0000644�0001750�0001750�00000002044�12045520050�016146� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bLineEdit.h" #include <QAction> #include <QContextMenuEvent> #include <QMenu> c2bLineEdit::c2bLineEdit(QWidget* parentw) : QLineEdit(parentw) {} c2bLineEdit::~c2bLineEdit() {} void c2bLineEdit::contextMenuEvent(QContextMenuEvent* e) { QMenu* menu = QLineEdit::createStandardContextMenu(); QList<QAction*> acts = menu->actions(); QAction* act; act = new QAction("Clear", menu); act->setEnabled(!text().isEmpty()); connect(act, SIGNAL(triggered()), this, SLOT(clear())); menu->insertAction(acts.at(7), act); acts = actions(); for (int i = 0; i < acts.count(); ++i) menu->addAction(acts.at(i)); menu->exec(e->globalPos()); delete menu; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bBibHighlighter.cpp��������������������������������������������������������������0000644�0001750�0001750�00000003761�12045520050�017333� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bBibHighlighter.h" #include "c2bSettings.h" #include <QPalette> #include <QTextDocument> c2bBibHighlighter::c2bBibHighlighter(QTextDocument* doc) : QSyntaxHighlighter(doc) { QPalette p; text_color = p.text().color(); c2bSettings* settings(c2bSettingsP); c = &settings->colors; connect(settings, SIGNAL(newSettings()), this, SLOT(rehighlight())); rx0 = QRegExp("[\\{\\}]+"); rx0.setMinimal(true); rx1 = QRegExp("@\\w+"); rx2 = QRegExp("^\\w+"); rx3 = QRegExp("^%.+$"); } c2bBibHighlighter::~c2bBibHighlighter() {} void c2bBibHighlighter::highlightBlock(const QString& text) { const int len(text.length()); setFormat(0, len - 1, text_color); int pos(0); while (pos >= 0) { pos = rx0.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx0.matchedLength(), c->bib_delimiter_color); pos += rx0.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx1.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx1.matchedLength(), c->bib_reference_type_color); pos += rx1.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx2.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx2.matchedLength(), c->bib_reference_field_color); pos += rx2.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx3.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx3.matchedLength(), c->comment_color); pos += rx3.matchedLength(); } } } ���������������cb2bib-1.4.9/src/c2bCiterWidget.cpp�����������������������������������������������������������������0000644�0001750�0001750�00000031040�12045520050�016661� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bCiterWidget.h" #include "c2b.h" #include "c2bCiterModel.h" #include "c2bClipboard.h" #include "c2bCollectionIndex.h" #include "c2bCoreCiter.h" #include "c2bFileDialog.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <QKeyEvent> #include <QLabel> #include <QMenu> #ifdef Q_WS_X11 #include <QX11Info> #include <X11/Xatom.h> #include <X11/Xlib.h> #endif c2bCiterWidget::c2bCiterWidget(QWidget* parentw) : QWidget(parentw) { ui.setupUi(this); ui.clipboardIcon->setVisible(true); ui.filterIcon->setVisible(false); _citerP = new c2bCoreCiter(this); _tray_icon = 0; setActions(); _settingsP = c2bSettingsP; resize(_settingsP->value("c2bCiter/size", size()).toSize()); move(_settingsP->value("c2bCiter/position", pos()).toPoint()); _clipboard_connected = true; _citations = new c2bCiterModel(this); connect(_citations, SIGNAL(statusLabel(const QString&)), this, SLOT(showLabel(const QString&))); connect(_citations, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); connect(c2b::clipboard(), SIGNAL(cbDataChanged(const QString&)), this, SLOT(filterDataChanged(const QString&))); connect(ui.citationsView, SIGNAL(activated(const QModelIndex&)), _citations, SLOT(selectCitation(const QModelIndex&))); connect(ui.citationsView, SIGNAL(citeReferences()), this, SLOT(citeReferences())); connect(ui.citationsView, SIGNAL(editReference()), this, SLOT(editReference())); connect(ui.citationsView, SIGNAL(hideCiter()), this, SLOT(hide())); connect(ui.citationsView, SIGNAL(openFile()), this, SLOT(openFile())); connect(ui.citationsView, SIGNAL(openUrl()), this, SLOT(openUrl())); connect(ui.citationsView, SIGNAL(patternFilterChanged(const bool, const QString&)), this, SLOT(updatePatternFilter(const bool, const QString&))); connect(ui.citationsView, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); } c2bCiterWidget::~c2bCiterWidget() { if (!isFullScreen()) { _settingsP->setValue("c2bCiter/position", pos()); _settingsP->setValue("c2bCiter/size", size()); } _settingsP->setValue("c2bCiter/format", static_cast<int>(_citations->lastCitationFormat())); } void c2bCiterWidget::load() { _bibtex_files.clear(); if (_settingsP->cl_citer_filenames.count() == 0) _bibtex_files = c2bUtils::filesInDir(QFileInfo(_settingsP->fileName("cb2Bib/BibTeXFile")).absolutePath(), QStringList() << "*.bib"); else for (int i = 0; i < _settingsP->cl_citer_filenames.count(); ++i) _bibtex_files += c2bUtils::filesInDir(_settingsP->cl_citer_filenames.at(i), QStringList() << "*.bib"); c2bCiter::State state; state.format = static_cast<c2bCiter::Format>(_settingsP->value("c2bCiter/format", state.format).toInt()); reload(state); } void c2bCiterWidget::reload() { const c2bCiter::State state(ui.citationsView->currentState()); reload(state); } void c2bCiterWidget::reload(const c2bCiter::State& state) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); updatePatternFilter(false, QString()); if (_bibtex_files.count() == 1) setWindowTitle(tr("%1 - cb2Bib").arg(QDir::toNativeSeparators(QFileInfo(_bibtex_files.at(0)).absoluteFilePath()))); else if (_bibtex_files.count() > 1) setWindowTitle(tr("%1 - cb2Bib").arg(QDir::toNativeSeparators(QFileInfo(_bibtex_files.at(0)).absolutePath()))); else setWindowTitle(tr("Citer - cb2Bib")); ui.citationsView->reloadModel(_citations, _bibtex_files, state); QApplication::restoreOverrideCursor(); } void c2bCiterWidget::toggleVisible() { if (isVisible()) hide(); else show(); } void c2bCiterWidget::show() { #ifdef Q_WS_X11 updateUserTimestamp(); #endif if (isHidden()) QWidget::show(); raise(); activateWindow(); ui.citationsView->setFocus(); } void c2bCiterWidget::updateUserTimestamp() { #ifdef Q_WS_X11 // Bypass focus stealing prevention // Adapted from KDE libraries: // Copyright (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) // Copyright (C) 1998, 1999, 2000 KDE Team // http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kapplication_8cpp_source.html Window w = XCreateSimpleWindow(QX11Info::display(), QX11Info::appRootWindow(), 0, 0, 1, 1, 0, 0, 0); XSelectInput(QX11Info::display(), w, PropertyChangeMask); unsigned char cdata[ 1 ]; XChangeProperty(QX11Info::display(), w, XA_ATOM, XA_ATOM, 8, PropModeAppend, cdata, 1); XEvent ev; XWindowEvent(QX11Info::display(), w, PropertyChangeMask, &ev); const unsigned long time = ev.xproperty.time; XDestroyWindow(QX11Info::display(), w); QX11Info::setAppUserTime(time); QX11Info::setAppTime(time); #endif } void c2bCiterWidget::setTrayIcon() { _tray_icon = new QSystemTrayIcon(this); _tray_icon->setIcon(QIcon(":/icons/icons/cb2bib.png")); _tray_icon->setToolTip("c2bBib Citer"); QMenu* tray_icon_menu = new QMenu(this); foreach(QAction * a, actions()) { tray_icon_menu->addAction(a); } _tray_icon->setContextMenu(tray_icon_menu); _tray_icon->show(); connect(_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); } void c2bCiterWidget::trayIconActivated(QSystemTrayIcon::ActivationReason r) { if (r == QSystemTrayIcon::Context) return; show(); } void c2bCiterWidget::setActions() { QAction* a; a = new QAction(this); a->setText(tr("Citer Help")); a->setShortcut(QKeySequence(QKeySequence::HelpContents)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(help())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Open Directory")); a->setShortcut(QKeySequence(QKeySequence::Open)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(openDirectory())); a = new QAction(this); a->setText(tr("Open Files")); a->setShortcut(QKeySequence(Qt::ALT + Qt::Key_O)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(openFiles())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Refresh")); a->setShortcut(QKeySequence(QKeySequence::Refresh)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(reload())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Search In Files")); a->setShortcut(QKeySequence(QKeySequence::Find)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(doSearchInFiles())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Set LyX Pipe")); a->setShortcut(QKeySequence(Qt::ALT + Qt::Key_L)); addAction(a); connect(a, SIGNAL(triggered()), _citerP, SLOT(setLyXPipe())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Toggle cb2Bib")); a->setShortcut(QKeySequence(Qt::Key_F2)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(toggleCb2Bib())); a = new QAction(this); a->setText(tr("Toggle Clipboard")); a->setShortcut(QKeySequence(Qt::ALT + Qt::Key_C)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(toggleClipboard())); a = new QAction(this); a->setText(tr("Toggle Full Screen")); a->setShortcut(QKeySequence(Qt::ALT + Qt::Key_F)); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Index Documents")); addAction(a); connect(a, SIGNAL(triggered()), this, SLOT(indexDocuments())); c2bUtils::addSeparator(this); a = new QAction(this); a->setText(tr("Exit")); #if QT_VERSION >= 0x040600 a->setShortcut(QKeySequence(QKeySequence::Quit)); #endif addAction(a); connect(a, SIGNAL(triggered()), c2b::instance(), SLOT(exitRequested())); } void c2bCiterWidget::openDirectory() { QString dir; if (_bibtex_files.count() > 0) dir = _bibtex_files.at(0); dir = c2bFileDialog::getExistingDirectory(this, tr("Select BibTeX directory"), dir); if (dir.isEmpty()) return; _bibtex_files = c2bUtils::filesInDir(dir, QStringList() << "*.bib"); reload(); } void c2bCiterWidget::openFiles() { QString dir; if (_bibtex_files.count() > 0) dir = _bibtex_files.at(0); const QStringList fns(c2bFileDialog::getOpenFilenames(this, "Select BibTeX filenames", dir, "BibTeX (*.bib);;All (*)")); if (fns.count() > 0) { _bibtex_files = fns; reload(); } } void c2bCiterWidget::doSearchInFiles() { const QString fn(_citations->isKeywordView() ? QString() : _citations->dataBibTeXFile(ui.citationsView->currentIndex())); if (fn.isEmpty()) showMessage(tr("No active reference.")); else c2b::doSearchInFiles(QString(), fn); } void c2bCiterWidget::toggleCb2Bib() { if (c2b::mainWidget()->isVisible()) c2b::mainWidget()->hide(); else c2bUtils::setWidgetOnTop(c2b::mainWidget()); } void c2bCiterWidget::toggleClipboard() { _clipboard_connected = !_clipboard_connected; ui.clipboardIcon->setVisible(_clipboard_connected); if (_clipboard_connected) showMessage(tr("Filter set to clipboard contents.")); } void c2bCiterWidget::toggleFullScreen() { if (isFullScreen()) showNormal(); else showFullScreen(); } void c2bCiterWidget::indexDocuments() { c2bCollectionIndex* ci(new c2bCollectionIndex(0)); ci->setAttribute(Qt::WA_DeleteOnClose); ci->show(); ci->index(); } void c2bCiterWidget::filterDataChanged(const QString& filter) { if (_clipboard_connected && isVisible()) { const QString p(c2bUtils::toAscii(filter, c2bUtils::Collation).simplified()); updatePatternFilter(false, p); ui.citationsView->setPatternFilter(p); } } void c2bCiterWidget::updatePatternFilter(const bool mode, const QString& pattern) { ui.filterIcon->setVisible(mode); if (mode) showLabel(tr("Filter: %1_").arg(pattern)); else { if (pattern.isEmpty()) showLabel(_citations->isKeywordView() ? tr("Glossary of terms") : pattern); else showLabel(tr("Filter: %1").arg(pattern)); } } void c2bCiterWidget::citeReferences() { const QStringList k(_citations->dataSelectedCiteIds()); if (k.count() > 0) { hide(); _citerP->cite(k); } else showMessage(tr("No selected references.")); } void c2bCiterWidget::editReference() { if (_citations->isKeywordView()) { showMessage(tr("No active reference.")); return; } const QString r(_citations->dataBibTeXPosition(ui.citationsView->currentIndex())); if (r.isEmpty()) showMessage(tr("No active reference.")); else emit openFile(r); } void c2bCiterWidget::openFile() { if (_citations->count() == 0) return; if (_citations->isKeywordView()) { showMessage(tr("No active reference.")); return; } const QString f(_citations->dataFile(ui.citationsView->currentIndex())); if (f.isEmpty()) showMessage(tr("No File entry in this reference.")); else { showMessage(tr("Opening %1").arg(f)); c2bUtils::openFile(f, parentWidget()); } } void c2bCiterWidget::openUrl() { if (_citations->count() == 0) return; if (_citations->isKeywordView()) { showMessage(tr("No active reference.")); return; } const QString u(_citations->dataUrl(ui.citationsView->currentIndex())); if (u.isEmpty()) showMessage(tr("No URL entry in this reference.")); else { showMessage(tr("Opening %1").arg(QUrl::fromPercentEncoding(u.toUtf8()))); c2bUtils::openFile(u, parentWidget()); } } void c2bCiterWidget::showLabel() { ui.statusBar->showMessage(_status_label, 0); } void c2bCiterWidget::showLabel(const QString& label) { _status_label = label; ui.statusBar->showMessage(_status_label, 0); } void c2bCiterWidget::showMessage(const QString& message) { QTimer::singleShot(C2B_MESSAGE_TIME, this, SLOT(showLabel())); ui.statusBar->showMessage(message, 0); } void c2bCiterWidget::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2bciter.php"); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bCollectionIndex.cpp�������������������������������������������������������������0000644�0001750�0001750�00000006601�12045520050�017537� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bCollectionIndex.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <QPushButton> c2bCollectionIndex::c2bCollectionIndex(QWidget* parentw) : QDialog(parentw), _indexerP(0) { ui.setupUi(this); setWindowTitle(tr("Documents Indexing Log - cb2Bib")); ui.Log->setFont(c2bSettingsP->c2bMonoFont); ui.Log->setLineWrapMode(QPlainTextEdit::NoWrap); _buttonAbort = new QPushButton(tr("Abort")); ui.buttonBox->addButton(_buttonAbort, QDialogButtonBox::ActionRole); connect(_buttonAbort, SIGNAL(clicked()), this, SLOT(aborted())); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); resize(c2bSettingsP->value("c2bLogWidget/size", size()).toSize()); } c2bCollectionIndex::~c2bCollectionIndex() { c2bSettingsP->setValue("c2bLogWidget/size", size()); } void c2bCollectionIndex::index() { ui.Log->clear(); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(false); _indexerP = new QProcess(this); _indexerP->setProcessChannelMode(QProcess::MergedChannels); connect(_indexerP, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(indexingEnded(int, QProcess::ExitStatus))); connect(_indexerP, SIGNAL(readyReadStandardOutput()), this, SLOT(addToLog())); const QStringList flags(QStringList() << "--index" << c2bSettingsP->confCommandFlags()); _indexerP->start(QCoreApplication::applicationFilePath(), flags); if (!_indexerP->waitForStarted()) { ui.Log->appendPlainText(tr("Failed to call %1.").arg(QCoreApplication::applicationFilePath())); _buttonAbort->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); delete _indexerP; _indexerP = 0; } } void c2bCollectionIndex::addToLog() { const QString log(QString::fromUtf8(_indexerP->readAllStandardOutput().trimmed())); if (log.isEmpty()) return; ui.Log->appendPlainText(log); } void c2bCollectionIndex::indexingEnded(int exit_code, QProcess::ExitStatus exit_status) { _buttonAbort->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); if (exit_code == 0 && exit_status == QProcess::NormalExit) ui.Log->appendPlainText(tr("\nIndexing ended\nRefresh cb2Bib Citer")); else ui.Log->appendPlainText(tr("\nAbnormal termination")); delete _indexerP; _indexerP = 0; } void c2bCollectionIndex::aborted() { if (_indexerP) _indexerP->kill(); ui.Log->appendPlainText(tr("Aborting...")); } void c2bCollectionIndex::closeEvent(QCloseEvent* qevent) { if (!_indexerP || _indexerP->state() == QProcess::NotRunning) QDialog::closeEvent(qevent); else qevent->ignore(); } void c2bCollectionIndex::reject() { if (!_indexerP || _indexerP->state() == QProcess::NotRunning) QDialog::reject(); } void c2bCollectionIndex::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2bciter.php"); } �������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bConsole.cpp���������������������������������������������������������������������0000644�0001750�0001750�00000005222�12045520050�016054� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bConsole.h" #include "c2bSettings.h" #include "c2bTests.h" #include "c2bNetworkQuery.h" #include <bibExtractor.h> #include <bibParser.h> #include <collectionIndex.h> #include <metadataParser.h> #include <texToHtml.h> #include <QCoreApplication> #include <QTimer> c2bConsole::c2bConsole(QObject* parento) : QObject(parento) {} c2bConsole::~c2bConsole() {} void c2bConsole::load() { // Send _process to application cue QTimer::singleShot(0, this, SLOT(_process())); } void c2bConsole::_process() { int code(0); if (c2bSettingsP->cl_html_annote) code = cl_html_annote(); else if (c2bSettingsP->cl_doc2bib) code = cl_doc2bib(); else if (c2bSettingsP->cl_txt2bib) code = cl_txt2bib(); else if (c2bSettingsP->cl_index) code = cl_index(); else if (c2bSettingsP->cl_cb2bib_tests) code = cl_cb2bib_tests(); QCoreApplication::exit(code); } int c2bConsole::cl_html_annote() { if (QFileInfo(c2bSettingsP->cl_annote_filename).exists()) { const QString tex(c2bUtils::fileToString(c2bSettingsP->cl_annote_filename)); const QString htmlf(c2bSettingsP->cl_annote_filename + ".html"); texToHtml t2h; t2h.toHtml(tex, htmlf); return 0; } else { c2bUtils::warn(QObject::tr("Error: Could not open %1 file for reading").arg(c2bSettingsP->cl_annote_filename)); return 1; } } int c2bConsole::cl_doc2bib() { bibParser bp; metadataParser mp(&bp); c2bNetworkQuery nq(&bp); // needs c2bUtils::fromHtmlString bibExtractor be(&bp, &mp, &nq); const int c(be.extract(c2bSettingsP->cl_extract_input_filenames, c2bSettingsP->cl_extract_output_filename, bibExtractor::Document)); return c; } int c2bConsole::cl_txt2bib() { bibParser bp; metadataParser mp(&bp); c2bNetworkQuery nq(&bp); bibExtractor be(&bp, &mp, &nq); const int c(be.extract(c2bSettingsP->cl_extract_input_filenames, c2bSettingsP->cl_extract_output_filename, bibExtractor::PlainText)); return c; } int c2bConsole::cl_index() { bibParser bp; collectionIndex ci(&bp); const int c(ci.index(c2bSettingsP->cl_index_dirname)); return c; } int c2bConsole::cl_cb2bib_tests() { c2bTests* t = new c2bTests(); const int passed(t->allTests()); delete t; return passed; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bAnnote.cpp����������������������������������������������������������������������0000644�0001750�0001750�00000012056�12045520050�015701� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bAnnote.h" #include "c2b.h" #include "c2bSettings.h" #include "c2bUtils.h" #include "c2bWebBrowser.h" #include <texToHtml.h> #include <QFileSystemWatcher> #include <QLabel> #include <QMessageBox> #include <QShortcut> #include <QStatusBar> c2bAnnote::c2bAnnote(QWidget* parentw) : QMainWindow(parentw) { _view_port = new c2bWebBrowser(this); setCentralWidget(_view_port); QLabel* informationLabel = new QLabel(this); statusBar()->addWidget(informationLabel, 1); connect(_view_port, SIGNAL(titleChanged(const QString&)), this, SLOT(setWindowTitle(const QString&))); connect(_view_port, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); // Creating cb2Bib global resources c2b* c2b_resources = new c2b(this, this); connect(c2b_resources, SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); QAction* act = new QAction(QIcon(QString::fromUtf8(":/icons/icons/edit.png")), tr("Edit Note"), this); act->setShortcut(QKeySequence(Qt::Key_E)); act->setStatusTip(tr("Edit TeX note")); c2bUtils::addSeparator(_view_port); _view_port->addAction(act); connect(act, SIGNAL(triggered()), this, SLOT(edit())); act = new QAction(QIcon(QString::fromUtf8(":/icons/icons/configure.png")), tr("Configure"), this); act->setShortcut(QKeySequence(Qt::Key_C)); act->setStatusTip(tr("Configure cb2Bib Annote")); c2bUtils::addSeparator(_view_port); _view_port->addAction(act); connect(act, SIGNAL(triggered()), this, SLOT(configure())); _settingsP = c2bSettingsP; resize(_settingsP->value("c2bAnnote/size", size()).toSize()); move(_settingsP->value("c2bAnnote/position", pos()).toPoint()); loadSettings(); connect(_settingsP, SIGNAL(newSettings()), this, SLOT(loadSettings())); _t2h = new texToHtml; _fsw = new QFileSystemWatcher(this); connect(_fsw, SIGNAL(fileChanged(const QString&)), this, SLOT(annote())); disconnect(_view_port->viewReloadAction, 0, 0, 0); connect(_view_port->viewReloadAction, SIGNAL(triggered()), this, SLOT(update())); QShortcut* help_shortcut = new QShortcut(QKeySequence(QKeySequence::HelpContents), this); connect(help_shortcut, SIGNAL(activated()), this, SLOT(help())); } c2bAnnote::~c2bAnnote() { delete _t2h; _settingsP->setValue("c2bAnnote/position", pos()); _settingsP->setValue("c2bAnnote/size", size()); } bool c2bAnnote::show() { _annote_filename = QDir::cleanPath(_settingsP->cl_annote_filename); const bool is_html = _annote_filename.endsWith(".html"); if (is_html) _annote_filename.remove(QRegExp("\\.html$")); if (!QFileInfo(_annote_filename).exists()) { QMessageBox::warning(this, tr("Warning - cb2Bib"), tr("Unable to open the file %1 for reading.\nError: '%2'."). arg(QDir::toNativeSeparators(_annote_filename)).arg("File does not exist"), QMessageBox::Ok); return false; } _html_filename = _annote_filename + ".html"; if (!is_html || !QFileInfo(_html_filename).exists()) _t2h->toHtml(c2bUtils::fileToString(_annote_filename), _html_filename); _view_port->setHomePage(_html_filename); _fsw->addPath(_annote_filename); QMainWindow::show(); return true; } void c2bAnnote::annote() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); _t2h->toHtml(c2bUtils::fileToString(_annote_filename), _html_filename); if (_html_filename == QDir::cleanPath(_view_port->url().toLocalFile())) _view_port->reload(); QApplication::restoreOverrideCursor(); } void c2bAnnote::update() { if (_html_filename == QDir::cleanPath(_view_port->url().toLocalFile())) annote(); else _view_port->reload(); } void c2bAnnote::edit() { c2bUtils::openFile(_annote_filename, this); } void c2bAnnote::configure() { // Attention: Currently c2bAnnote is page 0. Update here if c2bConfigure changes page ordering. c2b::configure(0); } void c2bAnnote::setWindowTitle(const QString& title) { if (title.isEmpty()) QMainWindow::setWindowTitle("Annote - cb2Bib"); else QMainWindow::setWindowTitle(title + " - cb2Bib"); if (title == "New Note") showMessage(tr("Press E to Edit and %1 for Help.").arg(QKeySequence(QKeySequence::HelpContents).toString())); } void c2bAnnote::showMessage(const QString& ms) { statusBar()->showMessage(ms, C2B_MESSAGE_TIME); } void c2bAnnote::loadSettings() { _view_port->setFont(_settingsP->value("c2bAnnote/Font").value<QFont>()); _view_port->setFixedFont(_settingsP->value("c2bAnnote/FixedFont").value<QFont>()); } void c2bAnnote::help() { c2bUtils::displayHelp("http://www.molspaces.com/cb2bib/annote.tex.html"); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bPdfImport.cpp�������������������������������������������������������������������0000644�0001750�0001750�00000051614�12045520050�016364� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bPdfImport.h" #include "c2b.h" #include "c2bFileDialog.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <document.h> #include <QDropEvent> #include <QPushButton> #include <QTimer> #include <QUrl> /** \page c2bpdfimport PDF Reference Import Articles in PDF or other formats that can be converted to plain text can be processed and indexed by the cb2Bib. Files can be selected using the Select Files button, or dragging them from the desktop or the file manager to the PDFImport dialog panel. Files are converted to plain text by using any external translation tool or script. This tool, and optionally its parameters, are set in the cb2Bib configure dialog. See the \ref c2bconf_utilities section for details. Once the file is converted, the text, and optionally, the preparsed metadata, is sent to the cb2Bib for reference recognition. This is the usual, two step process. First, text is optionally preprocessed, using a simple set of rules and/or any external script.or tool. See \ref c2bconf_clipboard. Second, text is processed for reference extraction. The cb2Bib so far uses two methods. One considers the text as a full pattern, which is checked against the user's set of regular expressions. The better designed are these rules, the best and most reliable will be the extraction. The second method, used when no regular expression matches the text, considers instead a set of predefined subpatterns. See \ref heuristicguess. At this point users can interact and supervise their references, right before saving them. Allowing user intervention is and has been a design goal in the cb2Bib. Thus, at this point, the cb2Bib invites users to check their references. Poorly translated characters, accented letters, 'forgotten' words, or some minor formatting in the titles might be worth considering. See \htmlonly <a href="http://www.glyphandcog.com/textext.html" target="_blank">Text Extraction</a> \endhtmlonly for a description on the intricacies of PDF to text conversions. In addition, if too few fields were extracted, one might perform a network query. Say, only the DOI was catch, then there are chances that such a query will fill the remaining fields. The references are saved from the cb2Bib main panel. Once Save is pressed, and depending on the configuration, see \ref c2bconf_documents, the document file will be either renamed, copied, moved or simply linked onto the <tt>file</tt> field of the reference. If <b>Insert BibTeX metadata to document files</b> is checked, the current reference will also be inserted into the document itself. When several files are going to be indexed, the sequence can be as follows: - <b>Process next after saving</b>\n Once files are load and Process is pressed, the PDFImport dialog can be minimized (but not closed) for convenience. All required operations to completely fill the desired fields (e.g. dynamic bookmarks, open DOI, etc, which might be required if the data in document is not complete) are at this point accessible from the main panel. The link in the <b><tt>file</tt> field will be permanent</b>, without regard to which operations (e.g. clipboard copying) are needed, until the reference is saved. The source file can be open at any time by right clicking the <tt>file</tt> line edit. Once the reference is saved, the next file will be automatically processed. To skip a given document file from saving its reference, press the Process button. - <b>Unsupervised processing</b>\n In this operation mode, all files will be sequentially processed, following the chosen steps and rules. <b>If the processes is successful</b>, the reference is automatically saved, and the next file is processed. <b>If it is not</b>, the file is skipped and no reference is saved. While processing, the clipboard is disabled for safety. Once finished, this box is unchecked, to avoid a possible accidental saving of a void reference. Network queries that require intervention, i.e., whose result is launching a given page, are skipped. The processes follows until all files are processed. However, it will stop to avoid a file being overwritten, as a result of a repeated key. In this case, it will resume after manual renaming and saving. See also \ref commandline, commands '--txt2bib' and '--doc2bib'. <p> </p> \section faq_automatic_extraction Automatic Extraction: Questions and Answers - <b>When does cb2Bib do automatic extractions?</b> The cb2Bib is conceived as a lightweight tool to extract references and manage bibliographies in a simple, fast, and accurate way. Accuracy is better achieved in semi-automatic extractions. Such extractions are handy, and allow user intervention and verification. However, in cases where one has accumulated a large number of unindexed documents, automatic processing can be convenient. The cb2Bib does automatic extraction when, in PDFImport mode, 'Unsupervised processing' is checked, or, in command line mode, when typing <tt>cb2bib --doc2bib *.pdf tmp_references.bib</tt>, or, on Windows, <tt>c2bconsole.exe</tt> instead of <tt>cb2bib</tt>. - <b>Are PDFImport and command line modes equivalent?</b> Yes. There are, however, two minor differences. First, PDFImport adds each reference to the current BibTeX file, as this behavior is the normal one in cb2Bib. On the other hand, command line mode will, instead, overwrite <tt>tmp_references.bib</tt> if it exists, as this is the expected behavior for almost all command line tools. Second, as for now, command line mode does not follow the configuration option 'Check Repeated On Save'. - <b>How do I do automatic extraction?</b> To test and learn about automatic extractions, the cb2Bib distribution includes a set of four PDF files that mimic a paper title page. For these files, distribution also includes a regular expression, in file <tt>regexps.txt</tt>, capable of extracting the reference fields, provided the <tt>pdftotex</tt> flags are set to their default values. Processing these files, should, therefore, be automatic, and four messages stating <tt>Processed as 'PDF Import Example'</tt> should be seen in the logs. Note that extractions are configurable. A reading of \ref c2bconf will provide additional, useful information. - <b>Why some entries are not saved and files not renamed?</b> Once you move from the fabricated examples to real cases, you will realize that some of the files, while being processed, are not renamed and their corresponding BibTeX data is not written. For each document file, cb2Bib converts its first page to text, and from this text it attempts to extract the bibliographic reference. By design, when extraction fails, cb2Bib does nothing: no file is moved, no BibTeX is written. This way, you know that the remaining files in the origin directory need special, manual attention. <b>Extractions are always seen as failed, unless reliable data is found in the text</b>. - <b>What is <em>reliable data</em>?</b> Note that computer processing of natural texts, as extracting the bibliographic data from a title page, is nowadays an approximated procedure. The cb2Bib tries several strategies: <b>1)</b> allow for including user regular expressions very specific to the extraction at hand, <b>2)</b> use metadata if available, <b>3)</b> guess what is reasonable, and, based on this, make customized queries. Then, cb2Bib considers extracted <b>data is reliable if i)</b> data comes from a match to an user supplied regular expression <b>ii)</b> document contains BibTeX metadata, or <b>iii)</b> a guess is transformed through a query to formatted bibliographic data. As formatted bibliographic data, cb2Bib only understands BibTeX, and, as an exception, PubMed XML data. However, it allows external processing if needed. Any other data, metadata, guesses, and guesses on query results are considered unreliable data. - <b>Is metadata reliable data?</b> No. Only author, title, and keywords in standard PDF metadata can be mapped to their corresponding bibliographic fields. Furthermore, publishers most often misuse these three keys, placing, for instance, DOI in title, or setting author to, perhaps, the document typesetter. Only BibTeX XMP metadata is considered reliable, and only documents already processed with cb2Bib or JabRef will have it. If you consider that a set of PDF files does contain reliable data, you may force to accept it using the command line switch <tt>--sloppy</tt> together with <tt>--doc2bib</tt>. - <b>How successful is automatic extraction?</b> As it follows from the given definition of reliable data, running automatic extractions without adhoc <tt>regexps.txt</tt> and <tt>netqinf.txt</tt> files will certainly give a zero success ratio. In practice, scenario 3) often applies: cb2Bib guesses several fields, and, based on the out-of-the-box <tt>netqinf.txt</tt> file, it obtains from the web either BibTeX or PubMed XML data. Thus, biologists, for instance, usually have success ratios close to 100%, since PubMed is almost complete for them, and its data is extremely accurate. - <b>What can I do to increase success ratio?</b> First, set your favorite journals in file <tt>abbreviations.txt</tt>. Besides increasing the chances of journal name recognition, it will provide consistency across your BibTeX database. In general, do not write regular expressions to extract directly from the PDF text. Conversion is often poor. Special characters often break lines, thus breaking your regular expressions too. Write customized queries. For instance, if your PDFs have DOI in title page, set the simple query \verbatim journal=The Journal of Everything| query=http://dx.doi.org/<<doi>> capture_from_query= referenceurl_prefix= referenceurl_sufix= pdfurl_prefix= pdfurl_sufix= action=htm2txt_query \endverbatim then, if it is feasible to extract the reference from the document's web page using a regular expression, include it in file <tt>regexps.txt</tt>. Note that querying in cb2Bib had been designed having in mind minority fields of research, for which, established databases might not be available. If cb2Bib failed to make reasonable guesses, then, you might consider writing very simple regular expressions to extract directly from the PDF text. For instance, obtain title only. Then, the posterior query step can provide the remaining information. Note also, especially for old documents, journal name is often missing from the paper title page. If in need of processing a series of those papers, consider using a simple script, that, in the cb2Bib preprocessing step, adds this missing information. - <b>Does successful extraction mean accurate extraction?</b> No. An extraction is successful if reliable data, as defined above, is found in the text, in the metadata, or in the text returned by a query. Reference accuracy relies on whether or not user regular expressions are robust, BibTeX metadata is correct, a guess is appropriate, a set of queries can correct a partially incorrect guess, and the text returned by a query is accurate. In general, well designed sets of regular expressions are accurate. Publisher's abstract pages and PubMed are accurate. But, some publishers are still using images for non-ASCII characters, and PubMed algorithms may drop author middle names if a given author has 'too many names'. Expect convenience over accuracy on other sources. - <b>Can I use cb2Bib to extract comma separated value CSV references?</b> Yes. To automatically import multiple CSV references you will need one regular expression. If you can control CSV export, choose | as separator, since comma might be used, for instance, in titles. The regular expression for \verbatim AuthName1, AuthName2 | Title | 2010 \endverbatim will simply be \verbatim author title year ^([^|]*)\|([^|]*)\|([^|]*)$ \endverbatim The reference file <tt>references.csv</tt> can then be split to single-line files typing \verbatim split -l 1 references.csv slineref \endverbatim and the command \verbatim cb2bib --txt2bib slineref* references.bib rm -f slineref* \endverbatim will convert <tt>references.csv</tt> to BibTeX file <tt>references.bib</tt> <p> </p> */ c2bPdfImport::c2bPdfImport(QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); settings = c2bSettingsP; loadSettings(); buttonSelectFiles = new QPushButton(tr("&Select Files")); buttonSelectFiles->setStatusTip(tr("Select PDF files. Hint: Files can also be dragged and dropped to this window")); buttonSelectFiles->setMouseTracking(true); ui.buttonBox->addButton(buttonSelectFiles, QDialogButtonBox::ActionRole); buttonProcess = new QPushButton(tr("&Process")); ui.buttonBox->addButton(buttonProcess, QDialogButtonBox::ActionRole); ui.buttonBox->button(QDialogButtonBox::Help)->setAutoDefault(false); buttonProcess->setAutoDefault(true); buttonProcess->setDefault(true); buttonProcess->setEnabled(false); buttonSelectFiles->setAutoDefault(true); buttonSelectFiles->setDefault(true); buttonSelectFiles->setFocus(); ui.buttonBox->button(QDialogButtonBox::Abort)->setAutoDefault(false); ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(false); m_aborted = false; connect(ui.buttonBox->button(QDialogButtonBox::Abort), SIGNAL(clicked()), this, SLOT(abort())); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); connect(buttonSelectFiles, SIGNAL(clicked()), this, SLOT(selectFiles())); connect(buttonProcess, SIGNAL(clicked()), this, SLOT(processOneFile())); connect(ui.DoAll, SIGNAL(toggled(bool)), this, SIGNAL(setClipboardDisabled(bool))); connect(c2b::instance(), SIGNAL(statusMessage(const QString&)), this, SLOT(showMessage(const QString&))); ui.Log->appendPlainText(tr("PDF to Text converter: %1\nArguments: %2\n"). arg(settings->fileName("c2bPdfImport/Pdf2TextBin")). arg(settings->value("c2bPdfImport/Pdf2TextArg").toString())); showMessage(tr("See cb2Bib install directory for demo c2bPdfImport files.")); } c2bPdfImport::~c2bPdfImport() { emit setClipboardDisabled(false); saveSettings(); } void c2bPdfImport::processOneFile() { // Converting PDF to Text buttonProcess->setEnabled(false); m_aborted = false; ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(ui.DoAll->isChecked()); settings->setValue("networkQuery/isSupervised", !ui.DoAll->isChecked()); settings->setValue("cb2Bib/AutomaticQuery", ui.AutomaticQuery->isChecked()); if (ui.PDFlist->currentItem() == 0) return; processedFile = ui.PDFlist->currentItem()->text(); if (ui.OpenFiles->isChecked()) c2bUtils::openFile(processedFile, this); QCoreApplication::processEvents(); processDocument(); } void c2bPdfImport::processNext() { processedFile.clear(); if (m_aborted) { m_aborted = false; return; } if (ui.PDFlist->currentItem() == 0) return; if (ui.DoNextAfterSaving->isChecked() || ui.DoAll->isChecked()) processOneFile(); } void c2bPdfImport::processDocument() { document doc(processedFile, document::FirstPage); QString text(doc.toString()); const QString log(doc.logString()); if (!log.isEmpty()) ui.Log->appendPlainText(log); const QString error(doc.errorString()); if (!error.isEmpty()) ui.Log->appendPlainText(tr("[cb2bib] %1.").arg(error)); QListWidgetItem* item = ui.PDFlist->currentItem(); delete item; if (ui.PDFlist->currentItem() == 0) { buttonProcess->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); } else { buttonProcess->setEnabled(true); buttonProcess->setFocus(); } QString metadata; if (settings->value("cb2Bib/AddMetadata").toBool()) metadata = c2b::documentMetadata(processedFile); if (text.isEmpty() && metadata.isEmpty()) { if (ui.DoAll->isChecked()) QTimer::singleShot(500, this, SLOT(processNext())); } else { if (settings->value("cb2Bib/PreAppendMetadata").toString() == "prepend") text = metadata + text; else text = text + '\n' + metadata; ui.Log->appendPlainText(tr("[cb2bib] Conversion completed for file %1.").arg(processedFile)); emit textProcessed(text); emit fileProcessed(processedFile); } } void c2bPdfImport::referenceExtacted(bool status) { if (!ui.DoAll->isChecked()) return; if (ui.PDFlist->currentItem() == 0) { ui.DoAll->setChecked(false); ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(false); } // Delay request to make sure fileProcessed has finished if (status) QTimer::singleShot(500, this, SIGNAL(saveReferenceRequest())); else QTimer::singleShot(500, this, SLOT(processNext())); } void c2bPdfImport::dropEvent(QDropEvent* qevent) { QList<QUrl> fns(qevent->mimeData()->urls()); for (int i = 0; i < fns.count(); i++) { QString scheme(fns.at(i).scheme()); QString fn; if (scheme == "file") fn = fns.at(i).toLocalFile(); if (!fn.isEmpty()) { QListWidgetItem* item = new QListWidgetItem(fn, ui.PDFlist); if (ui.PDFlist->currentItem() == 0) ui.PDFlist->setCurrentItem(item); } } qevent->acceptProposedAction(); c2bUtils::setWidgetOnTop(this); buttonProcess->setEnabled(true); buttonProcess->setFocus(); showMessage(tr("%1 files selected.").arg(ui.PDFlist->count())); } void c2bPdfImport::dragEnterEvent(QDragEnterEvent* qevent) { if (qevent->mimeData()->hasUrls()) qevent->acceptProposedAction(); } bool c2bPdfImport::event(QEvent* qevent) { if (qevent->type() == QEvent::StatusTip) { ui.statusBar->showMessage(static_cast<QStatusTipEvent*>(qevent)->tip()); return true; } else return QWidget::event(qevent); } void c2bPdfImport::selectFiles() { QStringList fns(c2bFileDialog::getOpenFilenames(this, QString(), settings->fileName("c2bPdfImport/LastFile"), tr("Portable Document Format (*.pdf);;All (*)"))); if (fns.isEmpty()) return; settings->setFilename("c2bPdfImport/LastFile", fns.last()); QStringList::Iterator it = fns.begin(); while (it != fns.end()) { QListWidgetItem* item = new QListWidgetItem(*it, ui.PDFlist); if (ui.PDFlist->currentItem() == 0) ui.PDFlist->setCurrentItem(item); ++it; } buttonProcess->setEnabled(true); buttonProcess->setFocus(); showMessage(tr("%1 files selected.").arg(ui.PDFlist->count())); } void c2bPdfImport::show() { c2bUtils::setWidgetOnTop(this); if (buttonProcess->isEnabled()) buttonProcess->setFocus(); else buttonSelectFiles->setFocus(); QDialog::show(); } void c2bPdfImport::showMessage(const QString& ms) { ui.statusBar->showMessage(ms, C2B_MESSAGE_TIME); if (ms.startsWith(tr("Processed as")) || ms.startsWith(tr("Unable"))) ui.Log->appendPlainText("[cb2bib] " + ms); } void c2bPdfImport::loadSettings() { c2bAutomaticQuery = settings->value("cb2Bib/AutomaticQuery").toBool(); ui.AutomaticQuery->setChecked(settings->value("c2bPdfImport/AutomaticQuery").toBool()); ui.DoNextAfterSaving->setChecked(settings->value("c2bPdfImport/DoNextAfterSaving", true).toBool()); ui.OpenFiles->setChecked(settings->value("c2bPdfImport/OpenFiles", false).toBool()); } void c2bPdfImport::saveSettings() { settings->setValue("c2bPdfImport/AutomaticQuery", ui.AutomaticQuery->isChecked()); settings->setValue("c2bPdfImport/DoNextAfterSaving", ui.DoNextAfterSaving->isChecked()); settings->setValue("c2bPdfImport/OpenFiles", ui.OpenFiles->isChecked()); settings->setValue("cb2Bib/AutomaticQuery", c2bAutomaticQuery); settings->setValue("networkQuery/isSupervised", true); } void c2bPdfImport::abort() { m_aborted = true; ui.DoAll->setChecked(false); ui.buttonBox->button(QDialogButtonBox::Abort)->setEnabled(false); } void c2bPdfImport::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2bpdfimport.php"); } ��������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bColors.h������������������������������������������������������������������������0000644�0001750�0001750�00000002225�12045520050�015360� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCOLORS_H #define C2BCOLORS_H #include <QColor> #include <QHash> class c2bSettings; /** cb2Bib Color Scheme */ class c2bColors { public: c2bColors(); ~c2bColors(); QColor bib_delimiter_color; QColor bib_reference_field_color; QColor bib_reference_type_color; QColor cb2bib_digit_color; QColor cb2bib_highly_relevant_color; QColor cb2bib_metadata_color; QColor cb2bib_relevant_color; QColor cb2bib_tag_color; QColor cb2bib_unrelevant_color; QColor comment_color; QColor netqinf_command_content_color; QColor netqinf_command_key_color; QHash<QString, QColor*> colorList; void loadColors(c2bSettings* settings); void saveColors(c2bSettings* settings); void updateColor(const QColor& color, const QString& colorName); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2b.cpp����������������������������������������������������������������������������0000644�0001750�0001750�00000010460�12045520050�014531� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2b.h" #include "c2bClipboard.h" #include "c2bConfigure.h" #include "ui_proxyDialog.h" #include <QAuthenticator> #include <QMessageBox> #include <QNetworkProxy> #include <QProgressDialog> /** Global resources for the cb2Bib */ c2b::c2b(QWidget* main, QObject* parento) : QObject(parento) { Q_ASSERT_X(!_c2b_single_instance, "c2b", "cb2Bib resources already instantiated"); c2b::_c2b_single_instance = this; _c2b_main = main; if (_c2b_main->inherits("cb2Bib")) { // Create bibliographic parser _c2b_bibparser = new c2bBibParser(this); // Create cb2Bib network _c2b_network = new network(this); connect(_c2b_network, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)), this, SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*))); connect(_c2b_network, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateDownloadProgress(qint64, qint64))); _download_progress = new QProgressDialog(_c2b_main); _download_progress->setWindowTitle("cb2Bib"); connect(_download_progress, SIGNAL(canceled()), _c2b_network, SLOT(cancelDownload())); // Create cb2Bib network query info _c2b_netqinf = new c2bNetworkQueryInfo(this); // Create cb2Bib metadata parser _c2b_metadataparser = new metadataParser(_c2b_bibparser, this); connect(_c2b_metadataparser, SIGNAL(showMessage(const QString&, const QString&)), this, SLOT(showMessage(const QString&, const QString&))); // Create cb2Bib clipboard _c2b_clipboard = new c2bClipboard(this); _c2b_clipboard->setConnected(true); } else if (_c2b_main->inherits("c2bAnnote")) { // Nothing is needed at present for the c2bAnnote } else Q_ASSERT_X(false, "c2b", "unknown required resources for main"); } c2b::~c2b() { _c2b_single_instance = 0; } c2b* c2b::_c2b_single_instance = 0; void c2b::showMessage(const QString& title, const QString& ms) { QMessageBox::warning(_c2b_main, title, ms, QMessageBox::Ok); } void c2b::configure(int index) { c2bConfigure* c = new c2bConfigure(); if (index > -1) c->setPage(index); if (c->exec() == QDialog::Accepted) showMessage(tr("Configuration was saved.")); else showMessage(tr("Configuration was cancelled.")); delete c; } void c2b::exitRequested() { foreach(QWidget * w, QApplication::topLevelWidgets()) { // So far only editors grant user exit cancellation // Avoid closing other visible widgets until exit is granted if (w->isVisible()) if (w->inherits("c2bEditor")) w->close(); } qApp->processEvents(); foreach(QWidget * widget, QApplication::topLevelWidgets()) { if (widget->isVisible()) if (widget->inherits("c2bEditor")) return; } qApp->closeAllWindows(); qApp->processEvents(); if (!qApp->quitOnLastWindowClosed()) qApp->quit(); } void c2b::updateDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { if (bytesTotal < 50000) return; if (bytesReceived == bytesTotal) { _download_progress->reset(); return; } _download_progress->setLabelText(tr("Retrieving from %1...").arg(QUrl(_c2b_network->sourceFilename()).host())); _download_progress->setMaximum((int)bytesTotal); _download_progress->setValue((int)bytesReceived); } void c2b::proxyAuthenticationRequired(const QNetworkProxy& proxy, QAuthenticator* auth) { QDialog dialog(_c2b_main); Ui::proxyDialog proxyDialog; proxyDialog.setupUi(&dialog); dialog.setWindowTitle(tr("Proxy %1 Authentication - cb2Bib").arg(proxy.hostName())); if (dialog.exec() == QDialog::Accepted) { auth->setUser(proxyDialog.userNameLineEdit->text()); auth->setPassword(proxyDialog.passwordLineEdit->text()); } else _c2b_network->cancelDownload(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bUpdateMetadata.cpp��������������������������������������������������������������0000644�0001750�0001750�00000015574�12045520050�017350� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bUpdateMetadata.h" #include "c2b.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <QPushButton> #include <QTimer> c2bUpdateMetadata::c2bUpdateMetadata(QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); setWindowTitle(tr("Documents Updating Log - cb2Bib")); ui.Log->setFont(c2bSettingsP->c2bMonoFont); ui.Log->setLineWrapMode(QPlainTextEdit::NoWrap); _buttonAbort = new QPushButton(tr("Abort")); ui.buttonBox->addButton(_buttonAbort, QDialogButtonBox::ActionRole); connect(_buttonAbort, SIGNAL(clicked()), this, SLOT(aborted())); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); resize(c2bSettingsP->value("c2bLogWidget/size", size()).toSize()); _bpP = c2b::bibParser(); } c2bUpdateMetadata::~c2bUpdateMetadata() { c2bSettingsP->setValue("c2bLogWidget/size", size()); } void c2bUpdateMetadata::update(const QString& fn, const QString& bibtex) { ui.Log->clear(); _fn = fn; _bibtex = bibtex; QTimer::singleShot(500, this, SLOT(update())); QDialog::exec(); } void c2bUpdateMetadata::update() { ui.Log->appendPlainText(tr("[cb2bib] Updating documents metadata...\n")); const QString exiftool_bin(c2bSettingsP->fileName("cb2Bib/ExifToolBin")); if (exiftool_bin.isEmpty()) { ui.Log->appendPlainText(tr("[cb2bib] ExifTool location has not been specified.")); return ; } const QFileInfo exiftool_bin_fi(exiftool_bin); if (exiftool_bin_fi.isAbsolute()) if (!exiftool_bin_fi.exists()) { ui.Log->appendPlainText(tr("[cb2bib] ExifTool file %1 does not exist.").arg(exiftool_bin)); return; } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(false); _buttonAbort->setEnabled(true); _buttonAbort->setFocus(); _aborted = false; ui.Log->appendPlainText(tr("[cb2bib] Processing file %1...\n").arg(_fn)); int doc_counter(0); int error_counter(0); int updated_counter(0); metadataParser* mp = c2b::metaParser(); bibReference ref; _bpP->initReferenceParsing(_fn, _bpP->bibliographicFields(), &ref); while (_bpP->referencesIn(_bibtex, &ref) && !_aborted) { QCoreApplication::processEvents(); const QString file(ref.value("file")); if (file.isEmpty()) { ui.Log->appendPlainText(tr("[cb2bib] %1: No file in reference.").arg(ref.citeidName)); continue; } QFileInfo fi(file); if (!fi.exists()) { ui.Log->appendPlainText(tr("[cb2bib] %1: Warning: File %2 does not exist.").arg(ref.citeidName).arg(file)); continue; } ++doc_counter; bibReference mref; if (mp->metadata(file, &mref)) if (!needsUpdating(ref, mref)) continue; if (!fi.isWritable()) { ++error_counter; ui.Log->appendPlainText(tr("[cb2bib] %1: Error: File %2 is not writable.").arg(ref.citeidName).arg(file)); continue; } QString error_str; if (mp->insertMetadata(ref, file, &error_str)) { if (mp->metadata(file, &mref)) if (!needsUpdating(ref, mref)) { ++updated_counter; ui.Log->appendPlainText(tr("[cb2bib] %1: File %2 successfully updated.").arg(ref.citeidName).arg(file)); continue; } ++error_counter; ui.Log->appendPlainText(tr("[cb2bib] %1: Warning: File %2 was not properly updated.").arg(ref.citeidName).arg(file)); writeDifferences(ref, mref); } else { ++error_counter; ui.Log->appendPlainText(tr("[cb2bib] %1: Error: File %2 could not be updated.").arg(ref.citeidName).arg(file)); ui.Log->appendPlainText(tr("[exiftool] '%1'.").arg(error_str)); } QCoreApplication::processEvents(); } QApplication::restoreOverrideCursor(); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); _buttonAbort->setEnabled(false); ui.Log->appendPlainText(tr("\n[cb2bib] Checked %1 documents.").arg(doc_counter)); if (doc_counter > 0 && updated_counter == 0 && error_counter == 0) ui.Log->appendPlainText(tr("[cb2bib] Documents Metadata was up to date.")); else ui.Log->appendPlainText(tr("[cb2bib] Updated %1 documents.").arg(updated_counter)); if (error_counter > 0) ui.Log->appendPlainText(tr("[cb2bib] Found %1 errors.").arg(error_counter)); c2b::showMessage(tr("Updated %1 documents.").arg(updated_counter)); } bool c2bUpdateMetadata::needsUpdating(const bibReference& ref, const bibReference& mref) { if (ref.typeName != mref.typeName) return true; const QStringList& bibliographicFields = _bpP->bibliographicFields(); for (int i = 0; i < bibliographicFields.count(); ++i) { const QString key(bibliographicFields.at(i)); if (key == "file") continue; else if (key == "id") continue; QString value(ref.value(key)); c2bUtils::fullBibToC2b(value); if (key == "title" || key == "booktitle") c2bUtils::cleanTitle(value); if (value != mref.value(key)) return true; } return false; } void c2bUpdateMetadata::writeDifferences(const bibReference& ref, const bibReference& mref) { QString diff(" [Key] '%1'\n [In Reference] '%2'\n [In Document] '%3'"); if (ref.typeName != mref.typeName) ui.Log->appendPlainText(diff.arg("type").arg(ref.typeName).arg(mref.typeName)); const QStringList& bibliographicFields = _bpP->bibliographicFields(); for (int i = 0; i < bibliographicFields.count(); ++i) { const QString key(bibliographicFields.at(i)); if (key == "file") continue; else if (key == "id") continue; QString value(ref.value(key)); c2bUtils::fullBibToC2b(value); if (key == "title" || key == "booktitle") c2bUtils::cleanTitle(value); if (value != mref.value(key)) ui.Log->appendPlainText(diff.arg(key).arg(value).arg(mref.value(key))); } } void c2bUpdateMetadata::aborted() { _aborted = true; _buttonAbort->setEnabled(false); ui.Log->appendPlainText(tr("\n\n[cb2bib] Aborted.\n")); } void c2bUpdateMetadata::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-c2beditor.php#update_metadata"); } ������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bTextEdit.h����������������������������������������������������������������������0000644�0001750�0001750�00000004717�12045520050�015661� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BTEXTEDIT_H #define C2BTEXTEDIT_H #include <QPlainTextEdit> class c2bSettings; class c2bTextEdit : public QPlainTextEdit { Q_OBJECT public: c2bTextEdit(QWidget* parentw = 0); ~c2bTextEdit(); QAction* convertSelection2LaTeXAction; QAction* convertSelection2UnicodeAction; QAction* journalsToAbbreviatedAction; QAction* journalsToFullAction; QAction* pasteCurrentBibTeXAction; QAction* toggleWordWrappingAction; QAction* updateMetadataAction; void setBibTeXActions(); void updatePlainText(const QString& text); inline const QString editorFilename() const { return _editor_filename; } void setEditorFilename(const QString& fn) { _editor_filename = fn; } signals: void overwriteModeChanged(); public slots: void toggleWordWrapping(); protected slots: void convert2LaTeX(); void convert2Unicode(); protected: void contextMenuEvent(QContextMenuEvent* qevent); void keyPressEvent(QKeyEvent* qevent); void resizeEvent(QResizeEvent* qevent); private: QColor _line_number_area_color; QColor* _line_number_color_p; QString _editor_filename; QWidget* _line_number_area; c2bSettings* _settingsP; int lineNumberAreaWidth(); void lineNumberAreaPaintEvent(QPaintEvent* qevent); private slots: void loadSettings(); void updateLineNumberAreaWidth(); void updateLineNumberArea(const QRect& qrect, int dy); friend class LineNumberArea; }; /*************************************************************************** * Line number area (From CodeEditor Qt's example) ***************************************************************************/ class LineNumberArea : public QWidget { public: LineNumberArea(c2bTextEdit* editor) : QWidget(editor) { _editor = editor; } ~LineNumberArea() {} QSize sizeHint() const { return QSize(_editor->lineNumberAreaWidth(), 0); } protected: void paintEvent(QPaintEvent* qevent) { _editor->lineNumberAreaPaintEvent(qevent); } private: c2bTextEdit* _editor; }; #endif �������������������������������������������������cb2bib-1.4.9/src/c2bIdLineEdit.h��������������������������������������������������������������������0000644�0001750�0001750�00000002752�12045520050�016076� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * Improvements and modifications: * July 2009 - Added <<author_all_abbreviated>>, (C) 2009 by Dayu Huang ***************************************************************************/ #ifndef C2BIDLINEEDIT_H #define C2BIDLINEEDIT_H #include "c2bLineEdit.h" class QAction; class QMenu; /** @author Pere Constans */ class c2bIdLineEdit : public c2bLineEdit { Q_OBJECT public: c2bIdLineEdit(QWidget* parentw = 0); ~c2bIdLineEdit(); void setDocumentIDEdit(); protected: QAction* a_author_all_abbreviated; QAction* a_author_all_initials; QAction* a_author_first; QAction* a_citeid; QAction* a_journal_initials; QAction* a_pages_first; QAction* a_ppages_first; QAction* a_reset; QAction* a_title; QAction* a_title_underscored; QAction* a_volume; QAction* a_year_abbreviated; QAction* a_year_full; protected slots: void author_all_abbreviated(); void author_all_initials(); void author_first(); void citeid(); void journal_initials(); void pages_first(); void ppages_first(); void reset(); void title(); void title_underscored(); void volume(); void year_abbreviated(); void year_full(); }; #endif ����������������������cb2bib-1.4.9/src/cb2Bib.h���������������������������������������������������������������������������0000644�0001750�0001750�00000007645�12045520050�014626� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef CB2BIB_H #define CB2BIB_H #include "ui_cb2Bib.h" #include <QHash> #include <QMainWindow> #include <QPointer> class bibSearcher; class c2bBibMenu; class c2bBibParser; class c2bCiterWidget; class c2bClipEdit; class c2bEditor; class c2bNetworkQuery; class c2bPdfImport; class c2bSearchInFiles; class c2bSettings; class c2bTextBrowser; class cb2Bib : public QMainWindow { Q_OBJECT public: cb2Bib(QWidget* parentw = 0); ~cb2Bib(); public slots: void show(); signals: void addedBibToFile(const QString&); void endedProcessing(bool status); private: QHash<QString, c2bEditor*> _openDocuments; QPointer<c2bPdfImport> _pdfImportP; QPointer<c2bSearchInFiles> _searchInFilesP; QString _dropped_document_file; QString _raw_input_data; QString _target_document_file; QString buttonStatusTip(const QString& ms, const QKeySequence& ks) const; Ui::cb2Bib ui; bool _connected; bool _is_check_repeated_done; bool _modified; bool _taggedViewMode; bool isReferenceRepeated(); c2bBibMenu* _bib_menu; c2bBibParser* _bpP; c2bCiterWidget* _citerP; c2bClipEdit* BibBrowser; c2bClipEdit* ClipEdit; c2bNetworkQuery* _netQP; c2bSettings* _settingsP; c2bTextBrowser* AboutBrowser; void c2bParse(const QString& text); void c2bPreparse(const QString& text); void closeEvent(QCloseEvent* qevent); void dragEnterEvent(QDragEnterEvent* qevent); void dropEvent(QDropEvent* qevent); void fileDroppedByUser(const QString& fn); void initAsBibTeXEditor(); void processingEnded(); void setBibMenu(); void setWidgetMapping(); void updateBibfile(const QString& fn); void updateViewButtons(); private slots: void abbreviationsEditor(); void addAuthors(); void addEditors(); void addMetadata(); void addToFile(bool ready); void anyPattern(); void bibEditor(const QString& bibtexfile, bibSearcher* searcher = 0); void bibModified(bool modified); void bookmarksEditor(); void c2bInit(); void checkRepeated(); void dataChanged(const QString& str); void deleteTmpBib(); void doSearchInFiles(const QString& string = QString(), const QString& fn = QString()); void fileDropped(const QString& fn); void forceDataChange(const QString& str); void guessFields(); void insertRegExp(); void linkClicked(const QUrl& ln); void loadSettings(); void makeNetQuery(); void netQueryEnded(bool succeeded, const QString& targetPDF, const QString& targetBib); void on_AddBibB_clicked(); void on_BibTeXDir_clicked(); void on_ConfigureB_clicked(); void on_ConnectB_clicked(); void on_EditBibTeXB_clicked(); void on_ExitB_clicked(); void on_MakeNetworkQueryB_clicked(); void on_PdfImportB_clicked(); void on_SearchInFilesB_clicked(); void on_ViewAboutB_clicked(); void on_ViewBibB_clicked(); void openAnnote(); void openFileDocument(); void postprocessBibTeX(); void preparseClipboard(); void readField(const QPoint& position); void regExpsEditor(); void restartEngine(); void savePattern(const QString& rx, const QString& rxname); void selectFile(); void setDocumentFilename(); void setTaggedClipEditMode(bool tagged); void setWindowTitle(const QString& title = QString()); void showLink(const QString& ln); void showMessage(const QString& ms); void toggleReferenceTabs(); void updateCheckRepeatedAction(); void updateOpenDocuments(QObject* obj); void updateOpenDocuments(const QString& old_name, const QString& new_name); }; #endif �������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bConfigure.h���������������������������������������������������������������������0000644�0001750�0001750�00000003670�12045520050�016045� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCONFIGURE_H #define C2BCONFIGURE_H #include "c2bColors.h" #include "ui_c2bConfigure.h" #include <QDialog> #include <QFontDatabase> class c2bSettings; class c2bConfigure : public QDialog { Q_OBJECT public: c2bConfigure(QWidget* parentw = 0); ~c2bConfigure(); void setPage(int index); protected slots: void FindReplaceDialog_Delete(); void FindReplaceDialog_Edit(); void FindReplaceDialog_New(); void accept(); void apply(); void changeContextColor(QTreeWidgetItem* item); void changePage(QListWidgetItem* current, QListWidgetItem* previous); void comboFamilyChanged(const QString& family); void comboSizeChanged(const QString& pt); void getAnnoteCssFile(); void getBibSearcherPdf2TextBin(); void getBrowserCssFile(); void getCacheDirectory(); void getExifToolBin(); void getFmClientCopyBin(); void getFmClientMoveBin(); void getJournalFile(); void getNetworkFile(); void getPdfDirectory(); void getPdfImportPdf2TextBin(); void getPosLexiconFile(); void getPostprocessBibTeXBin(); void getPreparserBin(); void getRegularExpressionFile(); void getjsMathDirectory(); void help(); void showMessage(const QString& ms); void updateFindReplaceInputButtons(); private: QFont c2bMonoFont; QFont selectedFont(QFontComboBox* fc, QComboBox* sc) const; Ui::c2bConfigure ui; bool event(QEvent* qevent); c2bColors colors; c2bSettings* settings; void fontSelection(const QFont& f, QFontComboBox* fc, QComboBox* sc); void populateFontCombos(); }; #endif ������������������������������������������������������������������������cb2bib-1.4.9/src/c2b.h������������������������������������������������������������������������������0000644�0001750�0001750�00000005625�12045520050�014205� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2B_H #define C2B_H #include "c2bBibParser.h" #include "c2bNetworkQueryInfo.h" #include <metadataParser.h> #include <network.h> #include <QObject> class c2bClipboard; class QProgressDialog; class QWidget; class c2b : public QObject { Q_OBJECT public: c2b(QWidget* main, QObject* parento = 0); ~c2b(); // Actions inline static const QString documentMetadata(const QString& fn) { return metaParser()->metadata(fn); } inline static const QString encodeLink(const QString& ln) { return netqinf()->encodeLink(ln); } inline static void showMessage(const QString& message) { instance()->emitMessage(message); } inline static void doSearchInFiles(const QString& string, const QString& fn) { instance()->emitSearchInFiles(string, fn); } // Pointers inline static c2b* instance() { Q_ASSERT_X(_c2b_single_instance, "c2b", "cb2Bib resources were not instantiated"); return _c2b_single_instance; } inline static QWidget* mainWidget() { return instance()->_c2b_main; } inline static c2bClipboard* clipboard() { return instance()->_c2b_clipboard; } inline static network* net() { return instance()->_c2b_network; } inline static c2bNetworkQueryInfo* netqinf() { return instance()->_c2b_netqinf; } inline static c2bBibParser* bibParser() { return instance()->_c2b_bibparser; } inline static metadataParser* metaParser() { return instance()->_c2b_metadataparser; } public slots: static void configure(int index = -1); void exitRequested(); signals: void searchInFiles(const QString& string, const QString& fn); void statusMessage(const QString& message); private: QProgressDialog* _download_progress; QWidget* _c2b_main; c2bBibParser* _c2b_bibparser; c2bClipboard* _c2b_clipboard; c2bNetworkQueryInfo* _c2b_netqinf; metadataParser* _c2b_metadataparser; network* _c2b_network; static c2b* _c2b_single_instance; inline void emitMessage(const QString& message) { emit statusMessage(message); } inline void emitSearchInFiles(const QString& string, const QString& fn) { emit searchInFiles(string, fn); } private slots: void proxyAuthenticationRequired(const QNetworkProxy& proxy, QAuthenticator* auth); void showMessage(const QString& title, const QString& ms); void updateDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); }; #endif �����������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bShortcutPushButton.cpp����������������������������������������������������������0000644�0001750�0001750�00000003017�12045520050�020321� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bShortcutPushButton.h" #include <QKeyEvent> void c2bShortcutPushButton::setKeysequence(const QKeySequence& ks) { _keysequence = ks; const QString bt(_keysequence.toString(QKeySequence::NativeText)); setText(bt.isEmpty() ? tr("None") : bt); setChecked(false); } void c2bShortcutPushButton::clear() { _set_keysequence(QKeySequence()); } void c2bShortcutPushButton::reset() { _set_keysequence(_default_keysequence); } void c2bShortcutPushButton::keyPressEvent(QKeyEvent* qevent) { const int k(qevent->key()); // This function is based on GPL configdialog.cpp // Copyright (C) 2003-2007 by Pascal Brachet, http://www.xm1math.net/texmaker/ if ((qevent->modifiers() != 0 && k != Qt::Key_Enter && k != Qt::Key_Alt && k != Qt::Key_Shift && k != Qt::Key_Control && k != Qt::Key_AltGr && k != Qt::Key_Meta && k != 0 && k != Qt::Key_Super_L && k != Qt::Key_Super_R) || (k >= Qt::Key_F1 && k <= Qt::Key_F35)) { _set_keysequence(QKeySequence(qevent->modifiers() | k)); return; } QPushButton::keyPressEvent(qevent); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/CMakeLists.txt���������������������������������������������������������������������0000644�0001750�0001750�00000005664�12045517740�016145� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # cb2bib cmake build script # - build cb2bib #------------------------------------------------------------------------------- list_source_files(CB2BIB_CPP CB2BIB_H CB2BIB_MOCH) if(C2B_USE_WEBKIT) find_package(Qt4 ${CB2BIB_MINIMUM_REQUIRED_QT} COMPONENTS QtCore QtNetwork QtGui QtWebKit REQUIRED) add_definitions(-DC2B_USE_WEBKIT) else() find_package(Qt4 ${CB2BIB_MINIMUM_REQUIRED_QT} COMPONENTS QtCore QtNetwork QtGui REQUIRED) list(REMOVE_ITEM CB2BIB_CPP c2bAnnote.cpp) list(REMOVE_ITEM CB2BIB_CPP c2bWebBrowser.cpp) list(REMOVE_ITEM CB2BIB_H c2bAnnote.h) list(REMOVE_ITEM CB2BIB_H c2bWebBrowser.h) list(REMOVE_ITEM CB2BIB_MOCH c2bAnnote.h) list(REMOVE_ITEM CB2BIB_MOCH c2bWebBrowser.h) endif() if(C2B_USE_CBPOLL) add_definitions(-DC2B_USE_CBPOLL) else() list(REMOVE_ITEM CB2BIB_CPP clipboardPoll.cpp) list(REMOVE_ITEM CB2BIB_H clipboardPoll.h) list(REMOVE_ITEM CB2BIB_MOCH clipboardPoll.h) endif() qt4_wrap_cpp(CB2BIB_MOC ${CB2BIB_MOCH}) file(GLOB CB2BIB_UI RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.ui") qt4_wrap_ui(CB2BIB_UIH ${CB2BIB_UI}) qt4_add_resources(CB2BIB_RCC cb2bib.qrc) list_source_files_at(MODSINGAPP_CPP MODSINGAPP_H MODSINGAPP_MOCH qtsingleapplication/src/) if(WIN32) list(REMOVE_ITEM MODSINGAPP_CPP qtsingleapplication/src/qtlockedfile_unix.cpp) else() list(REMOVE_ITEM MODSINGAPP_CPP qtsingleapplication/src/qtlockedfile_win.cpp) endif() qt4_wrap_cpp(MODSINGAPP_MOC ${MODSINGAPP_MOCH}) include(${QT_USE_FILE}) include_directories(.) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(c2b) if(WIN32) # add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/c2bicon.o COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR} add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/c2bicon.o COMMAND windres.exe -i${CMAKE_CURRENT_SOURCE_DIR}/cb2bib.rc -o ${CMAKE_CURRENT_BINARY_DIR}/c2bicon.o ) list(APPEND CB2BIB_CPP ${CMAKE_CURRENT_BINARY_DIR}/c2bicon.o) endif(WIN32) if(APPLE) add_executable(cb2bib MACOSX_BUNDLE ${CB2BIB_CPP} ${CB2BIB_MOC} ${CB2BIB_UIH} ${CB2BIB_RCC} ${MODSINGAPP_CPP} ${MODSINGAPP_MOC}) else() add_executable(cb2bib WIN32 ${CB2BIB_CPP} ${CB2BIB_MOC} ${CB2BIB_UIH} ${CB2BIB_RCC} ${MODSINGAPP_CPP} ${MODSINGAPP_MOC}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) endif() if(UNIX AND NOT APPLE) if(C2B_USE_LZO) target_link_libraries(cb2bib c2b ${LZO_LIBRARIES} ${QT_LIBRARIES} -lX11) else() target_link_libraries(cb2bib c2b ${QT_LIBRARIES} -lX11) endif() else() if(C2B_USE_LZO) target_link_libraries(cb2bib c2b ${LZO_LIBRARIES} ${QT_LIBRARIES}) else() target_link_libraries(cb2bib c2b ${QT_LIBRARIES}) endif() endif() if(APPLE) install(TARGETS cb2bib BUNDLE DESTINATION ${C2B_INSTALL_BIN_DIR}) else() install(TARGETS cb2bib RUNTIME DESTINATION ${C2B_INSTALL_BIN_DIR}) endif() #-------------------------------------------------------------------------------����������������������������������������������������������������������������cb2bib-1.4.9/src/c2bTextEdit.cpp��������������������������������������������������������������������0000644�0001750�0001750�00000021322�12045520050�016203� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bTextEdit.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <QMenu> #include <QPainter> #include <QScrollBar> #include <QTextBlock> c2bTextEdit::c2bTextEdit(QWidget* parentw) : QPlainTextEdit(parentw) { setFrameShape(QPlainTextEdit::StyledPanel); setFrameShadow(QPlainTextEdit::Raised); _settingsP = c2bSettingsP; connect(_settingsP, SIGNAL(newSettings()), this, SLOT(loadSettings())); _line_number_area = new LineNumberArea(this); _line_number_area_color = palette().color(QPalette::Active, QPalette::Base).darker(110); _line_number_color_p = &_settingsP->colors.comment_color; connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth())); connect(this, SIGNAL(updateRequest(const QRect&, int)), this, SLOT(updateLineNumberArea(const QRect&, int))); updateLineNumberAreaWidth(); c2bUtils::addSeparator(this); toggleWordWrappingAction = new QAction(this); addAction(toggleWordWrappingAction); toggleWordWrappingAction->setText(tr("Toggle Word Wrapping")); toggleWordWrappingAction->setStatusTip(tr("Toggle word wrapping")); _settingsP->setKeysequence("Shortcuts/Editor/", toggleWordWrappingAction); connect(toggleWordWrappingAction, SIGNAL(triggered()), this, SLOT(toggleWordWrapping())); if (_settingsP->value("c2bTextEdit/WrapMode", false).toBool()) setLineWrapMode(QPlainTextEdit::WidgetWidth); else setLineWrapMode(QPlainTextEdit::NoWrap); } c2bTextEdit::~c2bTextEdit() { _settingsP->setValue("c2bTextEdit/WrapMode", lineWrapMode() == QPlainTextEdit::WidgetWidth); } void c2bTextEdit::setBibTeXActions() { c2bUtils::addSeparator(this); pasteCurrentBibTeXAction = new QAction(this); addAction(pasteCurrentBibTeXAction); pasteCurrentBibTeXAction->setText(tr("Paste Current BibTeX")); pasteCurrentBibTeXAction->setStatusTip(tr("Paste current BibTeX")); _settingsP->setKeysequence("Shortcuts/Editor/", pasteCurrentBibTeXAction); c2bUtils::addSeparator(this); convertSelection2LaTeXAction = new QAction(this); addAction(convertSelection2LaTeXAction); convertSelection2LaTeXAction->setText(tr("Selection to LaTeX")); convertSelection2LaTeXAction->setStatusTip(tr("Convert selection to LaTeX")); _settingsP->setKeysequence("Shortcuts/Editor/", convertSelection2LaTeXAction); connect(convertSelection2LaTeXAction, SIGNAL(triggered()), this, SLOT(convert2LaTeX())); convertSelection2LaTeXAction->setEnabled(false); connect(this, SIGNAL(copyAvailable(bool)), convertSelection2LaTeXAction, SLOT(setEnabled(bool))); convertSelection2UnicodeAction = new QAction(this); addAction(convertSelection2UnicodeAction); convertSelection2UnicodeAction->setText(tr("Selection to Unicode")); convertSelection2UnicodeAction->setStatusTip(tr("Convert selection to Unicode")); _settingsP->setKeysequence("Shortcuts/Editor/", convertSelection2UnicodeAction); connect(convertSelection2UnicodeAction, SIGNAL(triggered()), this, SLOT(convert2Unicode())); convertSelection2UnicodeAction->setEnabled(false); connect(this, SIGNAL(copyAvailable(bool)), convertSelection2UnicodeAction, SLOT(setEnabled(bool))); c2bUtils::addSeparator(this); journalsToFullAction = new QAction(this); addAction(journalsToFullAction); journalsToFullAction->setText(tr("Set Journals to Full Name")); journalsToFullAction->setStatusTip(tr("Set journals to full name")); _settingsP->setKeysequence("Shortcuts/Editor/", journalsToFullAction); journalsToAbbreviatedAction = new QAction(this); addAction(journalsToAbbreviatedAction); journalsToAbbreviatedAction->setText(tr("Set Journals to Abbreviated Name")); journalsToAbbreviatedAction->setStatusTip(tr("Set journals to abbreviated name")); _settingsP->setKeysequence("Shortcuts/Editor/", journalsToAbbreviatedAction); c2bUtils::addSeparator(this); updateMetadataAction = new QAction(this); addAction(updateMetadataAction); updateMetadataAction->setText(tr("Update Documents Metadata")); updateMetadataAction->setStatusTip(tr("Update document files metadata")); _settingsP->setKeysequence("Shortcuts/Editor/", updateMetadataAction); } void c2bTextEdit::contextMenuEvent(QContextMenuEvent* qevent) { QMenu* menu = createStandardContextMenu(); QList<QAction*> acts = actions(); for (int i = 0; i < acts.count(); ++i) menu->addAction(acts.at(i)); menu->exec(qevent->globalPos()); delete menu; } void c2bTextEdit::keyPressEvent(QKeyEvent* qevent) { QPlainTextEdit::keyPressEvent(qevent); if (qevent->key() == Qt::Key_Insert) { setOverwriteMode(!overwriteMode()); emit overwriteModeChanged(); } } void c2bTextEdit::toggleWordWrapping() { if (lineWrapMode() == QPlainTextEdit::WidgetWidth) setLineWrapMode(QPlainTextEdit::NoWrap); else setLineWrapMode(QPlainTextEdit::WidgetWidth); } void c2bTextEdit::updatePlainText(const QString& newText) { const int scrollPosition(verticalScrollBar()->value()); const int cursorBlock(textCursor().blockNumber()); const int cursorColumn(textCursor().columnNumber()); setPlainText(newText); QTextBlock p = document()->begin(); int i(0); while (p.isValid()) { if (cursorBlock == i) break; i++; p = p.next(); } QTextCursor tcursor = textCursor(); tcursor.setPosition(p.position() + cursorColumn, QTextCursor::MoveAnchor); setTextCursor(tcursor); verticalScrollBar()->setValue(scrollPosition); } void c2bTextEdit::convert2LaTeX() { QString txt(textCursor().selectedText()); // Better do the long way: Convert anything to c2b, and then // translate to TeX c2bUtils::fullBibToC2b(txt); insertPlainText(c2bUtils::c2bToBib(txt)); } void c2bTextEdit::convert2Unicode() { QString txt(textCursor().selectedText()); // Strictly, this should be bibToC2b; but convert also // possible PNAS like, and, for consistency, HTML sub // and superscripts to TeX insertPlainText(c2bUtils::fullBibToC2b(txt)); } void c2bTextEdit::loadSettings() { if (font() != _settingsP->c2bMonoFont) { setFont(_settingsP->c2bMonoFont); updateLineNumberAreaWidth(); } _line_number_area->update(); // Update, otherwise number colors might not follow apply button } /*************************************************************************** * Line number area (From CodeEditor Qt's example) ***************************************************************************/ int c2bTextEdit::lineNumberAreaWidth() { int digits(1); int max(qMax(1, blockCount())); while (max >= 10) { max /= 10; ++digits; } const int space(5 + fontMetrics().width(QLatin1Char('9')) * digits); return space; } void c2bTextEdit::updateLineNumberAreaWidth() { setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); } void c2bTextEdit::updateLineNumberArea(const QRect& qrect, int dy) { if (dy) _line_number_area->scroll(0, dy); else _line_number_area->update(0, qrect.y(), _line_number_area->width(), qrect.height()); if (qrect.contains(viewport()->rect())) updateLineNumberAreaWidth(); } void c2bTextEdit::resizeEvent(QResizeEvent* qevent) { QPlainTextEdit::resizeEvent(qevent); QRect cr = contentsRect(); _line_number_area->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height())); } void c2bTextEdit::lineNumberAreaPaintEvent(QPaintEvent* qevent) { QPainter painter(_line_number_area); painter.fillRect(qevent->rect(), _line_number_area_color); painter.setPen(*_line_number_color_p); QFont f = font(); f.setPointSize(qMax(0, f.pointSize() - 3)); painter.setFont(f); QTextBlock block = firstVisibleBlock(); int blockNumber(block.blockNumber()); int top(int(blockBoundingGeometry(block).translated(contentOffset()).top())); int bottom(top + int(blockBoundingRect(block).height())); while (block.isValid() && top <= qevent->rect().bottom()) { if (block.isVisible() && bottom >= qevent->rect().top()) { const QString number(QString::number(blockNumber + 1)); painter.drawText(5, top + 2, _line_number_area->width(), fontMetrics().height(), Qt::AlignLeft, number); } block = block.next(); top = bottom; bottom = top + (int)blockBoundingRect(block).height(); ++blockNumber; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bCiter.h�������������������������������������������������������������������������0000644�0001750�0001750�00000012302�12045520050�015162� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCITER_H #define C2BCITER_H #include <QString> /** \page c2bciter The cb2Bib Citer The cb2Bib Citer is a keyboard based module for inserting citation IDs into a working document. Conveniently, the command <tt>c2bciter</tt>, or its expansion <tt>'cb2bib --citer'</tt>, can be assigned to a global, desktop wide shortcut key. This will provide an easy access to the citer from within any text editor. Pressing the shortcut turns on and off the citer panel. Once appropriate references are selected, pressing key C sets the citations either to the clipboard or to a LyX pipe, closes the citer panel, and returns keyboard focus to the editor. By default, <tt>c2bciter</tt> loads all references from the current directory, specified in the cb2Bib main panel. On the desktop tray, the cb2Bib icon indicates that the citer is running. Its context menu offers the possibility to load other files or directories, or to toggle full screen mode. Search, filtering, navigation, and citation are keyword based. Pressing keys A, I, J, T, and Y sorts the references by author, included date, journal, title, and year, respectively. Key F initiates filtering, and Esc leaves filtering mode. References are selected when pressing enter. Key S toggles the current selection display, and Del clears the selection. The combination Shift + letter navigates through the rows starting by the letter. Advanced filtering capabilities are available if documents are indexed. Document indexing, or term or key sentence extraction, is performed by clicking the tray icon menu action Index Documents. Once indexing is done, after pressing Refresh, pressing K displays the document extracted keywords, and pressing G, the collection glossary of terms. On a keyword, pressing R display all documents indexed by the keyword. On a document, pressing R display related documents. Relatedness is set from keyword based similarity measures. Key sequence Alt+C toggles clipboard connection on and off. When connection is on, the clipboard contents is set, each time it changes, as the filter string. This provides a fast way to retrieve a given reference while browsing elsewhere. <p> </p> \verbatim Usage: cb2bib --citer [dirname1 [dirname2 ... ]] cb2bib --citer [filename1.bib [filename2.bib ... ]] \endverbatim \verbatim Display Keys A author - journal - year - title I included date - title J journal - year - author T title Y year - author - journal - title \endverbatim \verbatim Filter Keys D Delete last filter F Enter pattern filter mode G Toggle glossary of terms view K Toggle document keywords view R Display related documents Left Move to previous filtered view Right Move to next filtered view \endverbatim \verbatim Action Keys C Cite selected citations and close citer window Del Unselect all citations E Edit current citation's source Enter Select current citation Esc Exit filter mode or close citer window O Open current citation's file S Display the set of selected citations V Display document excerpts in keywords view Shift+ Keyboard search naviagation U Open current citation's URL \endverbatim \verbatim Tray Icon Actions F1 Citer help Ctrl+O Open BibTeX directory Alt+O Open BibTeX files F5 Refresh Ctrl+F Search in files Alt+L Set Lyx pipe F2 Toggle cb2Bib Alt+C Toggle clipboard Alt+F Toggle full screen Index documents \endverbatim <p> </p> See also \ref relnotes130, \ref relnotes140, \ref relnotes147, \ref commandline and \htmlonly <a href="cb2bib/annote.tex.html" target="_blank">The cb2Bib Annote</a>. \endhtmlonly */ namespace c2bCiter { enum Format {AJYT, IT, JYA, T, YAJT, R, K}; enum Filter {None, Document, Keyword, Pattern, Related, Selected}; struct State { inline State() : format(AJYT), filter(None), viewer_index(0) {} inline State(const Format fo, const Filter fi, const int vi, const QString fs) : format(fo), filter(fi), viewer_index(vi), filter_string(fs) {} inline bool operator==(const State& s) const { return format == s.format && filter == s.filter && viewer_index == s.viewer_index && filter_string == s.filter_string; } Format format; Filter filter; int viewer_index; QString filter_string; QString index_data; }; struct KeywordData { bool valid; QString bibtexfn; QString documentfn; QString keyword; }; } // namespace c2bCiter #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bComboBox.h����������������������������������������������������������������������0000644�0001750�0001750�00000001162�12045520050�015626� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCOMBOBOX_H #define C2BCOMBOBOX_H #include <QComboBox> class c2bComboBox : public QComboBox { Q_OBJECT public: c2bComboBox(QWidget* parentw = 0); ~c2bComboBox(); protected: virtual void contextMenuEvent(QContextMenuEvent* e); }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bIdLineEdit.cpp������������������������������������������������������������������0000644�0001750�0001750�00000011471�12045520050�016427� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. * * Improvements and modifications: * July 2009 - Added <<author_all_abbreviated>>, (C) 2009 by Dayu Huang ***************************************************************************/ #include "c2bIdLineEdit.h" #include "c2bUtils.h" #include <cb2bib_parameters.h> #include <QAction> #include <QContextMenuEvent> #include <QMenu> c2bIdLineEdit::c2bIdLineEdit(QWidget* parentw) : c2bLineEdit(parentw) { a_author_all_abbreviated = new QAction(this); a_author_all_initials = new QAction(this); a_author_first = new QAction(this); a_citeid = new QAction(this); a_journal_initials = new QAction(this); a_pages_first = new QAction(this); a_ppages_first = new QAction(this); a_title = new QAction(this); a_title_underscored = new QAction(this); a_volume = new QAction(this); a_year_abbreviated = new QAction(this); a_year_full = new QAction(this); a_reset = new QAction(this); c2bUtils::addSeparator(this); addAction(a_author_all_abbreviated); addAction(a_author_all_initials); addAction(a_author_first); c2bUtils::addSeparator(this); addAction(a_citeid); c2bUtils::addSeparator(this); addAction(a_journal_initials); c2bUtils::addSeparator(this); addAction(a_pages_first); addAction(a_ppages_first); c2bUtils::addSeparator(this); addAction(a_title); addAction(a_title_underscored); c2bUtils::addSeparator(this); addAction(a_volume); c2bUtils::addSeparator(this); addAction(a_year_abbreviated); addAction(a_year_full); c2bUtils::addSeparator(this); addAction(a_reset); a_author_all_abbreviated->setText(tr("Insert <<author_all_abbreviated>>")); a_author_all_initials->setText(tr("Insert <<author_all_initials>>")); a_author_first->setText(tr("Insert <<author_first>>")); a_citeid->setText(tr("Insert <<citeid>>")); a_journal_initials->setText(tr("Insert <<journal_initials>>")); a_pages_first->setText(tr("Insert <<pages_first>>")); a_ppages_first->setText(tr("Insert <<ppages_first>>")); a_title->setText(tr("Insert <<title>>")); a_title_underscored->setText(tr("Insert <<title_underscored>>")); a_volume->setText(tr("Insert <<volume>>")); a_year_abbreviated->setText(tr("Insert <<year_abbreviated>>")); a_year_full->setText(tr("Insert <<year_full>>")); a_reset->setText(tr("Reset ID Pattern")); connect(a_author_all_abbreviated, SIGNAL(triggered()), this, SLOT(author_all_abbreviated())); connect(a_author_all_initials, SIGNAL(triggered()), this, SLOT(author_all_initials())); connect(a_author_first, SIGNAL(triggered()), this, SLOT(author_first())); connect(a_citeid, SIGNAL(triggered()), this, SLOT(citeid())); connect(a_journal_initials, SIGNAL(triggered()), this, SLOT(journal_initials())); connect(a_pages_first, SIGNAL(triggered()), this, SLOT(pages_first())); connect(a_ppages_first, SIGNAL(triggered()), this, SLOT(ppages_first())); connect(a_title, SIGNAL(triggered()), this, SLOT(title())); connect(a_title_underscored, SIGNAL(triggered()), this, SLOT(title_underscored())); connect(a_volume, SIGNAL(triggered()), this, SLOT(volume())); connect(a_year_abbreviated, SIGNAL(triggered()), this, SLOT(year_abbreviated())); connect(a_year_full, SIGNAL(triggered()), this, SLOT(year_full())); connect(a_reset, SIGNAL(triggered()), this, SLOT(reset())); // Hide citeid as default: CiteID line edit a_citeid->setVisible(false); } c2bIdLineEdit::~c2bIdLineEdit() {} void c2bIdLineEdit::setDocumentIDEdit() { a_citeid->setVisible(true); } void c2bIdLineEdit::author_all_abbreviated() { insert("<<author_all_abbreviated>>"); } void c2bIdLineEdit::author_all_initials() { insert("<<author_all_initials>>"); } void c2bIdLineEdit::author_first() { insert("<<author_first>>"); } void c2bIdLineEdit::citeid() { insert("<<citeid>>"); } void c2bIdLineEdit::journal_initials() { insert("<<journal_initials>>"); } void c2bIdLineEdit::pages_first() { insert("<<pages_first>>"); } void c2bIdLineEdit::ppages_first() { insert("<<ppages_first>>"); } void c2bIdLineEdit::title() { insert("<<title_25>>"); } void c2bIdLineEdit::title_underscored() { insert("<<title_underscored_25>>"); } void c2bIdLineEdit::volume() { insert("<<volume>>"); } void c2bIdLineEdit::year_abbreviated() { insert("<<year_abbreviated>>"); } void c2bIdLineEdit::year_full() { insert("<<year_full>>"); } void c2bIdLineEdit::reset() { if (a_citeid->isVisible()) setText(C2B_DOCUMENT_ID_PATTERN); else setText(C2B_CITE_ID_PATTERN); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bPostprocess.h�������������������������������������������������������������������0000644�0001750�0001750�00000001732�12045520050�016445� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BPOSTPROCESS_H #define C2BPOSTPROCESS_H #include "ui_c2bLogWidget.h" #include <QDialog> class QProcess; class c2bPostprocess : public QDialog { Q_OBJECT public: c2bPostprocess(const QString& fn, QWidget* parentw = 0); ~c2bPostprocess(); protected: void PProcessFile(); void addToLog(); protected slots: void conversionEnded(); void help(); void openFile(); private: QProcess* _ppBibTeX; QPushButton* _buttonOpenFile; QString PPBIBTEX_ARG; QString PPBIBTEX_BIN; QString PPBIBTEX_EXT; QString _bib; QString _out; Ui::c2bLogWidget ui; }; #endif ��������������������������������������cb2bib-1.4.9/src/c2bClipEdit.h����������������������������������������������������������������������0000644�0001750�0001750�00000002467�12045520050�015624� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCLIPEDIT_H #define C2BCLIPEDIT_H #include <QPlainTextEdit> /** @author Pere Constans */ class c2bClipEdit : public QPlainTextEdit { Q_OBJECT public: enum Mode {Editor, Browser}; c2bClipEdit(const Mode mode, QWidget* parentw = 0); ~c2bClipEdit(); void setText(const QString& text, const QString& tagged_text = QString()); void setTaggedViewMode(bool tagged_view); void insertTag(const QString& field); void updatePlainText(const QString& text); signals: void userEndedSelection(const QPoint& position); protected: virtual void contextMenuEvent(QContextMenuEvent* qevent); virtual void keyPressEvent(QKeyEvent* qevent); virtual void keyReleaseEvent(QKeyEvent* qevent); virtual void mouseReleaseEvent(QMouseEvent* qevent); private slots: virtual void selectionHasChanged(); private: QString _tagged_text; QString _text; bool _has_selecting_ended; bool _is_tagged_view; }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bSaveREHighlighter.cpp�����������������������������������������������������������0000644�0001750�0001750�00000002701�12045520050�017755� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bSaveREHighlighter.h" #include "c2bSettings.h" #include <QPalette> #include <QTextDocument> c2bSaveREHighlighter::c2bSaveREHighlighter(QRegExp& rx, QTextDocument* doc) : QSyntaxHighlighter(doc), _current_rx(rx) { QPalette p; text_color = p.text().color(); c2bSettings* settings(c2bSettingsP); c = &settings->colors; connect(settings, SIGNAL(newSettings()), this, SLOT(rehighlight())); } c2bSaveREHighlighter::~c2bSaveREHighlighter() {} void c2bSaveREHighlighter::highlightBlock(const QString& text) { const int len(text.length()); const int ind(_current_rx.indexIn(text)); const int caps(_current_rx.capturedTexts().count()); if (ind == -1 || caps <= 1) setFormat(0, len, text_color); else { setFormat(0, len, c->cb2bib_unrelevant_color); for (int i = 1; i < caps; i = i + 2) setFormat(_current_rx.pos(i), _current_rx.cap(i).length(), c->cb2bib_highly_relevant_color); for (int i = 2; i < caps; i = i + 2) setFormat(_current_rx.pos(i), _current_rx.cap(i).length(), c->cb2bib_relevant_color); } } ���������������������������������������������������������������cb2bib-1.4.9/src/c2bSettings.cpp��������������������������������������������������������������������0000644�0001750�0001750�00000027335�12045520050�016263� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bSettings.h" #include "c2bUtils.h" #include <QApplication> #include <QClipboard> #include <QMessageBox> #include <QProgressBar> #include <QShortcut> #include <QTimer> /** Global settings for the cb2Bib */ c2bSettings::c2bSettings(const QString& organization, const QString& application, QObject* parento) : settings(organization, application, parento) {} c2bSettings::c2bSettings(const QString& fn, QObject* parento) : settings(fn, parento) {} c2bSettings::~c2bSettings() { delete _progress_bar; } c2bSettings* c2bSettings::initSettings() { c2bSettings* s; if (c2bSettings::isConfiguredMode()) s = new c2bSettings(c2bSettings::configuredFilename()); else s = new c2bSettings(qApp->organizationName(), qApp->applicationName()); s->init(); return s; } void c2bSettings::init() { settings::init(); _progress_bar = 0; if (cl_console_mode) return; setDefaults(); if (cl_import) // Process cl_import_filename and update cl_cb2bib_import_mode processReferenceFile(); if (cl_cb2bib_mode && !cl_cb2bib_import_mode) { setValue("cb2Bib/isRunning", true); sync(); connect(qApp, SIGNAL(lastWindowClosed()), this, SLOT(guiExits())); } } void c2bSettings::notify() { update(); emit newSettings(); } void c2bSettings::update() { // Values for very general GUI settings c2bMonoFont = value("cb2Bib/MonoFont").value<QFont>(); colors.loadColors(this); } void c2bSettings::setDefaults() { QHash<QString, QVariant> defaults; defaults["cb2Bib/MonoFont"] = QFont("Courier"); const QStringList keys(defaults.keys()); for (int i = 0; i < keys.count(); ++i) setValue(keys.at(i), value(keys.at(i), defaults.value(keys.at(i)))); // Shortcuts _default_keysequences.clear(); _default_keysequences["Shortcuts/cb2Bib/Button About and Bookmarks"] = QKeySequence(Qt::CTRL + Qt::Key_Tab); _default_keysequences["Shortcuts/cb2Bib/Button Configure"] = QKeySequence(); _default_keysequences["Shortcuts/cb2Bib/Button Network Query"] = QKeySequence(Qt::ALT + Qt::Key_N); _default_keysequences["Shortcuts/cb2Bib/Button Start PDFImport"] = QKeySequence(); _default_keysequences["Shortcuts/cb2Bib/Button Toggle Connection"] = QKeySequence(); _default_keysequences["Shortcuts/cb2Bib/Button View BibTeX"] = QKeySequence(Qt::ALT + Qt::Key_V); _default_keysequences["Shortcuts/cb2Bib/Check Repeated"] = QKeySequence(Qt::ALT + Qt::Key_X); _default_keysequences["Shortcuts/cb2Bib/Clear All Fields"] = QKeySequence(); _default_keysequences["Shortcuts/cb2Bib/Delete Temporary BibTeX File"] = QKeySequence(Qt::ALT + Qt::Key_D); _default_keysequences["Shortcuts/cb2Bib/Edit Bookmarks"] = QKeySequence(Qt::ALT + Qt::Key_B); _default_keysequences["Shortcuts/cb2Bib/Edit Journal Abbreviations"] = QKeySequence(Qt::ALT + Qt::Key_J); _default_keysequences["Shortcuts/cb2Bib/Edit Regular Expressions"] = QKeySequence(Qt::ALT + Qt::Key_E); _default_keysequences["Shortcuts/cb2Bib/Guess Bibliographic Fields"] = QKeySequence(Qt::ALT + Qt::Key_G); _default_keysequences["Shortcuts/cb2Bib/Insert Regular Expression"] = QKeySequence(Qt::ALT + Qt::Key_I); _default_keysequences["Shortcuts/cb2Bib/Open Document"] = QKeySequence(Qt::ALT + Qt::Key_O); _default_keysequences["Shortcuts/cb2Bib/Postprocess BibTeX"] = QKeySequence(Qt::ALT + Qt::Key_P); _default_keysequences["Shortcuts/cb2Bib/Preparse Clipboard"] = QKeySequence(Qt::ALT + Qt::Key_C); _default_keysequences["Shortcuts/cb2Bib/Restart Recognition"] = QKeySequence(Qt::ALT + Qt::Key_R); _default_keysequences["Shortcuts/cb2Bib/Select BibTeX File"] = QKeySequence(Qt::ALT + Qt::Key_S); _default_keysequences["Shortcuts/cb2Bib/Select Document File"] = QKeySequence(Qt::ALT + Qt::Key_F); _default_keysequences["Shortcuts/cb2Bib/Start Annote"] = QKeySequence(Qt::ALT + Qt::Key_A); _default_keysequences["Shortcuts/cb2Bib/Toggle Reference Tabs"] = QKeySequence(Qt::Key_F4); _default_keysequences["Shortcuts/cb2Bib/View Tagged Clipboard Data"] = QKeySequence(); _default_keysequences["Shortcuts/cb2Bib/Write Metadata to Document"] = QKeySequence(Qt::ALT + Qt::Key_W); _default_keysequences["Shortcuts/Editor/Browse Reference by DOI"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Cite Selected Entries"] = QKeySequence(Qt::ALT + Qt::Key_C); _default_keysequences["Shortcuts/Editor/Clear Entry Selection"] = QKeySequence(Qt::Key_Delete); _default_keysequences["Shortcuts/Editor/Export Entries"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Local Search for Selected Text"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Open Document File"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Open Document URL"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Paste Current BibTeX"] = QKeySequence(Qt::SHIFT + Qt::Key_Insert); _default_keysequences["Shortcuts/Editor/Restart Network Query"] = QKeySequence(Qt::ALT + Qt::Key_N); _default_keysequences["Shortcuts/Editor/Restart Recognition"] = QKeySequence(Qt::ALT + Qt::Key_R); _default_keysequences["Shortcuts/Editor/Save and Postprocess"] = QKeySequence(Qt::ALT + Qt::Key_P); _default_keysequences["Shortcuts/Editor/Selection to LaTeX"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Selection to Unicode"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Set Journals to Abbreviated Name"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Set Journals to Full Name"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Set LyX Pipe"] = QKeySequence(Qt::ALT + Qt::Key_L); _default_keysequences["Shortcuts/Editor/Toggle Editing and Browsing"] = QKeySequence(Qt::CTRL + Qt::Key_Tab); _default_keysequences["Shortcuts/Editor/Toggle Word Wrapping"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Update Documents Metadata"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Web Search Settings"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Web Search by Author"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Web Search by Title"] = QKeySequence(); _default_keysequences["Shortcuts/Editor/Web Search for Selected Text"] = QKeySequence(); const QStringList sc(_default_keysequences.keys()); for (int i = 0; i < sc.count(); ++i) setValue(sc.at(i), value(sc.at(i), _default_keysequences.value(sc.at(i)))); update(); } void c2bSettings::setKeysequences(const QHash<QString, QKeySequence>& keysequences) { if (keysequences.size() == 0) return; QHash<QString, QKeySequence>::const_iterator it(keysequences.constBegin()); while (it != keysequences.constEnd()) { setValue(it.key(), it.value()); ++it; } // Set keysequences to created objects const QString sctag("Shortcuts/"); foreach(QWidget * w, QApplication::topLevelWidgets()) { const QList<QAction*> alist(w->findChildren<QAction*>()); for (int i = 0; i < alist.count(); ++i) { const QString fullname(alist.at(i)->data().toString()); if (fullname.startsWith(sctag)) alist.at(i)->setShortcut(keysequence(fullname)); } const QList<QShortcut*> sclist(w->findChildren<QShortcut*>()); for (int i = 0; i < sclist.count(); ++i) { const QString fullname(sclist.at(i)->objectName()); if (fullname.startsWith(sctag)) sclist.at(i)->setKey(keysequence(fullname)); } } } void c2bSettings::setKeysequence(const QString& path, QAction* action) { if (!action) return; const QString fullname(path + action->text()); if (_default_keysequences.contains(fullname)) { action->setShortcut(keysequence(fullname)); action->setData(fullname); } else c2bUtils::warn(tr("Action '%1' is not registered in default keysequence list").arg(fullname)); } void c2bSettings::setKeysequence(const QString& fullname, QShortcut* shortcut) { if (!shortcut) return; if (_default_keysequences.contains(fullname)) { shortcut->setObjectName(fullname); shortcut->setKey(keysequence(fullname)); } else c2bUtils::warn(tr("Shortcut '%1' is not registered in default keysequence list").arg(fullname)); } #ifdef Q_WS_WIN #include <QFileDialog> QString c2bSettings::decodeFilename(const QString& fn) const { // This function is meant for fn given by the command shell and that will end up being visible const QString dfn(settings::decodeFilename(fn)); QFileDialog fd(0, QString(), dfn); const QStringList fns(fd.selectedFiles()); if (fns.count() == 0) return dfn; const QString wdfn(fns.first()); if (QFileInfo(wdfn).exists()) return QDir::toNativeSeparators(wdfn); else return dfn; } #endif /*************************************************************************** * Downloaded reference extraction ***************************************************************************/ void c2bSettings::processReferenceFile() { // The "Download reference to reference manager" functionality to cb2Bib is implemented as follows: // - Put downloaded reference into the clipboard // - If no cb2Bib instance is running, launch cb2Bib GUI, otherwise exit // This is simple, enough, and consistent with a 'clipboard to BibTeX' program. // The 'single instance' implementation is naive, but it is sufficient for cb2Bib, and does not prevent // from having multiple cb2Bib instances in its usual deployment, if so desired. // Aware of QClipboard X11 note: "You should not store or retrieve the clipboard contents in response // to timer or non-user-input events". Functions processReferenceFile() and processprocessReferenceFileEvent() // do not follow it. It seems to work smooth, for all platforms, and, overall, it is a feasible solution // in this particular case. QFile file(cl_import_filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { cl_cb2bib_import_mode = true; QMessageBox::warning(0, tr("Warning - cb2Bib"), tr("Unable to open the reference file %1 for reading.\nError: '%2'."). arg(cl_import_filename).arg(file.errorString()), QMessageBox::Ok); QTimer::singleShot(500, qApp, SLOT(quit())); } else { if (value("cb2Bib/isRunning", false).toBool()) { cl_cb2bib_import_mode = true; if (!_progress_bar) _progress_bar = new QProgressBar; _progress_bar->setRange(0, 100); _progress_bar->setWindowTitle(QObject::tr("Importing...")); _progress_bar->setWindowIcon(QIcon(QString::fromUtf8(":/icons/icons/cb2bib.png"))); _progress_bar->show(); _progress_bar->setValue(50); } QTimer::singleShot(500, this, SLOT(processReferenceFileEvent())); } } void c2bSettings::processReferenceFileEvent() { const QString reference(c2bUtils::fileToString(cl_import_filename).trimmed()); QClipboard* cb = qApp->clipboard(); cb->setText(reference, QClipboard::Clipboard); if (cl_cb2bib_import_mode) { if (_progress_bar) _progress_bar->setValue(100); QTimer::singleShot(500, qApp, SLOT(quit())); } } void c2bSettings::guiExits() { setValue("cb2Bib/isRunning", false); sync(); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/cb2bib.qrc�������������������������������������������������������������������������0000644�0001750�0001750�00000005131�12045517740�015224� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<RCC> <qresource prefix="/icons" > <file>icons/add.png</file> <file>icons/annote.png</file> <file>icons/application-x-executable.png</file> <file>icons/application-x-html.png</file> <file>icons/application-x-none.png</file> <file>icons/application-x-pdf.png</file> <file>icons/application-x-tex.png</file> <file>icons/application-x-txt.png</file> <file>icons/back_cb2bib_32.png</file> <file>icons/bullet.png</file> <file>icons/cb2bib.png</file> <file>icons/citer_citation.png</file> <file>icons/citer_citation_checked.png</file> <file>icons/clear_left.png</file> <file>icons/clipboard.png</file> <file>icons/configure.png</file> <file>icons/configure_bibtex.png</file> <file>icons/configure_clipboard.png</file> <file>icons/configure_documents.png</file> <file>icons/configure_files.png</file> <file>icons/configure_fonts.png</file> <file>icons/configure_network.png</file> <file>icons/configure_shortcuts.png</file> <file>icons/configure_utilities.png</file> <file>icons/connect_established.png</file> <file>icons/connect_no.png</file> <file>icons/edit-undo.png</file> <file>icons/edit.png</file> <file>icons/edit16.png</file> <file>icons/edit22.png</file> <file>icons/exec22.png</file> <file>icons/exit.png</file> <file>icons/fileclose22.png</file> <file>icons/fileopen22.png</file> <file>icons/filesave22.png</file> <file>icons/filesaveas22.png</file> <file>icons/filesaveas.png</file> <file>icons/filter.png</file> <file>icons/help16.png</file> <file>icons/mimeFolder.png</file> <file>icons/package_network.png</file> <file>icons/pdf.png</file> <file>icons/select.png</file> <file>icons/tex.png</file> <file>icons/viewBackward.png</file> <file>icons/viewForward.png</file> <file>icons/viewHome.png</file> <file>icons/viewReload.png</file> <file>icons/viewZoomIn.png</file> <file>icons/viewZoomOut.png</file> <file>icons/viewbib.png</file> <file>icons/viewcb.png</file> </qresource> <qresource prefix="/htm" > <file>htm/bib_item.html</file> <file>htm/excerpts.html</file> <file>htm/references.css</file> <file>htm/references.html</file> </qresource> <qresource prefix="/xml" > <file>xml/cb2bib.xmp</file> <file>xml/ExifTool_config</file> </qresource> </RCC> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bSaveRegExp.h��������������������������������������������������������������������0000644�0001750�0001750�00000002024�12045520050�016125� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSAVEREGEXP_H #define C2BSAVEREGEXP_H #include "ui_c2bSaveRegExp.h" #include <QDialog> class c2bSaveREHighlighter; class c2bSaveRegExp : public QDialog { Q_OBJECT public: c2bSaveRegExp(const QStringList& pattern, const QString& input, QWidget* parentw = 0); ~c2bSaveRegExp(); signals: void savePatternInfo(const QString& rx, const QString& rxname); public slots: void accept(); void help(); void updateInput(const QString& text); private: QRegExp _pattern_rx; QString _input_text; Ui::c2bSaveRegExp ui; c2bSaveREHighlighter* _sreS; private slots: void inputMightHaveChanged(); void setInformation(); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bSaveRegExp.cpp������������������������������������������������������������������0000644�0001750�0001750�00000021070�12045520050�016462� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bSaveRegExp.h" #include "c2b.h" #include "c2bSaveREHighlighter.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <QPushButton> /** \page regexpedit Regular Expression Editor Once a manual processing is done, cb2Bib clipboard area contains the extraction tags, plus, possibly, some other cb2Bib tags introduced during the preprocessing (see \ref bibproc). The <b>RegExp Editor</b> will generate a guess regular expression or matching pattern usable for automated extractions. The cb2Bib matching patterns consist of four lines: a brief description, the reference type, an ordered list of captured fields, and the regular expression itself. \htmlonly <pre style="background : #d5d5d5; border : #6D8CC3 solid 1px;"> # cb2Bib GET_VERSION Pattern: American Chemical Society Publications article journal volume pages year title author abstract ^(.+), (\d+) \(.+\), ([\d|\-|\s]+),(\d\d\d\d)\..+<NewLine3>(.+)<NewLine4> (.+)<NewLine5>.+Abstract:<NewLine\d+>(.+)$ </pre> \endhtmlonly The Regular Expression Editor provides the basic skeleton and a set of predefined suggestions. The regular expressions follow a Perl-like sintax. There are, however, some slight differences and minor limitations. Information about the basics on the editing and working with Regular Expressions as used by cb2Bib can be found at the Qt document file \htmlonly <a href="http://qt-project.org/doc/qt-4.8/QRegExp.html#introduction" target="_blank">http://qt-project.org/doc/qt-4.8/qregexp.html#introduction</a>. \endhtmlonly <b>Remember when creating and editing regular expressions:</b> - Switch the clipboard mode to 'Tagged Clipboard Data', using the clipboard panel context menu. - Extract the bibliographic reference manually. On the clipboard panel will appear some cb2Bib tags that indicate which fields are being extracted. Once done, type Alt+I to enter to the regular expression editor. In the editor, there are the four line edits that define a cb2Bib pattern, one copy of the clipboard panel, and an information panel. The information panel displays possible issues, and, once everything is correct, the actual extracted fields. The clipboard panel highlights the captures for the current regular expression and current input text. - Patterns can be modified at any time by typing Alt+E to edit the regular expression file. Patterns are reloaded each time the automatic pattern recognition is started. This permits editing and testing. - The cb2Bib processes sequentially the list of regular expressions as found in the regular expression file. It stops and picks the first match for the current input. <b>Therefore, the order of the regular expressions is important</b>. Consequently, to avoid possible clashing among similar patterns, consider sorting them from the most restrictive pattern to the less one. As a rule of thumb, the more captions it has the most restrictive a pattern is. - <b>The cb2Bib proposed patterns are general, and not necessarily the most appropriate for a particular capture</b>. E.g. tag <tt>pages</tt> becomes <tt>([\\d|\\-|\\s]+)</tt>, which considers digits, hyphens, and spaces. It must be modified accordingly for reference sources with, e.g., <tt>pages</tt> written as Roman ordinals. - <b>Avoid whenever possible general patterns <tt>(.+)</tt></b>. There is a risk that such a caption could include text intended for a posterior caption. This is why, sometimes, the cb2Bib proposed pattern is not hit by the input stream that originated it. <b>Use, whenever possible, cb2Bib anchors like <tt>\<NewLine1\></tt> instead of <tt>\<NewLine\\d+\></tt>. They prevent <tt>(.+)</tt> captions to overextend</b>. - To debug a large regular expression it might be useful to break it to the first capturing parenthesis. For instance, the above pattern will be \htmlonly <pre style="background : #d5d5d5; border : #6D8CC3 solid 1px;"> # cb2Bib GET_VERSION Pattern: American Chemical Society Publications article journal ^(.+), </pre> \endhtmlonly - Then, check if anything is captured and if this corresponds to <tt>journal</tt>. - Add on successive steps your set of captions and BibTeX fields. */ c2bSaveRegExp::c2bSaveRegExp(const QStringList& pattern, const QString& input, QWidget* parentw) : QDialog(parentw) { Q_ASSERT_X(pattern.count() == 3, "c2bSaveRegExp", "Expected exactly three strings for pattern"); ui.setupUi(this); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); c2bSettings* settings(c2bSettingsP); ui.Input->setFont(settings->c2bMonoFont); ui.Type->setText(pattern.at(0)); ui.Fields->setText(pattern.at(1)); ui.RegExp->setText(pattern.at(2)); ui.Name->setFocus(); updateInput(input); _pattern_rx.setMinimal(true); _sreS = new c2bSaveREHighlighter(_pattern_rx, ui.Input->document()); setInformation(); connect(ui.Type, SIGNAL(textChanged(const QString&)), this, SLOT(setInformation())); connect(ui.Fields, SIGNAL(textChanged(const QString&)), this, SLOT(setInformation())); connect(ui.RegExp, SIGNAL(textChanged(const QString&)), this, SLOT(setInformation())); connect(ui.Input, SIGNAL(textChanged()), this, SLOT(inputMightHaveChanged())); } c2bSaveRegExp::~c2bSaveRegExp() {} void c2bSaveRegExp::setInformation() { QString info; bool can_save(false); const QStringList field_list(ui.Fields->text().split(' ', QString::SkipEmptyParts)); const int fields(field_list.count()); _pattern_rx.setPattern(ui.RegExp->text()); const int captures(_pattern_rx.numCaptures()); if (_pattern_rx.isValid() && fields > 0 && fields == captures && !ui.Type->text().isEmpty()) { info += tr("Reference type: %1\n").arg(ui.Type->text()); info += tr("Number of fields: %1\n").arg(fields); can_save = true; } else { if (ui.Type->text().isEmpty()) info += tr("[Error] Invalid pattern: empty reference type\n"); if (fields == 0) info += tr("[Error] Invalid pattern: no fields declared\n"); if (_pattern_rx.isValid()) { if (captures == 0) { if (_pattern_rx.pattern().isEmpty()) info += tr("[Error] Invalid pattern: empty regular expression\n"); else info += tr("[Error] Invalid pattern: no captures defined in the regular expression\n"); } else if (fields != captures) info += tr("[Error] Invalid pattern: declared %1 fields while the regular expression has %2 captures\n"). arg(fields).arg(captures); } else info += tr("[Error] Invalid regular expression: %1\n").arg(_pattern_rx.errorString()); } if (can_save) { if (_pattern_rx.indexIn(ui.Input->toPlainText()) == -1 || _pattern_rx.matchedLength() < 1) info += tr("[Info] Regular expression does not match input text\n"); else { bibParser* bp = c2b::bibParser(); for (int i = 0; i < fields; ++i) { const QString& f = field_list.at(i); const QString v(bp->parse(f, _pattern_rx.cap(i + 1))); info += QString("[%1]: '%2'\n").arg(f).arg(v); } } } ui.Information->setPlainText(info); ui.buttonBox->button(QDialogButtonBox::Save)->setEnabled(can_save); _sreS->rehighlight(); } void c2bSaveRegExp::updateInput(const QString& text) { if (!ui.Input->textCursor().hasSelection()) ui.Input->setPlainText(c2b::bibParser()->setTags(text)); } void c2bSaveRegExp::inputMightHaveChanged() { // Avoid recursively calling setInformation due to syntax highlighting if (_input_text == ui.Input->toPlainText()) return; _input_text = ui.Input->toPlainText(); setInformation(); } void c2bSaveRegExp::accept() { const QString rx(ui.Type->text() + '\n' + ui.Fields->text() + '\n' + ui.RegExp->text()); emit savePatternInfo(rx, ui.Name->text()); QDialog::accept(); } void c2bSaveRegExp::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-regexpedit.php"); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bHighlighter.h�������������������������������������������������������������������0000644�0001750�0001750�00000001776�12045520050�016367� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BHIGHLIGHTER_H #define C2BHIGHLIGHTER_H #include <QSyntaxHighlighter> /** clipboard SyntaxHighLighter @author Pere Constans */ class c2bColors; class c2bHighlighter : public QSyntaxHighlighter { public: c2bHighlighter(QTextDocument* doc); ~c2bHighlighter(); protected: virtual void highlightBlock(const QString& text); private: QColor text_color; QRegExp rx0; QRegExp rx1; QRegExp rx2; QRegExp rx3; QRegExp rx4; QRegExp rx5; QRegExp rx6; QRegExp rx_extracted_ends; QRegExp rx_extracted_starts; QRegExp rx_metadata_ends; QRegExp rx_metadata_starts; c2bColors* c; }; #endif ��cb2bib-1.4.9/src/c2bCiterView.cpp�������������������������������������������������������������������0000644�0001750�0001750�00000026557�12045520050�016371� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bCiterView.h" #include "c2bCiterExcerptView.h" #include <bibSearcher.h> #include <QApplication> #include <QHeaderView> #include <QKeyEvent> c2bCiterView::c2bCiterView(QWidget* parentw) : QTableView(parentw) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setShowGrid(false); setTabKeyNavigation(true); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); horizontalHeader()->setResizeMode(QHeaderView::Fixed); horizontalHeader()->setVisible(false); verticalHeader()->setDefaultSectionSize(fontMetrics().height() + 5); verticalHeader()->setResizeMode(QHeaderView::Fixed); verticalHeader()->setVisible(false); _citationsP = 0; _filter_mode = false; } void c2bCiterView::reloadModel(QAbstractItemModel* citations, const QStringList& bibtex_files, const c2bCiter::State& state) { _filter_mode = false; _filter_string.clear(); if (!citations) return; if (_citationsP != citations) { _citationsP = static_cast<c2bCiterModel*>(citations); QTableView::setModel(_citationsP); connect(_citationsP, SIGNAL(patternFilterChanged(const QString&)), this, SLOT(updatePatternFilter(const QString&))); } QModelIndex i(currentIndex()); _citationsP->reloadCitations(bibtex_files, state, &i); updateViewport(); updateCurrentIndex(i); } c2bCiter::State c2bCiterView::currentState() const { if (_citationsP) return _citationsP->currentState(currentIndex()); else return c2bCiter::State(); } void c2bCiterView::showPreviousState() { QModelIndex i(currentIndex()); _citationsP->restorePreviousState(&i); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::showNextState() { QModelIndex i(currentIndex()); _citationsP->restoreNextState(&i); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::clearCurrentFilter() { QModelIndex i(currentIndex()); _citationsP->clearCurrentFilter(&i); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::setPatternFilter(const QString& pattern) { QModelIndex i(currentIndex()); _filter_string = pattern; _citationsP->setPatternFilter(_filter_string, &i, _citationsP->currentFormat()); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::updatePatternFilter(const QString& pattern) { _filter_string = pattern; emit patternFilterChanged(false, _filter_string); } void c2bCiterView::setRelatedFilter() { if (_citationsP->count() == 0) return; QModelIndex i(currentIndex()); if (_citationsP->currentFormat() == c2bCiter::K) { const QString k(_citationsP->dataKeyword(i)); _citationsP->setKeywordFilter(k, &i); updateViewport(); updateCurrentIndex(i); } else { const QString f(_citationsP->dataFile(i)); if (f.isEmpty()) emit statusMessage(tr("No File contents in this reference.")); else { _citationsP->setRelatedFilter(f, &i); updateViewport(); updateCurrentIndex(i); } } } void c2bCiterView::toggleSelectedFilter() { QModelIndex i(currentIndex()); if (_citationsP->currentFilter() == c2bCiter::Selected) _citationsP->restoreLastNonSelectedState(&i); else _citationsP->setSelectedFilter(&i); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::toggleKeywordView() { if (_citationsP->count() == 0) return; QModelIndex i(currentIndex()); if (_citationsP->currentFormat() == c2bCiter::K) { _citationsP->restoreLastNonKeywordState(&i); updateViewport(); updateCurrentIndex(i); } else { const QString f(_citationsP->dataFile(i)); if (f.isEmpty()) emit statusMessage(tr("No File contents in this reference.")); else { _citationsP->setDocumentFilter(f, &i); updateViewport(); updateCurrentIndex(i); } } } void c2bCiterView::toggleGlossaryView() { QModelIndex i(currentIndex()); if (_citationsP->currentFormat() == c2bCiter::K && (_citationsP->currentFilter() == c2bCiter::None || _citationsP->currentFilter() == c2bCiter::Pattern)) _citationsP->restoreLastNonKeywordState(&i); else _citationsP->setGlossaryView(&i); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::keywordDocumentSearch() { const c2bCiter::KeywordData kd(_citationsP->keywordData(currentIndex())); if (!kd.valid) return; QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); const QString excerpt(bibSearcher::searchDocumentKeyword(kd.bibtexfn, kd.documentfn, kd.keyword)); QApplication::restoreOverrideCursor(); if (excerpt.isEmpty()) { emit statusMessage(tr("Keyword variation '%1' not available in this reference.").arg(kd.keyword)); return; } c2bCiterExcerptView cev(excerpt, this); cev.exec(); } void c2bCiterView::updateCurrentIndex(const QModelIndex& i) { setCurrentIndex(i); scrollTo(i, PositionAtCenter); } void c2bCiterView::updateFormat(const c2bCiter::Format& format) { if (!_citationsP) return; QModelIndex i(currentIndex()); _citationsP->updateFormat(format, &i); updateViewport(); updateCurrentIndex(i); } void c2bCiterView::updateViewport() { if (!_citationsP) return; const int nc(_citationsP->columnCount()); if (nc < 1) return; const int vp_w(viewport()->size().width()); if (nc == 1) { setColumnWidth(0, vp_w); return; } QList<int> w = _citationsP->sizeHintForColumns(); const int char_w(fontMetrics().width(QLatin1Char('N'))); for (int i = 0; i < nc; ++i) w[i] *= char_w; int required_w(w.at(0)); if (required_w >= vp_w) { setColumnWidth(0, vp_w); for (int i = 1; i < nc; ++i) setColumnWidth(i, 0); return; } for (int i = 1; i < nc; ++i) required_w += w.at(i); if (required_w > vp_w) { int available_w(vp_w - w.at(0)); int div[] = {0, 0, 0, 0}; while (available_w > 0) for (int i = 1; i < nc; ++i) if (div[i] < w.at(i)) { div[i] += 1; --available_w; } for (int i = 1; i < nc; ++i) w[i] = div[i]; } else w[nc-1] += vp_w - required_w; for (int i = 0; i < nc; ++i) setColumnWidth(i, w.at(i)); } void c2bCiterView::keyPressEvent(QKeyEvent* qevent) { if (_filter_mode) { switch (qevent->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Down: case Qt::Key_Escape: case Qt::Key_Up: case Qt::Key_Tab: _filter_mode = false; emit patternFilterChanged(_filter_mode, _filter_string); qevent->accept(); return; } switch (qevent->key()) { case Qt::Key_Backspace: _filter_string.chop(1); break; default: _filter_string += c2bUtils::toAscii(qevent->text(), c2bUtils::Collation); } emit patternFilterChanged(_filter_mode, _filter_string); setPatternFilter(_filter_string); qevent->ignore(); return; } if (qevent->modifiers() & Qt::ShiftModifier) { if (!qevent->text().isEmpty()) QTableView::keyboardSearch(qevent->text()); qevent->accept(); return; } switch (qevent->key()) { // Formats case Qt::Key_A: updateFormat(c2bCiter::AJYT); qevent->accept(); return; case Qt::Key_I: updateFormat(c2bCiter::IT); qevent->accept(); return; case Qt::Key_J: updateFormat(c2bCiter::JYA); qevent->accept(); return; case Qt::Key_T: updateFormat(c2bCiter::T); qevent->accept(); return; case Qt::Key_Y: updateFormat(c2bCiter::YAJT); qevent->accept(); return; // Filters case Qt::Key_Delete: _citationsP->clearSelection(); qevent->accept(); return; case Qt::Key_D: clearCurrentFilter(); qevent->accept(); return; case Qt::Key_F: _filter_mode = true; emit patternFilterChanged(_filter_mode, _filter_string); qevent->accept(); return; case Qt::Key_G: toggleGlossaryView(); qevent->accept(); return; case Qt::Key_K: toggleKeywordView(); qevent->accept(); return; case Qt::Key_R: setRelatedFilter(); qevent->accept(); return; case Qt::Key_S: toggleSelectedFilter(); qevent->accept(); return; // Actions case Qt::Key_Left: emit showPreviousState(); qevent->accept(); return; case Qt::Key_Right: emit showNextState(); qevent->accept(); return; case Qt::Key_C: emit citeReferences(); qevent->accept(); return; case Qt::Key_E: emit editReference(); qevent->accept(); return; case Qt::Key_O: emit openFile(); qevent->accept(); return; case Qt::Key_U: emit openUrl(); qevent->accept(); return; case Qt::Key_V: keywordDocumentSearch(); qevent->accept(); return; case Qt::Key_Escape: emit hideCiter(); qevent->accept(); return; // Navigation case Qt::Key_Tab: { QKeyEvent ke(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier); QTableView::keyPressEvent(&ke); qevent->accept(); return; } case Qt::Key_Backspace: { QKeyEvent ke(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier); QTableView::keyPressEvent(&ke); qevent->accept(); return; } case Qt::Key_Home: { QKeyEvent ke(QEvent::KeyPress, Qt::Key_Home, Qt::ControlModifier); QTableView::keyPressEvent(&ke); qevent->accept(); return; } case Qt::Key_End: { QKeyEvent ke(QEvent::KeyPress, Qt::Key_End, Qt::ControlModifier); QTableView::keyPressEvent(&ke); qevent->accept(); return; } case Qt::Key_Space: { QKeyEvent ke(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier); QTableView::keyPressEvent(&ke); qevent->accept(); return; } case Qt::Key_Enter: case Qt::Key_Return: { QTableView::keyPressEvent(qevent); QKeyEvent ke(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier); QTableView::keyPressEvent(&ke); qevent->accept(); return; } default: QTableView::keyPressEvent(qevent); qevent->ignore(); } } void c2bCiterView::resizeEvent(QResizeEvent* qevent) { updateViewport(); QTableView::resizeEvent(qevent); } void c2bCiterView::keyboardSearch(const QString& /* search */) {} �������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bCiterWidget.h�������������������������������������������������������������������0000644�0001750�0001750�00000003434�12045520050�016334� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BCITERWIDGET_H #define C2BCITERWIDGET_H #include "ui_c2bCiterWidget.h" #include <QSystemTrayIcon> class QLabel; class c2bCiterModel; class c2bCoreCiter; class c2bSettings; class c2bCiterWidget : public QWidget { Q_OBJECT public: c2bCiterWidget(QWidget* parentw = 0); ~c2bCiterWidget(); public: void load(); void setTrayIcon(); public slots: void show(); void toggleVisible(); signals: void openFile(const QString& fn); private: QString _status_label; QStringList _bibtex_files; QSystemTrayIcon* _tray_icon; Ui::c2bCiterWidget ui; bool _clipboard_connected; c2bCiterModel* _citations; c2bCoreCiter* _citerP; c2bSettings* _settingsP; void reload(const c2bCiter::State& state); void setActions(); void updateUserTimestamp(); private slots: void citeReferences(); void doSearchInFiles(); void editReference(); void filterDataChanged(const QString& filter); void help(); void indexDocuments(); void openDirectory(); void openFile(); void openFiles(); void openUrl(); void reload(); void showLabel(); void showLabel(const QString& label); void showMessage(const QString& message); void toggleCb2Bib(); void toggleClipboard(); void toggleFullScreen(); void trayIconActivated(QSystemTrayIcon::ActivationReason r); void updatePatternFilter(const bool mode, const QString& pattern); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bLineEdit.h����������������������������������������������������������������������0000644�0001750�0001750�00000001161�12045520050�015612� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BLINEEDIT_H #define C2BLINEEDIT_H #include <QLineEdit> class c2bLineEdit : public QLineEdit { Q_OBJECT public: c2bLineEdit(QWidget* parentw = 0); ~c2bLineEdit(); protected: virtual void contextMenuEvent(QContextMenuEvent* e); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bExport.h������������������������������������������������������������������������0000644�0001750�0001750�00000001530�12045520050�015376� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BEXPORT_H #define C2BEXPORT_H #include <QObject> #include <QStringList> class c2bExport : public QObject { Q_OBJECT public: c2bExport(QObject* parento = 0); ~c2bExport(); struct export_data { QString bibtex_contents; QString bibtex_fn; QString documents_dir; QString export_fn; QStringList bibtex_keys; bool copy_documents; bool relative_dir; }; void exportEntries(const export_data& ed); }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bBibHighlighter.h����������������������������������������������������������������0000644�0001750�0001750�00000001531�12045520050�016771� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BBIBHIGHLIGHTER_H #define C2BBIBHIGHLIGHTER_H #include <QSyntaxHighlighter> /** BibTeX SyntaxHighLighter @author Pere Constans */ class c2bColors; class c2bBibHighlighter : public QSyntaxHighlighter { public: c2bBibHighlighter(QTextDocument* doc); ~c2bBibHighlighter(); protected: virtual void highlightBlock(const QString& text); private: QColor text_color; QRegExp rx0; QRegExp rx1; QRegExp rx2; QRegExp rx3; c2bColors* c; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bShortcutPushButton.h������������������������������������������������������������0000644�0001750�0001750�00000002523�12045520050�017767� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSHORTCUTPUSHBUTTON_H #define C2BSHORTCUTPUSHBUTTON_H #include <QPushButton> class c2bShortcutPushButton : public QPushButton { Q_OBJECT public: inline c2bShortcutPushButton(QWidget* parentw = 0) : QPushButton(parentw) {} inline ~c2bShortcutPushButton() {} void setKeysequence(const QKeySequence& ks); void setDefaultKeysequence(const QKeySequence& ks) { _default_keysequence = ks; } inline QKeySequence keysequence() const { return _keysequence; } signals: void shortcutChanged(const QKeySequence& oldks, const QKeySequence& newks); public slots: void clear(); void reset(); protected: virtual void keyPressEvent(QKeyEvent* qevent); private: inline void _set_keysequence(const QKeySequence& ks) { const QKeySequence oldks(_keysequence); setKeysequence(ks); emit shortcutChanged(oldks, ks); } QKeySequence _default_keysequence; QKeySequence _keysequence; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bBibMenu.h�����������������������������������������������������������������������0000644�0001750�0001750�00000003747�12045520050�015452� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BBIBMENU_H #define C2BBIBMENU_H #include <QMenu> class c2bBibMenu : public QMenu { Q_OBJECT public: c2bBibMenu(QWidget* parentw = 0); inline ~c2bBibMenu() {} inline QAction* addAuthorAction() const { return _add_author_action; } inline QAction* addEditorAction() const { return _add_editor_action; } inline QAction* anyPatternAction() const { return _any_pattern_action; } inline void setAnyPatternText(const QString& text) { _any_pattern_action->setText(text); } QAction* exec(const QPoint& p); protected: void keyPressEvent(QKeyEvent* qevent); private: QAction* _abstract_action; QAction* _add_author_action; QAction* _add_editor_action; QAction* _address_action; QAction* _annote_action; QAction* _any_pattern_action; QAction* _author_action; QAction* _booktitle_action; QAction* _chapter_action; QAction* _doi_action; QAction* _edition_action; QAction* _editor_action; QAction* _eprint_action; QAction* _file_action; QAction* _institution_action; QAction* _isbn_action; QAction* _issn_action; QAction* _journal_action; QAction* _keyboard_selection; QAction* _keywords_action; QAction* _month_action; QAction* _note_action; QAction* _number_action; QAction* _organization_action; QAction* _pages_action; QAction* _publisher_action; QAction* _school_action; QAction* _series_action; QAction* _title_action; QAction* _url_action; QAction* _volume_action; QAction* _year_action; bool _was_plus_pressed; }; #endif �������������������������cb2bib-1.4.9/src/c2bPostprocess.cpp�����������������������������������������������������������������0000644�0001750�0001750�00000011057�12045520050�017001� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bPostprocess.h" #include "c2b.h" #include "c2bSettings.h" #include "c2bUtils.h" #include <QDir> #include <QMessageBox> #include <QProcess> #include <QPushButton> c2bPostprocess::c2bPostprocess(const QString& fn, QWidget* parentw) : QDialog(parentw) { ui.setupUi(this); setWindowTitle(tr("BibTeX Postprocessing Log - cb2Bib")); setAttribute(Qt::WA_DeleteOnClose); _buttonOpenFile = new QPushButton(tr("&Open File")); ui.buttonBox->addButton(_buttonOpenFile, QDialogButtonBox::ActionRole); _buttonOpenFile->setAutoDefault(true); _buttonOpenFile->setDefault(true); _buttonOpenFile->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(false); connect(ui.buttonBox, SIGNAL(helpRequested()), this, SLOT(help())); connect(_buttonOpenFile, SIGNAL(clicked()), this, SLOT(openFile())); c2bSettings* settings(c2bSettingsP); resize(settings->value("c2bLogWidget/size", size()).toSize()); PPBIBTEX_BIN = settings->fileName("cb2Bib/PostprocessBibTeXBin"); PPBIBTEX_ARG = settings->value("cb2Bib/PostprocessBibTeXArg").toString(); PPBIBTEX_EXT = settings->value("cb2Bib/PostprocessBibTeXExt").toString(); QFile f(fn); if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(parentw, tr("Warning - cb2Bib"), tr("Unable to open the file %1 for reading.\nError: '%2'."). arg(fn).arg(f.errorString()), QMessageBox::Ok); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); ui.Log->appendPlainText(tr("BibTeX Post Processing: Erroneous termination.\n")); } else { f.close(); _bib = fn; QFileInfo fi(fn); _out = QDir::toNativeSeparators(fi.absolutePath() + '/' + fi.baseName() + '.' + PPBIBTEX_EXT); QString cargs(PPBIBTEX_ARG); cargs.replace("%finput", _bib); cargs.replace("%foutput", _out); ui.Log->appendPlainText(tr("BibTeX Post Processing Command:\n%1 %2\n").arg(PPBIBTEX_BIN).arg(cargs)); PProcessFile(); } } c2bPostprocess::~c2bPostprocess() { c2bSettingsP->setValue("c2bLogWidget/size", size()); } void c2bPostprocess::PProcessFile() { // Postprocessing BibTeX const QStringList arglist(PPBIBTEX_ARG.split(' ', QString::SkipEmptyParts)); QStringList args; for (int i = 0; i < arglist.count(); i++) { if (arglist.at(i) == "%finput") args.append(_bib); else if (arglist.at(i) == "%foutput") args.append(_out); else args.append(arglist.at(i)); } _ppBibTeX = new QProcess(this); connect(_ppBibTeX, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(conversionEnded())); _ppBibTeX->start(PPBIBTEX_BIN, args); if (!_ppBibTeX->waitForStarted()) { ui.Log->appendPlainText(tr("Failed to call %1.").arg(PPBIBTEX_BIN)); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); delete _ppBibTeX; } } void c2bPostprocess::conversionEnded() { addToLog(); ui.buttonBox->button(QDialogButtonBox::Close)->setEnabled(true); if (QFileInfo(_out).isReadable()) { _buttonOpenFile->setEnabled(true); _buttonOpenFile->setFocus(); } else { ui.buttonBox->button(QDialogButtonBox::Close)->setAutoDefault(true); ui.buttonBox->button(QDialogButtonBox::Close)->setDefault(true); ui.buttonBox->button(QDialogButtonBox::Close)->setFocus(); } ui.Log->appendPlainText(tr("\n\nBibTeX Post Processing Command Ended.")); delete _ppBibTeX; } void c2bPostprocess::addToLog() { QString log(QString::fromUtf8(_ppBibTeX->readAllStandardOutput().trimmed())); if (!log.isEmpty()) ui.Log->appendPlainText(log); log = QString::fromUtf8(_ppBibTeX->readAllStandardError().trimmed()); if (!log.isEmpty()) ui.Log->appendPlainText(log); } void c2bPostprocess::openFile() { c2bUtils::openFile(_out, this); close(); } void c2bPostprocess::help() { c2bUtils::displayHelp("http://www.molspaces.com/d_cb2bib-overview.php#keyboard"); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bSearchInFilesPattern.h����������������������������������������������������������0000644�0001750�0001750�00000002237�12045520050�020137� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BSEARCHINFILESPATTERN_H #define C2BSEARCHINFILESPATTERN_H #include "ui_c2bSearchInFilesPattern.h" #include <QWidget> const int ITEMS_IN_SEARCH_PATTERN(6); class QTreeWidgetItem; class c2bSearchInFilesPattern : public QWidget { Q_OBJECT public: c2bSearchInFilesPattern(QWidget* parentw = 0); ~c2bSearchInFilesPattern(); const QStringList patterns(); void clear(); void setPattern(QTreeWidgetItem* pattern); void setText(const QString& text); inline bool isAvailable() const { return !ui.inputPattern->text().isEmpty(); } signals: void patternAvailable(bool available); public slots: void setFocus(); private slots: void patternChanged(); void showYearScope(const QString& scope); private: Ui::c2bSearchInFilesPattern ui; }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bTextBrowser.h�������������������������������������������������������������������0000644�0001750�0001750�00000001451�12045520050�016407� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BTEXTBROWSER_H #define C2BTEXTBROWSER_H #include <QTextBrowser> class QAction; /** @author Pere Constans */ class c2bTextBrowser : public QTextBrowser { Q_OBJECT public: c2bTextBrowser(QWidget* parentw = 0); ~c2bTextBrowser(); void updateHtml(const QString& newHtml); public slots: virtual void setSource(const QUrl& name); protected: virtual void contextMenuEvent(QContextMenuEvent* qevent); }; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bREHighlighter.cpp���������������������������������������������������������������0000644�0001750�0001750�00000005756�12045520050�017153� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bREHighlighter.h" #include "c2bSettings.h" #include <QPalette> #include <QTextDocument> c2bREHighlighter::c2bREHighlighter(QTextDocument* doc) : QSyntaxHighlighter(doc) { QPalette p; text_color = p.text().color(); c2bSettings* settings(c2bSettingsP); c = &settings->colors; connect(settings, SIGNAL(newSettings()), this, SLOT(rehighlight())); rx0 = QRegExp("\\b(?:abstract|address|annote|author|booktitle|chapter|" "doi|edition|editor|eprint|file|institution|isbn|issn|journal|" "keywords|month|note|number|organization|pages|publisher|" "school|series|title|url|volume|year)\\b"); rx0.setMinimal(true); rx1 = QRegExp("\\b(?:article|book|booklet|conference|inbook|incollection|" "inproceedings|manual|mastersthesis|misc|periodical|phdthesis|" "proceedings|techreport|unpublished)\\b"); rx2 = QRegExp("^[a-z_]+=\\S.+$"); rx3 = QRegExp("^[a-z_]+="); rx4 = QRegExp("<<[a-z]+>>"); rx5 = QRegExp("^#.*$"); } c2bREHighlighter::~c2bREHighlighter() {} void c2bREHighlighter::highlightBlock(const QString& text) { const int len(text.length()); setFormat(0, len - 1, text_color); int pos(0); while (pos >= 0) { pos = rx0.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx0.matchedLength(), c->bib_reference_field_color); pos += rx0.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx1.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx1.matchedLength(), c->bib_reference_type_color); pos += rx1.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx2.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx2.matchedLength(), c->netqinf_command_content_color); pos += rx2.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx3.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx3.matchedLength(), c->netqinf_command_key_color); pos += rx3.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx4.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx4.matchedLength(), c->cb2bib_tag_color); pos += rx4.matchedLength(); } } pos = 0; while (pos >= 0) { pos = rx5.indexIn(text, pos); if (pos > -1) { setFormat(pos, rx5.matchedLength(), c->comment_color); pos += rx5.matchedLength(); } } } ������������������cb2bib-1.4.9/src/c2bExport.cpp����������������������������������������������������������������������0000644�0001750�0001750�00000005203�12045520050�015732� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bExport.h" #include "c2b.h" #include <cb2bib_parameters.h> c2bExport::c2bExport(QObject* parento) : QObject(parento) {} c2bExport::~c2bExport() {} void c2bExport::exportEntries(const export_data& ed) { // Note. Assume caller performs export_data validity check for files and directories. // Prefer replacing filenames to a full BibTeX parsing: This will preserve the // original entry and possibly available non cb2Bib tags. bibParser* bp = c2b::bibParser(); QStringList fields; if (ed.copy_documents) fields.append("file"); QRegExp filere("\\bfile\\s*=\\s*[\\{\"](.*)[\\}\"]", Qt::CaseInsensitive); filere.setMinimal(true); QString export_contents("\n\n"); QString export_log; bibReference ref; bp->initReferenceParsing(ed.bibtex_fn, fields, &ref); while (bp->referencesIn(ed.bibtex_contents, &ref)) { if (!ed.bibtex_keys.contains(ref.citeidName, Qt::CaseSensitive)) continue; if (ed.copy_documents) { QString sfn(ref.value("file")); if (!sfn.isEmpty()) { QString dfn(c2bUtils::documentAbsoluteName(ed.relative_dir, ed.export_fn, ed.documents_dir, sfn)); QFile source(sfn); if (!source.copy(dfn)) export_log += tr("% Unable to copy file %1 to %2. %3.\n").arg(sfn).arg(dfn).arg(source.errorString()); if (QFileInfo(dfn).exists()) { const int pos(filere.indexIn(ref.rawReference, 0)); if (pos > -1) { QString line(filere.cap(0)); QString file(filere.cap(1)); line.replace(file, c2bUtils::documentFilename(ed.relative_dir, ed.export_fn, ed.documents_dir, sfn)); ref.rawReference.replace(pos, filere.matchedLength(), line); } } } } export_contents += ref.rawReference + "\n\n"; } if (!export_log.isEmpty()) export_contents = "% cb2Bib " + C2B_VERSION + " / Export Error Log\n" + export_log + export_contents; if (!c2bUtils::stringToFile(export_contents, ed.export_fn)) c2bUtils::warn(tr("Unable to write file %1").arg(ed.export_fn)); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bCiterModel.cpp������������������������������������������������������������������0000644�0001750�0001750�00000067054�12045520050�016514� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #include "c2bCiterModel.h" #include <bibParser.h> #include "c2b.h" #include <QDateTime> #include <QIcon> template <typename T> class ascending { public: ascending(const T& data) : _data(data) {} inline bool operator()(const int i, const int j) { return _data.at(i) < _data.at(j); } private: const T& _data; }; c2bCiterModel::c2bCiterModel(QObject* parento) : QAbstractTableModel(parento) { _first_column_color = QApplication::palette().color(QPalette::Active, QPalette::Base).darker(110); _clear(); } void c2bCiterModel::loadCitations(const QStringList& fns) { emit layoutAboutToBeChanged(); _clear(); _analyzer.reload(); for (int i = 0; i < fns.count(); ++i) _add_citations(fns.at(i)); _set_table_data(); _set_sort_indices(); _update_format(); emit layoutChanged(); emit statusMessage(tr("Loaded %1 references from %2 files.").arg(_citation_count).arg(fns.count())); } void c2bCiterModel::loadCitations(const QString& fn) { emit layoutAboutToBeChanged(); _clear(); _analyzer.reload(); _add_citations(fn); _set_table_data(); _set_sort_indices(); _update_format(); emit layoutChanged(); emit statusMessage(tr("Loaded %1 references.").arg(_citation_count)); } void c2bCiterModel::reloadCitations(const QStringList& fns, const c2bCiter::State& state, QModelIndex* current_index) { emit layoutAboutToBeChanged(); _clear(); _analyzer.reload(); for (int i = 0; i < fns.count(); ++i) _add_citations(fns.at(i)); _set_table_data(); _set_sort_indices(); _update_format(state.format); const int current_item(_current_item(state.index_data)); _update_current_index(current_item, current_index); _history.saveCurrentState(_format, _filter, current_item, current_index, _fstring); emit layoutChanged(); emit statusMessage(tr("Loaded %1 references from %2 files.").arg(_citation_count).arg(fns.count())); } QVariant c2bCiterModel::data(const QModelIndex& i, int role) const { if (role == Qt::DisplayRole) return (this->*_display_ptr)(i.row(), i.column()); else if (role == Qt::DecorationRole) { if (_format == c2bCiter::K && i.column() == 0) return QVariant(QIcon(":/icons/icons/bullet.png")); if (i.column() == 0) { if (_is_selected.at(_offset(i.row()))) return QVariant(QIcon(":/icons/icons/citer_citation_checked.png")); else return QVariant(QIcon(":/icons/icons/citer_citation.png")); } return QVariant(); } else if (role == Qt::BackgroundRole) { if (i.column() == 0 && _column_count > 1 && _format != c2bCiter::K) return _first_column_color; else return QVariant(); } else return QVariant(); } QStringList c2bCiterModel::dataSelectedCiteIds() const { QStringList ids; for (int i = 0; i < _citation_count; ++i) if (_is_selected.at(_map_yajt.at(i))) ids.append(_citeId.at(_map_yajt.at(i))); return ids; } void c2bCiterModel::setPatternFilter(const QString& pattern, QModelIndex* current_index, const c2bCiter::Format format) { _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); const QStringList word(pattern.split(c2bUtils::nonLetter, QString::SkipEmptyParts)); _filter = word.count() > 0 ? c2bCiter::Pattern : c2bCiter::None; _format = format; if (_filter == c2bCiter::Pattern) { _fstring = pattern; if (_format == c2bCiter::K) { int j(0); for (int i = 0; i < _keyword_count; ++i) { const QString& str = _analyzer.sentence(i); bool mf(true); for (int w = 0; w < word.count(); ++w) if (!str.contains(word.at(w), Qt::CaseSensitive)) { mf = false; break; } if (mf) _map_filter[j++] = i; } _row_count = j; } else { for (int i = 0; i < _citation_count; ++i) { _matches_filter[i] = true; const QString& str = _search_string.at(i); for (int w = 0; w < word.count(); ++w) if (!str.contains(word.at(w), Qt::CaseSensitive)) { _matches_filter[i] = false; break; } } } } else _fstring.clear(); _update_format(_format == c2bCiter::R ? _history.lastCitationFormat() : _format); _update_current_index(_format == c2bCiter::K ? _history.lastKeyword() : _history.lastCitation(), current_index); emit layoutChanged(); } void c2bCiterModel::setSelectedFilter(QModelIndex* current_index) { emit statusLabel(tr("Selected")); _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); for (int i = 0; i < _citation_count; ++i) _matches_filter[i] = _is_selected.at(i); _filter = c2bCiter::Selected; _fstring.clear(); _update_format(_history.lastCitationFormat()); _update_current_index(_history.lastSelectionCitation(), current_index); emit layoutChanged(); } void c2bCiterModel::setRelatedFilter(const QString& documentfn, QModelIndex* current_index, const c2bCiter::Format format) { _analyzer.setSimilarDocuments(documentfn); if (_analyzer.similarCount() == 0) { emit statusMessage(tr("No related references.")); return; } emit statusLabel(tr("Related to '%1'").arg(_title.at(_file.value(documentfn)))); _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); for (int i = 0; i < _citation_count; ++i) _matches_filter[i] = false; const int sc(_analyzer.similarCount()); _related_count = 0; for (int i = 0; i < sc; ++i) { // Note that data in collectionAnalyzer index might not match // BibTeX files data (outdated index or users browsing // particular BibTeX file sets). Use full path document // filenames to set a mapping. const int j(_file.value(_analyzer.similar(i), -1)); if (j == -1) { _analyzer.skipSimilarDocument(i); continue; } _matches_filter[j] = true; _map_filter[i] = j; ++_related_count; } _filter = c2bCiter::Related; _fstring = documentfn; _update_format(format); _update_current_index(_history.lastCitation(), current_index); emit layoutChanged(); } void c2bCiterModel::setKeywordFilter(const QString& keyword, QModelIndex* current_index) { _analyzer.setKeywordDocuments(keyword); if (_analyzer.documentCount() == 0) { emit statusMessage(tr("No related references.")); return; } emit statusLabel(tr("Related to '%1'").arg(keyword)); _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); for (int i = 0; i < _citation_count; ++i) _matches_filter[i] = false; const int dc(_analyzer.documentCount()); for (int i = 0; i < dc; ++i) { // See comment at c2bCiterModel::setRelatedFilter const int j(_file.value(_analyzer.document(i), -1)); if (j == -1) continue; _matches_filter[j] = true; } _filter = c2bCiter::Keyword; _fstring = keyword; _update_format(_history.lastCitationFormat()); _update_current_index(_history.lastKeyword(), current_index); emit layoutChanged(); } void c2bCiterModel::setDocumentFilter(const QString& documentfn, QModelIndex* current_index) { _analyzer.setDocumentKeywords(documentfn); const int nk(_analyzer.keywordCount()); if (nk == 0) { emit statusMessage(tr("No keywords from this reference.")); return; } emit statusLabel(tr("Keywords from '%1'").arg(_title.at(_file.value(documentfn)))); _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); int j(0); for (int i = 0; i < nk; ++i) _map_filter[j++] = _analyzer.keywordid(i); _row_count = j; _filter = c2bCiter::Document; _fstring = documentfn; _update_format(c2bCiter::K); _update_current_index(_history.lastKeyword(), current_index); emit layoutChanged(); } void c2bCiterModel::setGlossaryView(QModelIndex* current_index) { _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); _filter = c2bCiter::None; _fstring.clear(); _update_format(c2bCiter::K); _update_current_index(_history.lastKeyword(), current_index); emit patternFilterChanged(_fstring); emit layoutChanged(); } void c2bCiterModel::selectCitation(const QModelIndex& i) { if (_format == c2bCiter::K) return; _is_selected[_offset(i.row())] = !_is_selected.at(_offset(i.row())); emit layoutChanged(); } QList<int> c2bCiterModel::sizeHintForColumns() const { QList<int> sizes; switch (_format) { case c2bCiter::AJYT: sizes.append(qMin(20, _author_max_length + 2)); sizes.append(20); sizes.append(6); sizes.append(100); break; case c2bCiter::IT: sizes.append(12); sizes.append(100); break; case c2bCiter::JYA: sizes.append(qMin(25, _journal_max_length)); sizes.append(6); sizes.append(100); break; case c2bCiter::K: sizes.append(100); break; case c2bCiter::R: sizes.append(9); sizes.append(100); break; case c2bCiter::T: sizes.append(100); break; case c2bCiter::YAJT: default: sizes.append(8); sizes.append(75); sizes.append(25); sizes.append(100); break; } return sizes; } void c2bCiterModel::clearSelection() { emit layoutAboutToBeChanged(); for (int i = 0; i < _citation_count; ++i) _is_selected[i] = false; emit layoutChanged(); } void c2bCiterModel::clearCurrentFilter(QModelIndex* current_index) { if (_filter == c2bCiter::None) return; if (_filter != c2bCiter::Pattern && _history.lastState().filter == c2bCiter::Pattern) { const c2bCiter::State& s(_history.lastState()); setPatternFilter(s.filter_string, current_index, s.format); emit patternFilterChanged(s.filter_string); } else { _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); emit layoutAboutToBeChanged(); _filter = c2bCiter::None; _fstring.clear(); _update_format(_format == c2bCiter::R ? _history.lastCitationFormat() : _format); _update_current_index(_format == c2bCiter::K ? _history.lastKeyword() : _history.lastCitation(), current_index); emit patternFilterChanged(_fstring); emit layoutChanged(); } } c2bCiter::State c2bCiterModel::currentState(const QModelIndex& current_index) const { const int current_item(_current_item(current_index)); c2bCiter::State s(_format == c2bCiter::R ? _history.lastCitationFormat() : _format, _filter, current_index.row(), _fstring); if (current_item > -1) s.index_data = (_format == c2bCiter::K) ? _analyzer.sentence(current_item) : _search_string.at(current_item); return s; } void c2bCiterModel::restoreState(const c2bCiter::State& s, QModelIndex* current_index) { if (current_index) _history.saveCurrentItemIndex(_format, _filter, _current_item(current_index)); switch (s.filter) { case c2bCiter::None: emit layoutAboutToBeChanged(); _filter = c2bCiter::None; _fstring.clear(); _update_format(s.format); emit patternFilterChanged(_fstring); emit layoutChanged(); break; case c2bCiter::Document: if (_file.contains(s.filter_string)) emit statusLabel(tr("Keywords from '%1'").arg(_title.at(_file.value(s.filter_string)))); setDocumentFilter(s.filter_string, 0); break; case c2bCiter::Keyword: setKeywordFilter(s.filter_string, 0); break; case c2bCiter::Pattern: setPatternFilter(s.filter_string, 0, s.format); emit patternFilterChanged(s.filter_string); break; case c2bCiter::Related: setRelatedFilter(s.filter_string, 0, s.format); break; case c2bCiter::Selected: emit statusLabel(tr("Selected")); setSelectedFilter(0); break; default: break; } if (current_index) *current_index = index(s.viewer_index, 0); } void c2bCiterModel::restorePreviousState(QModelIndex* current_index) { if (_history.currentState() == -1) _history.saveCurrentState(_format, _filter, _current_item(current_index), current_index, _fstring); const c2bCiter::State s(_history.previousState()); restoreState(s, 0); if (current_index) *current_index = index(s.viewer_index, 0); } void c2bCiterModel::restoreNextState(QModelIndex* current_index) { if (_history.currentState() == -1) return; const c2bCiter::State s(_history.nextState()); restoreState(s, 0); if (current_index) *current_index = index(s.viewer_index, 0); } void c2bCiterModel::updateFormat(const c2bCiter::Format format, QModelIndex* current_index) { if (_format == c2bCiter::K) { c2bCiter::State s(_history.lastNonKeywordState()); s.format = format; restoreState(s, current_index); } else { emit layoutAboutToBeChanged(); const int current_item(_current_item(current_index)); _update_format(format); _update_current_index(current_item, current_index); emit layoutChanged(); } } void c2bCiterModel::_update_format(const c2bCiter::Format format) { _format = format; _history.saveCurrentCitationFormat(_format); switch (_format) { case c2bCiter::AJYT: _column_count = 4; _display_ptr = &c2bCiterModel::_display_ajyt; break; case c2bCiter::IT: _column_count = 2; _display_ptr = &c2bCiterModel::_display_it; break; case c2bCiter::JYA: _column_count = 3; _display_ptr = &c2bCiterModel::_display_jya; break; case c2bCiter::K: _column_count = 1; _display_ptr = &c2bCiterModel::_display_k; break; case c2bCiter::R: _column_count = 2; _display_ptr = &c2bCiterModel::_display_r; break; case c2bCiter::T: _column_count = 1; _display_ptr = &c2bCiterModel::_display_t; break; case c2bCiter::YAJT: default: _column_count = 4; _display_ptr = &c2bCiterModel::_display_yajt; break; } _set_mapping(); } int c2bCiterModel::_current_item(const QString& index_data) const { int current_item(-1); if (!index_data.isEmpty()) { if (_format == c2bCiter::K) { for (int i = 0; i < _keyword_count; ++i) if (index_data == _analyzer.sentence(i)) { current_item = i; break; } } else { for (int i = 0; i < _citation_count; ++i) if (index_data == _search_string.at(i)) { current_item = i; break; } } } return current_item; } void c2bCiterModel::_update_current_index(const int current_item, QModelIndex* current_index) const { if (!current_index) return; if (current_item >= 0) for (int i = 0; i < _row_count; ++i) if (_offset(i) == current_item) { *current_index = index(i, 0); return; } *current_index = index(0, 0); } void c2bCiterModel::_add_citations(const QString& fn) { bibParser* bpP = c2b::bibParser(); const QString tag_author("author"); const QString tag_booktitle("booktitle"); const QString tag_doi("doi"); const QString tag_editor("editor"); const QString tag_file("file"); const QString tag_journal("journal"); const QString tag_title("title"); const QString tag_url("url"); const QString tag_year("year"); const QString template_position("%1:%2"); QStringList fields; fields.append(tag_author); fields.append(tag_booktitle); fields.append(tag_doi); fields.append(tag_editor); fields.append(tag_file); fields.append(tag_journal); fields.append(tag_title); fields.append(tag_url); fields.append(tag_year); bibReference ref; bpP->initReferenceParsing(fn, fields, &ref); const QRegExp initials1("\\b\\w\\b"); const QRegExp initials2("[^\\w\\s]"); const QString bibtex(c2bUtils::fileToString(fn)); while (bpP->referencesIn(bibtex, &ref)) { QString author(ref.anyAuthor()); if (!author.isEmpty()) { author = bpP->authorFromBibTeX(author); author.remove(initials1); author.remove(initials2); author.replace(" and ", ", "); c2bUtils::simplifyString(author); } QString title(ref.anyTitle()); c2bUtils::cleanTitle(title, true); QString url(ref.value(tag_url)); if (url.isEmpty()) { const QString doi(ref.value(tag_doi)); if (!doi.isEmpty()) { if (doi.startsWith("http://")) url = QUrl::toPercentEncoding(doi); else url = "http://dx.doi.org/" + QUrl::toPercentEncoding(doi); } } QString file(ref.value(tag_file)); if (!file.isEmpty()) file = QDir::cleanPath(file); uint included_date; const QFileInfo finf(file); if (finf.exists()) included_date = QDateTime(finf.lastModified().date()).toTime_t(); else included_date = 0; _author_string.append(author); _bibtex_position.append(template_position.arg(fn).arg(ref.positionValue)); _citeId.append(ref.citeidName); _included_date.append(included_date); _journal.append(ref.anyJournal()); _title.append(title); _url.append(url); _year.append(ref.value(tag_year)); if (!file.isEmpty()) _file.insert(file, _citation_count); _citation_count++; } } void c2bCiterModel::_clear() { _filter = c2bCiter::None; _format = c2bCiter::AJYT; _author.clear(); _author_string.clear(); _bibtex_position.clear(); _citeId.clear(); _file.clear(); _fstring.clear(); _history.clear(); _included_date.clear(); _is_selected.clear(); _journal.clear(); _map_ajyt.clear(); _map_author.clear(); _map_filter.clear(); _map_it.clear(); _map_jya.clear(); _map_t.clear(); _map_yajt.clear(); _matches_filter.clear(); _search_string.clear(); _title.clear(); _url.clear(); _year.clear(); _author_count = 0; _author_max_length = 0; _citation_count = 0; _column_count = 0; _journal_max_length = 0; _keyword_count = 0; _mapping = 0; _related_count = 0; _row_count = 0; } /**************************************************************************** SETTING DATA POINTERS *****************************************************************************/ void c2bCiterModel::_set_table_data() { const QString sep(", "); const QChar dot('.'); for (int i = 0; i < _citation_count; ++i) _author_count += _author_string.at(i).count(sep) + 1; _author.resize(_author_count); _map_author.resize(_author_count); int ij(0); for (int i = 0; i < _citation_count; ++i) { const QStringList authors(_author_string.at(i).split(sep, QString::KeepEmptyParts)); for (int j = 0; j < authors.count(); ++j) { _author[ij] = authors.at(j).trimmed(); _map_author[ij] = i; _author_max_length = qMax(_author_max_length, _author.at(ij).length()); ++ij; } } if (_author_count != ij) qFatal("c2bCiterModel::_set_table_data: Mismatch author mapping"); bibParser* bpP = c2b::bibParser(); for (int i = 0; i < _citation_count; ++i) { _journal[i] = bpP->abbreviatedJournal(_journal.at(i)); _journal[i].remove(dot); _journal_max_length = qMax(_journal_max_length, _journal.at(i).length()); } _is_selected.resize(_citation_count); for (int i = 0; i < _citation_count; ++i) _is_selected[i] = false; _keyword_count = _analyzer.sentenceCount(); const int mca(qMax(_citation_count, _author_count)); const int mcas(qMax(mca, _keyword_count)); _matches_filter.resize(mca); _map_filter.resize(mcas); } void c2bCiterModel::_set_sort_indices() { const QChar sp(' '); // AJYT // Use _search_string as temporary for sorting _search_string.resize(_author_count); for (int i = 0; i < _author_count; ++i) { const int j(_map_author.at(i)); _search_string[i] = c2bUtils::toAscii(_author.at(i) + sp + _journal.at(j) + sp + _year.at(j) + sp + _title.at(j), c2bUtils::Collation); } _map_ajyt.resize(_author_count); for (int i = 0; i < _author_count; ++i) _map_ajyt[i] = i; ascending< QVector<QString> > ajyt(_search_string); qSort(_map_ajyt.begin(), _map_ajyt.end(), ajyt); // IT _search_string.resize(_citation_count); const int current_dtt(QDateTime::currentDateTime().toTime_t()); const QString dtt("%1"); const QChar padding('0'); for (int i = 0; i < _citation_count; ++i) _search_string[i] = c2bUtils::toAscii(dtt.arg(current_dtt - _included_date.at(i), 10, 10, padding) + sp + _title.at(i), c2bUtils::Collation); _map_it.resize(_citation_count); for (int i = 0; i < _citation_count; ++i) _map_it[i] = i; ascending< QVector<QString> > it(_search_string); qSort(_map_it.begin(), _map_it.end(), it); // JYA for (int i = 0; i < _citation_count; ++i) _search_string[i] = c2bUtils::toAscii(_journal.at(i) + sp + _year.at(i) + sp + _author_string.at(i), c2bUtils::Collation); _map_jya.resize(_citation_count); for (int i = 0; i < _citation_count; ++i) _map_jya[i] = i; ascending< QVector<QString> > jya(_search_string); qSort(_map_jya.begin(), _map_jya.end(), jya); // T for (int i = 0; i < _citation_count; ++i) _search_string[i] = c2bUtils::toAscii(_title.at(i), c2bUtils::Collation); _map_t.resize(_citation_count); for (int i = 0; i < _citation_count; ++i) _map_t[i] = i; ascending< QVector<QString> > t(_search_string); qSort(_map_t.begin(), _map_t.end(), t); // YAJT for (int i = 0; i < _citation_count; ++i) _search_string[i] = c2bUtils::toAscii(_year.at(i) + sp + _author_string.at(i) + sp + _journal.at(i) + sp + _title.at(i), c2bUtils::Collation); _map_yajt.resize(_citation_count); for (int i = 0; i < _citation_count; ++i) _map_yajt[i] = i; ascending< QVector<QString> > yajt(_search_string); qSort(_map_yajt.begin(), _map_yajt.end(), yajt); // Keep _search_string for filtering } void c2bCiterModel::_set_mapping() { switch (_format) { case c2bCiter::AJYT: _row_count = _author_count; _mapping = &_map_ajyt; break; case c2bCiter::IT: _row_count = _citation_count; _mapping = &_map_it; break; case c2bCiter::JYA: _row_count = _citation_count; _mapping = &_map_jya; break; case c2bCiter::K: _row_count = _filter == c2bCiter::None ? _keyword_count : _row_count; break; case c2bCiter::R: _row_count = _related_count; _mapping = &_map_filter; break; case c2bCiter::T: _row_count = _citation_count; _mapping = &_map_t; break; case c2bCiter::YAJT: default: _row_count = _citation_count; _mapping = &_map_yajt; break; } if (_filter == c2bCiter::None) return; if (_format == c2bCiter::K) { _mapping = &_map_filter; return; } if (_format == c2bCiter::R) // _map_filter is already set in setRelatedFilter return; int r(0); if (_format == c2bCiter::AJYT) { for (int i = 0; i < _row_count; ++i) if (_matches_filter.at(_map_author.at(_mapping->at(i)))) _map_filter[r++] = _mapping->at(i); } else { for (int i = 0; i < _row_count; ++i) if (_matches_filter.at(_mapping->at(i))) _map_filter[r++] = _mapping->at(i); } _row_count = r; _mapping = &_map_filter; } QString c2bCiterModel::_display_ajyt(const int row, const int column) const { switch (column) { case 0: return _author.at(_mapping->at(row)); case 1: return _journal.at(_map_author.at(_mapping->at(row))); case 2: return _year.at(_map_author.at(_mapping->at(row))); case 3: return _title.at(_map_author.at(_mapping->at(row))); default: return QString(); } } QString c2bCiterModel::_display_it(const int row, const int column) const { switch (column) { case 0: return _included_date.at(_offset(row)) > 0 ? QDateTime::fromTime_t(_included_date.at(_offset(row))).date().toString(Qt::ISODate) : QString(); case 1: return _title.at(_offset(row)); default: return QString(); } } QString c2bCiterModel::_display_jya(const int row, const int column) const { switch (column) { case 0: return _journal.at(_offset(row)); case 1: return _year.at(_offset(row)); case 2: return _author_string.at(_offset(row)); default: return QString(); } } QString c2bCiterModel::_display_k(const int row, const int column) const { switch (column) { case 0: return _analyzer.sentence(_offset(row)); default: return QString(); } } QString c2bCiterModel::_display_r(const int row, const int column) const { switch (column) { case 0: return QString("%1%").arg(100 * _analyzer.similarity(row), 3, 'f', 0); case 1: return _title.at(_offset(row)); default: return QString(); } } QString c2bCiterModel::_display_t(const int row, const int column) const { switch (column) { case 0: return _title.at(_offset(row)); default: return QString(); } } QString c2bCiterModel::_display_yajt(const int row, const int column) const { switch (column) { case 0: return _year.at(_offset(row)); case 1: return _author_string.at(_offset(row)); case 2: return _journal.at(_offset(row)); case 3: return _title.at(_offset(row)); default: return QString(); } } int c2bCiterModel::_offset(const int i) const { if (_format == c2bCiter::AJYT) return _map_author.at(_mapping->at(i)); else if (_format == c2bCiter::K && _filter == c2bCiter::None) return i; else return _mapping->at(i); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/src/c2bNetworkQuery.h������������������������������������������������������������������0000644�0001750�0001750�00000001766�12045520050�016607� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** * Copyright (C) 2004-2012 by Pere Constans * constans@molspaces.com * cb2Bib version 1.4.9. Licensed under the GNU GPL version 3. * See the LICENSE file that comes with this distribution. ***************************************************************************/ #ifndef C2BNETWORKQUERY_H #define C2BNETWORKQUERY_H #include "c2bUtils.h" #include <networkQuery.h> class c2bNetworkQuery : public networkQuery { Q_OBJECT public: c2bNetworkQuery(bibParser* bp, QObject* parento = 0); c2bNetworkQuery(bibParser* bp, network* net, QObject* parento = 0); ~c2bNetworkQuery(); protected: bool checkQueryFile(const QString& fn) const; inline QString fromHtmlString(const QString& str, const bool addMetadata = false) const { return c2bUtils::fromHtmlString(str, addMetadata); } bool openFile(const QString& fn) const { return c2bUtils::openFile(fn); } }; #endif ����������cb2bib-1.4.9/COPYRIGHT������������������������������������������������������������������������������0000644�0001750�0001750�00000001077�12045517740�014103� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The cb2Bib. Copyright (C) 2004-2012 by Pere Constans The cb2Bib includes third party GPL and LGPL code that is copyrighted by others: - Class clipboardPoll is based on work by Lubos Lunak, 2003 - Function citeToLyXPipe is adapted from work by Robby Stephenson, 2005 - Function updateUserTimestamp from KDE libraries, by Matthias K. Dalheimer, 1997 - Class EQRegExp is based on work by Trolltech ASA, 2008 - Class QtSingleApplication by Nokia Corporation, 2009 - Icons come from the Oxygen, Crystal SVG, and Noia icon sets, published by the KDE Desktop Environment. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/LICENSE��������������������������������������������������������������������������������0000644�0001750�0001750�00000104513�12045517740�013614� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> 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 3 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, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: <program> Copyright (C) <year> <name of author> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/����������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045520051�013501� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/references.css��������������������������������������������������������������������0000644�0001750�0001750�00000001373�12045520050�016337� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cb2Bib References CSS */ /* general */ body { font-size: 100%; font-family: sans-serif; background-color: #818B93; color: black; padding: 0; margin: 0; } a { color: #D8D7D7; text-decoration: none; } a:link { color: #D8D7D7; text-decoration: underline; } h1 { color: #C7C6C6; font-size: 20px; font-variant: small-caps; font-family: sans-serif; } /* references */ #references{ background-color: #818B93; } #references blockquote{ font-size: small; } #references span{ color: #E4E3E2; } #excerpt{ font-style: italic; } /* header */ #header { vertical-align: middle; } /* footer */ #footer { color: #C7C6C6; font-family: arial, sans-serif; font-size: small; } #footer td{ padding: 10px; padding-left: 5px; padding-right: 5px; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/references-dark.css���������������������������������������������������������������0000644�0001750�0001750�00000001417�12045520050�017255� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cb2Bib References CSS */ /* general */ body { font-size: 100%; font-family: sans-serif; background-color: #5C656D; color: #ECECEC; padding: 0; margin: 0; } a { color: #EDE159; text-decoration: none; } a:link { color: #EDE159; text-decoration: underline; } h1 { color: #ECECEC; font-size: 20px; font-variant: small-caps; font-family: sans-serif; } /* references */ #references{ background-color: #23445b; } #references blockquote{ font-size: small; } #references span{ color: #FFFFFF; font-weight: bold; } #excerpt{ font-style: italic; } /* header */ #header { vertical-align: middle; } /* footer */ #footer { color: #E4E3E2; font-family: arial, sans-serif; font-size: small; } #footer td{ padding: 10px; padding-left: 5px; padding-right: 5px; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/abbreviations.txt�����������������������������������������������������������������0000644�0001750�0001750�00000235501�12045517740�017113� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AA|Adhes. Age|Adhesives Age AA|Astron. Astrophys.|Astronomy and Astrophysics AAC|Antimicrob. Agents Chemother.|Antimicrobial Agents and Chemotherapy AAM|Adv. Appl. Math.|Advances in Applied Mathematics AAM|Adv. Appl. Microbiol.|Advances in Applied Microbiology AAMOP|Adv. At. Mol. Opt. Phys.|Advances in Atomic, Molecular, and Optical Physics AAQA|An. Asoc. Quim. Argent.|Anales de la Asociacion Quimica Argentina AB|Acta Biotechnol.|Acta Biotechnologica AB|Anal. Biochem.|Analytical Biochemistry ABB|Appl. Biochem. Biotechnol.|Applied Biochemistry and Biotechnology ABB|Arch. Biochem. Biophys.|Archives of Biochemistry and Biophysics ABEB|Adv. Biochem. Eng./Biotechnol.|Advances in Biochemical Engineering / Biotechnology ABP|Acta Biochim. Pol.|Acta Biochimica Polonica ACA|Anal. Chim. Acta|Analytica Chimica Acta ACA|Appl. Catal., A|Applied Catalysis A AC|Adv. Chromatogr.|Advances in Chromatography AC|Anal. Chem.|Analytical Chemistry AC|Anal. Chim.|Annali di Chimica AC|Anal. Commun.|Analytical Communications ACAP|Anal. Chem. A-Pages|Analytical Chemistry A-Pages ACB|Ann. Clin. Biochem.|Annals of Clinical Biochemistry ACB|Appl. Catal., B|Applied Catalysis B ACBSIB|Artif. Cells, Blood Substitues, Immobilization Biotechnol.|Artificial Cells Blood Substitutes and Immobilization Biotechnology ACC|Antiviral Chem. Chemother.|Antiviral Chemistry and Chemotherapy ACCB|Adv. Carbohydr. Chem. Biochem.|Advances in Carbohydrate Chemistry and Biochemistry ACDD|Anti-Cancer Drug Des.|Anti-Cancer Drug Design ACE|Adv. Cryog. Eng.|Advances in Cryogenic Engineering ACEJ|AlChE J.|AIChE Journal ACESS|AlChE Symp. Ser.|AIChE Symposium Series ACHMC|ACH - Models Chem.|ACH - Models in Chemistry ACIC|Acta Cienc. Indica, Chem.|Acta Cienceia Indica Chemistry ACIE|Angew. Chem. Int. Ed.|Angewandte Chemie International Edition ACIEE|Angew. Chem. Int. Ed. Engl.|Angewandte Chemie International Edition in English ACIMJ|ACI Mater. J.|ACI Materials Journal ACIP|Acta Cienc. Indica, Phys.|Acta Ciencia Indica Phyics ACIS|Adv. Colloid Interface Sci.|Advances in Colloid and Interface Science ACM|Adv. Compos. Mater|Advanced Composite Materials ACM|Appl. Compos. Mater.|Applied Composite Materials ACMTMS|ACM Trans. Math. Softw.|ACM Transactions on Mathematical Software ACP|Adv. Chem. Phys.|Advances in Chemical Physics ACR|Acc. Chem. Res.|Accounts of Chemical Research ACR|Ann. Chim. (Rome)|Annali di Chimica ACS|Acta Chem. Scand.|Acta Chemica Scandinavica ACS|Acta Chim. Sinica|Acta Chimica Sinica ACS|Adv. Chem. Ser.|Advances in Chemistry Series ACAFC|Acta Crystallogr. A Found. Crystallogr.|Acta Crystallographica Section A: Foundations of Crystallography ACSAMI|ACS Appl. Mater. Interfaces|ACS Applied Materials and Interfaces ACSB|Am. Ceram. Soc. Bull.|American Ceramic Society Bulletin ACBSS|Acta Crystallogr. B|Acta Crystallographica Section B: Structural Science ACCCSC|Acta Crystallogr. C Cryst. Struct. Commun.|Acta Crystallographica Section C: Crystal Structure Communications ACDBC|Acta Crystallogr. D Biol. Crystallogr.|Acta Crystallographica Section D: Biological Crystallography ACSESRO|Acta Crystallogr. Sect. E: Struct. Rep. Online|Acta Crystallographica Section E: Structure Reports Online ACSM|Ann. Chim. - Sci. Mat.|Annales de Chimie - Science des Materiaux ACSSS|ACS Symp. Ser.|ACS Symposium Series ADNDT|At. Data Nucl. Data Tables|Atomic Data and Nuclear Data Tables ADRTR|Adverse Drug React. Toxicol. Rev.|Adverse Drug Reactions and Toxicological Reviews AE|At. Energ.|Atomic Energy AE|Atmos. Environ.|Atmospheric Environment AECT|Arch. Environ. Contam. Toxicol.|Archives of Environment Contamination and Toxicology AEH|Arch. Environ. Health|Archives of Environment Health AEM|Adv. Eng. Mater.|Advanced Engineering Materials AEM|Appl. Environ. Microbiol.|Applied and Environment Microbiology AER|Adv. Enzyme Regul.|Advances in Enzyme Regulation AERAMB|Adv. Enzymol. Relat. Areas Mol. Biol.|Advances in Enzymology and Related Areas of Molecular Biology AF|Arzneim.-Forsch.|Arzneimittel-Forschung/Drug Research AFM|Adv. Funct. Mater.|Advanced Functional Materials AFST|Adv. Filtr. Sep. Technol.|Advances in Filtration and Separation Technology AG|Appl. Geochem.|Applied Geochemistry AHC|Adv. Heterocycl. Chem.|Advances in Heterocyclic Chemistry AHH|Acta Hydroch. Hydrob.|Acta Hydrochimica et Hydrobiologica AIBP|Arch. Insect Biochem. Physiol.|Archives of Insect Biochemistry and Physiology AIC|Adv. Inorg. Chem.|Advances in Inorganic Chemistry AIHAJ|Am. Ind. Hyg. Assoc. J.|American Industrial Hygiene Association Journal AJ|Appita J.|Appita Journal AJ|Astron. J.|Astronomy Journal AJ|Astrophys J.|Astrophysics Journal AJC|Asian J. Chem.|Asian Journal of Chemistry AJC|Aust. J. Chem.|Australian Journal of Chemistry AJRCMB|Am. J. Respir. Cell Mol. Biol.|American Journal of Respiratory Cell and Molecular Biology AJS|Asian J. Spectro.|Asian Journal of Spectroscopy AL|Am. Lab.|American Laboratory AL|Anal. Lett.|Analytical Letters AM|Acta Mater.|Acta Materialia AM|Acta Metall.|Acta Metallurgica AM|Adv. Mater.|Advanced Materials AM|Am. Mineral.|American Mineralogist AM|Arch. Microbiol.|Archives of Microbiology AMB|Appl. Microbiol. Biotechnol.|Applied Microbiology and Biotechnology AMC|Angew. Makromol. Chem.|Angewandte Makromolekulare Chemie AMC|Appl. Math. Comput.|Applied Mathematics and Computation AMOE|Adv. Mater. Opt. Electron.|Advanced Materials for Optics and Electronics AMP|Adv. Mater. Processes|Advanced Materials and Processes AMR|Adv. Mater. Res.|Advances in Materials Research AMR|Appl. Magn. Reson.|Applied Magnetic Resonance AMS|Adv. Mass Spectrom.|Advances in Mass Spectrometry ANADD|Antisense Nucleic Acid Drug Dev.|Antisense and Nucleic Acid Drug Development ANYAS|Ann. N.Y. Acad. Sci.|Annals of the New York Academy of Sciences AO|Appl. Opt.|Applied Optics AOC|Adv. Organomet. Chem.|Advances in Organometallic Chemistry AOC|Appl. Organomet. Chem.|Applied Organometallic Chemistry APA|Appl. Phys. A|Applied Physics A AP|Acta Polym.|Acta Polymerica AP|Arch. Pharm.|Archiv der Pharmazie APB|Appl. Phys. B|Applied Physics B APB|Arch. Physiol. Biochem.|Archives of Physiology and Biochemistry APC|Adv. Protein Chem.|Advances in Protein Chemistry APL|Appl. Phys. Lett.|Applied Physics Letters APMPM|Adv. Powder. Metall. Part. Mater.|Advances in Powder Metallurgy and Particulate Materials APOC|Adv. Phys. Org. Chem.|Advances in Physical Organic Chemistry APPA|Acta Phys. Pol., A|Acta Physica Polonica A APPB|Acta Phys. Pol., B|Acta Physica Polonica B APR|Arch. Pharmacal Res.|Archives of Pharmacal Research APS|Adv. Polym. Sci.|Advances in Polymer Science APSCTS|Acta Polytech. Scand., Chem. Technol. Ser|Acta Polytechnica Scandinavica - Chemical Technology Series APSRF|Ammonia Plant Saf. Relat. Facil|Ammonia Plant Safety and Related Facilities APT|Adv. Polym. Tech.|Advances in Polymer Technology APT|Adv. Powder Technol.|Advanced Powder Technology AQ|An. Quim.|Anales de Quimica AQC|Adv. Quantum Chem.|Advances in Quantum Chemistry AR|Anticancer Res.|Anticancer Research ARB|Annu. Rev. Biochem|Annual Review of Biochemistry ARBBS|Annu. Rev. Biophys. Biomol. Struct.|Annual Review of Biophysics and Biomolecular Structure ARCDB|Annu. Rev. Cell Dev. Biol.|Annual Review of Cell and Developmental Biology AREE|Annu. Rev. Energy Env.|Annual Review of Energy and the Environment ARI|Appl. Radiat. Isot.|Applied Radiation and Isotopes ARMC|Annu. Rep. Med. Chem.|Annual Reports in Medicinal Chemistry ARMS|Annu. Rev. Mater. Sci.|Annual Review of Materials Science ARPC|Annu. Rev. Phys. Chem.|Annual Review of Physical Chemistry ARPCSAIC|Annu. Rep. Prog. Chem. Sect. A: Inorg. Chem.|Annual Reports on the Progress of Chemistry, Section A: Inorganic Chemistry ARPCSBOC|Annu. Rep. Prog. Chem. Sect. B: Org. Chem.|Annual Reports on the Progress of Chemistry, Section B: Organic Chemistry ARPCSCPC|Annu. Rep. Prog. Chem. Sect. C: Phys. Chem.|Annual Reports on the Progress of Chemistry, Section C: Physical Chemistry ARPT|Annu. Rev. Pharmacool. Toxicol.|Annual Review of Pharmacology and Toxicology AS|Anal. Sci.|Analytical Sciences AS|Appl. Spectrosc.|Applied Spectroscopy AS|Appl. Supercond.|Applied Superconductivity AS|Atomization Sprays|Atomization and Sprays AS|At. Spectrosc.|Atomic Spectroscopy ASC|Adv. Synth. Catal.|Advanced Synthesis and Catalysis ASMPR|Adv. Second Messenger Phosphoprotein Res.|Advances in Second Messenger and Phosphoprotein Research ASR|Adv. Space Res.|Advances in Space Research ASR|Appl. Sci. Res.|Applied Scientific Research ASS|Appl. Surf. Sci.|Applied Surface Science AST|Adsorpt. Sci. Technol.|Adsorption Science and Technology AST|Aerosol Sci. Technol.|Aerosol Science and Technology ASTMSTP|ASTM Spec. Tech. Publ.|ASTM Specical Technical Publication AT|Aquat. Toxicol.|Aquatic Toxicology AT|Arch. Toxicol.|Archives of Toxicology ATE|Appl. Therm. Eng.|Applied Thermal Engineering AV|Arch. Virol|Archives of Virology AXRA|Adv. X-Ray Anal.|Advances in X-Ray Analysis BAB|Biotechnol. Appl. Biochem.|Biotechnology and Applied Biochemistry BA|Biochem. Arch.|Biochemical Archives BA|Biog. Amines|Biogenic Amines BA|Biotechnol. Adv.|Biotechnology Advances BBA|Biochim. Biophys. Acta|Biochimica et Biophysica Acta BBB|Biosci., Biotechnol., Biochem.|Bioscience Biotechnology and Biochemistry BB|Biocatal. Biotransform.|Biocatalysis and Biotransformation BB|Bioelectrochem. Bioenerg.|Bioelectrochemistry and Bioenergetics BB|Biomass Bioenergy|Biomass and Bioenergy BB|Biosens. Bioelectron.|Biosensors and Bioelectronics BB|Biotechnol. Bioeng.|Biotechnology and Bioengineering BBE|Biotechnol. Biotechnol. Equip.|Biotechnology and Biotechnological Equipment BBGPC|Ber. Bunsen-Ges. Phys. Chem.|Berichte der Bunsen-Gesellschaft für Physikalische Chemie B|Biochemistry|Biochemistry B|Bioinformatics|Bioinformatics B|Biomacromolecules|Biomacromolecules B|Biometrika|Biometrika BBRC|Biochem. Biophys. Res. Commun.|Biochemical and Biophysical Research Communications BCB|Biochem. Cell Biol.|Biochemistry and Cell Biology-Biochimie et Biologie Cellulaire BC|Bioconjugate Chem.|Bioconjugate Chemistry BC|Biol. Chem.|Biological Chemistry BC|Biomed. Chromatogr.|Biomedical Chromatography BC|Bioorg. Chem.|Bioorganic Chemistry BC|Biophys. Chem.|Biophysical Chemistry BCHS|Biol. Chem. Hoppe-Seyler|Biological Chemistry Hoppe-Seyler BCJ|Br. Corros. J.|British Corrosion Journal BCSJ|Bull. Chem. Soc. Jpn.|Bulletin of the Chemical Society of Japan BCT|Br. Ceram. Trans.|British Ceramic Transactions BDD|Biopharm. Drug Dispos.|Biopharmaceutics and Drug Disposition BE|Biomol. Eng|Biomolecular Engineering BE|Bioprocess. Eng.|Bioprocess Engineering BEBM|Bull. Exp. Biol. Med.|Bulletin of Experimental Biology and Medicine BE|Bull. Electrochem.|Bulletin of Electrochemistry BECT|Bull. Environ. Contam. Toxicol.|Bulletin of Environment Contamination and Toxicology BEJ|Biochem. Eng. J.|Biochemical Engineering Journal BG|Biochem. Genet.|Biochemical Genetics BH|Biotech. Histochem.|Biotechnic and Histochemistry BHC|Bull. Hist. Chem.|Bulletin for the History of Chemistry BJ|Biochem. J|Biochemical Journal BJ|Biophys. J.|Biophysical Journal BJ|Biorem. J.|Bioremediation Journal BJP|Br. J. Pharmacol.|British Jornal of Pharmacology BK|Bioorg. Khim|Bioorganicheskaya Khimiya (Russian Journal of Bioorganic Chemistry) BKCS|Bull. Korean Chem. Soc.|Bulletin of the Korean Chemical Society BL|Biotechnol. Lett|Biotechnology Letters BMBI|Biochem. Mol. Biol. Int.|Biochemistry and Molecular Biology International BM|Biol. Membr.|Biological Membranes BM|Biomed. Microdevices|Biomedical Microdevices BMC|Bioorg. Med. Chem.|Bioorganic and Medicinal Chemistry BMCB|BMC Bioinformatics|BioMed Central Bioinformatics BMCL|Bioorg. Med. Chem. Lett.|Bioorganic and Medicinal Chemistry Letters BMMB|Biochem. Med. Metab. Biol.|Biochemical Medicine and Metabolic Biology BMM|Biochem. Mol. Med.|Biochemical and Molecular Medicine BMME|Bio-Med. Mater. Eng.|Bio-Medical Materials and Engineering BMS|Bull. Mater. Sci.|Bulletin of Materials Science BPASC|Bull. Pol. Acad. Sci., Chem.|Bulletin of the Polish Academy of Sciences Chemistry BPB|Biol. Pharm. Bull.|Biological and Pharmaceutical Bulletin BP|Behav. Pharmacol.|Behavioural Pharmacology BP|Biochem. Pharmacol.|Biochemical Pharmacology BP|Biotechnol. Prog.|Biotechnology Progress BP|Biotechnol. Progr.|Biotechnology Progress BR|Biosci. Rep.|Bioscience Reports BSCB|Bull. Soc. Chim. Belg.|Bulletin des Societes Chimiques Belges BSCF|Bull. Soc. Chim. Fr.|Bulletin de la Societe Chimique de France BSCQ|Bol. Soc. Chil. Quim.|Boletin de la Sociedad Chilena de Quimica BSE|Biochem. Syst. Ecol.|Biochemical Systematics and Ecology BSS|Biochem. Soc. Symp.|Biochemical Society Symposium BST|Biochem. Soc. Trans.|Biochemical Society Transactions BT|Bioresour. Technol.|Bioresource Technology BT|Biotechnol. Tech.|Biotechnology Techniques BTER|Biol. Trace Elem. Res.|Biological Trace Element Research BWK|Brennst.-Warme-Kraft|Brennstoff-Warme-Kraft CA|Chem. Aust.|Chemistry in Australia CAD|Computer Aided Des.|Computer-Aided Design CAV|Chem. -Anlagen Verfahren|Chemie Anlagen und Verfahren CAW|Chem. Anal. (Warsaw)|Chemia Analityczna CBC|Comput. Biol. Chem.|Computational Biology and Chemistry CB|Chem. Ber.|Chemische Berichte CB|Chem. Br.|Chemistry in Britain CB|Clin. Biochem.|Clinical Biochemistry CBEQ|Chem. Biochem. Eng. Q.|Chemical and Biochemical Engineering Quarterly CBF|Cell Biochem. Funct.|Cell Biochemistry and Function CBI|Chem. Biol. Interact.|Chemico-Biological Interactions CBPAP|Comp. Biochem. Physiol. A: Physiol.|Comparative Biochemistry and Physiology A: Physiology CBPBBMB|Comp. Biochem. Physiol. B: Biochem. Mol. Biol.|Comparative Biochemistry and Physiology B: Biochemistry and Molecular Biology CBPCPT|Comp. Biochem. Physiol. C: Pharmacol. Toxicol.|Comparative Biochemistry and Physiology C: Pharmacology Toxicology and Endocrinology CBR|Chem. Ber. Recl.|Chemische Berichte-Recueil CCA|Clin. Chim. Acta|Clinica Chimica Acta CCA|Croat. Chem. Acta|Croatica Chemica Acta C|Calphad|Calphad - Computer Coupling of Phase Diagrams and Thermochemistry CC|Carbohydr. Chem.|Carbohydrate Chemistry CC|Catal. Commun.|Catalysis Communications CCCC|Collect. Czech. Chem. Commun.|Collection of Czechoslovak Chemical Communications CCC|Cem. Concr. Compos.|Cement and Concrete Composites CC|Cereal Chem.|Cereal Chemistry CC|Chem. Commun.|Chemical Communications CC|Clin. Chem.|Clinical Chemistry CC|Comput. Chem.|Computers and Chemistry CCE|Comput. Chem. Eng.|Computers and Chemical Engineering CCHTS|Comb. Chem. High Throughput Screening|Combinatorial Chemistry and High Throughput Screening CCL|Chin. Chem. Lett.|Chinese Chemical Letters CCM|Clays Clay Miner.|Clays and Clay Minerals CCO|Comput. Chem. (Oxford)|Computers and Chemistry CCQ|Can. Ceram. Q.|Canadian Ceramics Quarterly CCR|Cem. Concr. Res.|Cement and Concrete Research CCR|Coord. Chem. Rev.|Coordination Chemistry Reviews CCT|Cellul. Chem. Technol.|Cellulose Chemistry and Technology CEC|Chem. Eng. Commun.|Chemical Engineering Communications CE|Chem. Express|Chemistry Express CE|Compos. Eng.|Composites Engineering CE|Cryst. Eng.|Crystal Engineering CEI|Concr. Eng. Int.|Concrete Engineering International CEJ|Chem. Eng. J.|Chemical Engineering Journal CEJ|Chem. Eur. J.|Chemistry A European Journal CEJ|Chem. Eur. J.|Chemistry- A European Journal CEL|Chem. Eng. (London)|Chemical Engineer (London) CEN|Chem. Eng. News|Chemical and Engineering News CENY|Chem. Eng. (New York)|Chemical Engineering (New York) CEP|Chem. Eng. Process.|Chemical Engineering and Processing CEP|Chem. Eng. Prog.|Chemical Engineering Progress CERD|Chem. Eng. Res. Des.|Chemical Engineering Research and Design CES|Chem. Eng. Sci.|Chemical Engineering Science CET|Chem. Eng. Technol.|Chemical Engineering and Technology CF|Combust. Flame|Combustion and Flame CFI|Chem. Fibers Int.|Chemical Fibers International CG|Chem. Geol.|Chemical Geology CGD|Cryst. Growth Des.|Crystal Growth and Design CHC|Chem. Heterocycl. Compd.|Chemistry of Heterocyclic Compounds CIC|Comments Inorg. Chem.|Comments on Inorganic Chemistry CI|Ceram. Int.|Ceramics International CI|Chem. Ind. (London)|Chemistry and Industry CI|Compos. Interfaces|Composite Interfaces CI|Concr. Int.|Concrete International CILS|Chemom. Intell. Lab. Syst.|Chemometrics and Intelligent Laboratory Systems CIMB|CIM Bull.|CIM Bulletin CIT|Chem. Ing. Tech.|Chemie Ingenieur Technik CITRM|Cah. Inf. Tech./Rev Metall|Cahiers d'Informations Techniques / Revue de Metallurgie CJASS|Can. J. Anal. Sci. Spectros.|Canadian Journal of Analytical Sciences and Spectroscopy CJB|Can. J. Biochem.|Canadian Journal of Biochemistry CJC|Can. J. Chem.|Canadian Journal of Chemistry CJC|Chin. J. Chem .|Chinese Journal of Chemistry CJCE|Can. J. Chem. Eng.|Canadian Journal of Chemical Engineering CJCE|Chin. J. Chem. Eng.|Chinese Journal of Chemical Engineering CJ|Colloid J.|Colloid Journal CJM|Can. J. Microbiol.|Canadian Journal of Microbiology CJNP|Chin. J. Nucl. Phys.|Chinese Journal of Nuclear Physics CJP|Can. J. Phys.|Canadian Journal of Physics CJPP|Can. J. Physiol. Pharmacol.|Canadian Journal of Physiology and Pharmacology CJPS|Chin. J. Polym. Sci.|Chinese Journal of Polymer Science CL|Carbohydr. Lett.|Carbohydrate Letters CL|Catal. Lett.|Catalysis Letters CL|Chem. Lett.|Chemistry Letters CL|Chem. Listy|Chemicke Listy CM|Can. Mineral.|Canadian Mineralogist CM|Chem. Mater.|Chemistry of Materials CMJ|Can. Min. J.|Canadian Mining Journal CMP|Condens. Matter Phys.|Condensed Matter Physics CMP|Contrib. Mineral. Petrol.|Contributions to Mineralogy and Petrology CMQ|Can. Metall. Q.|Canadian Metallurgical Quarterly CMR|Concepts Magn. Reson.|Concepts in Magenetic Resonance CMS|Comput. Mater. Sci.|Computation Materials Science CMT|Condens. Matter Theor.|Condensed Matter Theories CMT|Continuum Mech. Thermodyn.|Continuum Mechanics and Thermodynamics CNC|Chem. Nat. Compd.|Chemistry of Natural Compounds COB|Curr. Opin. Biotechnol.|Current Opinion in Biotechnology COCB|Curr. Opin. Chem. Biol.|Current Opinion in Chemical Biology COC|Curr. Org. Chem.|Current Organic Chemistry COCIS|Curr. Opin. Colloid Interface Sci.|Current Opinion in Colloid and Interface Science COP|Curr. Opin. Pharmacol.|Current Opinion in Pharmacology COSB|Curr. Opin. Struct. Biol.|Current Opinion in Structural Biology COSSMS|Curr. Opin. Solid State Mater. Sci.|Current Opinion in Solid State and Materials Science CPA|Composites Part A|Composites Part A Applied Science and Manufacturing CPB|Cell. Physiol. Biochem.|Cellular Physiology and Biochemistry CPB|Chem. Pharm. Bull.|Chemical and Pharmaceutical Bulletin CPB|Composites Part B|Composites Part B Engineering CP|Carbohydr. Polym.|Carbohydrate Polymers CPC|Chem. Phys. Carbon|Chemistry and Physics of Carbon CPC|Comput. Phys. Commun.|Computer Physics Communications CP|Cell. Polym.|Cellular Polymers CP|Chem. Phys.|Chemical Physics CP|Chem. Process.|Chemical Processing CPCZ|Chem. Pap. - Chem. Zvesti|Chemical Papers - Chemicke Zvesti CPL|Chem. Phys. Lett.|Chemical Physics Letters CPL|Chem. Phys. Lipids|Chemistry and Physics of Lipids CPPCPP|CPP Chem. Plants and Process.|CPP Chemical Plants and Processing CPSBA|Curr. Plant Sci. Biotechnol. Agric.|Current Plant Science in Biotechnology and Agriculture CPS|Colloid. Polym. Sci.|Colloid and Polymer Science CRAC|Crit. Rev. Anal. Chem.|Critical Reviews in Analytical Chemistry CRASSIIC|C.R. Acad. Sci., Ser. IIc: Chim.|Comptes Rendus de l' Academie des Sciences Serie IIc:Chemie CRASSIII|C.R. Acad. Sci., Ser. III|Comptes Rendus de l' Academie des Sciences Serie III: Sciences de la Vie CRASSIIMPCA|C.R. Acad. Sci., Ser. IIb: Mec., Phys., Chim., Astron.|Comptes Rendus de l' Academie des Sciences Serie IIb:Mecanique Physique Chimie Astronomie CRASSIISTP|C.R. Acad. Sci., Ser. IIa: Sci. Terre Planets|Comptes Rendus de l' Academie des Sciences Serie IIa:Sciences de la Terre et des Planets CRB|Crit. Rev. Biotechnol.|Critical Reviews in Biotechnology CRBMB|Crit. Rev. Biochem. Mol. Biol.|Critical Reviews in Biochemistry and Molecular Biology CR|Carbohydr. Res.|Carbohydrate Research CR|Chem. Rev.|Chemical Reviews CR|Corros. Rev.|Corrosion Reviews CREST|Crit. Rev. Env. Sci. Technol.|Critical Reviews in Environment Science and Technology CRSE|Cat. Rev. - Sci. Eng.|Catalysis Reviews - Science and Engineering CRSSMS|Crit. Rev. Solid State Mater. Sci.|Critical Reviews in Solid State and Materials Sciences CRT|Chem. Res. Toxicol.|Chemical Research in Toxicology CRT|Crit. Rev. Toxicol.|Critical Reviews in Toxicology CRT|Cryst. Res. Technol.|Crystal Research and Technology CSA|Colloids Surf., A|Colloids and Surfaces A CSB|Chem. Speciation Bioavailability|Chemical Speciation and Bioavailability CSB|Chin. Sci. Bull.|Chinese Science Bulletin CSB|Colloids Surf., B|Colloids and Surfaces B CS|Ceram. Silik.|Ceramics - Silikaty CS|Chem. Senses|Chemical Senses CS|Compos. Struct.|Composite Structures CS|Corros. Sci.|Corrosion Science CSDA|Comput. Statist. Data Anal.|Computational Statistics and Data Analysis CSE|Concr. Sci. Eng.|Concrete Science and Engineering CSR|Chem. Soc. Rev.|Chemical Society Reviews CSS|Chromatogr. Sci. Ser.|Chromatographic Science Series CST|Combust. Sci. Technol.|Combustion Science and Technology CST|Compos. Sci. Technol.|Composites Science and Technology CT|Catal. Today|Catalysis Today CT|Ceram. Trans.|Ceramic Transactions CT|Chem. Tech.|ChemTech CTFO|Chem. Technol. Fuels Oils|Chemistry and Technology of Fuels and Oils CTL|Chem. Tech. (Leipzig)|Chemische Technik CTMC|Curr. Top. Med. Chem.|Current Topics in Medicinal Chemistry CTM|Curr. Top. Membr.|Current Topics in Membranes CTPS|Comput. Theor. Polym. Sci.|Computational and Theoretical Polymer Science CVD|Chem. Vap. Deposition|Chemical Vapor Deposition CW|Chem. Week|Chemical Week CZ|Chem. unserer Zeit|Chemie in unserer Zeit DAN|Dokl. Akad. Nauk|Doklady Akademii Nauk DCT|Drug Chem. Toxicol.|Drug and Chemical Toxicology DDIP|Drug Dev. Ind. Pharm.|Drug Development and Industrial Pharmacy DDR|Drug Dev. Res.|Drug Development Research DDT|Drug Discovery Today|Drug Discovery Today DFT|Diamond Films Technol.|Diamond Films and Technology DM|Dent. Mater.|Dental Materials DRM|Diamond Relat. Mater.|Diamond and Related Materials DT|Drying Technol.|Drying Technology EA|Electrochim. Acta|Electrochimica Acta EC|Educ. Chem.|Education in Chemistry EC|Electrochem. Commun.|Electrochemistry Communications ECER|Environ. Carcinog. Ecotoxicol. Rev.|Environment Carcinogenesis and Ecotoxicology Reviews ECM|Energy Convers. Manage.|Energy Conversion and Management EE|Ecol. Eng.|Ecological Engineering EES|Ecotoxicol. Environ. Saf.|Ecotoxicology and Environment Safety EF|Energy Fuels|Energy and Fuels EF|Exp. Fluids|Experiments in Fluids EG|Econ. Geol.|Economic Geology and the Bulletin of the Society of Economic Geologists EG|Environ. Geol.|Environmental Geology EGH|Environ. Geochem. Health|Environmental Geochemistry and Health EHP|Environ. Health Perspect.|Environmental Health Perspectives EJB|Eur. J. Biochem.|European Journal of Biochemistry EJCCCB|Eur. J. Clin. Chem. Clin. Biochem.|European Journal of Clinical Chemistry and Clinical Biochemistry EJIC|Eur. J. Inorg. Chem.|European Journal of Inorganic Chemistry EJLST|Eur. J. Lipid Sci. Technol.|European Journal of Lipid Science and Technology EJMC|Eur. J. Med. Chem.|European Journal of Medical Chemistry EJM|Eur. J. Mineral.|European Journal of Mineralogy EJMS|Eur. J. Mass Spectrom.|European Journal of Mass Spectrometry EJOC|Eur. J. Org. Chem.|European Journal of Organic Chemistry EJP|Eur. J. Pharmacol.|European Journal of Pharmacology EJSSIC|Eur. J. Solid State Inorg. Chem.|European Journal of Solid State and Inorganic Chemistry EKEP|Erdol and Kohle Erdgas, Petrochem.|Erdol and Kohle Erdgas, Petrochemie EL|Electron. Lett|Electronics Letters EL|Europhys. Lett.|Europhysics Letters EMA|Environ. Monit. Assess.|Environmental Monitoring and Assessment EMBOJ|EMBO J.|EMBO Journal EM|Electro- Magnetobiol.|Electro- and Magnetobiology EM|Environ. Microbiol.|Environmental Microbiology EMG|Explor. Min. Geol.|Exploration and Mining Geology EMJ|Eng. Min. J.|Engineering and Mining Journal EMS|Eur. Mass Spectrom.|European Mass Spectrometry EMT|Enzyme Microb. Technol.|Enzyme and Microbial Technology EP|Environ. Pollut.|Environmental Pollution EP|Environ. Prog.|Environmental Progress EP|Enzyme Protein|Enzyme and Protein EPJ|Eur. Polym. J.|European Polymer Journal EPSL|Earth. Planet. Sci. Lett.|Earth and Planetary Science Letters ER|Environ. Res.|Environmental Research ESI|Electrochem. Soc. Interface|Electrochemical Society Interface ESSL|Electrochem. Solid-State Lett.|Electrochemical and Solid-State Letters ESTAP|Environ. Sci. Technol. A-Pages|Environmental Science and Technology A-Pages EST|Environ. Sci. Technol.|Environmental Science and Technology ETC|Environ. Toxicol. Chem.|Environmental Toxicology and Chemistry ET|Electron Technol.|Electronic Technology ET|Environ. Technol.|Environmental Technology ETFS|Exp. Therm Fluid Sci.|Experimental Thermal and Fluid Science ETP|Environ. Toxicol. Pharmacol.|Environmental Toxicology and Pharmacology ETWQ|Environ. Toxicol. Water Qual.|Environmental Toxicology and Water Quality FAC|Food Addit. Contam.|Food Additives and Contaminants FACT|Field Anal. Chem. Technol.|Field Analytical Chemistry and Technology. FASEBJ|FASEB J.|FASEB Journal FAT|Fundam. Appl. Toxicol.|Fundamental and Applied Toxicology FB|Food Biotechnol.|Food Biotechnology FC|Food Chem.|Food Chemistry FCT|Food Chem. Toxicol.|Food and Chemical Toxicology FD|Faraday Discuss.|Faraday Discussions FD|Fold Des.|Folding and Design FEB|Fresenius Environ. Bull.|Fresenius Environment bulletin FEBSL|FEBS Lett.|FEBS Letters FED|Fusion Eng. Des.|Fusion Engineering and Design FEMSIMM|FEMS Immunol. Med. Microbiol.|FEMS Immunology And Medical Microbiology FEMSME|FEMS Microbiol. Ecol.|FEMS Microbiology Ecology FEMSML|FEMS Microbiol. Lett.|FEMS Microbiology Letters FEMSMR|FEMS Microbiol. Rev.|FEMS Microbiology Review FFEMS|Fatigue Fract. Eng. Mater. Struct.|Fatigue and Fracture of Engineering Materials and Structures FIG|Funct. Integr. Genomics|Functional and Integrative Genomics FIO|Fiber Integr. Opt.|Fiber and Integrated Optics FJAC|Fresenius J. Anal. Chem.|Fresenius Journal of Analytical Chemistry FL|Ferroelectr. Lett.|Ferroelectrics Letters FL|Fett - Lipid|Fett - Lipid FMM|Fiz. Met. Metalloved.|Fizika Metallov i Metallovedenie FPE|Fluid Phase Equilib.|Fluid Phase Equilibria FPSJ|Fluid/Part. Sep. J.|Fluid/Particle Separation Journal FPT|Fuel Process. Technol.|Fuel Processing Technology FRBM|Free Radical Biol. Med.|Free Radical Biology and Medicine FR|Ferroelectr. Rev.|Ferroelectrics Review FRR|Free Radical Res.|Free Radical Research FS|Filtr. Sep.|Filtration and Separation FSS|Front Sci. Ser.|Frontier Science Series FST|Fullerene Sci. Technol.|Fullerene Science and Technology FSTI|Food Sci. Technol. Int.|Food Science and Technology International FSTI|Fuel Sci. Technol. Int.|Fuel Science and Technology International FT|Fusion Technol.|Fusion Technology GABE|Genet. Anal. - Biomol. Eng.|Genetic Analysis - Biomolecular Engineering GBC|Global Biogeochem. Cycles|Global Biogeochemical Cycles GCA|Geochim. Cosmochim. Acta|Geochimica et Cosmochimica Acta GC|Glass Ceram.|Glass and Ceramics GC|Green Chem.|Greem Chemistry GCI|Gazz. Chim. Ital.|Gazzetta Chimica Italiana GEEA|Geochem.: Explor. Environ., Anal.|Geochemistry: Exploration, Environment, Analysis G|Galvanotechnik|Galvanotechnik GG|Geol Geofiz|Geologiya i Geofizika GGG|Geochem. Geophys. Geosyst.|Geochemistry, Geophysics, Geosystems GJ|Geochem. J.|Geochemical Journal GJ|Geomicrobiol. J.|Geomicrobiology Journal GJ|Glycoconjugate J.|Glycoconjugate Journal GJPAS|Global J. Pure Appl. Sci.|Global Journal of Pure and Applied Sciences GPC|Glass Phys. Chem|Glass Physics and Chemistry GR|Glass Res.|Glass Research GRL|Gefahrstoffe - Reinhalt. Luft|Gefahrstoffe Reinhaltung der Luft GSP|Gas Sep. Purif.|Gas Separation and Purification GST|Glass Sci. Technol.|Glass Science and Technology GT|Geochem. Trans.|Geochemical Transactions GT|Glass Technol.|Glass Technology GWMR|Ground Water Monit. Rem.|Ground Water Monitoring and Remediation HC|Heteroat. Chem|Heteroatom Chemistry HC|Heterocycl. Commun.|Heterocyclic Communications HCR|Heterogen. Chem. Rev.|Heterogeneous Chemistry Reviews HEC|High Energ. Chem.|High Energy Chemistry HEP|Handb. Exp. Pharmacol.|Handbook of Experimental Pharmacology HICA|HeIv. Chim. Acta|HeIvetica Chimica Acta HI|Hyperfine Interact.|Hyperfine Interactions HJIC|Hung. J. Ind. Chem.|Hungarian Journal of Industrial Chemistry HMT|Heat Mass Transfer.|Heat and Mass Transfer HP|Health Phys.|Health Physics HPIE|Hydrocarbon Process., Int. Ed.|Hydrocarbon Processing, International Edition HPP|High Perform. Polym.|High Performance Polymers HRCJHRC|HRC J. High Resolut. Chromatogr.|HRC Journal of High Resolution Chromatography HRW|Holz Roh Werkst.|Holz als Roh und Werkstoff HSZPC|Hoppe-Seyler's Z. Physiol. Chem.|Hoppe-Seyler's Zeitschrift fur Physiologische Chemie HTM|Heat Treat. Met.|Heat Treatment of Metals HTMPL|High Temp. Mater. Processes (London)|High Temperature Materials and Processes HTMPNY|High Temp. Mater. Processes (New York)|High Temperature Material Processes HWHM|Hazard. Waste Hazard. Mater.|Hazardous Waste and Hazardous Materials IBB|Int. Biodeterior. Biodegrad.|International Biodeterioration and Biodegradation IBMB|Insect Biochem. Mol. Biol.|Insect Biochemisry and Molecular Biology ICA|Inorg. Chim. Acta|Inorganica Chimica Acta ICC|Inorg. Chem. Commun.|Inorganic Chemistry Communications IC|Inorg. Chem.|Inorganic Chemistry ICP|Inz. Chem. Procesowa|Inzynieria Chemiczna i Procesowa IDATASSDMSA|Int. DATA Ser., Sel. Data Mixtures, Ser. A|International DATA Series, Selected Data on Mixtures, Series A IDR|Ind. Diamond Rev.|Industrial Diamond Review IECF|Ind. Eng. Chem. Fundam.|Industrial and Engineering Chemistry Research Fundamentals IEC|Ind. Eng. Chem.|Industrial and Engineering Chemistry IECR|Ind. Eng. Chem. Res.|Industrial and Engineering Chemistry Research IEEESJ|IEEE Sens. J.|IEEE Sensors Journal IJAA|Int. J. Adhes. Adhes.|International Journal of Adhesion and Adhesives IJBB|Indian J. Biochem. Biophys.|Indian Journal of Biochemistry and Biophysics IJBCB|Int. J. Biochem. Cell Biol.|International Journal of Biochemistry and Cell Biology IJBC|Int. J. Bio-Chromatogr.|International Journal of Biochromatography IJB|Int. J. Biochem.|International Journal of Biochemistry IJBM|Int. J. Biol. Macromol.|International Journal of Biological Macromolecules IJC|Internet J. Chem.|Internet Journal of Chemistry IJC|Isr. J. Chem.|Israel Journal of Chemistry IJCK|Int. J. Chem. Kinet.|International Journal of Chemical Kinetics IJCMR|Int. J. Cast Met. Res.|International Journal of Cast Metals Research IJCSA|Indian J. Chem., Sect A|Indian Journal of Chemistry Section A: Inorganic, Bio-inorganic, Physical, Theoretical and Analytical Chemistry IJCSB|Indian J. Chem., Sect B|Indian Journal of Chemistry Section B: Organic Chemistry including Medicinal Chemistry IJCT|Indian J. Chem. Technol.|Indian Journal of Chemical Technology IJEAC|Int. J. Environ. Anal. Chem.|International Journal of Environment Analytical Chemistry IJEMS|Indian J. Eng. Mater. Sci.|Indian Journal of Engineering and Materials Science IJF|Int. J. Fatigue|International Journal of Fatigue IJHC|Indian J. Heterocycl. Chem.|Indian Journal of Heterocyclic Chemistry IJHE|Int. J. Hydrogen Energy|International Journal of Hydrogen Energy IJHFF|Int. J. Heat Fluid Flow|International Journal of heat and fluid flow IJHMT|Int. J. Heat Mass Transfer|International Journal of Heat and Mass Transfer IJI|Int. J. Immunopharmacol|International Journal of Immunopharmacology IJIM|Int. J. Inorg. Mater.|International Journal of Inorganic Materials IJMF|Int. J. Multiphase Flow|International Journal of Multiphase Flow IJM|Int. J. Mass Spectrom.|International Journal of Mass Spectrometry IJMPB|Int. J. Mod Phys B|International Journal of Modern Physics B IJMP|Int. J. Miner. Process.|International Journal of Mineral Processing IJMSIP|Int. J. Mass Spectrom. Ion Processes|International Journal of Mass Spectrometry and Ion Processes IJNMF|Int. J. Numer. Methods Fluids|International Journal for Numerical Methods in Fluids IJO|Int. J. Oncol.|International Journal of Oncology IJPAC|Int. J. Polym. Anal. Charact.|International Journal of Polymer Analysis and Characterization IJPAP|Indian J. Pure Appl. Phys.|Indian Journal of Pure and Applied Physics IJP|Int. J. Pharm.|International Journal of Pharmaceutics IJP|Int. J. Phytorem.|International Journal of Phytoremediation IJP|Int. J. Plast.|International Journal of Plasticity IJPM|Int. J. Polymer. Mater.|International Journal of Polymeric Materials IJPM|Int. J. Powder Metall.|International Journal of Powder Metallurgy IJPPR|Int. J. Pept. Protein Res.|International Journal of Peptide and Protein Research IJQC|Int. J. Quantum Chem.|International Journal of Quantum Chemistry IJRB|Int. J. Radiat Biol.|International Journal of Radiation Biology IJRMHM|Int. J. Refract. Met. Hard Mater.|International Journal of Refractory Metals and Hard Materials IJSPHTS|Int. J. Self-Propag. High-Temp Synth.|International Journal of Self-Propagating High-Temperature Synthesis IJT|Indian J. Technol.|Indian Journal of Technology IJT|Int. J. Thermophys.|International Journal of Thermophysics IJVS|Internet J. Vib. Spectro.|Internet Journal of Vibrational Spectroscopy IM|Inorg. Mater.|Inorganic Materials IMR|Int. Mater. Rev.|International Materials Reviews IPP|Int. Polym. Proc.|International Polymer Processing IPT|Infrared Phys. Technol.|Infrared Physics and Technology IQ|Ing. Quim.|Ingeniera Quimica (Madrid) IRM|Inorg. React. Mech.|Inorganic Reaction Mechanisms IRPC|Int. Rev. Phys. Chem.|International Reviews in Physical Chemistry ISIJI|ISIJ Int.|ISIJ International IS|Inorg. Synth.|Inorganic Syntheses IS|Interface Sci.|Interface Science IS|Ironmaking Steelmaking|Ironmaking and Steelmaking IST|Instrum Sci. Technol.|Instrumentation Science and Technology JAAP|J. Anal. Appl. Pyrolysis|Journal of Analytical and Applied Pyrolysis JAAS|J. Anal. At. Spectrom.|Journal of Analytical Atomic Spectrometry JAB|J. Appl. Bacteriol.|Journal of Applied Bacteriology JAB|J. Appl. Biomater.|Journal of Applied Biomaterials JAC|J. Alloys Compd.|Journal of Alloys and Compounds JAC|J. Anal. Chem.|Journal of Analytical Chemistry JAC|J. Antimicrob. Chemother.|Journal of Antimicrobial Chemotherapy JAC|J. Appl. Crystallogr.|Journal of Applied Crystallography JAC|J. Autom. Chem.|Journal of Automatic Chemistry JACS0|J. Am. Ceram. Soc.|Journal of the American Ceramic Society JACS|J. Am. Chem. Soc.|Journal of the American Chemical Society JACS1|J. Amer. Chem. Soc.|Journal of the American Chemical Society JAE|J. Appl. Electrochem.|Journal of Applied Electrochemistry JAFC|J. Agric. Food. Chem.|Journal of Agricultural and Food Chemistry JA|J. Adhes.|Journal of Adhesion JA|J. Antibiot.|Journal of Antibiotics JAM|J. Adv. Mater.|Journal of Advanced Materials JAMMC|J. Autom. Methods Manage. Chem.|Journal of Automated Methods and Management in Chemistry JANPR|J. Asian Nat. Prod. Res.|Journal of Asian Natural Products Research JAOACI|J. AOAC Int.|Journal of AOAC International JAOCS|J. Am. Oil Chem. Soc.|Journal of the American Oil Chemists Society JAP|J. Appl. Phycol.|Journal of Applied Phycology JAP|J. Appl. Phys.|Journal of Applied Physics JAPS|J. Appl. Polym. Sci.|Journal of Applied Polymer Science JASBC|J. Am. Soc. Brew. Chem.|Journal of the American Society of Brewing Chemists JAS|J. Aerosol Sci|Journal of Aerosol Science JAS|J. Appl. Spectrosc.|Journal of Applied Spectroscopy JASMS|J. Am. Soc. Mass. Spectrom.|Journal of the American Society for Mass Spectrometry JAST|J. Adhes. Sci. Technol.|Journal of Adhesion Science and Technology JAT|J. Anal. Toxicol.|Journal of Analytical Toxicology JAT|J. Appl. Toxicol.|Journal of Applied Toxicology JAWMA|J. Air Waste Manage. Assoc.|Journal of the Air and Waste Management Association JBA|J. Biomater. Appl.|Journal of Biomaterials Applications JBBM|J. Biochem. Bioph. Methods|Journal of Biochemical and Biophysical Methods JBC|J. Biol. Chem.|Journal of Biological Chemistry JBC|J. Biolumin. Chemilumin.|Journal of Bioluminescence and Chemiluminescence JBCP|J. Bioact. Compat. Polym.|Journal of Bioactive and Bompatible Polymers JBIC|J. Biol. Inorg. Chem.|Journal of Biological Inorganic Chemistry JB|J. Bacteriol.|Journal of Bacteriology JB|J. Biochem.|Journal of Biochemistry JB|J. Biotechnol.|Journal of Biotechnology JBMR|J. Biomed. Mater. Res.|Journal of Biomedial Materials Research JBNMR|J. Biomol. NMR|Journal of Biomolecular NMR JBSD|J. Biomol. Struct. Dyn.|Journal of Biomolecular Structure and Dynamics JBSPE|J. Biomater. Sci., Polym. Ed.|Journal of Biomaterials Science Polymer Edition JCA|J. Chromatogr. A|Journal of Chromatography A JCAMD|J. Comput. Aided Mater. Des.|Journal of Computer-Aided Materials Design JCAMD|J. Comput. Aided Mol. Des.|Journal of Computer-Aided Molecular Design JCB|J. Cell. Biochem.|Journal of Cellular Biochemistry JCB|J. Cell Biol.|Journal of Cell Biology JCB|J. Chromatogr. B|Journal of Chromatography B JCC|J. Carbohydr. Chem.|Journal of Carbohydrate Chemistry JCC|J. Chem. Crystallogr.|Journal of Chemical Crystallography JCC|J. Comb. Chem.|Journal of Combinatorial Chemistry JCC|J. Comput. Chem.|Journal of Computational Chemistry JCC|J. Coord. Chem.|Journal of Coordination Chemistry JCCS|J. Chin. Chem. Soc.|Journal of the Chinese Chemical Society JCED|J. Chem. Eng. Data|Journal of Chemical and Engineering Data JCE|J. Chem. Ecol.|Journal of Chemical Ecology JCE|J. Chem. Educ.|Journal of Chemical Education JCEJ|J. Chem. Eng. Jpn.|Journal of Chemical Engineering of Japan JCEM|J. Clin. Endocrinol. Metab.|Journal of Clinical Endocrinology and Metabolism JCG|J. Cryst. Growth|Journal of Crystal Growth JCH|J. Contam. Hydrol.|Journal of Contaminant Hydrology JCICE|J. Chin. Inst. Chem. Eng,|Journal of the Chinese Institute of Chemical Engineers JCICS|J. Chem. Inf. Comput. Sci.|Journal of Chemical Information and Computer Sciences JCIM|J. Chem. Inf. Model.|Journal of Chemical Information and Modeling JCIS|J. Colloid Interface Sci.|Journal of Colloid and Interface Science JC|J. Catal.|Journal of Catalysis JC|J. Chemom.|Journal of Chemometrics JC|J. Chromatogr.|Journal of Chromatography JCM|J. Clin. Microbiol.|Journal of Clinical Microbiology JCM|J. Compos. Mater.|Journal of Composite Materials JCN|J. Chem. Neuroanat.|Journal of Chemical Neuroanatomy JCP|J. Cardiovasc. Pharmacol.|Journal of Cardiovascular Pharmacology JCP|J. Cell. Physiol.|Journal of Cellular Physiology JCP|J. Chem. Phys.|The Journal of Chemical Physics JCP|J. Chem. Phys.|Journal of Chemical Physics JCP|J. Comput. Phys.|Journal of Computational Physics JCPPCB|J. Chim. Phys. Phys.- Chim. Biol.|Journal de Chimie Physique et de Physico-Chimie Biologique JCPT|J. Can. Pet. Technol.|Journal of Canadian Petroleum Technology JCR|J. Controlled Release|Journal of Controlled Release JCRS|J. Chem. Res., Synop .|Journal of Chemical Research Synopsis JCSCC|J. Chem. Soc., Chem. Commun.|Journal of the Chemical Society, Chemical Communications JCSDT|J. Chem. Soc., Dalton Trans.|Journal of the Chemical Society, Dalton Transactions JCSFT|J. Chem. Soc., Faraday Trans.|Journal of the Chemical Society, Faraday Transactions JCS|J. Cell Sci.|Journal of Cell Science JCS|J. Chem. Soc.|Journal of the Chemical Society JCS|J. Chromatogr. Sci.|Journal of Chromatographic Science JCS|J. Cluster Sci.|Journal of Cluster Science JCSJ|J. Ceram. Soc. Jpn.|Journal of the Ceramic Society of Japan JCSP|J. Chem. Soc. Pak.|Journal of the Chemical Society of Pakistan JCSPT|J. Chem. Soc., Perkin Trans. 1|Journal of the Chemical Society, Perkin Transactions 1 JCSPT|J. Chem. Soc., Perkin Trans. 2|Journal of the Chemical Society, Perkin Transactions 2 JCTB|J. Chem. Technol. Biotechnol.|Journal of Chemical Technology and Biotechnology JCTC|J. Chem. Theory Comput.|Journal of Chemical Theory and Computation JCT|J. Chem. Thermodyn.|Journal of Chemical Thermodynamics JCT|J. Coat. Technol.|Journal of Coatings Technology JCTR|J. Compos. Tech. Res.|Journal of Composites Technology and Research JDS|J. Dairy Sci.|Journal of Dairy Science JDST|J. Dispersion Sci. Technol.|Journal of Dispersion Science and Technology JEAEE|J. Exposure Anal. Environ. Epidemiol.|Journal of Exposure Analysis and Environment Epidemiology JEB|J. Environ. Biol.|Journal of Environment biology JEB|J. Exp. Biol.|Journal of Experimental Biology JEB|J. Exp. Bot.|Journal of Experimental Botany JEC|J. Electroanal. Chem.|Journal of Electroanalytical Chemistry JECS|J. Eur. Ceram. Soc.|Journal of the European Ceramic Society JEE|J. Environ. Eng.|Journal of Environment Engineering JEH|J. Environ. Health|Journal of Environment Health JEI|J. Enzym Inhib.|Journal of Enzyme Inhibition JE|J. Electroceram.|Journal of Electroceramics JE|J. Endocrinol.|Journal of Endocrinology JE|J. Ethnopharmacol.|Journal of Ethnopharmacology JEM|J. Electron. Mater.|Journal of Electronic Materials JEM|J. Electron Microsc.|Journal of Electron Microscopy JEM|J. Environ. Manage.|Journal of Environment Management JEM|J. Environ. Monit.|Journal of Environmental Monitoring JEMT|J. Eng. Mater. Technol.|Journal of Engineering Materials and Technology JEOR|J. Essent. Oil Res.|Journal of Essential Oil Research JEP|J. Elastomers Plast.|Journal of Elastomers and Plastics JEQ|J. Environ. Qual.|Journal of Environment Quality JER|J. Endotoxin Res.|Journal of Endotoxin Research JER|J. Environ. Radioact.|Journal of Environment Radioactivity JESHPA|J. Environ. Sci. Health., Part A|Journal of Environment Science and Health, Part A Environmental Science JESHPB|J. Environ. Sci. Health., Part B|Journal of Environment Science and Health, Part B Pesticides JES|J. Electrochem. Soc.|Journal of the Electrochemical Society JESRP|J. Electron. Spectrosc. Relat. Phenom.|Journal of Electron Spectroscopy and Related Phenomena JFB|J. Ferment. Bioeng.|Journal of Fermentation and Bioengineering JFB|J. Food Biochem.|Journal of Food Biochemistry JFC|J. Fluorine Chem.|Journal of Fluorine Chemistry JFE|J. Fluids Eng.|Journal of Fluids Engineering JFE|J. Food Eng.|Journal of Food Engineering JFL|J. Food Lipids|Journal of Food Lipids JFM|J. Fluid Mech.|Journal of Fluid Mechanics JFP|J. Food Prot.|Journal of Food Protection JFS|J. Fire Sci.|Journal of Fire Sciences JFS|J. Food Sci.|Journal of Food Science JGAM|J. Gen. Appl. Microbiol.|Journal of General and Applied Microbiology JGM|J. Gen. Microbiol.|Journal of General Microbiology JHC|J. Heterocycl. Chem.|Journal of Heterocyclic Chemistry JHC|J. Histochem. Cytochem.|Journal of Histochemistry and Cytochemistry JH|J. Hypertens.|Journal of Hypertension JHM|J. Hazard. Mater.|Journal of Hazardous materials JHRC|J. High. Resolut. Chromatogr.|Journal of High Resolution Chromatography JHT|J. Heat Transfer|Journal of Heat Transfer JIB|J. Inorg. Biochem.|Journal of Inorganic Biochemistry JIC|J. Inst. Chem.|Journal of Institute of Chemists (India) JICR|J. Interferon Cytokine Res.|Journal of Interferon and Cytokine Research JICS|J. Indian Chem. Soc.|Journal of the Indian Chemical Society JIES|J. Inst. Environ. Sci.|Journal of the Institute of Environment Sciences JIMB|J. Ind. Microbiol. Biotechnol.|Journal of Industrial Microbiology and Biotechnology JIM|J. Ind. Microbiol.|Journal of Industrial Microbiology JIMSS|J. Intell. Mater. Syst. Struct.|Journal of Intelligent Material Systems and Structures JINC|J. Inorg. Nucl. Chem.|Journal of Inorganic and Nuclear Chemistry JIOP|J. Inorg. Organomet. Polym.|Journal of Inorganic and Organometallic Polymers JIPMRC|J. Inclusion Phenom. Mol. Recognit. Chem.|Journal of Inclusion Phenomena and Molecular Recognition in Chemistry JIR|J. Interferon Res.|Journal of Interferon Research JIST|J. Imaging Sci. Technol.|Journal of Imaging Science and Technology JIWEM|J. Inst. Water Environ. Manage.|Journal of the Institution of Water and Environment Management JJAPP|Jpn. J. Appl. Phys., Part 1|Japanese Journal of Applied Physics Part 1 JJAPP|Jpn. J. Appl. Phys., Part 2|Japanese Journal of Applied Physics Part 2 JJCR|Jpn. J. Cancer Res.|Japanese Journal of Cancer Research JJIM|J. Jpn. Inst. Met.|Journal of the Japan Institute of Metals JJP|Jpn. J. Pharmacol.|Japanese Journal of Pharmacology JJTEH|Jpn. J. Toxicol. Environ. Health|Japanese Journal of toxicology and Environment health JKCS|J. Korean Chem. Soc.|Journal of the Korean Chemical Society JLC|J. Liq. Chromatogr.|Journal of Liquid Chromatography JLCR|J. Labelled Compd. Radiopharm.|Journal of Labelled Compounds and Radiopharmaceuticals JLCRT|J. Liq. Chromatogr. Related Technol.|Journal of Liquid Chromatography and Related Technologies JL|J. Lumin.|Journal of Luminescence JLMCS|J. Lipid Mediators Cell Signalling|Journal of Lipid Mediators and Cell Signalling JLM|J. Lipid Mediators|Journal of Lipid Mediators JLR|J. Lipid Res.|Journal of Lipid Research JLTP|J. Low Temp. Phys.|Journal of Low Temperature Physics JMB|J. Membr. Biol.|Journal of Membrane Biology JMB|J. Microbiol. Biotechnol.|Journal of Microbiology and Biotechnology JMB|J. Mol. Biol.|Journal of Molecular Biology JMCAC|J. Mol. Catal. A: Chem.|Journal of Molecular Catalysis A: Chemical JMCBE|J. Mol. Catal. B: Enzym.|Journal of Molecular Catalysis B: Enzymatic JMCE|J. Mater. Civ. Eng.|Journal of Materials in Civil Engineering JMC|J. Mater. Chem.|Journal of Materials Chemistry JMC|J. Math. Chem.|Journal of Mathematical Chemistry JMC|J. Med. Chem.|Journal of Medicinal Chemistry JMC|J. Mol. Catal.|Journal of Molecular Catalysis JMCWM|J. Mater. Cycles Waste Manage.|Journal of Material Cycles and Waste Management JMEP|J. Mater. Eng. Perform.|Journal of Materials Engineering and Performance JMAP|J. Math. Anal. Appl.|Journal of Mathematical Analysis and Applications JMGM|J. Mol. Graphics Modell.|Journal of Molecular Graphics and Modelling JM|J. Microencapsulation|Journal of Microencapsulation JML|J. Mol. Liq.|Journal of Molecular Liquids JMMB|J. Mol. Microbiol. Biotechnol.|Journal of Molecular Microbiology and Biotechnology JMM|J. Microbiol. Methods|Journal of Microbiological Methods JMM|J. Mol. Model.|Journal of Molecular Modeling JMMM|J. Magn. Magn. Mater.|Journal of Magnetism and Magnetic Materials JMP|J. Math. Phys.|Journal of Mathematical Physics JMPMS|J. Mater. Process. Manuf. Sci.|Journal of Materials Processing and Manufacturing Science JMPT|J. Mater. Process. Technol.|Journal of Materials Processing Technology JMR|J. Mater. Res.|Journal of Materials Research JMRSA|J. Magn. Reson., Ser A|Journal of Magnetic Resonance Series A JMRSB|J. Magn. Reson., Ser B|Journal of Magnetic Resonance Series B JMS|J. Mass Spectrom.|Journal of Mass Spectrometry JMS|J. Membr. Sci.|Journal of Membrance Science JMS|J. Microcolumn Sep.|Journal of Microcolumn Separations JMS|J. Microelectromech. Syst.|Journal of Microelectronic Systems JMS|J. Mol. Spectrosc.|Journal of Molecular Spectroscopy JMS|J. Mol. Struct.|Journal of Molecular Structure JMSL|J. Mater. Sci. Lett.|Journal of Materials Science Letters JMSME|J. Mater. Sci. - Mater. Electron.|Journal of Materials Science - Materials in Electronics JMSMM|J. Mater. Sci. - Mater. Med.|Journal of Materials Science Materials in Medicine JMSPAC|J. Macromol. Sci., Pure Appl. Chem.|Journal of Macromolecular Science Pure and Applied Chemistry JMSP|J. Macromol. Sci., Phys.|Journal of Macromolecular Science - Physics JMSP|J. Mater. Synth. Process.|Journal of Materials Synthesis and Processing JMSPR|J. Macromol. Sci., Polym. Rev.|Journal of Macromolecular Science Polymer Reviews JMSRMCP|J. Macromol. Sci., Rev. Macromol. Chem. Phys.|Journal of Macromolecular Science - Reviews in Macromolecular Chemistry and Physics JMST|J. Mater. Sci. Technol.|Journal of Materials Science and Technology JMST|J. Mol. Struct. (Theochem)|Journal of Molecular Structure: THEOCHEM JNCS|J. Non-Cryst. Solids|Journal of Non-Crystalline Solids JNET|J. Non-Equilib. Thermodyn.|Journal of Non-Equilibrium Thermodynamics JNIS|J. Near Infrared Spectrosc.|Journal of Near Infrared Spectroscopy JN|J. Neurochem.|Journal of Neurochemistry JN|J. Neurosci.|Journal of Neuroscience JNMES|J. New Mater. Electrochem. Syst.|Journal of New Materials for Electrochemical Systems JNM|J. Nucl. Mater.|Journal of Nuclear Materials JNP|J. Nat. Prod.|Journal of Natural Products JNR|J. Nanopart. Res.|Journal of Nanoparticle Research JNR|J. Neurosci. Res.|Journal of Neuroscience Research JNST|J. Nucl. Sci. Technol.|Journal of Nuclear Science and Technology JOC|J. Organomet. Chem.|Journal of Organometallic Chemistry JOC|J. Org. Chem.|Journal of Organic Chemistry JOSABOP|J. Opt. Soc. Am. B: Opt. Phys.|Journal of the Optical Society of America B: Optical Physics JPAMG|J. Phys. A: Math. Gen.|Journal of Physics A: Mathematical and General JPBA|J. Pharm. Biomed. Anal.|Journal of Pharmaceutical and Biomedical Analysis JPBAMOP|J. Phys. B: At. Mol. Opt. Phys.|Journal of Physics B: Atomic, Molecular and Optical Physics JPBB|J. Plant Biochem. Biotechnol.|Journal of Plant Biochemistry and Biotechnology JPCA|J. Phys. Chem. A|The Journal of Physical Chemistry A JPCB|J. Phys. Chem. B|The Journal of Physical Chemistry B JPCC|J. Phys. Chem. C|The Journal of Physical Chemistry C JPCCZ|J. Prakt. Chem. /Chem-Ztg|Journal fur Praktische Chemie - Chemiker Zeitung JPCJPCMTLC|JPC J. Planar Chromatogr. - Mod. TLC|JPC Journal of Planar Chromatography Modern TLC JPC|J. Phys. Chem.|Journal of Physical Chemistry JPC|J. Protein Chem.|Journal of Protein Chemistry JPCM|J. Phys.: Condens. Matter|Journal of Physics: Condensed Matter JPCMTLC|J. Planar. Chromatogr. - Mod. TLC|Journal of Planar Chromatography - Modern TLC JPCRD|J. Phys. Chem. Ref. Data|Journal of Physical and Chemical Reference Data JPCS|J. Phys. Chem. Solids|Journal of Physics and Chemistry of Solids JPDAP|J. Phys. D: Appl. Phys.|Journal of Physics D: Applied Physics JPE|J. Phase Equilib.|Journal of Phase Equilibrium JPE|J. Polym. Eng.|Journal of Polymer Engineering JPE|J. Polym. Environ.|Journal of Polymers and the Environment JPET|J. Pharmacol. Exp. Ther.|Journal of Pharmacology and Experimental Therapeutics JPGNPP|J. Phys. G: Nucl. Part. Phys.|Journal of Physics G: Nuclear and Particle Physics JPIII|J. Phys. III|Journal de Physique III JPII|J. Phys. II|Journal de Physique II JPI|J. Phys. I|Journal de Physique I JPIV|J. Phys. IV|Journal de Physique IV JPM|J. Polym. Mater.|Journal of Polymer Materials JPM|J. Porous Mater.|Journal of Porous Materials JPOC|J. Phys. Org. Chem.|Journal of Physical Organic Chemistry JPPA|J. Photochem. Photobiol., A|Journal of Photochemistry and Photobiology A JPPB|J. Photochem. Photobiol., B|Journal of Photochemistry and Photobiology B JPP|J. Pharm. Pharmacol.|Journal of Pharmacy and Pharmacology JPP|J. Porphyrins Phthalocyanines|Journal of Porphyrins and Phthalocyanines JPP|J. Propul. Power|Journal of Propulsion and Power JPPS|J. Pulp Pap. Sci.|Journal of Pulp and Paper Science JPR|J. Proteome Res.|Journal of Proteome Research JPSJ|J. Phys. Soc. Jpn.|Journal of the Physical Society of Japan JPS|J. Pharm. Sci.|Journal of Pharmaceutical Sciences JPS|J. Power Sources|Journal of Power Sources JPSPAPC|J. Polym. Sci., Part A: Polym. Chem.|Journal of Polymer Science Part A: Polymer Chemistry JPSPBPP|J. Polym. Sci., Part B: Polym. Phys.|Journal of Polymer Science Part B: Polymer Physics JPST|J. Pet. Sci. Technol.|Journal of Petroleum Science and Technology JPST|J. Photopolym. Sci. Technol.|Journal of Photopolymer Science and Technology JPTM|J. Pharmacol. Toxicol. Methods|Journal of Pharmacological and Toxicological Methods JQSRT|J. Quant. Spectrosc. Radiat. Transfer|Journal of Quantitative Spectroscopy and Radiative Transfer JR|J. Rheol.|Journal of Rheology JRMAM|J. Rapid Methods Autom. Microbiol.|Journal of Rapid Methods and Automation in Microbiology JRNCA|J. Radioanal. Nucl. Chem. Art.|Journal of Radioanalytical and Nuclear Chemistry Articles JRNC|J. Radioanal. Nucl. Chem.|Journal of Radioanalytical and Nuclear Chemistry JRNCL|J. Radioanal. Nucl. Chem. Lett.|Journal of Radioanalytical and Nuclear Chemistry Letters JRPC|J. Reinf. Plast. Compos.|Journal of Reinforced Plastics and Composites JRS|J. Raman Spectrosc.|Journal of Raman Specroscopy JSAED|J. Strain Anal. Eng. Des.|Journal of Strain Analysis for Engineering Design JSAIMM|J. S. Afr. Inst. Min. Metall.|Journal of the South African Institute of Mining and Metallurgy JSBMB|J. Steroid Biochem. Mol. Biol.|Journal of Steroid Biochemistry and Molecular Biology JSC|J. Solution Chem.|Journal of Solution Chemistry JSC|J. Struct. Chem.|Journal of Structural Chemistry JSCS|J. Serb. Chem. Soc.|Journal of the Serbian Chemical Society JSFA|J. Sci. Food Agric.|Journal of the Science of Food and Agriculture JSF|J. Supercrit. Fluids|Journal of Supercritical Fluids JSGST|J. Sol-Gel Sci. Technol.|Journal of Sol-Gel Science and Technology JSIR|J. Sci. Ind. Res.|Journal of Scientific and Industrial Research JSMEIJSA|JSME Int J., Ser. A|JSME International Journal Series A: Mechanics and Material Engineering JSMEIJSB|JSME Int J., Ser. B|JSME International Journal Series B: Fluids and Thermal Engineering JSMEIJSC|JSME Int J., Ser. C|JSME International Journal Series C: Mechanical Systems Machine Elements and Manufacturing JSOCJ|J. Synth. Org. Chem Jpn.|Journal of Synthetic Organic Chemistry, Japan JSSC|J. Solid State Chem.|Journal of Solid State Chemistry JSSE|J. Solid State Electrochem.|Journal of Solid State Electrochemistry JSS|J. Sep. Sci.|Journal of Separation Science JTAC|J. Therm. Anal. Calorim.|Journal of Thermal Analysis and Calorimetry JTA|J. Therm. Anal.|Journal of Thermal Analysis JTCC|J. Theor. Comput. Chem.|Journal of Theoretical and Computational Chemistry JTCM|J. Thermoplast. Compos. Mater.|Journal of Thermoplastic Composite Materials JTCOT|J. Toxicol., Cutaneous Ocul. Toxicol.|Journal of Toxicology - Cutaneous and Ocular Toxicology JTCT|J. Toxicol., Clin. Toxicol.|Journal of Toxicology - Clinical Toxicology JTEEM|J. Trace Elem. Exp. Med.|Journal of Trace Elements in Experimental Medicine JTEH|J. Toxicol. Environ. Health|Journal of Toxicology and Environment Health JTE|J. Test. Eval.|Journal of Testing and Evaluation JTEMB|J. Trace Elem. Med Biol.|Journal of Trace Elements in Medicine and Biology JTHT|J. Thermophys Heat Transfer|Journal of Thermophysics and Heat Transfer JTMT|J. Trace Microprobe Tech.|Journal of Trace and Microprobe Techniques JTST|J. Therm. Spray Technol.|Journal of Thermal Spray Technology JTTR|J. Toxicol., Toxin Rev.|Journal of Toxicology - Toxin Reviews JVSTA|J. Vac. Sci. Technol., A|Journal of Vacuum Science and Technology A JVSTB|J. Vac. Sci. Technol., B|Journal of Vacuum Science and Technology B JWCT|J. Wood Chem. Technol.|Journal of Wood Chemistry and Technology KC|Kinet. Catal.|Kinetics and Catalysis KEM|Key Eng. Mater.|Key Engineering Materials KF|Khim. Fiz.|Khimicheskaya Fizika KGK|Kautsch. Gummi Kunstst.|Kautschuk Gummi Kunststoffe KJCE|Korean J. Chem. Eng.|Korean Journal of Chemical Engineering KK|Kinet. Katal.|Kinetika i Kataliz KK|Koord. Khim.|Koordinatsionnaya Khimiya (Russian Journal of Coordination Chemistry) KM|Kovove Mater.|Kovove Materialy Metallic Materials KZ|Kolloidn Zh|Kolloidn Zhurnal LAC|Liebigs Ann. Chem.|Liebigs Annalen der Chemie LAIM|Lab. Autom. Inf. Manage.|Laboratory Automation and Information Management LAM|Lett. Appl. Microbiol.|Letters in Applied Microbiology LAR|Liebigs Ann. Recl.|Liebigs Annalen - Recueil LCGC|LC-GC|LC-GC The Magazine of Separation Science LC|Laser Chem.|Laser Chemistry LC|Liq. Cryst.|Liquid Crystals LE|Lubr. Eng.|Lubrication Engineering LI|Lab. Invest.|Laboratory Investigation L|Langmuir|Langmuir LPS|Lett. Pept. Sci.|Letters in Peptide Science LRA|Lab. Rob. Autom.|Laboratory Robotics and Automation LS|Life Sci.|Life Sciences LS|Lubr. Sci.|Lubrication Science MA|Mikrochim. Acta|Mikrochimica Acta MBA|Methods Biochem. Anal.|Methods of Biochemical Analysis MBD|Met.-Based Drugs|Metal-Based Drugs MB|Mar. Biol.|Marine Biology MB|Mar. Biotechnol.|Marine Biotechnology MB|Matrix Biol.|Matrix Biology MCB|Mol. Cell. Biochem.|Molecular and Cellular Biochemistry MCG|Microb. Comp. Genomics|Microbial and Comparative Genomics MCLCSTSA|Mol. Cryst. Liq. Cryst. Sci. Technol., Sect. A|Molecular Crystals and Liquid Crystals Science and Technology Section A MCLCSTSC|Mol. Cryst. Liq. Cryst. Sci. Technol., Sect. C|Molecular Crystals and Liquid Crystals Science and Technology Section C MC|Manuf. Chem.|Manufacturing Chemist MC|Mar. Chem.|Marine Chemistry MC|Mater. Charact.|Materials Characterization MC|Mater. Corros.|Materials and Corrosion MC|Mendeleev Commun.|Mendeleev Communications MCM|Mech. Compos. Mater.|Mechanics of Composite Materials MC|Monatsh. Chem.|Monatshefte fur Chemie MCMS|Mech. Compos. Mater. Struct.|Mechanics of Composite Materials and Structures MCP|Macromol. Chem. Phys.|Macromolecular Chemistry and Physics MCP|Mater. Chem. Phys.|Materials Chemistry and Physics MCR|Med. Chem. Res.|Medicinal Chemistry Research MDD|Mod. Drug Discovery|Modern Drug Discovery MD|Mater. Des.|Materials and Design ME|Mater. Eval.|Materials Evaluation ME|Metab. Eng.|Metabolic Engineering ME|Methods Enzymol.|Methods in Enzymology ME|Microelectron. Eng.|Microelectronic Engineering ME|Miner. Eng.|Minerals Engineering MER|Mar. Environ. Res.|Marine Environment Research MF|Mater. Forum|Materials Forum MGC|Main Group Chem.|Main Group Chemistry MGMC|Main Group Met. Chem.|Main Group Metal Chemistry MHT|Mater. High Temp.|Materials at High Temperatures MIBS|Met. Ions Biol. Syst.|Metal Ions in Biological Systems MI|Mol. Interventions|Molecular Interventions MJ|Microchem. J.|Microchemical Journal MJ|Microelectron. J.|Microelectronics Journal MKF|Magy. Kem. Foly.|Magyar Kemiai Folyoirat ML|Mater. Lett.|Materials Letters M|Macromolecules|Macromolecules MMBB|Mol. Mar. Biol. Biotech,|Molecular Marine Biology and Biotechnology MM|Mech. Mater.|Mechanics of Materials MM|Microporous Mater.|Microporous Materials MM|Microsc. Microanal.|Microscopy and Microanalysis MMM|Microporous Mesoporous Mater.|Microporous and Mesoporous Materials MM|Mol. Microbiol.|Molecular Microbiology MMP|Mater. Manuf. Processes|Materials and Manufacturing Processes MMP|Miner. Metall. Process|Minerals and Metallurgical Processing MMTA|Metall. Mater. Trans. A|Metallurgical and Materials Transactions A: Physical Metallurgy and Materials Science MMTB|Metall. Mater. Trans. B|Metallurgical and Materials Transactions B: Process Metallurgy and Materials Processing Science MNRAS|Mon. Not. R. Astron. Soc.|Monthy Notices of the Royal Astronomical Society MO|Mater. Org.|Materials and Organisms MPB|Mar. Pollut. Bull.|Marine Pollutution Bulletin MPEMR|Miner. Process. Extr. Metall. Rev.|Mineral Processing and Extractive Metallurgy Review MPLA|Mod. Phys. Lett. A|Modern Physics Letters A MPLB|Mod. Phys. Lett. B|Modern Physics Letters B MP|Mater. Performance|Materials Performance MP|Mol. Pharmacol.|Molecular Pharmacology MP|Mol. Phys.|Molecular Physics MRB|Mater. Res. Bull.|Materials Research Bulletin MRC|Macromol. Rapid Commun.|Macromolecular Rapid Communications MRC|Magn. Reson. Chem.|Magnetic Resonance in Chemistry MRD|Mol. Reprod. Dev|Molecular Reproduction and Development MRI|Mater. Res. Innovations|Materials Research Innovations MRMC|Mini-Rev. Med. Chem.|Mini - Reviews in Medicinal Chemistry MR|Microbiol. Res.|Microbiological Research MRMPBM|Magn. Reson. Mater. Phys., Biol. Med.|Magnetic Resonance Materials in Physics, Biology and Medicine MRSB|MRS Bull.|MRS Bulletin MRSIJNSR|MRS Internet J. Nitride Semicond. Res.|MRS Internet Journal of Nitride Semiconductor Research MRT|Microsc. Res. Tech.|Microscopy Research and Technique MSEA|Mater. Sci. Eng., A|Materials Science and Engineering A MSEB|Mater. Sci. Eng., B|Materials Science and Engineering B MSEC|Mater. Sci. Eng., C|Materials Science and Engineering C MSER|Mater. Sci. Eng., R|Materials Science and Engineering Reports MSF|Mater. Sci. Forum|Materials Science Forum MSHT|Met. Sci. Heat Treat.|Metal Science and Heat Treatment MS|Macromol. Symp.|Macromolecular Symposium MS|Mater. Sci.|Materials Science MS|Mater. Struct.|Materials and Structures MSMSE|Modell. Simul. Mater. Sci. Eng.|Modelling and Simulation in Materials Science and Engineering MSP|Mol. Supramol. Photochem.|Molecular and Supramolecular Photochemistry MSRI|Mater. Sci. Res. Int.|Materials Science Research International MSR|Mass Spectrom. Rev.|Mass Spectrometry Reviews MSSP|Mater. Sci. Semicond. Process.|Materials Science in Semiconductor Processing MST|Mater. Sci. Technol.|Materials Science and Technology MST|Meas. Sci. Technol.|Measurement Science and Technology MTA|Metall. Trans. A|Metallurgical Transactions A MTB|Metall. Trans. B|Metallurgical Transactions B MTDM|Mech. Time-Depend. Mater.|Mechanics of Time Dependent Materials MTE|Microscale Thermophys. Eng.|Microscale Thermophysical Engineering MTJIM|Mater. Trans., JIM|Materials Transactions, JIM MT|Mater. Today|Materials Today MTOM|Metalloved. Term. Obrab. Met.|Metallovedenie i Termicheskaya Obrabotka Metallov MTS|Macromol. Theory Simul.|Macromolecular Theory and Simulations MWE|Mine Water Environ.|Mine Water and the Environment MW|Materialwiss. Werkstofftech.|Materialwissenschaft und Werkstofftechnik NA|Numer. Algor.|Numerical Algorithms NAR|Nucleic Acids Res.|Nucleic Acids Research NATOASISSA|NATO ASI Ser., Ser. A|NATO ASI Series, Series A Life Sciences NATOASISSB|NATO ASI Ser., Ser. B|NATO ASI Series, Series B Physics NATOASISSC|NATO ASI Ser., Ser. C|NATO ASI Series, Series C Mathematical and Physical Sciences NATOASISSE|NATO ASI Ser., Ser. E|NATO ASI Series, Series E Applied Physics NATOASISSG|NATO ASI Ser., Ser. G|NATO ASI Series, Series G Ecological Sciences NATOASISSH|NATO ASI Ser., Ser. H|NATO ASI Series, Series H Cell Biology NB|Nat. Biotechnol.|Nature Biotechnology NCB|New Compr. Biochem.|New Comprehensive Biochemistry NCSIFA|Nuovo Cimento Soc. Ital. Fis., A|Nuovo Cimento della Societa Italiana di Fisica A NCSIFB|Nuovo Cimento Soc. Ital. Fis., B|Nuovo Cimento della Societa Italiana di Fisica B NCSIFC|Nuovo Cimento Soc. Ital. Fis., C|Nuovo Cimento della Societa Italiana di Fisica C NCSIFD|Nuovo Cimento Soc. Ital. Fis., D|Nuovo Cimento della Societa Italiana di Fisica D NCTL|Nachr. Chem. Tech. Lab.|Nachrichten aus Chemie Technik und Laboratorium NDFCT|New Diamond Front. Carbon Technol.|New Diamond and Frontier Carbon Technology NDTEI|NDT and E Int.|NDT and E International NED|Nucl. Eng. Des.|Nuclear Engineering and Design NF|Nucl. Fusion|Nuclear Fusion NHTPA|Numer. Heat Transfer, Part A|Numerical Heat Transfer Part A NHTPB|Numer. Heat Transfer, Part B|Numerical Heat Transfer Part B NIMPRSA|Nucl. Instrum. Methods Phys. Res., Sect. A|Nuclear Instruments and Methods in Physical Research Section A NIMPRSB|Nucl. Instrum. Methods Phys. Res., Sect. B|Nuclear Instruments and Methods in Physical Research Section B NI|Neurochem. Int.|Neurochemistry International NJC|New J. Chem.|New Journal of Chemistry NK|Neft. Khoz.|Neftyanoe Khozyaistvo (Petroleum Industry) NL|Nano Lett.|Nano Letters NM|Nanostruct. Mater.|Nanostructured Materials NM|Neorg. Mater.|Neorganicheskie Materialy NMRB|NMR Biomed.|NMR in Biomedicine N|Nature|Nature NPA|Nucl. Phys. A|Nuclear Physics A NPB|Nucl. Phys. B|Nuclear Physics B NPL|Nat. Prod. Lett.|Natural Products Letters NPM|New Polym. Mat.|New Polymeric Materials NPR|Nat. Prod. Rep.|Natural Products Reports NPS|Nat. Prod. Sci.|Natural Product Sciences NR|Neurochem. Res.|Neurochemical Research NSAP|Naunyn-Schmiedeberg's Arch. Pharmacol.|Naunyn-Schmiedeberg's Archives of Pharmacology NSB|Nat. Struct. Biol.|Natural Structural Biology NT|Nat. Toxins|Natural Toxins NT|Nucl. Technol.|Nuclear Technology OC|Opt. Commun.|Optics Communication OC|Organohalogen Compd.|Organohalogen Compounds OC|Organomet. Chem.|Organometallic Chemistry OE|Opt. Express|Optics Express OE|Org. Electron.|Organic Electronics OGJ|Oil Gas J.|Oil and Gas Journal OG|Org. Geochem.|Organic Geochemistry OLEB|Origins Life Evol. Biosphere|Origins of Life and Evolution of the Biosphere OL|Opt. Lett.|Optics Letters OL|Org. Lett.|Organic Letters OM|Opt. Mater.|Optical Materials OM|Oxid. Met.|Oxidation of Metals OMS|Org. Mass Spectrom.|Organic Mass Spectrometry O|Organometallics|Organometallics OPPI|Org. Prep. Proced. Int.|Organic Preparations and Procedures International OPRD|Org. Process Res. Dev.|Organic Process Research and Development ORM|Org. React. Mech.|Organic Reaction Mechanics OSE|Ozone Sci. Eng.|Ozone Science and Engineering OS|Opt. Spectrosc.|Optics and Spectroscopy OS|Opt. Spektrosk.|Optika i Spektroskopiya OZ|Opt. Zh.|Opticheskii Zhurnal P|Peptides|Peptides PAC|Polycyclic Aromat. Compd.|Polycyclic Aromatic Compounds PAC|Pure Appl. Chem.|Pure and Applied Chemistry PACSDPC|Prepr. - Am. Chem. Soc., Div. Pet. Chem.|Preprints - American Chemical Society, Division of Petroleum Chemistry PAMS|Proc. Amer. Math. Soc.|Proceedings of the American Mathematical Society PA|Physica A|Physica A PA|Phytochem. Anal|Phytochemical Analysis PAT|Polym. Adv. Technol.|Polymers for Advanced Technologies PBB|Prep. Biochem. Biotechnol.|Preparative Biochemistry and Biotechnology PBMB|Prog. Biophys. Mol. Biol.|Progress in Biophysics and Molecular biology PB|Physica B|Physica B PB|Polym. Bull.|Polymer Bulletin PBP|Pestic. Biochem. Physiol.|Pesticide Biochemistry and Physiology PB|Process Biochem.|Process Biochemistry PB|Prog. Biotechnol.|Progress in Biotechnology PBZ|Physiol. Biochem. Zool.|Physiological and Biochemical Zoology PCCP|Phys. Chem. Chem. Phys.|Physical Chemistry Chemical Physics PCGCM|Prog. Cryst. Growth Charact. Mater.|Progress in Crystal Growth and Characterization of Materials PCG|Phys. Chem. Glasses|Physics and Chemistry of Glasses PCJ|Pharm. Chem. J.|Pharmaceutical Chemistry Journal PCL|Phys. Chem. Liq.|Physics and Chemistry of Liquids PCM|Phys. Chem. Miner.|Physics and Chemistry of Minerals PCONP|Prog. Chem. Org. Nat. Prod.|Progress in the Chemistry of Organic Natural Products PC|Physica C|Physica C PCPMNMR|Physiol. Chem. Phys. Med. NMR|Physiological Chemistry and Physics and Medical NMR PC|Polym. Compos.|Polymer Composites PCPP|Plasma Chem. Plasma Process.|Plasma Chemistry and Plasma Processing PC|Przem. Chem.|Przemysl Chemiczny PCPS|Prog. Colloid Polym. Sci.|Progress in Colloid and Polymer Science PCQ|Process Control Qual.|Process Control and Quality PDDD|Perspect. Drug Discovery Des.|Perspectives in Drug Discovery and Design PD|Physica D|Physica D PD|Powder Diffr.|Powder Diffraction PDS|Polym. Degrad. Stab.|Polymer Degradation and Stability PECS|Prog. Energy Combust. Sci.|Progress in Energy and Combustion Science PE|Physica E|Physica E PE|Plast. Eng.|Plastics Engineering PE|Protein Eng.|Protein Engineering PES|Polym. Eng. Sci.|Polymer Engineering and Science PFA|Phys. Fluids A|Physics of Fluids A PFB|Phys. Fluids B|Physics of Fluids B PGN|Polym. Gels Networks|Polymer Gels and Networks PHC|Prog. Heterocycl. Chem.|Progress in Heterocyclic Chemistry PIC|Prog. Inorg. Chem.|Progress in Inorganic Chemistry PIM|Prog. Ind. Microbiol.|Progress in Industrial Microbiology PI|Polym. Int.|Polymer International PJC|Pol. J. Chem.|Polish Journal of chemistry PJ|Polym. J.|Polymer Journal PLA|Phys. Lett. A|Physics Letters A PLB|Phys. Lett. B|Physics Letters B PLR|Prog. Lipid Res.|Progress in Lipid Research PMA|Philos. Mag. A|Philosophical Magazine A PMB|Philos. Mag. B|Philosophical Magazine B PML|Philos. Mag. Lett.|Philosophical Magazine Letters PMMC|Powder Metall. Met. Ceram.|Powder Metallurgy and Metal Ceramics PM|Planta Med.|Planta Medica PM|Powder Metall.|Powder Metallurgy PM|Prot. Met|Protection of Metals PMR|Platinum Met. Rev.|Platinum Metals Review PMSE|Polym. Mater. Sci. Eng.|Polymeric Materials Science and Engineering PMS|Prog. Mater Sci.|Progress in Materials Science PNASUSA|Proc. Natl. Acad. Sci. USA|Proceedings of the National Academy of Sciences of the United States of America PNAS|Proc. Natl. Acad. Sci. USA|Proceedings of the National Academy of Sciences PNB|Polym. Networks Blends|Polymer Networks and Blends PNMRS|Prog. Nucl. Magn. Reson. Spectrosc.|Progress in Nuclear Magnetic Resonance Spectroscopy POC|Prog. Org. Coat.|Progress in Organic Coatings PO|Pestic. Outlook|Pesticide Outlook PPACSDFC|Prepr. Pap. - Am. Chem. Soc., Div. Fuel Chem.|Preprint Papers - American Chemical Society, Division of Fuel Chemistry PPACSDPC|Polym. Prepr. (Am. Chem. Soc., Div. Polym. Chem.)|Polymeric Preprints (American Chemical Society, Division of Polymer Chemistry) PPB|Plant Physiol. Biochem.|Plant Physiology and Biochemistry PPCF|Plasma Phys. Controlled Fusion|Plasma Physics and Controlled Fusion PPC|Pharm. Pharmacol. Commun.|Pharmacy and Pharmacology Communications PPC|Polym. Polym. Compos.|Polymers and Polymer Composites PPL|Pharm. Pharmacol. Lett.|Pharmaceutical and Pharmacological Letters PP|Photochem. Photobiol.|Photochemistry and Photobiology PP|Physiol. Plant.|Physiologia Plantarum PP|Plasmas Polym.|Plasmas and Polymers PPR|Prog. Pap. Recycl.|Progress in Paper Recycling PPSC|Part. Part. Syst. Char.|Particle and Particle Systems Characterization PPS|Prog. Polym. Sci.|Progress in Polymer Science PPTE|Polym. Plast. Technol. Eng.|Polymer - Plastics Technology and Engineering PRAAMOP|Phys. Rev. A: At. Mol. Opt. Phys.|Physical Review A: Atomic, Molecular, and Optical Physics PRBCM|Phys. Rev. B: Condens. Matter|Physical Review B: Condensed Matter PRCNP|Phys. Rev. C: Nucl. Phys.|Physical Review C: Nuclear Physics PRCPA|Plast. Rubber Compos. Process. Appl.|Plastics Rubber and Composites Processing and Applications PRDPF|Phys. Rev. D: Part. Fields|Physical Review D: Particles and Fields PRE|Polym. React. Eng.|Polymer Reaction Engineering PRESPPF|Phys. Rev. E: Stat. Phys., Plasmas, Fluids,|Physical Review E: Statistical Physics, Plasmas, Fluids, and Related Interdisciplinary Topics PRK|Prog. React. Kinet.|Progress in Reaction Kinetics PRL|Phys. Rev. Lett.|Physical Review Letters PR|Pharmacol. Res.|Pharmacological Research PR|Pharm. Res.|Pharmaceutical Research PR|Photosynth. Res.|Photosynthesis Research PR|Phys. Rev.|Physical Review PR|Polym. Recycl.|Polymer Recycling PRSLSA|Proc. R. Soc. London, Ser. A|Proceedings of the Royal Society of London Series A PRSLSB|Proc. R. Soc. London, Ser. B|Proceedings of the Royal Society of London Series B PSEP|Process Saf. Environ. Prot.|Process Safety and Environment Protection PSFB|Proteins|Proteins: Structure, Function, and Bioinformatics PSFG|Protein-Struct. Funct. Genet.|Proteins: Structure, Function, and Genetics PSF|Plat. Surf. Finish.|Plating and Surface Finishing PS|Phys. Scr.|Physica Scripta PSP|Process Saf. Prog.|Process Safety Progress PS|Protein Sci.|Protein Science PSSA|Phys. Status Solidi A|Physical Status Solidi A PSSB|Phys. Status Solidi B|Physical Status Solidi B PSSC|Prog. Solid State Chem.|Progress in Solid State Chemistry PSS|Prog. Surf. Sci.|Progress in Surface Science PSSRE|Phosphorus, Sulfur Silicon Relat. Elem.|Phosphorus Sulfur Silicon and the Related Elements PSST|Plasma Sources Sci. Technol.|Plasma Sources Science and Technology PST|Part. Sci. Technol.|Particulate Science and Technology PST|Pet. Sci. Technol.|Petroleum Science and Technology PT|Pharm. Technol.|Pharmaceutical Technology PT|Phase Transitions|Phase Transitions PT|Polym. Test.|Polymer testing PT|Powder Technol.|Powder Technology PTRSLSA|Philos. Trans. R. Soc. London, Ser. A|Philosophical Transactions of the Royal Society of London, Series A PTRSLSB|Philos. Trans. R. Soc. London, Ser. B|Philosophical Transactions of the Royal Society of London, Series B QAB|Quim. Anal. (Barcelona)|Quimica Analitica QN|Quim. Nova|Quimica Nova QSAR|Quant. Struct.-Act. Relat.|Quantitative Structure-Activity Relationships RAC|Rev. Anal. Chem|Reviews in Analytical Chemistry RA|Radiochim. Acta|Radiochima Acta RA|Rheol. Acta|Rheologica Acta RCB|Russ. Chem. Bull.|Russian Chemical Bulletin RCC|Rev. Comput. Chem.|Reviews in Computational Chemistry RCE|Rev. Chem. Eng.|Reviews in Chemical Engineering RCI|Res. Chem. Intermed.|Research on Chemical Intermediates RCMPP|Res. Commun. Mol. Pathol. Pharmacol.|Research Communications in Molecular Pathology and Pharmacology RCMS|Rapid Commun. Mass Spectrom.|Rapid Communications in Mass Spectrometry RC|Rev. Chim.|Revista de Chimie RCT|Rubber Chem. Technol.|Rubber Chemistry and Technology RECT|Rev. Environ. Contam. Toxicol.|Reviews of Environment Contamination and Toxicology REDS|Radiat Eff. Defects Solids|Radiation Effects and Defects in Solids RFP|React. Funct. Polym.|Reactive and Functional Polymers RGT|Rev. Gen. Therm.|Revue Generale de Thermique RIC|Refract. Ind. Ceram|Refractories and Industrial Ceramics RJAC|Russ. J. Appl. Chem.|Russian Journal of Applied Chemistry RJBC|Russ. J. Bioorg. Chem.|Russian Journal of Bioorganic Chemistry RJCC|Russ. J. Coord. Chem.|Russion Journal of Coordination Chemistry RJE|Russ. J. Electrochem.|Russian Journal of Electrochemistry RJGC|Russ. J. Gen. Chem.|Russian Journal of General Chemistry RJNT|Russ. J. Nondestr. Test.|Russian Journal of Nondestructive Testing RJOC|Russ. J. Org. Chem.|Russian Journal of Organic Chemistry RKCL|React. Kinet. Catal. Lett.|Reaction Kinetics and Catalysis Letters RMCIT|Rev. Metall. / Cah. Inf. Tech.|Revue de Metallurgie / Cahiers d'Informations Techniques RM|Res. Microbiol.|Research in Microbiology RM|Russ. Metall.|Russian Metallurgy RPBP|Rev. Physiol., Biochem. Pharmacol.|Reviews of Physiology Biochemistry and Pharmacology RPC|Radiat. Phys. Chem.|Radiation Physics and Chemistry RPD|Radiat. Prot. Dosim.|Radiation Protection Dosimetry RPP|Rep. Prog. Phys.|Reports on Progress in Physics RRC|Rev. Roum. Chim.|Revue Roumaine de Chimie RR|Radiat. Res.|Radiation Research RRR|Rapra Rev. Rep.|RAPRA Review Reports RSI|Rev. Sci. Instrum.|Review of Scientific Instruments RTCPB|Recl. Trav. Chim. Pays-Bas|Recueil des Travaux Chimiques des Pays-Bas Journal of the Royal Netherlands Chemical Society RTP|Regul. Toxicol. Pharm.|Regulatory Toxicology and Pharmacology SAA|Sens. Actuators, A|Sensors and Actuators, A SAB|Sens. Actuators, B|Sensors and Actuators, B SAJC|S. Afr. J. Chem.|South African Journal of Chemistry SAMPEJ|SAMPE J.|SAMPE Journal SAPA|Spectrochim. Acta, Part A|Spectrochimica Acta, Part A SAPB|Spectrochim. Acta, Part B|Spectrochimica Acta, Part B SA|Spectrochim. Acta|Spectrochimica Acta SBB|Soil Biol. Biochem.|Soil Biology and Biochemistry SB|Struct. Bond.|Structure and Bonding SCI|Surf. Coat. Int.|Surface Coatings International SCSB|Sci. China, Ser. B|Science in China, Series B Chemistry SCSE|Sci. China, Ser. E|Science in China, Series E Technological Sciences SC|Struct. Chem.|Structural Chemistry SC|Supramol. Chem.|Supramolecular Chemistry SC|Synth. Commun.|Synthetic Communications SCT|Surf. Coat. Technol.|Surface and Coatings Technology SEIE|Solvent Extr. Ion Exch.|Solvent Extraction and Ion Exchange SEMSC|Sol. Energy Mater. Sol. Cells|Solar Energy Materials and Solar Cells SE|Spectrosc. Eur.|Spectroscopy Europe SE|Surf. Eng.|Surface Engineering SIA|Surf. Interface Anal.|Surface and Interface Analysis SISC|SIAM J. Sci. Comp.|SIAM Journal on Scientific Computing SI|Silic. Indus.|Silicates Industriels SJM|Scand. J. Metall.|Scandinavian Journal of Metallurgy SL|Spectrosc. Lett.|Spectroscopy Letters SM|Scripta Mater.|Scripta Materialia SMS|Smart Mater. Struct.|Smart Materials and Structures SM|Superlattices Microstruct.|Superlattices and Microstructures SM|Synth. Met.|Synthetic Metals SNPC|Stud. Nat. Prod. Chem.|Studies in Natural Products Chemistry SPEM|Supramol. Photosensit. Electroact. Mater.|Supramolecular Photosensitive and Electroactive Materials SPIOC|Spectrosc. Prop. Inorg. Organomet. Compd.|Spectroscopic Properties of Inorganic and Organometallic Compounds SPM|Sep. Purif. Methods|Separation and Purification Methods SP|Sci. Prog.|Science Progress SPT|Sep. Purif. Technol.|Separation and Purification Technology SRIMOC|Synth. React. Inorg. Met.-Org. Chem.|Synthesis and Reactivity in Inorganic and Metal-Organic Chemistry SRL|Surf. Rev. Lett.|Surface Review and Letters S|Science|Science SSCP|Springer Ser. Chem. Phys.|Springer Series in Chemical Physics SSC|Solid State Commun.|Solid State Communications SSE|Solid-State Electron.|Solid State Electronics SSI|Solid State Ionics|Solid State Ionics SSNMR|Solid State Nucl. Magn. Reson.|Solid State Nuclear Magnetic Resonance SSR|Surf. Sci. Rep.|Surface Science Reports SSSC|Stud. Surf. Sci. Catal.|Studies in Surface Science and Catalysis SSSSS|Springer Ser. Solid-State Sci.|Springer Series in Solid-State Sciences SSS|Surf. Sci. Spectra|Surface Science Spectra SS|Supramol. Sci.|Supramolecular Science SS|Surf. Sci.|Surface Science SSTB|Spill Sci. Technol. Bull.|Spill Science and Technology Bulletin SST|Semicond. Sci. Technol.|Semiconductor Science and Technology SST|Sep. Sci. Technol.|Separation Science and Technology SST|Speculations Sci. Technol.|Speculations in Science and Technology SST|Supercond. Sci. Technol.|Superconductor Science and Technology STE|Sci. Total Environ.|Science of the Total Environment STWJ|Sci. Technol. Weld. Joining|Science and Technology of Welding and Joining /font> TACTAC|TrAC, Trends Anal. Chem.|TRAC Trends in Analytical Chemistry TAP|Top. Appl. Phys.|Topics in Applied Physics TAP|Toxicol. Appl. Pharmacol.|Toxicology and Applied Pharmacology TA|Tetrahedron: Asymmetry|Tetrahedron: Asymmetry TA|Thermochim. Acta|Thermochimica Acta TBIC|Top. Biol. Inorg. Chem.|Topics in Biological and Inorganic Chemistry TBS|Trends Biochem. Sci.|Trends in Biochemical Sciences TB|Trends Biotechnol.|Trends in Biotechnology TCA|Theor. Chem. Acc.|Theoretical Chemistry Accounts TCC|Top. Curr. Chem.|Topics in Current Chemistry TC|Top. Catal.|Topics in Catalysis TEC|Theor. Exp. Chem.|Theoretical and Experimental Chemistry TEC|Toxicol. Environ. Chem.|Toxicological and Environmental Chemistry TEE|Trace Elem. Electrolytes|Trace Elements and Electrolytes TE|Tissue Eng.|Tissue Engineering TFCE|Theor. Found. Chem. Eng.|Theoretical Foundations of Chemical Engineering TFS|Top. Fluoresc. Spectrosc.|Topics in Fluorescence Spectroscopy TIC|Top. Inorg. Chem.|Topics in Inorganic Chemistry TIMF|Trans. Inst. Met. Finish.|Transactions of the Institution of Metal Finishing TIMMSA|Trans. Inst. Min. Metall., Sect. A|Transactions of the Institution of Mining and Metallurgy Section A TIMMSB|Trans. Inst. Min. Metall., Sect. B|Transactions of the Institution of Mining and Metallurgy Section B TIMMSC|Trans. Inst. Min. Metall., Sect. C|Transactions of the Institution of Mining and Metallurgy Section C TJ|Tappi J.|Tappi Journal TL|Tetrahedron Lett.|Tetrahedron Letters TL|Toxicol. Lett.|Toxicology Letters TMC|Transition Met. Chem.|Transition Metal Chemistry TMM|Tsvetn. Met. (Moscow)|Tsvetnaya Metally TSF|Thin Solid Films|Thin Solid Films TS|Toxicol. Sci.|Toxicological Sciences UFZ|Ukr. Fiz. Zh.|Ukrainskii Fizicheskii Zhurnal UK|Usp. Khim.|Uspekhi Khimii UKZ|Ukr. Khim. Zh.|Ukrainskii Khimicheskii Zhurnal US|Ultrason. Sonochem.|Ultrasonics Sonochemistry VS|Vib. Spectrosc|Vibrational Spectroscopy WASP|Water, Air, Soil Pollut.|Water, Air, and Soil Pollution WER|Water Environ. Res|Water Environment Research WJMB|World J. Microbiol. Biotechnol.|World Journal of Microbiology and Biotechnology WMO|Waste Manage. (Oxford)|Waste Management WMR|Waste Manage. Res.|Waste Management and Research WRR|Water Resour. Res.|Water Resources Research WR|Water Res.|Water Research WST|Water Sci. Technol.|Water Science and Technology XRS|X-Ray Spectrom.|X-Ray Spectrometry ZAAC|Z. Anorg. Allg. Chem.|Zeitschrift fur Anorganische und Allgemeine Chemie ZFK|Zh. Fiz. Khim.|Zhurnal Fizicheskoi Khimii ZKNCS|Z. Kristallogr. - New Cryst. Struct.|Zeitschrift fur Kristallograhie - New Crystral Stuctures ZK|Z. Kristallogr.|Zeitschrift fur Kristallograhie ZMI|Z. MetaIlkd.|Zeitschrift fur MetaIlkunde ZNAPS|Z. Naturforsch., A: Phys. Sci.|Zeitschrift fur Naturforschung A: Journal of Physical Sciences ZNBCS|Z. Naturforsch., B: Chem. Sci.|Zeitschrift fur Naturforschung B: Journal of Chemical Sciences ZNCB|Z. Naturforsch., C: Biosci.|Zeitschrift fur Naturforschung C: Journal of Biosciences ZNK|Zh. Neorg. Khim.|Zhurnal Neorganicheskoi Khimii ZOK|Zh. Obshch. Khim.|Zhurnal Obshchei Khimii ZOK|Zh. Org. Khim.|Zhurnal Organicheskoi Khimii ZPAHN|Z. Phys. A: Hadrons Nucl.|Zeitschrift fur Physik A: Hadrons and Nuclei ZPBCM|Z. Phys. B: Condens. Matter|Zeitschrift fur Physik B: Condensed Matter ZPCPF|Z. Phys. C: Part. Fields|Zeitschrift fur Physik C: Particle Fields ZPC|Z. Phys. Chem.|Zeitschrift fur Physikalische Chemie ZPDAMC|Z. Phys. D: At., Mol. Clusters|Zeitschrift fur Physik D: Atoms, Molecules and Clusters ZPK|Zh. Prikl. Khim.|Zhurnal Prikladnoi Khimi �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/netqinf.txt�����������������������������������������������������������������������0000644�0001750�0001750�00000044264�12045517740�015733� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������############################################################ # CB2BIB/EDITOR BOOKMARKS AND NETWORK QUERY INFORMATION FILE ############################################################ ########### # BOOKMARKS ########### # Syntax: # bookmark=Description|Target URL # Notes: # - cb2Bib tags, e. g. BibTeX fields enclosed as <<...>>, can be included in the URL. These tags will be # substituted by the current values. # - The non BibTeX tag <<selection>> is the placeholder for the current text selection. # - Some special characters, such as |, might need percent encoding to properly work. # Bookmark Examples: bookmark=PubMed Citation Finder|http://www.ncbi.nlm.nih.gov/pubmed/citmatch bookmark=HighWire Press -- Search|http://highwire.stanford.edu/cgi/search/ bookmark=DBLP Bibliography|http://www.informatik.uni-trier.de/~ley/db/indices/query.html bookmark=arXiv.org e-Print archive|http://arxiv.org/ bookmark=CiteSeerX|http://citeseerx.ist.psu.edu/ bookmark=Directory of Open Access Journals|http://www.doaj.org/home bookmark=PLoS - The Public Library of Science|http://www.plos.org/ bookmark=OAIster|http://www.oaister.org/ bookmark=Scirus|http://www.scirus.com/srsapp/advanced/index.jsp bookmark=Search ACS Publications|http://pubs.acs.org/search/advanced bookmark=Google Scholar|http://scholar.google.com/ bookmark= | bookmark=Search arXiv for selected text|http://search.arxiv.org:8081/?query=<<selection>> bookmark=Search Citebase for Authors|http://www.citebase.org/search?type=metadata&maxrows=10&author=<<author>>&submitted=Search bookmark=Search CiteSeerX for Title|http://citeseerx.ist.psu.edu/search?q=title%3A<<title>>&sort=cite bookmark=Search PubMed for Title|http://www.ncbi.nlm.nih.gov/sites/entrez?orig_db=PubMed&db=pubmed&cmd=Search&TransSchema=title&term=<<title>> bookmark=Search PubMed for DOI|http://www.ncbi.nlm.nih.gov/sites/entrez?orig_db=PubMed&db=PubMed&cmd=Search&term=<<doi>> bookmark=Search Google for literal Title|http://www.google.com/search?ie=UTF-8&q=%22<<title>>%22 bookmark=Search Scholar for literal Title|http://scholar.google.com/scholar?ie=UTF-8&q=%22<<title>>%22 bookmark=Search Crossref for Journal + Volume + Page|http://www.crossref.org/guestquery/?search_type=journal&auth=&issn=&title=<<journal>>&art_title=&volume=<<volume>>&page=<<pages>>&isbn=&comp_num=&series_title=&multi_hit=on&view_records=Search bookmark=Search ISBN Database|http://isbndb.com/search-all.html?kw=<<isbn>> bookmark=Open DOI Document|http://dx.doi.org/<<doi>> # CR subscribers might consider its bookmark as: # bookmark=Current 'Journal-Volume-Page' to DOI|http://doi.crossref.org/resolve?pid=<USR>:<PWD>&aulast=&title=<<journal>>&volume=<<volume>>&issue=&page=<<pages>>&year=&isbn=&comp_num=&series_title= # See http://www.crossref.org/help/ ################## # EDITOR BOOKMARKS ################## # Syntax: # editorbookmark=Description|Target file name|Shortcut|Icon file name # Bookmark Example: editorbookmark=Bookmarks Description|http://www.molspaces.com/d_cb2bib-c2beditor.php#bookmarks|| ########################### # NETWORK QUERY INFORMATION ########################### # Description: # The cb2Bib tags <<journal>>, <<volume>>, <<pages>>, <<doi>> and/or <<excerpt>> are # substituted in the Submition Form (see below) by the actual values of the reference. # In a first step, the 'query' URL containing above substituted tags is sent to the # database server or publisher's website. # Once the URL is retrieved, in a second step, cb2Bib captures a database identifier for # the desired reference. This step is a regular expression caption. # Steps 1) and 2) are, therefore, a mapping from the given reference fields to an internal # database identifier. In the next step, step 3), this identifier is used to retrieve the # complete bibliographic reference, and possibly, in step 4), the link or URL for the # target document, usually a PDF file. # # # Queries are performed in 4 steps: # 1) Post Query( journal-fullname, volume, first page; or doi; or excerpt ) (HTML post + cb2Bib tags) # 2) Capture referenceurl and pdfurl from query (RegExp) # 3) Retrieve referenceurl = referenceurl_prefix + capture_from_query + referenceurl_sufix # 4) Schedule for retrieving pdfurl = pdfurl_prefix + capture_from_query + pdfurl_sufix # # #-------------------------------------------------------------------------------------------- # Submition Form # All field/lines required, ordered as here, no comment or blank lines in between #-------------------------------------------------------------------------------------------- # QUERY INFO FOR #journal=cb2Bib Long Journal Name|journal code (or left blank if none needed, see ACS example) #query= (use '<<post>>http://www...' for http post method, instead of get method) #capture_from_query= #referenceurl_prefix= #referenceurl_sufix= #pdfurl_prefix= #pdfurl_sufix= #action= # #-------------------------------------------------------------------------------------------- # Action Description: #-------------------------------------------------------------------------------------------- # # blank = cb2Bib imports query output to clipboard panel # browse_query = cb2Bib opens the url in query # browse_referenceurl = cb2Bib opens referenceurl_prefix + capture_from_query + referenceurl_sufix # # Perform HTML to text conversion before importing to clipboard panel: # htm2txt_query = cb2Bib imports the url in query # htm2txt_referenceurl = cb2Bib imports referenceurl_prefix + capture_from_query + referenceurl_sufix # #-------------------------------------------------------------------------------------------- # Examples below explain and clarify this query syntax #-------------------------------------------------------------------------------------------- # QUERY INFO FOR IJQC # No BibTeX reference available. Instead, set 'action=browse_referenceurl'. # Reference and PDF file can later be extracted from browser, by selecting it. journal=International Journal of Quantum Chemistry| query=http://www3.interscience.wiley.com/search/allsearch?mode=citation&contextLink=%3Ca+href%3D%22%2Findex.html%22+target%3D%22_top%22%3EHome%3C%2Fa%3E+%2F+%3Ca+href%3D%22%2Fcgi-bin%2Fbrowsebysubject%3Fcode%3DCHEM%22+target%3D%22_top%22%3EChemistry%3C%2Fa%3E+%2F+%3Ca+href%3D%22%2Fcgi-bin%2Fbrowsebycategory%3Fcode%3DCH65%22+target%3D%22_top%22%3EComputational+Chemistry+and+Molecular+Modeling%3C%2Fa%3E&issn=1097-461X&volume=<<volume>>&issue=&pages=<<pages>> capture_from_query=/journal/(\d+)/abstract referenceurl_prefix=http://www3.interscience.wiley.com/journal/ referenceurl_sufix=/abstract pdfurl_prefix= pdfurl_sufix= action=browse_referenceurl # QUERY INFO FOR PNAS (Volume and Page) # Extracts BibTeX reference and article PDF file journal=Proceedings of the National Academy of Sciences of the United States of America| query=http://www.pnas.org/search?submit=yes&submit=Submit&pubdate_year=&volume=<<volume>>&firstpage=<<pages>>&doi=&author1=&author2=&title=&andorexacttitle=and&titleabstract=&andorexacttitleabs=and&fulltext=&andorexactfulltext=and&fmonth=Jan&fyear=1915&tmonth=Jul&tyear=2012&tocsectionid=all&format=standard&hits=10&sortspec=relevance&submit=yes capture_from_query=/content/(.+)\.(extract|abstract|full) referenceurl_prefix=http://www.pnas.org/citmgr?type=bibtex&gca=pnas; referenceurl_sufix= pdfurl_prefix=http://www.pnas.org/content/ pdfurl_sufix=.full.pdf action= # QUERY INFO FOR PNAS (DOI) # Extracts BibTeX reference and article PDF file journal=Proceedings of the National Academy of Sciences of the United States of America| query=http://www.pnas.org/search?submit=yes&submit=Submit&doi=<<doi>> capture_from_query=/content/(.+)\.(extract|abstract|full) referenceurl_prefix=http://www.pnas.org/citmgr?type=bibtex&gca=pnas; referenceurl_sufix= pdfurl_prefix=http://www.pnas.org/content/ pdfurl_sufix=.full.pdf action= # QUERY INFO FOR BIOMETRIKA # Extracts BibTeX reference journal=Biometrika| query=http://biomet.oxfordjournals.org/cgi/search?sendit=Search&pubdate_year=&volume=<<volume>>&firstpage=<<pages>>&DOI=&author1=&author2=&title=&andorexacttitle=and&titleabstract=&andorexacttitleabs=and&fulltext=&andorexactfulltext=and&fmonth=Jan&fyear=&tocsectionid=all&RESULTFORMAT=1&hits=10&hitsbrief=25&sortspec=relevance&sortspecbrief=relevance capture_from_query=http://biomet\.oxfordjournals\.org/cgi/content/abstract/([/\d\w]+)\? referenceurl_prefix=http://biomet.oxfordjournals.org/cgi/citmgr?type=bibtex&gca=biomet; referenceurl_sufix= pdfurl_prefix= pdfurl_sufix= action= # QUERY INFO FOR NAR # Extracts BibTeX reference and article PDF file journal=Nucleic Acids Research| query=http://nar.oxfordjournals.org/cgi/search?sendit=Search&pubdate_year=&volume=<<volume>>&firstpage=<<pages>>&DOI=&author1=&author2=&title=&andorexacttitle=and&titleabstract=&andorexacttitleabs=and&fulltext=&andorexactfulltext=and&fmonth=Jan&fyear=1990&tocsectionid=all&RESULTFORMAT=1&hits=10&hitsbrief=25&sortspec=relevance&sortspecbrief=relevance capture_from_query=http://nar\.oxfordjournals\.org/cgi/content/abstract/([/\d\w]+)\? referenceurl_prefix=http://nar.oxfordjournals.org/cgi/citmgr?type=bibtex&gca=nar; referenceurl_sufix= pdfurl_prefix=http://nar.oxfordjournals.org/cgi/reprint/ pdfurl_sufix=.pdf action= # QUERY INFO FOR SCIENCE # Extracts BibTeX reference and article PDF file journal=Science| query=http://www.sciencemag.org/cgi/search?sendit=Search&pubdate_year=&volume=<<volume>>&firstpage=<<pages>>&DOI=&author1=&author2=&title=&andorexacttitle=and&titleabstract=&andorexacttitleabs=and&fulltext=&andorexactfulltext=and&fmonth=Jan&fyear=1990&tocsectionid=all&RESULTFORMAT=1&hits=10&hitsbrief=25&sortspec=relevance&sortspecbrief=relevance capture_from_query=http://www\.sciencemag\.org/cgi/reprint/sci;([/\d\w]+)\? referenceurl_prefix=http://www.sciencemag.org/cgi/citmgr?type=bibtex&gca=sci; referenceurl_sufix= pdfurl_prefix=http://www.sciencemag.org/cgi/reprint/ pdfurl_sufix=.pdf action= # QUERY INFO FOR BJ # Extracts BibTeX reference and article PDF file journal=Biophysical Journal| query=http://www.biophysj.org/cgi/search?sendit=Search&pubdate_year=&volume=<<volume>>&firstpage=<<pages>>&DOI=&author1=&author2=&title=&andorexacttitle=and&titleabstract=&andorexacttitleabs=and&fulltext=&andorexactfulltext=and&fmonth=Jan&fyear=1990&tocsectionid=all&RESULTFORMAT=1&hits=10&hitsbrief=25&sortspec=relevance&sortspecbrief=relevance capture_from_query=http://www\.biophysj\.org/cgi/reprint/([/\d\w]+)\? referenceurl_prefix=http://www.biophysj.org/cgi/citmgr?type=bibtex&gca=biophysj; referenceurl_sufix= pdfurl_prefix=http://www.biophysj.org/cgi/reprint/ pdfurl_sufix=.pdf action= # QUERY INFO FOR B # Extracts BibTeX reference and article PDF file journal=Bioinformatics| query=http://bioinformatics.oxfordjournals.org/cgi/search?sendit=Search&pubdate_year=&volume=<<volume>>&firstpage=<<pages>>&DOI=&author1=&author2=&title=&andorexacttitle=and&titleabstract=&andorexacttitleabs=and&fulltext=&andorexactfulltext=and&fmonth=Jan&fyear=1990&tocsectionid=all&RESULTFORMAT=1&hits=10&hitsbrief=25&sortspec=relevance&sortspecbrief=relevance capture_from_query=http://bioinformatics\.oxfordjournals\.org/cgi/reprint/([/\d\w]+)\? referenceurl_prefix=http://bioinformatics.oxfordjournals.org/cgi/citmgr?type=bibtex&gca=bioinfo; referenceurl_sufix= pdfurl_prefix=http://bioinformatics.oxfordjournals.org/cgi/reprint/ pdfurl_sufix=.pdf action= # QUERY INFO FOR PubMed # Extracts Medline reference # Blank journal meaning 'any journal name' journal= query=http://www.ncbi.nlm.nih.gov/sites/entrez?orig_db=PubMed&db=PubMed&cmd=Search&term=<<doi>>[doi] capture_from_query=\bPMID:\D{1,10}(\d+)\D referenceurl_prefix=http://www.ncbi.nlm.nih.gov/pubmed/ referenceurl_sufix=?report=xml&format=text pdfurl_prefix=http://www.ncbi.nlm.nih.gov/pmc/articles/pmid/ pdfurl_sufix=/pdf/ action=htm2txt_referenceurl # QUERY INFO FOR PROLA # Extracts BibTeX reference journal= query=http://link.aps.org/doi/<<doi>> capture_from_query=href="/export/(.+)\?type=bibtex referenceurl_prefix=http://prola.aps.org/export/ referenceurl_sufix=?type=bibtex pdfurl_prefix= pdfurl_sufix= action= # QUERY INFO FOR PROLA # Extracts BibTeX reference journal= query=http://link.aps.org/doi/<<doi>> capture_from_query=href="/export/(.+)\.bibtex referenceurl_prefix=http://physics.aps.org/export/ referenceurl_sufix=.bibtex pdfurl_prefix= pdfurl_sufix= action= # QUERY INFO FOR PubMed, SPECIAL CASES (PubMed doesn't know full journal name) # Extracts Medline reference journal=Proteins: Structure, Function, and Bioinformatics|Proteins journal=Proteins: Structure, Function, and Genetics|Proteins query=http://www.ncbi.nlm.nih.gov/sites/entrez?orig_db=PubMed&db=PubMed&cmd=Search&term=<<journal>>[Jour]+AND+<<volume>>[volume]+AND+<<pages>>[page] capture_from_query=\bPMID:\D{1,10}(\d+)\D referenceurl_prefix=http://www.ncbi.nlm.nih.gov/pubmed/ referenceurl_sufix=?report=xml&format=text pdfurl_prefix=http://www.ncbi.nlm.nih.gov/pmc/articles/pmid/ pdfurl_sufix=/pdf/ action=htm2txt_referenceurl # QUERY INFO FOR PubMed # Extracts Medline reference # Blank journal meaning 'any journal name' journal= query=http://www.ncbi.nlm.nih.gov/sites/entrez?orig_db=PubMed&db=PubMed&cmd=Search&term=<<journal>>[Jour]+AND+<<volume>>[volume]+AND+<<pages>>[page] capture_from_query=\bPMID:\D{1,10}(\d+)\D referenceurl_prefix=http://www.ncbi.nlm.nih.gov/pubmed/ referenceurl_sufix=?report=xml&format=text pdfurl_prefix=http://www.ncbi.nlm.nih.gov/pmc/articles/pmid/ pdfurl_sufix=/pdf/ action=htm2txt_referenceurl # QUERY INFO FOR ACS # BibTeX references are available... but they contain HTML encoding for non-ascii characters. # So just point to the abstract page. journal=Accounts of Chemical Research|achre4 journal=ACS Applied Materials and Interfaces|aamick journal=Analytical Chemistry|ancham journal=Analytical Chemistry A-Pages|anchama journal=Biochemistry|bichaw journal=Bioconjugate Chemistry|bcches journal=Biomacromolecules|bomaf6 journal=Biotechnology Progress|bipret journal=Chemical Research in Toxicology|crtoec journal=Chemical Reviews|chreay journal=Chemistry of Materials|cmatex journal=Crystal Growth and Design|cgdefu journal=Energy and Fuels|enfuem journal=Environmental Science and Technology A-Pages|esthaga journal=Environmental Science and Technology|esthag journal=Industrial and Engineering Chemistry|iechad journal=Industrial and Engineering Chemistry Research Fundamentals|iecfa7 journal=Industrial and Engineering Chemistry Research|iecred journal=Inorganic Chemistry|inocaj journal=Journal of Agricultural and Food Chemistry|jafcau journal=Journal of Chemical and Engineering Data|jceaax journal=Journal of Chemical Information and Computer Sciences|jcisd8 journal=Journal of Chemical Information and Modeling|jcisd8 journal=Journal of Chemical Theory and Computation|jctcce journal=Journal of Combinatorial Chemistry|jcchff journal=Journal of Medicinal Chemistry|jmcmar journal=Journal of Natural Products|jnprdf journal=Journal of Organic Chemistry|joceah journal=The Journal of Physical Chemistry A|jpcafh journal=The Journal of Physical Chemistry B|jpcbfk journal=The Journal of Physical Chemistry C|jpccfk journal=Journal of Physical Chemistry|jpchax journal=Journal of Proteome Research|jprobs journal=Journal of the American Chemical Society|jacsat journal=Langmuir|langd5 journal=Macromolecules|mamobx journal=Molecular Pharmaceutics|mpohbp journal=Nano Letters|nalefd journal=Organic Letters|orlef7 journal=Organic Process Research and Development|oprdfk journal=Organometallics|orgnd7 query=http://pubs.acs.org/action/quickLink?quickLinkJournal=<<journal>>&quickLinkVolume=<<volume>>&quickLinkPage=<<pages>> capture_from_query= referenceurl_prefix= referenceurl_sufix= pdfurl_prefix= pdfurl_sufix= action=browse_query # QUERY INFO FOR JCP, JAP and JMP # Extracts BibTeX reference journal=The Journal of Chemical Physics|JCP journal=Journal of Chemical Physics|JCP journal=Journal of Applied Physics|JAP journal=Journal of Mathematical Physics|JMP query=http://link.aip.org/link/?<<journal>>/<<volume>>/<<pages>> capture_from_query=filetype=pdf&id=([\w\d]+)& referenceurl_prefix=http://scitation.aip.org/getabs/servlet/GetCitation?fn=view_bibtex2&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck= referenceurl_sufix=&downloadcitation=+Go+ pdfurl_prefix=http://scitation.aip.org/getpdf/servlet/GetPDFServlet?filetype=pdf&id= pdfurl_sufix=&idtype=cvips action= # QUERY INFO FOR DOI # If DOI is known, and so far the reference is not found, at least browse reference journal= query=http://dx.doi.org/<<doi>> capture_from_query= referenceurl_prefix= referenceurl_sufix= pdfurl_prefix= pdfurl_sufix= action=browse_query # QUERY INFO FOR CR # Uses <<post>> http method journal= query=<<post>>http://www.crossref.org/guestquery?search_type=journal&auth=&issn=&title=<<journal>>&art_title=&volume=<<volume>>&issue=&page=<<pages>>%20&year=&isbn=&comp_num=&series_title=&multi_hit=on&view_records=Search&queryType=bibsearch capture_from_query=doi:(.+)</a> referenceurl_prefix=http://dx.doi.org/ referenceurl_sufix= pdfurl_prefix= pdfurl_sufix= action=browse_referenceurl # QUERY INFO FOR PubMed # Extracts Medline reference # Uses <<title>> tag journal= query=http://www.ncbi.nlm.nih.gov/sites/entrez?orig_db=PubMed&db=pubmed&cmd=Search&TransSchema=title&term=<<title>> capture_from_query=\bPMID:\D{1,10}(\d+)\D referenceurl_prefix=http://www.ncbi.nlm.nih.gov/pubmed/ referenceurl_sufix=?report=xml&format=text pdfurl_prefix=http://www.ncbi.nlm.nih.gov/pmc/articles/pmid/ pdfurl_sufix=/pdf/ action=htm2txt_referenceurl # QUERY INFO FOR Google Scholar # Uses <<excerpt>> tag journal= query=http://scholar.google.com/scholar?hl=en&lr=&ie=UTF-8&q=<<excerpt>>&btnG=Search capture_from_query= referenceurl_prefix= referenceurl_sufix= pdfurl_prefix= pdfurl_sufix= action=browse_query # QUERY INFO FOR Google Scholar journal= query=http://scholar.google.com/scholar?hl=en&lr=&ie=UTF-8&q=<<doi>>&btnG=Search capture_from_query=info:(\w+):scholar referenceurl_prefix=http://scholar.google.com/scholar.bib?hl=en&lr=&ie=UTF-8&q=info: referenceurl_sufix=:scholar.google.com/&output=citation&oe=ASCII&oi=citation pdfurl_prefix= pdfurl_sufix= action= # QUERY INFO FOR Google Scholar # Uses <<excerpt>> tag journal= query=http://scholar.google.com/scholar?hl=en&lr=&ie=UTF-8&q=<<excerpt>>&btnG=Search capture_from_query=info:(\w+):scholar referenceurl_prefix=http://scholar.google.com/scholar.bib?hl=en&lr=&ie=UTF-8&q=info: referenceurl_sufix=:scholar.google.com/&output=citation&oe=ASCII&oi=citation pdfurl_prefix= pdfurl_sufix= action= ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/tex2html.css����������������������������������������������������������������������0000644�0001750�0001750�00000005641�12045520050�015767� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cb2Bib Annote CSS */ /* general */ body { background-color: #C4C4B7; border-color: #72726A; border-style: solid; border-width: 1px; color: black; margin: 1px; padding-left: 25px; padding-right: 25px; padding-top: 25px; } h1 { background-color: #818B93; border-color: black; border-style: solid; border-width: 1px; color: #E3E3E3; font-family: sans-serif; font-size: 120%; padding-left: 10px; } h2 { color: #602020; font-family: sans-serif; font-size: 110%; padding-left: 10px; } h3 { color: #602020; font-family: sans-serif; font-size: 100%; font-style: italic; padding-left: 10px; } a { color: #293747; font-size: 100%; text-decoration: underline; } p { padding-right: 20px; text-indent: 20px; } pre { background-color: #AEAEA3; border-color: #72726A; border-style: solid; border-width: 1px; font-family: monospace; font-size: 80%; padding: 10px; } ul li { list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAJCAYAAADkZNYtAAAABGdBTUEAANbY1E9YMgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gMCBQ5B7ky4rkAAAFHSURBVBjTTcoxasJQAIDhPy8JlfCKGpe+LIUuQhAnN0FEikcodOvSnqCLV+lYEA/QCi4GnERyhE5FsGoCDgZ9oMnr0pZ+8G+/xQ+lVLXVaj31+/378/lsOY5jJpPJaDabvWRZtuMfv9PpjKIoMkmSmDRNzXa7NdPp1LTb7RHgA9iACILgcTAYPFerVbTWaK3Z7XbkeU69Xm/M5/OvLMtiAbjNZvPO8zy01uz3+7+01nieR6PRuANcB3CVUje1Wg0pJa7rYts2eZ5zOp0olUoEQXDzO4skSVa+719JKXPLsizbtjHGACCEEJvNZgUIARSLxWK8Xq+RUtrlcllIKUWlUhFSSrFcLonjeAwUABdA2O12J3Ecm8PhYLTW5ng8miiKTBiGb0AIXFiAAC6VUqHv+w+9Xu/WcZzroig+h8Phe5qmr8AHkH0DzH6Pqv7Vyi4AAAAASUVORK5CYII=); padding-right: 100px; text-indent: 15px; } /* header */ .header { vertical-align: middle; } /* footer */ .footer { color: black; font-family: arial, sans-serif; font-size: 70%; } .footer td { padding: 10px; padding-left: 5px; padding-right: 5px; } .footer a { color: #293747; font-weight: bold; text-decoration: underline; } /* index */ .index { background-color: #AEAEA3; border-color: #72726A; border-style: solid; border-width: 1px; font-family: sans-serif; font-size: 80%; } .index a { color: #293747; font-weight: bold; text-decoration: none; } .index a:hover { color: #E3E3E3; font-weight: bold; text-decoration: none; } .index ul li { list-style-image: none; } /* abstract */ #abstract { background-color: #AEAEA3; border-color: #72726A; border-style: solid; border-width: 1px; font-size: 95%; font-style: italic; padding-bottom: 10px; padding-left: 50px; padding-right: 70px; padding-top: 10px; text-indent: 20px; } /* citations */ .citations { font-size: 80%; } .citations a { text-decoration: none; } .citations a:active { color: #602020; text-decoration: none; } /* references */ .references { font-size: 80%; font-family: sans-serif; padding-right: 50px; } .references a { color: black; text-decoration: none; } .references a:link { color: #293747; font-weight: bold; text-decoration: none; } .references a:visited { color: #293747; font-weight: bold; text-decoration: none; } /* math */ .math { visibility: hidden; } #math { font-size: 110%; } �����������������������������������������������������������������������������������������������cb2bib-1.4.9/data/lexicon.pos�����������������������������������������������������������������������0000644�0001750�0001750�00002175677�12045520050�015715� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#--------------------------------------------------------------------------- # cb2Bib POS Lexicon File #--------------------------------------------------------------------------- # # Tags: # A adjective # B between # C countable: one, two, ..., i, ii, ... # F from # G verbal noun # I in, on, for # N noun # O plural noun # P preposition # Q as # R adverb # S short word # T to # U union # V verb # # Values for non-regular words had been set according to www.wiktionary.org. #--------------------------------------------------------------------------- 2536 .A.A.A.A.N. .A.A.A.G. .A.A.A.N. .A.A.A.N.N.O. .A.A.A.NV. .A.A.A.NV.NV. .A.A.A.NV.O. .A.A.A.O. .A.A.A.OV. .A.A.AN. .A.A.AN.AN.O. .A.A.AN.G. .A.A.AN.N. .A.A.AN.O. .A.A.ANR. .A.A.ANV. .A.A.ANV.N. .A.A.ANV.NV. .A.A.ANV.NV.G. .A.A.ANV.OV. .A.A.AR.OV. .A.A.AR.OV.O. .A.A.AV.A.NV. .A.A.G.NV. .A.A.G.O. .A.A.G.OV. .A.A.I.A.OV. .A.A.N. .A.A.N.A.G. .A.A.N.A.N. .A.A.N.G. .A.A.N.I.AN.O. .A.A.N.I.N.N. .A.A.N.I.N.NV. .A.A.N.I.NV.N. .A.A.N.N. .A.A.N.N.N. .A.A.N.N.NV. .A.A.N.N.NV.N. .A.A.N.NV. .A.A.N.NV.N. .A.A.N.NV.N.N. .A.A.N.NV.O. .A.A.N.O. .A.A.N.OV. .A.A.N.P.AN.OV. .A.A.N.P.O. .A.A.N.U.AN.N. .A.A.NV. .A.A.NV.I.A.OV. .A.A.NV.N. .A.A.NV.NV. .A.A.NV.O. .A.A.NV.OV. .A.A.O. .A.A.O.I.A.NV. .A.A.O.I.N.O. .A.A.O.I.N.U.N. .A.A.O.N. .A.A.O.U.N.O. .A.A.OV. .A.A.S.O. .A.A.U.A.N. .A.A.U.A.NV. .A.A.U.A.O. .A.AG. .A.AG.N. .A.AN.A.N. .A.AN.A.NV. .A.AN.A.O. .A.AN.A.OV. .A.AN.AN.AN.O. .A.AN.AN.G.N. .A.AN.AN.N. .A.AN.AN.O. .A.AN.AN.O.I.ANV.NV. .A.AN.AN.O.U.O. .A.AN.AN.OV. .A.AN.ANR.A.N. .A.AN.ANV.N. .A.AN.ANV.OV. .A.AN.AR.OV. .A.AN.G.ANRV.O. .A.AN.G.I.AN.O. .A.AN.G.N. .A.AN.G.O. .A.AN.I.A.NV. .A.AN.I.A.O. .A.AN.I.N.OV. .A.AN.N. .A.AN.N.G. .A.AN.N.I.N.N. .A.AN.N.N. .A.AN.N.NV. .A.AN.N.O. .A.AN.N.OV. .A.AN.N.U.O. .A.AN.NV. .A.AN.NV.N. .A.AN.NV.N.I.A.G. .A.AN.NV.NV. .A.AN.NV.O. .A.AN.NV.OV. .A.AN.O. .A.AN.O.I.NV.OV. .A.AN.O.P.AN.O. .A.AN.O.U.O. .A.AN.OV. .A.AN.OV.U.ANV.OV. .A.AN.S.N. .A.AN.S.N.N.O. .A.AN.U.AV.O. .A.AN.U.N. .A.AN.U.NV. .A.ANRV.A.N. .A.ANRV.N.I.N.NV. .A.ANRV.N.N. .A.ANRV.N.NV. .A.ANRV.N.O. .A.ANRV.N.OV. .A.ANRV.NV. .A.ANRV.NV.N. .A.ANRV.NV.NV. .A.ANRV.NV.O. .A.ANV.A.N. .A.ANV.A.N.N. .A.ANV.AN.N. .A.ANV.AN.O. .A.ANV.ANRV.N. .A.ANV.ANV.N. .A.ANV.ANV.NV. .A.ANV.AR.OV. .A.ANV.G.ANV.N. .A.ANV.G.U.N. .A.ANV.I.A.NV. .A.ANV.I.A.OV. .A.ANV.I.AN.O. .A.ANV.I.ANV.N. .A.ANV.I.N.O. .A.ANV.I.N.OV. .A.ANV.I.O. .A.ANV.I.OV. .A.ANV.N. .A.ANV.N.G. .A.ANV.N.N. .A.ANV.N.NV. .A.ANV.N.O. .A.ANV.NV. .A.ANV.NV.AN.O. .A.ANV.NV.G. .A.ANV.NV.N. .A.ANV.O. .A.ANV.OV. .A.ANV.U.N.N. .A.AR.ANV.A.N. .A.AR.OV.N. .A.AR.OV.NV. .A.AR.OV.O. .A.ARV.N.O. .A.AV.A.A.NV. .A.AV.A.NV. .A.AV.G.OV. .A.AV.N.NV. .A.AV.NV.NV. .A.AV.U.AN.O. .A.B.N.N.U.NV. .A.B.NV.U.N.N. .A.C.N. .A.G. .A.G.AN. .A.G.ANRV.N. .A.G.ANRV.O. .A.G.ANV. .A.G.I.A.O. .A.G.I.AN.O. .A.G.I.O. .A.G.N. .A.G.N.N. .A.G.NV. .A.G.NV.O. .A.G.NV.T.NV.G. .A.G.O. .A.G.O.I.N.G. .A.G.OV. .A.G.P.ANV.N.N. .A.G.U.A.O. .A.G.U.G. .A.G.U.N.NV. .A.I.AN.AN.O. .A.I.AN.N.N. .A.I.N.A.N. .A.I.N.N.N. .A.I.N.N.NV. .A.I.N.NV.N. .A.I.N.U.N.OV. .A.I.S.AN.N. .A.N.A.G. .A.N.A.N. .A.N.A.N.N. .A.N.A.NV. .A.N.A.OV. .A.N.AN.N. .A.N.AN.N.N. .A.N.AN.O. .A.N.ANRV.N. .A.N.ANRV.O. .A.N.ANV. .A.N.ANV.N. .A.N.ANV.O. .A.N.B.C.O. .A.N.C. .A.N.C.N. .A.N.C.N.N. .A.N.G. .A.N.G.N. .A.N.G.NV. .A.N.G.NV.N. .A.N.G.NV.O. .A.N.G.O. .A.N.I.A.A.NV.NV. .A.N.I.A.AN.O. .A.N.I.A.G. .A.N.I.A.N. .A.N.I.A.NV. .A.N.I.A.NV.NV. .A.N.I.A.O. .A.N.I.A.O.U.O. .A.N.I.A.OV. .A.N.I.AN.AN.O. .A.N.I.AN.N. .A.N.I.AN.NV. .A.N.I.AN.O. .A.N.I.AN.OV. .A.N.I.ANR.N.NV. .A.N.I.ANV.O. .A.N.I.G.O. .A.N.I.N.N. .A.N.I.N.NV.O. .A.N.I.N.O. .A.N.I.N.OV. .A.N.I.NV.N. .A.N.I.NV.NV. .A.N.I.NV.OV. .A.N.I.O. .A.N.I.O.I.N.NV. .A.N.I.O.U.O. .A.N.I.OV. .A.N.I.R.A.NV. .A.N.N. .A.N.N.ANRV.NV. .A.N.N.ANV.NV. .A.N.N.G. .A.N.N.I.A.O. .A.N.N.I.AN.N. .A.N.N.I.N.N. .A.N.N.I.O. .A.N.N.N. .A.N.N.N.NV. .A.N.N.N.O. .A.N.N.NV. .A.N.N.NV.O. .A.N.N.O. .A.N.N.OV. .A.N.NV. .A.N.NV.ANV.N. .A.N.NV.I.O. .A.N.NV.N. .A.N.NV.N.N. .A.N.NV.NV. .A.N.NV.O. .A.N.NV.OV. .A.N.O. .A.N.O.I.A.G. .A.N.O.I.NV.N.O. .A.N.O.I.NV.O. .A.N.O.I.O. .A.N.O.N. .A.N.O.P.ANV.N.N. .A.N.O.Q.N.O. .A.N.OV. .A.N.P.A.G. .A.N.P.AN.G. .A.N.P.AV.G. .A.N.P.G. .A.N.P.OV. .A.N.S.N. .A.N.S.N.O. .A.N.S.O. .A.N.T.A.G. .A.N.T.A.N.I.OV. .A.N.T.A.NV. .A.N.T.AN.N. .A.N.T.G. .A.N.U.A.N. .A.N.U.A.O. .A.N.U.AN.N. .A.N.U.AN.O. .A.N.U.ANRV.N. .A.N.U.N.N.O. .A.N.U.N.NV.O. .A.N.U.N.O. .A.N.U.N.OV. .A.N.U.O. .A.NV.A.N. .A.NV.A.O. .A.NV.AN. .A.NV.AN.N.OV. .A.NV.ANV. .A.NV.C.OV. .A.NV.G. .A.NV.G.N. .A.NV.G.NV. .A.NV.G.OV. .A.NV.I.A.NV. .A.NV.I.A.U.A.N. .A.NV.I.AN.NV. .A.NV.I.AN.O. .A.NV.I.AN.OV. .A.NV.I.N.I.N. .A.NV.I.N.N. .A.NV.I.N.NV. .A.NV.I.O. .A.NV.I.OV. .A.NV.N. .A.NV.N.G. .A.NV.N.I.A.O. .A.NV.N.I.O. .A.NV.N.N. .A.NV.N.N.OV. .A.NV.N.NV. .A.NV.N.O. .A.NV.N.OV. .A.NV.N.U.AN.O. .A.NV.N.U.O. .A.NV.NV. .A.NV.NV.I.A.O. .A.NV.NV.N. .A.NV.NV.N.O. .A.NV.NV.N.P.A.G. .A.NV.NV.NV. .A.NV.NV.O. .A.NV.NV.OV. .A.NV.O. .A.NV.O.U.NV.OV. .A.NV.O.U.OV. .A.NV.OV. .A.NV.OV.N. .A.NV.P.A.A.A.O. .A.NV.P.A.ANV.O. .A.NV.P.A.N. .A.NV.P.A.O. .A.NV.P.N.O. .A.NV.P.OV. .A.NV.S.O. .A.NV.T.AN.N. .A.NV.U.A.NV. .A.NV.U.A.NV.N. .A.NV.U.ANV.NV. .A.NV.U.G. .A.NV.U.N.NV. .A.NV.U.O. .A.O.ANV. .A.O.G. .A.O.I.A.A.N.N. .A.O.I.A.A.O. .A.O.I.A.G. .A.O.I.A.N. .A.O.I.A.N.NV.N. .A.O.I.A.NV. .A.O.I.A.O. .A.O.I.AN.AN.O. .A.O.I.AN.N.N. .A.O.I.AN.O. .A.O.I.ANR.O. .A.O.I.ANV.O. .A.O.I.G.A.O. .A.O.I.N.N. .A.O.I.N.N.O. .A.O.I.N.NV. .A.O.I.N.NV.OV. .A.O.I.N.O. .A.O.I.N.OV. .A.O.I.N.S.N. .A.O.I.O. .A.O.I.O.U.N. .A.O.I.OV. .A.O.I.OV.U.OV. .A.O.NV. .A.O.NV.N. .A.O.NV.NV. .A.O.NV.OV. .A.O.P.A.O. .A.O.P.O. .A.O.Q.O. .A.O.T.A.N. .A.O.T.N.O. .A.O.U.A.AR.OV. .A.O.U.A.N.O. .A.O.U.A.O. .A.O.U.ANV.N.O. .A.O.U.N.G. .A.O.U.N.O. .A.O.U.O. .A.O.U.O.I.O. .A.O.U.O.N. .A.O.U.OV. .A.OV.A.N.N. .A.OV.I.A.G. .A.OV.I.A.NV. .A.OV.I.A.O. .A.OV.I.AN.G. .A.OV.I.AN.N. .A.OV.I.AN.O. .A.OV.I.N.AN.O. .A.OV.I.N.N. .A.OV.I.O. .A.OV.I.OV. .A.OV.I.R.A.O. .A.OV.N. .A.OV.N.I.N. .A.OV.OV. .A.OV.P.A.ANRV.A.N. .A.OV.P.A.O. .A.OV.P.ANV.NV. .A.OV.P.N.O. .A.OV.T.O. .A.OV.U.A.N. .A.OV.U.A.O. .A.OV.U.N.O. .A.OV.U.NV.OV. .A.OV.U.O. .A.OV.U.OV. .A.P.A.AN.O. .A.P.C.N.O. .A.P.NV.NV.O. .A.R.A.G. .A.R.A.NV. .A.R.A.OV. .A.S.A.N. .A.S.AN.N. .A.S.G. .A.S.N.N. .A.S.N.N.O. .A.S.N.O. .A.S.O. .A.S.S.N. .A.S.U.N.O. .A.U.A.A.NV. .A.U.A.AN.S.N. .A.U.A.G. .A.U.A.G.N. .A.U.A.N. .A.U.A.N.I.N.N. .A.U.A.N.N. .A.U.A.N.N.N.O. .A.U.A.N.N.O. .A.U.A.N.O. .A.U.A.N.OV. .A.U.A.N.S.N. .A.U.A.N.S.N.N. .A.U.A.NV. .A.U.A.NV.OV. .A.U.A.O. .A.U.A.O.I.AN.NV. .A.U.A.O.I.ANV.N. .A.U.A.OV. .A.U.A.OV.I.AN.N. .A.U.A.OV.T.NV.N. .A.U.A.S.AN.N. .A.U.AN.A.N. .A.U.AN.A.N.O. .A.U.AN.G. .A.U.AN.N.NV. .A.U.AN.O. .A.U.AN.OV. .A.U.ANP.O. .A.U.ANR.O. .A.U.ANR.OV. .A.U.ANRV.N.NV. .A.U.ANV.O. .A.U.ANV.OV. .A.U.AR.N. .A.U.AR.N.O. .A.U.AR.O. .A.U.AV.A.NV. .A.U.G.G. .A.U.G.NV. .A.U.G.O. .A.U.G.OV. .A.U.N.G. .A.U.N.N. .A.U.N.N.OV. .A.U.N.NV. .A.U.N.O. .A.U.N.OV. .A.U.NV.OV. .A.U.R.A.N. .A.U.R.G. .AG.A. .AG.ANRV.G. .AG.ANRV.O. .AG.N. .AG.NV. .AG.O. .AG.OV. .AN.A.A.G. .AN.A.A.N. .AN.A.A.NV. .AN.A.A.NV.O. .AN.A.A.O. .AN.A.AN.N. .AN.A.AN.NV. .AN.A.AN.O. .AN.A.AN.OV. .AN.A.G. .AN.A.G.N. .AN.A.G.O. .AN.A.G.OV. .AN.A.N. .AN.A.N.G. .AN.A.N.I.AN.N. .AN.A.N.N. .AN.A.N.N.OV. .AN.A.N.NV. .AN.A.N.NV.O. .AN.A.N.O. .AN.A.N.O.I.N.N. .AN.A.N.OV. .AN.A.NV. .AN.A.NV.N. .AN.A.NV.NV. .AN.A.NV.O. .AN.A.NV.OV. .AN.A.O. .AN.A.OV. .AN.A.U.A.A.NV. .AN.A.U.A.A.O. .AN.A.U.A.O. .AN.AN.A.G. .AN.AN.A.G.N. .AN.AN.A.N. .AN.AN.A.O. .AN.AN.A.OV. .AN.AN.AN. .AN.AN.AN.AN.O. .AN.AN.AN.G. .AN.AN.AN.N. .AN.AN.AN.NV.NV. .AN.AN.AN.NV.OV. .AN.AN.AN.O. .AN.AN.ANV.N. .AN.AN.G.N. .AN.AN.G.NV. .AN.AN.G.OV. .AN.AN.I.N.NV. .AN.AN.N. .AN.AN.N.A.O. .AN.AN.N.AN.N. .AN.AN.N.G.N. .AN.AN.N.I.A.A.N. .AN.AN.N.I.O. .AN.AN.N.N. .AN.AN.N.N.O. .AN.AN.N.NV. .AN.AN.N.NV.NV. .AN.AN.N.O. .AN.AN.N.OV. .AN.AN.NV. .AN.AN.NV.A.O. .AN.AN.NV.N. .AN.AN.NV.NV. .AN.AN.NV.O. .AN.AN.NV.OV. .AN.AN.O. .AN.AN.O.A.N. .AN.AN.O.I.A.O. .AN.AN.O.I.AN.NV. .AN.AN.O.I.ANR.NV. .AN.AN.O.I.ANV.NV. .AN.AN.O.N. .AN.AN.O.NV.N. .AN.AN.O.P.A.NV. .AN.AN.O.P.OV. .AN.AN.O.U.O. .AN.AN.OV. .AN.AN.OV.N. .AN.AN.S.O. .AN.ANR.A.N. .AN.ANR.A.O. .AN.ANR.A.OV. .AN.ANR.NV.NV. .AN.ANRV.G.O. .AN.ANRV.G.OV. .AN.ANRV.N.I.G. .AN.ANRV.N.I.N. .AN.ANRV.O.I.G. .AN.ANRV.O.I.N. .AN.ANRV.U.A.G.N. .AN.ANV.A.N. .AN.ANV.AN.NV. .AN.ANV.ANV.N. .AN.ANV.I.A.NV. .AN.ANV.I.AN.NV. .AN.ANV.I.N.N. .AN.ANV.I.N.O. .AN.ANV.I.N.U.N. .AN.ANV.I.NV.O. .AN.ANV.I.O. .AN.ANV.I.OV. .AN.ANV.N. .AN.ANV.N.I.A.N. .AN.ANV.N.I.A.O. .AN.ANV.N.N. .AN.ANV.NV. .AN.ANV.NV.N. .AN.ANV.NV.O. .AN.ANV.O. .AN.ANV.OV. .AN.AR.AN.NV. .AN.AR.OV.N. .AN.AV.A.N. .AN.AV.NV.N. .AN.C.N.O. .AN.C.O. .AN.G. .AN.G.AN.N. .AN.G.ANRV.O. .AN.G.ANV.NV. .AN.G.I.AN.AN.N. .AN.G.I.AN.O. .AN.G.I.AN.OV. .AN.G.I.ANV.N. .AN.G.I.O. .AN.G.N. .AN.G.N.N. .AN.G.N.NV. .AN.G.NV.N. .AN.G.O. .AN.G.U.G. .AN.G.U.N.N. .AN.I.A.G. .AN.I.A.N. .AN.I.A.NV. .AN.I.A.O. .AN.I.A.OV. .AN.I.AN.N. .AN.I.AN.NV. .AN.I.AN.O. .AN.I.G.N. .AN.I.N.AN.N. .AN.I.N.G. .AN.I.N.N. .AN.I.N.NV. .AN.I.N.O. .AN.I.N.OV. .AN.N.A.N. .AN.N.AN. .AN.N.AN.N. .AN.N.AN.O. .AN.N.AN.OV. .AN.N.ANV. .AN.N.ANV.N. .AN.N.ANV.NV. .AN.N.ANV.O. .AN.N.G. .AN.N.G.N. .AN.N.G.O. .AN.N.G.OV. .AN.N.I.A.G. .AN.N.I.A.G.O. .AN.N.I.A.N. .AN.N.I.A.N.O. .AN.N.I.A.NV. .AN.N.I.A.NV.G. .AN.N.I.A.O. .AN.N.I.A.OV. .AN.N.I.A.U.A.N. .AN.N.I.AN.A.N. .AN.N.I.AN.N. .AN.N.I.AN.NV. .AN.N.I.AN.O. .AN.N.I.ANR.N. .AN.N.I.ANRV.G. .AN.N.I.ANV.N. .AN.N.I.ANV.OV. .AN.N.I.AR.A.O. .AN.N.I.AR.A.O.OV. .AN.N.I.AR.U.A.N. .AN.N.I.G.U.O. .AN.N.I.N.I.O. .AN.N.I.N.I.OV. .AN.N.I.N.N. .AN.N.I.N.NV. .AN.N.I.N.O. .AN.N.I.N.O.U.N. .AN.N.I.N.U.A.N. .AN.N.I.N.U.N.N. .AN.N.I.NV.ANR.NV. .AN.N.I.NV.C.NV. .AN.N.I.NV.G. .AN.N.I.NV.N. .AN.N.I.NV.N.U.N. .AN.N.I.O. .AN.N.I.O.I.N.N. .AN.N.I.O.I.O. .AN.N.I.O.U.N. .AN.N.I.OV. .AN.N.I.OV.U.OV. .AN.N.I.R.A.N. .AN.N.N. .AN.N.N.A.O. .AN.N.N.C. .AN.N.N.G. .AN.N.N.I.A.N. .AN.N.N.I.A.N.O. .AN.N.N.N. .AN.N.N.N.NV. .AN.N.N.N.OV. .AN.N.N.NV. .AN.N.N.O. .AN.N.N.OV. .AN.N.N.P.AN.N. .AN.N.NV. .AN.N.NV.G. .AN.N.NV.N. .AN.N.NV.NV. .AN.N.NV.O. .AN.N.NV.OV. .AN.N.O. .AN.N.O.I.O. .AN.N.OV. .AN.N.P.R.AN.O. .AN.N.S.N. .AN.N.U.A.N. .AN.N.U.A.O. .AN.N.U.AN.N. .AN.N.U.ANR.NV. .AN.N.U.N. .AN.N.U.N.N. .AN.N.U.N.O. .AN.N.U.N.OV. .AN.N.U.NV. .AN.N.U.NV.N. .AN.N.U.O. .AN.NV.A.G. .AN.NV.A.NV. .AN.NV.A.O. .AN.NV.AN. .AN.NV.AN.AN.O. .AN.NV.AN.N. .AN.NV.AN.NV. .AN.NV.AN.O. .AN.NV.AN.OV. .AN.NV.ANRV.G. .AN.NV.B.OV. .AN.NV.C.NV. .AN.NV.G. .AN.NV.G.OV.U.O. .AN.NV.I.A.N. .AN.NV.I.A.NV. .AN.NV.I.AN.N. .AN.NV.I.AN.NV. .AN.NV.I.AV.G. .AN.NV.I.N.N. .AN.NV.I.N.N.U.N. .AN.NV.I.N.NV. .AN.NV.I.N.O. .AN.NV.I.NV.N. .AN.NV.I.O. .AN.NV.N. .AN.NV.N.N. .AN.NV.N.N.NV. .AN.NV.N.NV. .AN.NV.N.O. .AN.NV.N.OV. .AN.NV.NV. .AN.NV.NV.N. .AN.NV.NV.NV. .AN.NV.NV.O. .AN.NV.O. .AN.NV.O.I.A.G. .AN.NV.OV. .AN.NV.OV.I.A.O. .AN.NV.U.A.O. .AN.NV.U.N. .AN.NV.U.NV.N.N. .AN.NV.U.O. .AN.O.G. .AN.O.I.A.A.O. .AN.O.I.A.G. .AN.O.I.A.N.N.NV. .AN.O.I.A.O. .AN.O.I.A.OV. .AN.O.I.AN.N.NV. .AN.O.I.AN.NV. .AN.O.I.ANR.NV. .AN.O.I.ANR.O. .AN.O.I.N.N.N. .AN.O.I.N.NV. .AN.O.I.N.NV.N. .AN.O.I.N.NV.O. .AN.O.I.N.O. .AN.O.I.N.OV. .AN.O.I.N.U.N. .AN.O.I.NV.N. .AN.O.I.NV.OV. .AN.O.N.I.N.G. .AN.O.NV. .AN.O.O. .AN.O.OV. .AN.O.P.A.NV. .AN.O.P.AN.O. .AN.O.P.AN.U.ANV.O. .AN.O.P.G.O. .AN.O.P.N. .AN.O.P.NV. .AN.O.P.O. .AN.O.P.OV. .AN.O.P.R.AN.N. .AN.O.T.N. .AN.O.U.A.O. .AN.O.U.AN.O. .AN.O.U.AN.OV. .AN.O.U.N.O.I.OV. .AN.O.U.O. .AN.O.U.O.I.AN.N. .AN.O.U.OV. .AN.OV.B.NV.O. .AN.OV.I.A.N. .AN.OV.I.AN.N. .AN.OV.I.G.O. .AN.OV.I.N. .AN.OV.I.N.N. .AN.OV.I.N.O. .AN.OV.I.O. .AN.OV.N. .AN.OV.O. .AN.OV.U.G.O. .AN.OV.U.O. .AN.P.ANRV.N. .AN.P.N.NV. .AN.P.N.O. .AN.Q.N. .AN.R.A.AN.O. .AN.R.AN.N. .AN.S.N.N.O. .AN.T.A.N. .AN.T.A.NV. .AN.T.A.O. .AN.T.AN.N. .AN.T.AN.NV. .AN.T.AR.NV. .AN.T.N.N. .AN.T.N.NV. .AN.T.NV.N. .AN.T.NV.NV. .AN.U.A.G. .AN.U.A.N. .AN.U.A.O. .AN.U.A.OV. .AN.U.AN.AN.O. .AN.U.AN.N. .AN.U.AN.NV. .AN.U.AN.O. .AN.U.AN.O.I.O. .AN.U.AN.OV. .AN.U.ANRV.NV. .AN.U.ANV.N. .AN.U.ANV.NV. .AN.U.ANV.O. .AN.U.ANV.OV. .AN.U.AV.G. .AN.U.AV.O. .AN.U.AV.OV. .AN.U.G.O. .AN.U.N.G. .AN.U.N.N.OV. .AN.U.N.O. .AN.U.N.OV. .AN.U.NV.AN.O. .AN.U.NV.O. .AN.U.R.A.AN.O. .ANP.U.A.O. .ANR.A.A.N. .ANR.A.A.NV. .ANR.A.A.NV.NV. .ANR.A.AN.N. .ANR.A.ANV.O. .ANR.A.G.NV. .ANR.A.N.NV. .ANR.A.N.O. .ANR.A.NV.N. .ANR.A.NV.NV. .ANR.A.NV.O. .ANR.AN.N.NV. .ANR.ANV.N. .ANR.G. .ANR.N.A.NV. .ANR.N.AN.NV. .ANR.N.ANV.G. .ANR.N.ANV.O. .ANR.N.G.NV. .ANR.N.N. .ANR.N.N.N. .ANR.N.N.OV. .ANR.N.NV.O. .ANR.N.NV.P.AN.N. .ANR.N.O. .ANR.N.OV.I.AN.N. .ANR.NV.A.AN.O. .ANR.NV.A.N. .ANR.NV.AN. .ANR.NV.AN.A.O. .ANR.NV.AN.O. .ANR.NV.ANV.NV.O. .ANR.NV.G. .ANR.NV.N. .ANR.NV.N.G. .ANR.NV.N.N. .ANR.NV.N.NV. .ANR.NV.NV.O. .ANR.NV.OV. .ANR.O.U.O. .ANR.OV.I.AN.A.N. .ANR.R.ANRV.N.NV. .ANR.S.N.N. .ANR.U.A.O.U.OV. .ANR.U.ANV.N. .ANR.U.ANV.O. .ANR.U.ANV.OV. .ANRV.A.A.N. .ANRV.A.G.O. .ANRV.A.N.N. .ANRV.A.N.N.NV. .ANRV.A.N.NV.O. .ANRV.A.NV.O. .ANRV.AN.NV.NV. .ANRV.AN.O. .ANRV.ANV.N. .ANRV.G. .ANRV.N.A.O. .ANRV.N.AN.N. .ANRV.N.I.AN.AN.ANV.N. .ANRV.N.I.AN.N.N. .ANRV.N.I.O. .ANRV.N.N. .ANRV.N.N.O. .ANRV.N.NV. .ANRV.N.NV.N. .ANRV.N.NV.NV. .ANRV.N.NV.OV. .ANRV.N.O. .ANRV.N.O.I.AN.NV.NV. .ANRV.N.OV. .ANRV.NV.G. .ANRV.NV.N. .ANRV.NV.N.N. .ANRV.NV.NV. .ANRV.NV.O. .ANRV.O.U.O. .ANRV.R.N. .ANRV.S.N. .ANRV.U.A.G. .ANRV.U.A.N. .ANRV.U.ANRV.N. .ANRV.U.AR.O. .ANV.A.ANPR.N.NV. .ANV.A.N. .ANV.A.N.I.N.NV. .ANV.A.N.N. .ANV.A.N.NV. .ANV.A.N.O. .ANV.A.NV.N. .ANV.A.NV.NV. .ANV.A.NV.O. .ANV.A.NV.OV. .ANV.A.O. .ANV.A.O.U.O. .ANV.AG. .ANV.AN.A.N. .ANV.AN.AN.NV. .ANV.AN.AN.O. .ANV.AN.N. .ANV.AN.N.N. .ANV.AN.NV.NV. .ANV.AN.NV.O. .ANV.AN.O. .ANV.ANV.AN.N. .ANV.ANV.N. .ANV.ANV.NV. .ANV.ANV.NV.N. .ANV.ANV.NV.NV. .ANV.ANV.NV.O. .ANV.ANV.O. .ANV.AR.OV.N. .ANV.AR.OV.O. .ANV.AV.A.NV. .ANV.C.N.N. .ANV.C.N.O. .ANV.G. .ANV.G.N. .ANV.G.O. .ANV.G.OV. .ANV.G.U.G. .ANV.G.U.N. .ANV.I.A.A.N. .ANV.I.A.A.N.U.N. .ANV.I.A.A.NV. .ANV.I.A.A.OV. .ANV.I.A.AN.NV. .ANV.I.A.N. .ANV.I.A.N.O. .ANV.I.A.N.U.N. .ANV.I.A.NV. .ANV.I.A.NV.O. .ANV.I.A.O. .ANV.I.A.OV. .ANV.I.A.OV.I.A.G. .ANV.I.AG.NV.O. .ANV.I.AG.O. .ANV.I.AN.A.OV. .ANV.I.AN.AN.N.N. .ANV.I.AN.AN.N.N.O. .ANV.I.AN.AN.O. .ANV.I.AN.N. .ANV.I.AN.N.NV. .ANV.I.AN.N.O. .ANV.I.AN.NV. .ANV.I.AN.NV.O. .ANV.I.AN.O. .ANV.I.AN.O.NV. .ANV.I.AN.OV. .ANV.I.AN.S.N. .ANV.I.ANR.N.G. .ANV.I.ANV.A.O. .ANV.I.ANV.A.O.U.O. .ANV.I.ANV.AN.N. .ANV.I.AP.OV. .ANV.I.AR.A.O. .ANV.I.AV.N. .ANV.I.AV.O. .ANV.I.AV.OV. .ANV.I.G.O. .ANV.I.G.OV. .ANV.I.N.G. .ANV.I.N.N. .ANV.I.N.NV. .ANV.I.N.NV.O. .ANV.I.N.O. .ANV.I.N.OV. .ANV.I.NV.I.ANRV.N. .ANV.I.NV.N. .ANV.I.NV.N.O. .ANV.I.NV.O. .ANV.I.NV.OV. .ANV.I.R.AN.O. .ANV.I.R.AN.OV. .ANV.N.A.O. .ANV.N.AN. .ANV.N.AN.N. .ANV.N.ANV. .ANV.N.AV.O.I.AN.N. .ANV.N.G. .ANV.N.G.NV. .ANV.N.I.A.N. .ANV.N.I.AN.O. .ANV.N.I.N.I.N.NV. .ANV.N.I.N.N. .ANV.N.I.N.NV. .ANV.N.I.N.O. .ANV.N.I.N.OV. .ANV.N.I.NV.NV.OV. .ANV.N.I.O. .ANV.N.I.OV. .ANV.N.N. .ANV.N.N.A.N. .ANV.N.N.N. .ANV.N.N.NV. .ANV.N.N.O. .ANV.N.NV. .ANV.N.NV.N. .ANV.N.NV.N.N. .ANV.N.NV.NV. .ANV.N.O. .ANV.N.OV. .ANV.N.U.N. .ANV.NV.A.AN.O. .ANV.NV.A.NV.O. .ANV.NV.A.O. .ANV.NV.AN.AN.O. .ANV.NV.AN.N. .ANV.NV.AN.O. .ANV.NV.AN.OV. .ANV.NV.B.O. .ANV.NV.G. .ANV.NV.G.N. .ANV.NV.G.O. .ANV.NV.I.A.O. .ANV.NV.I.AN.NV. .ANV.NV.I.AN.O. .ANV.NV.I.N.AN. .ANV.NV.I.N.N. .ANV.NV.I.NV.AN. .ANV.NV.I.NV.NV. .ANV.NV.I.OV. .ANV.NV.N. .ANV.NV.N.AN.O. .ANV.NV.N.N.NV.N. .ANV.NV.N.O. .ANV.NV.NV. .ANV.NV.NV.N. .ANV.NV.NV.O. .ANV.NV.O. .ANV.NV.O.I.AN.AN.O. .ANV.NV.OV. .ANV.NV.U.ANR.A.NV. .ANV.O.AN.AN.O. .ANV.O.I.A.G.O. .ANV.O.I.AN.A.AN.OV. .ANV.O.I.O. .ANV.O.N.NV. .ANV.O.OV. .ANV.O.U.A.NV.N. .ANV.O.U.O. .ANV.OV.I.A.N. .ANV.OV.I.A.N.O. .ANV.OV.I.AN.N. .ANV.OV.I.O. .ANV.OV.U.OV. .ANV.U.A.A.OV. .ANV.U.A.N. .ANV.U.A.O. .ANV.U.A.OV. .ANV.U.AN.A.N. .ANV.U.AN.N. .ANV.U.AN.O. .ANV.U.AN.OV. .ANV.U.ANR.A.OV. .ANV.U.ANRV.O. .ANV.U.ANRV.OV. .ANV.U.ANV.NV. .ANV.U.ANV.OV. .ANV.U.AV.O. .ANV.U.AV.OV. .ANV.U.N.AN.N. .ANV.U.N.AN.O. .ANV.U.N.N. .ANV.U.N.NV. .ANV.U.N.NV.O. .ANV.U.N.O. .ANV.U.N.OV. .ANV.U.NV.G. .ANV.U.NV.N. .ANV.U.NV.N.O. .ANV.U.NV.O. .ANV.U.NV.OV. .APRV.G. .AR.A.AN.O. .AR.A.N. .AR.A.N.NV. .AR.A.NV.N.N. .AR.AN.AN.NV. .AR.AN.I.OV. .AR.AN.I.OV.N. .AR.AN.N.N. .AR.AN.N.OV. .AR.ANV.A.N. .AR.ANV.A.N.I.N.NV. .AR.N.A.NV. .AR.N.I.A.OV. .AR.N.N. .AR.N.N.NV. .AR.O.I.A.OV. .AR.OV.I.N. .AR.OV.N.N. .AR.OV.N.NV. .AR.OV.NV.NV.OV. .AR.R.A.N. .AR.U.A.A.OV. .ARV.A.A.N. .ARV.A.A.N.N. .ARV.A.N.O. .ARV.AN.N.N. .ARV.ANV.I.O. .ARV.N.I.A.N. .ARV.N.NV.O. .ARV.NV.O.I.ANRV.OV. .ARV.O.I.A.O. .ARV.U.A.O. .ARV.U.A.OV. .ARV.U.ANV.O. .AV.A.A.NV. .AV.A.A.NV.NV. .AV.A.ANV.NV. .AV.A.N. .AV.A.N.N. .AV.A.N.O. .AV.A.NV.N. .AV.A.NV.NV. .AV.AN.NV.N.NV. .AV.ANV.A.NV. .AV.ANV.I.A.O. .AV.ANV.I.AN.O. .AV.ANV.I.AN.OV. .AV.ANV.I.O. .AV.ANV.NV.N. .AV.N.A.N.N. .AV.N.ANV.ANV.N. .AV.N.ANV.O. .AV.N.I.AN.N. .AV.N.I.AN.O. .AV.N.I.N.N. .AV.N.I.OV. .AV.N.N.G. .AV.N.N.G.N. .AV.N.NV.N. .AV.N.NV.NV. .AV.N.O. .AV.N.OV. .AV.NV.I.AN.NV. .AV.NV.I.N.NV. .AV.NV.N.N. .AV.NV.NV.O. .AV.NV.O. .AV.U.AN.N. .AV.U.AN.O. .AV.U.AN.OV. .AV.U.AV.N. .AV.U.AV.O. .G.A.A.N.A.G. .G.A.A.N.O. .G.A.AR.OV.O. .G.A.N. .G.A.N.O. .G.A.NV.U.A.A.OV. .G.A.O. .G.A.O.OV. .G.A.O.P.A.N.O. .G.AN.N.I.A.O. .G.ANPR. .G.ANR. .G.ANV. .G.ANV.O.I.ANV.N. .G.B.N.U.N. .G.G. .G.I.A.G. .G.I.A.O. .G.I.AN.N.I.O.N. .G.I.AN.O. .G.I.ANRV.O. .G.I.ANV.OV. .G.I.N.ANV.OV. .G.I.N.N.O. .G.I.N.O. .G.I.N.OV. .G.I.NV.O. .G.I.O.T.N.O. .G.I.OV. .G.N. .G.N.A.OV. .G.N.C. .G.N.G.OV. .G.N.I.A.O. .G.N.N. .G.N.N.N. .G.N.N.NV. .G.N.N.NV.O. .G.N.N.O. .G.N.N.U.O. .G.N.NV. .G.N.NV.O. .G.N.O. .G.N.OV. .G.N.U.AN.N. .G.NV. .G.NV.I.A.O. .G.NV.I.AN.O. .G.NV.I.AN.OV. .G.NV.I.N.NV. .G.NV.I.N.O. .G.NV.N. .G.O. .G.O.I.A.A.O. .G.O.I.A.G. .G.O.I.A.N.G.O. .G.O.I.A.O. .G.O.I.O.I.AN.NV. .G.O.NV. .G.O.U.O. .G.ORV. .G.OV. .G.OV.I.A.G. .G.OV.I.A.N. .G.OV.I.ANV.O. .G.OV.U.G.OV. .G.P.S.O. .G.P.S.OV. .G.Q.N. .G.R.A.G.O. .G.U.G.NV.O. .G.U.G.O. .N.A.A.N. .N.A.A.NV. .N.A.A.O.N. .N.A.A.OV. .N.A.AN. .N.A.AN.N. .N.A.ANRV.N. .N.A.ANRV.NV. .N.A.ANV. .N.A.ANV.NV. .N.A.AR.OV. .N.A.G.I.N.G. .N.A.G.N. .N.A.N. .N.A.N.AN.N.N. .N.A.N.N. .N.A.N.N.O. .N.A.N.NV. .N.A.N.O. .N.A.N.OV. .N.A.N.U.N. .N.A.NV. .N.A.NV.AN.G. .N.A.NV.N. .N.A.NV.NV. .N.A.NV.NV.I.A.O. .N.A.NV.O. .N.A.NV.O.I.A.O. .N.A.NV.OV. .N.A.O. .N.A.O.N. .N.A.OV. .N.A.U.A.OV. .N.AG.N. .N.AG.NV. .N.AG.O. .N.AG.OV. .N.AN.A.N. .N.AN.A.N.O. .N.AN.A.O. .N.AN.A.OV. .N.AN.AN.N. .N.AN.AN.NV. .N.AN.AN.O. .N.AN.AR.NV. .N.AN.AR.OV. .N.AN.AV.N. .N.AN.G. .N.AN.G.N. .N.AN.I.O. .N.AN.N. .N.AN.N.ANV.N. .N.AN.N.I.N.I.O. .N.AN.N.I.N.O. .N.AN.N.N. .N.AN.N.N.N. .N.AN.N.NV. .N.AN.N.O. .N.AN.N.OV. .N.AN.NV. .N.AN.NV.F.AN.N. .N.AN.NV.N. .N.AN.NV.N.O. .N.AN.NV.NV. .N.AN.NV.NV.NV. .N.AN.NV.O. .N.AN.O. .N.AN.O.I.A.G. .N.AN.O.I.N.N. .N.AN.OV. .N.AN.OV.I.A.N. .N.AN.OV.U.OV. .N.ANR.O. .N.ANRV.N. .N.ANRV.N.N. .N.ANRV.N.NV. .N.ANRV.N.O. .N.ANRV.N.OV. .N.ANRV.OV. .N.ANV.A.N. .N.ANV.A.NV. .N.ANV.AN. .N.ANV.AN.O. .N.ANV.C.O. .N.ANV.G. .N.ANV.I.A.N. .N.ANV.I.A.O. .N.ANV.I.N.NV. .N.ANV.I.N.O. .N.ANV.I.OV. .N.ANV.N. .N.ANV.N.N. .N.ANV.N.NV. .N.ANV.N.O. .N.ANV.NV. .N.ANV.NV.G. .N.ANV.NV.N. .N.ANV.NV.NV. .N.ANV.NV.NV.NV.O. .N.ANV.NV.O. .N.ANV.O. .N.ANV.OV. .N.ANV.U.N.N. .N.ANV.U.N.NV. .N.AR.AN.O. .N.AR.OV.O. .N.AV.N.N. .N.B.C.O. .N.B.C.OV. .N.B.N.U.NV. .N.B.NV.U.N. .N.C.AN.NV. .N.C.N. .N.C.N.N. .N.C.N.O. .N.C.O. .N.G. .N.G.A.N. .N.G.AN.N.N.O. .N.G.ANRV.N. .N.G.ANV.OV. .N.G.I.O. .N.G.N. .N.G.N.N. .N.G.N.O. .N.G.N.P.NV.O. .N.G.NV. .N.G.NV.N. .N.G.NV.O. .N.G.O. .N.G.OV. .N.G.P.N.N. .N.G.P.S.O. .N.G.P.S.OV. .N.G.S.O. .N.G.U.A.N. .N.G.U.G. .N.G.U.N.N. .N.G.U.N.NV. .N.G.U.NV.O. .N.I.A.A.A.N. .N.I.A.A.A.O. .N.I.A.A.N. .N.I.A.A.N.N. .N.I.A.A.NV. .N.I.A.A.NV.N. .N.I.A.A.NV.NV. .N.I.A.A.O. .N.I.A.AN.AN.O. .N.I.A.AN.G. .N.I.A.AN.N. .N.I.A.AN.N.G. .N.I.A.AN.NV. .N.I.A.AN.O. .N.I.A.ANV.NV. .N.I.A.ANV.OV. .N.I.A.G.O. .N.I.A.N. .N.I.A.N.I.AN.N. .N.I.A.N.N. .N.I.A.N.NV. .N.I.A.N.O. .N.I.A.N.U.A.N. .N.I.A.N.U.AN.N. .N.I.A.N.U.N. .N.I.A.NV.G. .N.I.A.NV.N. .N.I.A.NV.N.O. .N.I.A.NV.NV. .N.I.A.NV.O. .N.I.A.O. .N.I.A.O.I.N.N. .N.I.A.O.U.N. .N.I.A.O.U.O. .N.I.A.OV. .N.I.A.OV.P.N.N. .N.I.A.OV.P.O. .N.I.A.U.A.N. .N.I.A.U.A.NV. .N.I.A.U.AN.N. .N.I.A.U.AN.NV. .N.I.A.U.AN.O. .N.I.A.U.G.O. .N.I.A.U.N.G. .N.I.A.U.N.O. .N.I.AN.A.G. .N.I.AN.A.O. .N.I.AN.AN.N. .N.I.AN.AN.O. .N.I.AN.N. .N.I.AN.N.N. .N.I.AN.N.NV. .N.I.AN.N.O. .N.I.AN.N.OV. .N.I.AN.N.U.A.N. .N.I.AN.N.U.N. .N.I.AN.NV. .N.I.AN.O. .N.I.AN.O.I.ANR.O. .N.I.AN.OV. .N.I.AN.OV.I.G.O. .N.I.AN.U.A.G. .N.I.AN.U.A.O. .N.I.AN.U.N.G. .N.I.AN.U.O.G. .N.I.ANR.A.NV. .N.I.ANR.A.O. .N.I.ANR.AN.N.NV. .N.I.ANR.N.NV. .N.I.ANR.O. .N.I.ANRV.N.O. .N.I.ANV.AN.O. .N.I.ANV.ANV.N. .N.I.ANV.I.A.N.O. .N.I.ANV.N. .N.I.ANV.NV.N. .N.I.ANV.NV.NV. .N.I.ANV.O. .N.I.ANV.O.T.O. .N.I.ANV.OV. .N.I.ANV.U.AN.O. .N.I.AR.A.O. .N.I.AR.OV.N. .N.I.AV.ANV.NV. .N.I.AV.N. .N.I.AV.NV. .N.I.AV.O. .N.I.AV.OV. .N.I.G.A.G. .N.I.G.A.O. .N.I.G.AN.NV.N. .N.I.G.N.N. .N.I.G.N.NV.U.N. .N.I.G.P.O. .N.I.N.A.G. .N.I.N.A.N. .N.I.N.A.OV. .N.I.N.AN.N. .N.I.N.AN.NV. .N.I.N.AN.O. .N.I.N.AN.OV. .N.I.N.ANRV.N. .N.I.N.ANV.N. .N.I.N.G.N. .N.I.N.G.NV. .N.I.N.G.U.A.N. .N.I.N.I.A.G. .N.I.N.I.A.O. .N.I.N.I.N.OV. .N.I.N.I.O. .N.I.N.I.OV. .N.I.N.N. .N.I.N.N.I.AN.NV. .N.I.N.N.N. .N.I.N.N.N.G. .N.I.N.N.NV. .N.I.N.N.O. .N.I.N.N.U.AN.O. .N.I.N.N.U.G. .N.I.N.N.U.N. .N.I.N.N.U.N.N. .N.I.N.N.U.O.G. .N.I.N.NV. .N.I.N.NV.N. .N.I.N.NV.P.N.N. .N.I.N.NV.U.NV. .N.I.N.NV.U.NV.N. .N.I.N.O. .N.I.N.O.P.N.O. .N.I.N.P.ANV.N.N. .N.I.N.P.N.NV.N. .N.I.N.Q.N. .N.I.N.S.N. .N.I.N.T.N. .N.I.N.T.O. .N.I.N.U.A.G. .N.I.N.U.A.N. .N.I.N.U.AN.G. .N.I.N.U.AN.N. .N.I.N.U.AN.O. .N.I.N.U.N.N. .N.I.N.U.N.O. .N.I.N.U.O.N. .N.I.NV.A.OV. .N.I.NV.AN.O. .N.I.NV.ANR.NV. .N.I.NV.C.NV. .N.I.NV.N. .N.I.NV.N.O. .N.I.NV.N.U.N. .N.I.NV.N.U.NV.N. .N.I.NV.NV.N. .N.I.NV.O. .N.I.NV.OV. .N.I.NV.U.ANV.NV. .N.I.NV.U.N. .N.I.NV.U.NV. .N.I.NV.U.NV.A.N. .N.I.O. .N.I.O.G.U.G.N. .N.I.O.I.A.O. .N.I.O.I.AN.N. .N.I.O.I.G.O. .N.I.O.I.N.N. .N.I.O.I.NV.O. .N.I.O.I.O. .N.I.O.N.U.G. .N.I.O.NV.NV. .N.I.O.T.O. .N.I.O.T.OV. .N.I.O.U.A.O. .N.I.O.U.N.N. .N.I.O.U.O. .N.I.O.U.O.OV. .N.I.OV. .N.I.OV.U.O. .N.I.R.A.N. .N.I.R.A.N.NV. .N.I.R.A.NV. .N.I.R.AN.O. .N.I.R.AN.OV. .N.I.S.A.O. .N.I.S.AN.O. .N.I.S.T.N. .N.N. .N.N.A.G. .N.N.A.N. .N.N.A.NV. .N.N.A.OV. .N.N.AN. .N.N.AN.N. .N.N.AN.N.I.A.N. .N.N.AN.NV. .N.N.ANRV.N. .N.N.ANRV.NV. .N.N.ANV. .N.N.ANV.N. .N.N.ANV.NV. .N.N.ANV.OV. .N.N.APR.G. .N.N.B.O. .N.N.C.N. .N.N.C.N.O. .N.N.C.O. .N.N.G. .N.N.G.ANV. .N.N.G.N. .N.N.G.NV. .N.N.G.O. .N.N.G.OV. .N.N.I.A.A.NV. .N.N.I.A.G. .N.N.I.A.N. .N.N.I.A.N.I.O. .N.N.I.A.N.O. .N.N.I.A.NV. .N.N.I.A.NV.N. .N.N.I.A.NV.OV. .N.N.I.A.O. .N.N.I.AN.N. .N.N.I.AN.N.N. .N.N.I.AN.N.U.N. .N.N.I.AN.NV. .N.N.I.AN.O. .N.N.I.AN.O.U.N. .N.N.I.ANRV.NV. .N.N.I.N.AN.O. .N.N.I.N.ANPR.A.O. .N.N.I.N.N. .N.N.I.N.NV. .N.N.I.N.O. .N.N.I.N.S.N. .N.N.I.N.U.N. .N.N.I.NV.AN.O. .N.N.I.NV.G.O. .N.N.I.NV.N. .N.N.I.O. .N.N.I.O.I.O. .N.N.I.O.Q.N. .N.N.I.O.U.O. .N.N.I.OV. .N.N.N. .N.N.N.ANRV.NV. .N.N.N.ANV. .N.N.N.ANV.N. .N.N.N.C. .N.N.N.G. .N.N.N.I.A.NV. .N.N.N.N. .N.N.N.N.N. .N.N.N.N.NV. .N.N.N.N.O. .N.N.N.NV. .N.N.N.O. .N.N.N.OV. .N.N.NV. .N.N.NV.N. .N.N.NV.NV. .N.N.NV.O. .N.N.NV.OV. .N.N.O. .N.N.O.A.I.N.N. .N.N.O.I.AN.AN.O. .N.N.O.I.N.N. .N.N.O.I.N.U.G. .N.N.O.N. .N.N.O.NV. .N.N.O.OV. .N.N.OV. .N.N.P.N.AN.N. .N.N.P.NV.A.NV. .N.N.S.N.O. .N.N.S.O. .N.N.T.A.N. .N.N.U.A.A.N. .N.N.U.A.A.N.N. .N.N.U.A.G. .N.N.U.A.N. .N.N.U.A.O. .N.N.U.AN.O. .N.N.U.ANV.N. .N.N.U.G. .N.N.U.N. .N.N.U.N.N. .N.N.U.N.N.N. .N.N.U.N.N.O. .N.N.U.N.O. .N.N.U.N.OV. .N.N.U.NV.N. .N.N.U.O. .N.N.U.O.G. .N.NP. .N.NRV. .N.NV. .N.NV.A.N. .N.NV.A.OV. .N.NV.AN. .N.NV.AN.N. .N.NV.ANV. .N.NV.ANV.N. .N.NV.C.N. .N.NV.G. .N.NV.G.N. .N.NV.G.O. .N.NV.I.A.N. .N.NV.I.A.NV. .N.NV.I.AN.N. .N.NV.I.AN.O. .N.NV.I.N.N. .N.NV.I.N.NV. .N.NV.I.N.S.N. .N.NV.I.N.U.AN.N. .N.NV.I.NV.U.N. .N.NV.I.O. .N.NV.I.OV. .N.NV.N. .N.NV.N.G. .N.NV.N.N. .N.NV.N.N.N. .N.NV.N.N.N.ANV.N. .N.NV.N.NV. .N.NV.N.NV.N. .N.NV.N.O. .N.NV.N.OV. .N.NV.N.U.N. .N.NV.NV. .N.NV.NV.I.O. .N.NV.NV.N. .N.NV.NV.N.N. .N.NV.NV.NV. .N.NV.NV.NV.N. .N.NV.NV.O. .N.NV.O. .N.NV.O.I.AN.AN.O. .N.NV.O.I.N.N. .N.NV.O.I.NV.OV. .N.NV.O.I.O. .N.NV.O.P.AN.O. .N.NV.O.U.O. .N.NV.OV. .N.NV.P.AN.N. .N.NV.P.G.N. .N.NV.P.N.N. .N.NV.P.NV.N. .N.NV.P.NV.NV. .N.NV.P.OV. .N.NV.P.R.O.A.NV. .N.NV.Q.N. .N.NV.S.N. .N.NV.T.N.S.N. .N.NV.U.AN.ANV.NV.N. .N.NV.U.AN.N. .N.NV.U.N.G. .N.NV.U.N.N. .N.NV.U.N.NV. .N.NV.U.NV.N. .N.NV.U.NV.NV. .N.O. .N.O.G.AN.N. .N.O.I.A.G. .N.O.I.A.N.O. .N.O.I.A.O. .N.O.I.A.O.U.G. .N.O.I.AN.AN.O. .N.O.I.AN.N.N. .N.O.I.ANV.N.N. .N.O.I.N.ANRV.N. .N.O.I.N.O. .N.O.I.NV.O. .N.O.N. .N.O.NV.N. .N.O.O. .N.O.OV. .N.O.P.A.N.O. .N.O.P.A.O. .N.O.P.N.N. .N.O.P.N.OV. .N.O.P.O. .N.O.Q.A.OV. .N.O.Q.N.O. .N.O.U.A.NV.O. .N.O.U.A.OV. .N.O.U.AN.O. .N.O.U.ANRV.O. .N.O.U.N.O. .N.O.U.N.OV. .N.O.U.NV.N. .N.O.U.O. .N.O.U.OV. .N.OV. .N.OV.I.A.N. .N.OV.I.A.O. .N.OV.I.AN.NV. .N.OV.I.ANV.N. .N.OV.I.N.N. .N.OV.I.N.NV. .N.OV.I.N.O. .N.OV.I.O. .N.OV.I.OV. .N.OV.P.AN.N. .N.OV.P.OV. .N.OV.U.A.O. .N.OV.U.ANV.OV. .N.OV.U.N.N. .N.OV.U.O. .N.P.N.NV.ANV.N. .N.P.N.NV.N.N. .N.Q.N. .N.Q.NV.NV. .N.R.N. .N.S.A.N. .N.S.AN. .N.S.AN.N. .N.S.ANV. .N.S.N. .N.S.N.ANV.O. .N.S.N.N. .N.S.N.N.N. .N.S.N.N.N.N. .N.S.N.O. .N.S.O. .N.S.O.U.N.N. .N.S.S.N. .N.S.U.N.O. .N.S.U.S.O. .N.T.A.A.NV. .N.T.A.A.NV.N. .N.T.A.G.N. .N.T.AN.A.NV. .N.T.AN.AN.O. .N.T.ANR.NV.N. .N.T.ANV.A.O. .N.T.ANV.N.NV. .N.T.ANV.N.O. .N.T.ANV.NV.N. .N.T.G.ANRV.N. .N.T.N.I.OV. .N.T.N.N.U.O. .N.T.N.NV.N. .N.T.NV.AN.A.G. .N.U.A.G.ANRV.N.NV. .N.U.A.N.O. .N.U.AN.N. .N.U.AN.NV. .N.U.ANR.NV.N. .N.U.ANRV.N.N. .N.U.ANRV.N.N.O. .N.U.ANV.AN.O. .N.U.ANV.G. .N.U.ANV.N. .N.U.ANV.O. .N.U.G. .N.U.G.N. .N.U.G.O. .N.U.G.OV. .N.U.N. .N.U.N.A.OV. .N.U.N.AN.N. .N.U.N.ANV.OV. .N.U.N.G. .N.U.N.I.A.A.NV. .N.U.N.I.A.O. .N.U.N.I.AN.O. .N.U.N.I.G.N. .N.U.N.I.N.O. .N.U.N.I.N.OV. .N.U.N.N. .N.U.N.N.N. .N.U.N.N.O. .N.U.N.N.OV. .N.U.N.NV. .N.U.N.NV.N. .N.U.N.NV.O. .N.U.N.NV.OV. .N.U.N.O. .N.U.N.OV. .N.U.N.P.ANV.N. .N.U.NV. .N.U.NV.G. .N.U.NV.N. .N.U.NV.NV. .N.U.NV.O. .N.U.NV.OV. .N.U.O.G. .N.U.O.I.A.N. .N.U.O.N. .NR.NV. .NV.A.A.N.O. .NV.A.AN.O. .NV.A.ANV. .NV.A.ANV.N. .NV.A.ANV.OV.U.OV. .NV.A.I.ANV.N. .NV.A.N. .NV.A.N.N. .NV.A.N.NV. .NV.A.N.NV.O. .NV.A.N.O. .NV.A.NV. .NV.A.NV.N. .NV.A.NV.O. .NV.A.O. .NV.A.O.U.NV.O. .NV.A.OV. .NV.AN.I.ANV.NV. .NV.AN.I.N.G. .NV.AN.I.N.NV. .NV.AN.N. .NV.AN.N.N. .NV.AN.N.NV. .NV.AN.N.OV. .NV.AN.NV. .NV.AN.O. .NV.AN.O.P.R.AN.N. .NV.AN.OV. .NV.ANR.NV.N. .NV.ANV.A.NV. .NV.ANV.ANV.NV. .NV.ANV.G. .NV.ANV.I.A.N. .NV.ANV.N. .NV.ANV.N.N. .NV.ANV.N.OV. .NV.ANV.NV. .NV.ANV.NV.N. .NV.ANV.O. .NV.AOV.U.OV. .NV.B.C.N. .NV.B.C.O. .NV.B.C.OV. .NV.B.N.O. .NV.B.N.U.N. .NV.B.NV.U.NV. .NV.B.S.O. .NV.C.A.N. .NV.C.A.N.N.N. .NV.C.A.N.O. .NV.C.A.O. .NV.C.N. .NV.C.N.N. .NV.C.N.O. .NV.C.NV. .NV.C.NV.NV. .NV.C.O. .NV.C.OV. .NV.G. .NV.G.ANV. .NV.G.I.O. .NV.G.N. .NV.G.O. .NV.G.OV. .NV.G.U.G. .NV.G.U.NV.G. .NV.G.U.O.G. .NV.I.A.A.N. .NV.I.A.A.NV. .NV.I.A.A.O. .NV.I.A.ANR.OV. .NV.I.A.G. .NV.I.A.G.U.N. .NV.I.A.N. .NV.I.A.N.I.N. .NV.I.A.N.NV. .NV.I.A.N.O. .NV.I.A.N.U.G. .NV.I.A.N.U.N. .NV.I.A.N.U.O. .NV.I.A.NV. .NV.I.A.NV.N. .NV.I.A.NV.NV. .NV.I.A.O. .NV.I.A.OPV. .NV.I.A.OV. .NV.I.A.U.A.G. .NV.I.A.U.A.N. .NV.I.A.U.A.O. .NV.I.AG.O. .NV.I.AN.A.N. .NV.I.AN.A.O. .NV.I.AN.AN.N. .NV.I.AN.AN.NV. .NV.I.AN.AN.O. .NV.I.AN.ANR.OV. .NV.I.AN.ANV.OV. .NV.I.AN.N. .NV.I.AN.N.I.N.N. .NV.I.AN.N.N. .NV.I.AN.N.N.OV. .NV.I.AN.N.U.N.O. .NV.I.AN.O. .NV.I.AN.OV. .NV.I.AN.U.A.O. .NV.I.AN.U.AV.O. .NV.I.AN.U.N.N. .NV.I.AN.U.O.G. .NV.I.ANR.N.NV. .NV.I.ANRV.U.A.G. .NV.I.ANV.O. .NV.I.ANV.OV. .NV.I.APRV.AN.N. .NV.I.AV.N. .NV.I.AV.NV. .NV.I.AV.O. .NV.I.C.AN.ANV.O. .NV.I.G.N. .NV.I.G.NV. .NV.I.G.O. .NV.I.G.OPV. .NV.I.G.OV. .NV.I.N.ANRV.N. .NV.I.N.G. .NV.I.N.I.OV.U.OV. .NV.I.N.N. .NV.I.N.N.N. .NV.I.N.N.U.O. .NV.I.N.NV. .NV.I.N.NV.NV. .NV.I.N.O. .NV.I.N.OV. .NV.I.N.S.N. .NV.I.N.U.A.N. .NV.I.N.U.AN.O. .NV.I.N.U.N.O. .NV.I.NV.G. .NV.I.NV.G.NV. .NV.I.NV.N. .NV.I.NV.N.N. .NV.I.NV.NV. .NV.I.NV.O. .NV.I.NV.OV. .NV.I.O.I.NV.A.N. .NV.I.O.N. .NV.I.O.N.U.G. .NV.I.O.NV. .NV.I.O.NV.U.AN.G. .NV.I.O.OV. .NV.I.O.U.O.OV. .NV.I.OV.N. .NV.I.OV.NV. .NV.I.R.A.O. .NV.I.S.N.OV. .NV.N. .NV.N.A.N. .NV.N.A.O. .NV.N.AN. .NV.N.AN.N. .NV.N.AN.NV. .NV.N.ANRV.O. .NV.N.ANV.N. .NV.N.B.NV.U.NV. .NV.N.G. .NV.N.G.N. .NV.N.G.NV. .NV.N.G.O. .NV.N.I.A.G. .NV.N.I.A.NV. .NV.N.I.A.O. .NV.N.I.AN.N. .NV.N.I.AN.NV. .NV.N.I.AN.O. .NV.N.I.C.OV. .NV.N.I.N.N. .NV.N.I.N.O. .NV.N.I.O. .NV.N.N. .NV.N.N.A.N. .NV.N.N.G. .NV.N.N.I.NV. .NV.N.N.N. .NV.N.N.N.NV. .NV.N.N.NV. .NV.N.N.O. .NV.N.N.OV. .NV.N.NV. .NV.N.NV.I.N. .NV.N.NV.N. .NV.N.NV.NV. .NV.N.NV.O. .NV.N.O. .NV.N.O.I.N. .NV.N.OV. .NV.N.P.A.G. .NV.N.P.A.N. .NV.N.P.AN.NV. .NV.N.P.N. .NV.N.P.N.N. .NV.N.P.O. .NV.N.S.N. .NV.N.U.A.N. .NV.N.U.AN.N. .NV.N.U.AN.O. .NV.N.U.N. .NV.N.U.N.N. .NV.N.U.N.NV. .NV.N.U.NV.N. .NV.N.U.NV.N.N. .NV.N.U.O. .NV.NRV. .NV.NV. .NV.NV.A.O. .NV.NV.A.OV. .NV.NV.AG.NV. .NV.NV.AN.AN.O. .NV.NV.AN.O. .NV.NV.AV.G. .NV.NV.AV.O. .NV.NV.B.C.O. .NV.NV.C. .NV.NV.G. .NV.NV.G.I.N. .NV.NV.G.OV. .NV.NV.I.A.O. .NV.NV.I.AN.N. .NV.NV.I.ANV.NV. .NV.NV.I.N.I.O. .NV.NV.I.N.N. .NV.NV.I.N.NV. .NV.NV.I.NV.O. .NV.NV.N. .NV.NV.N.I.A.NV. .NV.NV.N.I.A.NV.NV. .NV.NV.N.I.AN.O. .NV.NV.N.N. .NV.NV.N.N.I.ANV.N. .NV.NV.N.NV. .NV.NV.N.O. .NV.NV.N.OV. .NV.NV.NV. .NV.NV.NV.N. .NV.NV.NV.O. .NV.NV.O. .NV.NV.OV. .NV.NV.U.AV.NV. .NV.NV.U.NV.N. .NV.NV.U.NV.NV. .NV.O. .NV.O.I.A.G. .NV.O.I.A.N. .NV.O.I.A.N.G. .NV.O.I.A.N.U.G. .NV.O.I.A.NV.N. .NV.O.I.A.O. .NV.O.I.AN.A.N.G. .NV.O.I.AN.AN.O. .NV.O.I.AN.N. .NV.O.I.AN.NV. .NV.O.I.ANR.N.NV. .NV.O.I.N.N. .NV.O.I.N.NV. .NV.O.I.N.O. .NV.O.I.N.U.A.O. .NV.O.I.NV.N. .NV.O.I.NV.N.OV. .NV.O.I.NV.U.N. .NV.O.I.NV.U.N.O. .NV.O.I.O. .NV.O.P.AN.N. .NV.O.P.ANRV.G. .NV.O.P.ANRV.G.OV. .NV.O.U.A.N. .NV.O.U.A.O. .NV.O.U.N.O. .NV.O.U.NV.OV. .NV.O.U.O. .NV.O.U.OV. .NV.OV. .NV.OV.I.A.G. .NV.OV.I.A.N.O. .NV.OV.I.A.O. .NV.OV.I.AN.N. .NV.OV.I.AN.OV. .NV.OV.I.AV.A.OV. .NV.OV.I.N.NV. .NV.OV.I.N.U.N. .NV.OV.I.O. .NV.OV.U.N.OV. .NV.OV.U.NV.O. .NV.OV.U.NV.OV. .NV.Q.A.NV. .NV.Q.AN.NV. .NV.Q.ANV.N. .NV.Q.ANV.NV. .NV.Q.N. .NV.Q.N.N. .NV.S.N. .NV.S.N.O. .NV.S.O. .NV.T.A.N. .NV.T.AN.N. .NV.T.AN.NV. .NV.T.AN.O. .NV.T.ANV.A.N. .NV.T.AV.N. .NV.T.AV.O. .NV.T.N. .NV.T.N.N. .NV.T.N.NV. .NV.T.NV.NV. .NV.T.O. .NV.U.A.N. .NV.U.A.NV. .NV.U.A.O. .NV.U.AN.AN.O. .NV.U.AN.G. .NV.U.AN.N. .NV.U.AN.NV. .NV.U.AN.O. .NV.U.AN.OV. .NV.U.ANV.AN.N.N. .NV.U.ANV.N. .NV.U.ANV.NV. .NV.U.ANV.O. .NV.U.ANV.OV. .NV.U.N.G. .NV.U.N.I.N.O. .NV.U.N.I.N.OV. .NV.U.N.I.O. .NV.U.N.I.OV. .NV.U.N.N. .NV.U.N.NV. .NV.U.N.O. .NV.U.N.OV. .NV.U.NV. .NV.U.NV.G. .NV.U.NV.I.N.O. .NV.U.NV.N. .NV.U.NV.NV. .NV.U.NV.O. .NV.U.NV.OV. .NV.U.O. .NV.U.OV. .O.A.AN.N.O. .O.AN.OV. .O.ANPR.A.ANV.OV. .O.ANPR.A.OV. .O.ANPR.N.O. .O.ANPR.N.OV. .O.B.A.OV. .O.B.AN.O. .O.B.C.OV. .O.B.N.U.N. .O.G. .O.G.AN.AN.N.N. .O.G.O. .O.I.A.A.N.N. .O.I.A.A.O. .O.I.A.AN.O. .O.I.A.AN.OV. .O.I.A.AR.OV. .O.I.A.N. .O.I.A.N.NV.N. .O.I.A.N.O. .O.I.A.N.OV. .O.I.A.N.U.N. .O.I.A.N.U.O. .O.I.A.NV.N.O. .O.I.A.O. .O.I.A.O.U.O. .O.I.A.U.A.A.O. .O.I.A.U.A.N.N. .O.I.AN.AN.O. .O.I.AN.G. .O.I.AN.N. .O.I.AN.N.I.NV.G. .O.I.AN.N.I.O. .O.I.AN.N.I.O.N. .O.I.AN.N.N.NV. .O.I.AN.N.NV.O. .O.I.AN.O. .O.I.ANV.A.NV. .O.I.ANV.A.O. .O.I.ANV.AN.N. .O.I.ANV.N. .O.I.ANV.NV.A.AN.O. .O.I.ANV.O. .O.I.AR.OV.O. .O.I.AR.U.A.N. .O.I.AV.ANV.OV. .O.I.G.A.O. .O.I.G.AN.A.O. .O.I.G.N.N. .O.I.G.N.OV. .O.I.G.P.O. .O.I.N.A.N.OV. .O.I.N.A.NV. .O.I.N.AN.N. .O.I.N.G. .O.I.N.I.A.O. .O.I.N.I.ANV.NV. .O.I.N.N. .O.I.N.N.N. .O.I.N.N.N.N. .O.I.N.N.O. .O.I.N.NV.N. .O.I.N.NV.NV. .O.I.N.NV.O. .O.I.N.O. .O.I.N.OV.U.A.O. .O.I.N.S.N. .O.I.N.S.N.N. .O.I.N.S.N.N.N. .O.I.N.U.A.N. .O.I.N.U.A.O. .O.I.N.U.G. .O.I.N.U.N. .O.I.N.U.N.N. .O.I.NV.AN.O. .O.I.NV.N. .O.I.NV.N.U.NV.N. .O.I.NV.NV.O. .O.I.O.G.U.N.N. .O.I.O.I.A.O. .O.I.O.NV.U.N. .O.I.O.NV.U.N.N. .O.I.O.U.O. .O.I.O.U.OV. .O.I.R.A.OV. .O.N. .O.N.N. .O.N.N.N. .O.N.NV. .O.N.O. .O.N.U.G. .O.N.U.N. .O.N.U.N.O. .O.N.U.NV. .O.N.U.NV.N. .O.NPR.N.NV. .O.NPR.N.OV. .O.O. .O.P.A.ANR.O. .O.P.A.G. .O.P.A.N. .O.P.A.N.O. .O.P.A.N.OV. .O.P.A.NV. .O.P.A.O. .O.P.A.OV. .O.P.AN.N.OV. .O.P.AN.NV.OV. .O.P.R.AN.O. .O.P.R.AN.OV. .O.Q.A.O. .O.Q.A.OV. .O.Q.N. .O.Q.N.N.O. .O.Q.NV.S.O. .O.T.A.ANV.I.A.G. .O.T.A.O.U.N.O. .O.T.AN.AN.O. .O.U.A.O. .O.U.A.OV. .O.U.AN.O. .O.U.AN.OV. .O.U.AN.OV.I.AN.N. .O.U.ANV.O. .O.U.ANV.OV. .O.U.N.O. .O.U.N.O.I.OV. .O.U.NV.I.N.G. .O.U.O. .O.U.O.I.A.N. .O.U.O.I.ANRV.G. .O.U.O.I.N.NV.N. .O.U.OV. .ORV.N. .OV.I.A.G. .OV.I.A.N. .OV.I.A.N.G. .OV.I.A.N.G.O. .OV.I.A.N.O. .OV.I.A.NV. .OV.I.A.O. .OV.I.A.OV. .OV.I.AG.N. .OV.I.AN.G. .OV.I.AN.N. .OV.I.AN.N.A.O. .OV.I.AN.N.OV. .OV.I.AN.O. .OV.I.AN.O.I.NV.OV. .OV.I.AN.OV. .OV.I.ANR.ANV.O. .OV.I.N.N. .OV.I.N.N.U.O.G. .OV.I.N.O. .OV.I.N.OV. .OV.I.NV.I.A.A.O. .OV.I.NV.N. .OV.I.NV.NV.U.N. .OV.N. .OV.N.ANV. .OV.O. .OV.P.A.ANRV.A.N. .OV.P.A.N. .OV.P.A.O. .OV.P.A.OV. .OV.P.N.N. .OV.P.N.O. .OV.P.NV.O. .OV.Q.N. .OV.U.ANV.N.I.N.N. .OV.U.O. .OV.U.OV. .R.A.A.A.NV. .R.A.A.A.NV.NV. .R.A.A.N. .R.A.A.NV. .R.A.A.NV.NV. .R.A.A.O. .R.A.A.OV. .R.A.AN.G. .R.A.AN.N.OV. .R.A.AN.NV. .R.A.AN.O. .R.A.AN.OV. .R.A.ANV.O. .R.A.AR.OV. .R.A.AV.N. .R.A.AV.N.NV. .R.A.G.O. .R.A.I.A.OV. .R.A.I.N.O. .R.A.I.N.OV. .R.A.N. .R.A.N.A.N. .R.A.N.ANV.N. .R.A.N.N. .R.A.N.NV. .R.A.N.NV.O. .R.A.N.O. .R.A.N.OV. .R.A.NV.N. .R.A.NV.NV. .R.A.NV.NV.O. .R.A.NV.O. .R.A.NV.OV. .R.A.O. .R.A.O.I.N.OV. .R.A.U.ANRV.N.NV. .R.A.U.R.ANRV.N.NV. .R.AN.A.N. .R.AN.A.NV. .R.AN.A.O. .R.AN.A.OV. .R.AN.AN.NV. .R.AN.AN.O. .R.AN.ANV.NV. .R.AN.N.N. .R.AN.N.NV. .R.AN.N.O. .R.AN.NV.N. .R.AN.NV.OV. .R.AN.O. .R.ANRV.N.NV. .R.ANV.A.NV. .R.ANV.AN.NV. .R.ANV.ANR.OV. .R.ANV.ANV.NV. .R.ANV.N.NV. .R.N.A.A.N.NV. .R.N.N. .R.N.N.NV. .R.O.A.NV. .R.R.A.N. .R.R.A.NV. .R.R.AN.N. .S.A.N.O. .S.AN.N.N. .S.G.N. .S.G.O. .S.N.A.N. .S.N.A.N.N. .S.N.A.N.O. .S.N.A.NV. .S.N.A.NV.N. .S.N.A.NV.O. .S.N.AN.A.O. .S.N.AN.AN.O. .S.N.AN.N. .S.N.N. .S.N.N.AN.O. .S.N.N.I.AN.N.N. .S.N.N.N. .S.N.N.NV. .S.N.N.NV.N. .S.N.N.O. .S.N.NV. .S.N.NV.N. .S.N.S.O. .S.N.U.N.O. .S.U.S.AN.O. .S.U.S.N. .S.U.S.N.O. .S.U.S.O. 13 ANGR bleeding blinding blooming cracking darkling flipping freaking frigging fucking passing raving running spanking 3 ANPRV like part round 9 ANPR inside next opposite outside over ower past through underneath 1 ANPV pace 7 ANP anti ben following given mid minus vice 70 ANRV ajar back backcast bad bare bear best better big blind clean clear counter crisscross damn dead double fast feel fine flat forward free gain half heavy home jolly just last left light long manifold nought okay overnight parallel pat plain plum plumb pretty queer rear retail reverse right room sharp short slack sleek slow smooth still stone super top trim true underground upfront upstage well wholesale wild worst wrong zigzag 133 ANR accelerando accompagnato adagietto adagio addolorato agape agitato allegro almost andante anon backstage batshit beaucoup bimonthly biweekly breech bush cantabile cold contrary crazy daily deep diminuendo diviso downhill downslope downstage downstairs downtown due early east easterly eastward everloving extempore extra far faster feminine forte fortissimo fortississimo fortnightly friendly good grandioso great hard hawse here high hourly ill incog incognito inland instant late latest likely loco main midcalf midgame midmarket midstorm midweek midwinter mighty moderato monthly more most nightly nonstop north northerly northward now orderly outstation overall overhead overside postcareer precious prefeminism prior quarterly quick real saddleback sciolto several sforzando sideway small solid sooner sore south southerly southward staccato straight straightaway stretto stupid sweet tandem tenuto thick unlikely upcountry uphill upright upslope verbatim vigoroso weekly west westerly westward whole wicked wide windward witherward worse yearly 598 ANV abrupt abstract accordion ace acute addle advance affine agglomerate aggregate aggro airmail alert alien alternate antic antique ape arch arm aspirate associate astroturf audible aught autograph average azure baby backhand bald ballpark bandy base batch battle bay beat beef bent beta bigger birth black blag blank blanket blue bluff blunt bodge bogan bombast bone bootleg born boss bottom bound brag brand brave brick brief broadcast bronze brown budget buff buffer bulk bull bully bum bung burlesque bust calm camp canary cant carpetbag case cat center champion chance charcoal charter chelate chicken chill chuff clambake class close cloverleaf clutch colly color commonplace compact complex composite compound concave concrete conditionate confederate conglomerate conscript content coo coordinate copper copycat copyleft corkscrew cosy cotton counterfeit cover cozy crack crank crap crash craven cream credential crimson cripple crisp crook cross crown crump cuckoo cut damask damp dapple deadpan deal dearn debit decrescendo degenerate delipidate dern diamond dink discount disquiet divine dop dope doss downcast draft dread drunk duff dun duplex duplicate dwarf ebb elect empty epoxy equal evergreen excommunicate exempt expatriate export express extravasate fab faint fair fake fallow fancy farewell fat favorite favourite fawn fay fear feint fell fellow filk firm fit flagellate flambe flame flank flannel flash flatter fleet flip flirt flit flush fly fore foreset foster foul frail frank fraught freak freelance french fribble fringe frisk frit frolic front full fun game garden gas gilt gimp ginger goan gorge graduate grave gray grayscale greek green grey greyscale grill grit grizzle gross ground grouse grue gun gut gutter hackney hallow hash head hench het heterodyne hinder hollow hood hurt inboard incarnadine inchoate incuse initial insensate inspiral intermediate interwiki intimate invalid inverse involute iron jade jet joint keen key kit kvetch labrish lag lame land lash lateral laureate lay lead lease leather leer letterbox levant level lighter lime limit limp lit lite lobster loose low lush magic mail mainstream major manifest mank marcel market maroon mass master mean meet mellow mere metric minor mint minute miscast miscome mock model moderate monotone monster moot mordant motive motor multiplex mum murk mushroom mute neap necklace negative net neuter noncuple nucleate null number oblique occult ochre opaque open opiate orange ordinate orphan outsize overcast overweight oyster pale palsy panic pap paper pappyshow patent peach pedal pilot pimp pink pinpoint pirate plane plus pocket polish poll pony pop port precast precedent precipitate premier preorder preseed present primary prime print proctor profane prompt proof proxy puke punk purple putty quack quad quadruplicate quarter quicksilver quiet quintate quintuple quintuplicate radge rainbow rank raspberry raven rebound recce red reflex refuse remainder remote renate reprobate retrofit retrograde ripe roast rodomontade rogue romance rose rouge rough rubbish run rush sage salt sand sandwich sanguine savage scotch scratch scrimp scrub scud secret seed seesaw select separate septimate set sextate sextuplicate shallow sham shank sheen sheer shit shite shoal shot shotgun shy sick sickle signal simple single skill skimp slate slick slight slim slurry smock smoke snub snug sob sole solo sound sour spalt spanish spare spin spiral splay split sport spruce square squat stable starch steam steep sticky stiff stiletto stock stonewall stray subject sublime submarine subordinate suction sulfur sunder superordinate surrogate suspect swank swell swike swish taboo tally tarry tart tartan tender tense tensor test thin thunk tickle tin tinct tinsel token toom total tough trade traitor traunch treble trial trick trip triple truck turnkey twin twoc underline underwater underweight unfavorite upcast uplift upset upskirt upstart vassal veg verbal vintage void wallow wanton waste wax wee weed weekend weird welcome welter wet whiff wick wildcat windup wizard wont wood yellow young 5301 AN abdicant abdominal abducent abecedarian abelian aberdonian aberrant abessive abhesive abirritant abkhasian abkhaz abkhazian ablative ablauting abluent ablutophiliac abnormal abolitionist aboriginal abortifacient abortogenic abram abrasive absolute absolutist absolvent absorbent abstergent abstersive abstinent abstractionist absurd absurdist abyssinian academic acadian acanthopterygian acaricide acatalectic acataleptic accadian acceptant accessary accessorial accessory accidental accusative accused acephalan acerate acescent achaean achaian achean acheulean acheulian acid acmeist acoelomate acoustic acrocentric acrocephalic acrocoracoid acrodont acromegalic acrylic actinoid actinopterygian active actual adamant adamantium addictive additive adelaidean adelaidian adenoid adept adessive adherent adhesive adipose adjaran adjarian adjectival adjective adjoint adjunct adjunctive adjutant adjuvant administrant adnominal adolescent adoptionist adrenal adsorbent adult adulterine adventist adverbial adversative advisory aeginetan aerial aero aerosol aerospace aery aesthetic affected afferent affirmative affluent affluential affricative afghan afghani afghanistani aforementioned african afrotherian ageist agentive agglutinant aggravative agnate agnathan agnostic agoraphobic agrarian agriculturist agrin agrypnotic airborne akkadian alabaman alabamian alabaster alar alate albanian albertan albino albuminoid alcaic alcoholic alepidote aleut aleutian alexipharmic alexiteric algebroid algerian alienans aliped aliphatic aliquant aliquot aliterate alkadienyl alkaline alkenyl alkynyl allative allelochemical allopolyploid allotetraploid alluvial almond almondine alpha alpine alpinist alsatian alterable alterative alternant alternative aluredian alveolar alveolate alwite amacrine amandine amaranthine amateur amber ambient ambisexual ambulatory amenorrheic amenorrhoeic amerasian american ameriginal amerikkkan amethyst amino aminoethoxy aminoethyl aminomethoxy aminomethyl aminopropyl ammonoid amnesic amoeboid amorite amphibian amphidiploid amygdalate amygdaloid amyl amyloid anabolic anacreontic anaesthetic anal analeptic analgesic analog analogue anaphrodisiac anarchist anatolian anchal ancient ancillary andalusian andean andorran android anejo aneroid anesthetic aneuploid angevin angiosperm anglian anglican anglophone angolan anguillan angular anhedral anhidrotic animal anionic annelid anodyne anointed anorectic anorexic anorexigenic anosmic antacid antaphrodisiac antarctican antarthritic antasthmatic antecedent antediluvian antepaenultimate antepenultimate anthelmintic anthro anthropoid antiaircraft antialarmist antiallergenic antiangiogenic antiarrhythmic antiart antiarthritic antiasthmatic antiauthoritarian antibacterial antibiotic antibugging anticapitalist anticar anticatarrhal anticatholic anticestodal anticharm anticholesterol anticholinergic antichristian anticipant anticlerical anticlinal anticoagulant anticoagulation anticollectivist anticommunist anticonsumer anticonsumerist anticonvulsant anticonvulsive anticorrosive antidemocracy antidepressant antidepressive antidesiccant antidiarrheal antidiarrheic antidiarrhoeal antidiarrhoeic antidisestablishmentarian antidiuretic antidivision antiegalitarian antielitist antiemetic antiepileptic antiequalitarian antifascist antifebrile antifeedant antifeminist antifibrinolytic antifibrotic antifield antiflatulent antifolate antifungal antigalactic antigonorrhoeic antiguan antihelminthic antihemorrhagic antiherpetic antihistaminic antiholiday antihyperglycemic antihypertensive antiinfective antiknock antileukaemic antileukemic antiliberal antilibertarian antilithic antillean antiluetic antimalarial antimicrobial antimicrobic antimilitarist antimitotic antimodern antimodernist antimonarchist antimonial antimuscarinic antimycotic antinationalist antinaturalist antineoplastic antinephritic antinicotinic antinoise antinomian antinuke antiochan antiochene antiochian antioxidant antipain antiparallel antiparasitic antiphase antiphlogistic antiphonal antiphonary antipluralist antipodean antipollution antiprotozoal antipsoriatic antipsychotic antipyretic antiquarian antirachitic antiracism antiracist antirad antirepublican antiretroviral antirevolutionary antirheumatic antiromantic antirust antiscience antiscorbutic antisecretory antiseptic antisexist antisnob antispasmatic antispasmodic antispastic antistrange antisyphilitic antiterrorist antithrombotic antitranspirant antitrinitarian antitussive antiunification antiunitary antivaccinationist antivivisectionist antwerpian anxiogenic anxiolytic aorist aostan aotearoan aperient aperitive aphasic aphidian aphrodisiac apiarian apocalyptic apolitical apopemptic apostate apotreptic appellant appellative apposite appositive approbative appurtenant apricot aqua aquaholic aquamarine aquarian arab arabian arachnoid aragonese aramaean aramean araucanian arboreal arcadian archaic archconservative archer ard argent argentine argentinean argentinian arian arietian aristotelian arithmetic arizonan armchair armenian arminian armorial aromatic arsenic arsenical arterial arthritic aruban aryan arytenoid asbestos asbuilt ascendant ascendent ascetic asexual ashcan ashkenazi asian asiatic asper aspergerian asphyxiant aspic aspirant aspirational assessorial assistant assurgent assyrian asthmatic astringent asturian atacaman ataractic atheist atlantan atlantean atlantian atta attendant attic attrahent attributive atypical auburn audio augmentative augustinian aularian aulic auricular ausonian austral australian australopith australopithecine austrian austronesian auteurist authenticist authoritarian autistic autolocking automatic automatist autosexual autumn auvergnese auxiliary avar aventine aversive avian avocado awesomesauce awol awrath axillar azerbaijani azorean azorian aztec azurine babylonian bacchanal bacchanalian bacchant backer backgain backroom backstairs backstreet backup backwoods baconian badass baggy baghdadi baghdadian bahamian bahian bahraini bajan balaamite balinese ballbusting ballotechnic balzacian bamboo banana bandleading bandpass bangladeshi bangy banner bantam baptist barbadian barbarian barbudan barbudian barcelonan barcelonian barny barnyard barren barytone basal bashert bashkir bashkortostani basic basisphenoid basque bass bastard batavian batrachian batteling batty bavarian bayard bayfront bdelloid beachside bearbaiting beasting beavery behabitive behavioralist beige belarusan belarusian belgian belgradian belgravian belizean belizian bellicist belligerent bellywark beloved beltway bendy benedictine benedictive bengali beninese benthamite benzenoid benzo beotian berber bermudan bermudian berserk beryl beserk bessarabian betamimetic betrothed bhutanese biafran biannual biaryl bible bicentennial bichord bicoastal bicolour biconditional bicuspid bicyclic bielorussian biennial biflagellate bifundamental bigeminal bignose bigorexic bijou bilabial bilbaoan bilevel bilingual billable billiard billionth bimetallist bimillenary bimillennial binary binational binomial binominal biochemical biodegradable bioidentical biologic biomedical biomusical biotech bioterrorist birdy birthing bisexual bisque bissextile bistable bitter bittersweet bituminous bivariate blackleg blackpudlian blah blairite bleak blinder blinky blockbuster blond blonde bloquiste blueberry bluffer boeotian boffo bohemian boilerplate boine bolivian bolognese bolshie bolshy bombe bombproof boolean boon borax borderline bosniac bosnian bosom bostonian bostonite botanical botswanan bouffant bougie bourgeois boutique bovine bowtie bozal brabantian braced bracero brachycephalic bracteate bragger brahmin brant brash brass brassy bratislavan braunschweiger bravest bravura braxy brayon brazilian breakable breakaway breakthrough brethren bridal briefer bright brill brilliant brimstone brindle briny brittle broad broadband broadleaf broadloom broadsheet broadway brobdingnagian bronzer broody brookside broon brownite brummie bruneian brunet brunette brusselian brutalist brutalitarian brute bryozoan bubblegum bubbly buccaneering bucharestian buckshee buckskin bucolic budapestian buddhist buggy bughouse bulgarian bulimic bummer bummy bumper bunny bunodont burgeois burgundy buriat burkinabe burkinese burlywood burman burmese burnsian burrata burundian buryat buryatian bushist business bustier butch butlerian butoh butterscotch buttery butthurt bygone byronian bysen byzantine cabindan cablinasian cactus cade caenozoic caesarean caesarian caesarist caitiff cajun calabrian calefactory calgarian calico californian callable callistan callistoan calmative calmer calymmian cambodian cambrian camelback cameloid cameronite cameroonian campbellite camper camun camunian canaanite canadarian canadian canarian canberran cancerian cancroid candid canine canonical cantabrigian cantheist cantonese canuck capacity capital capitalist capitate capitulary capitulationist cappadocian capricornian captive carbenoid carbolic carboniferous carcinostatic cardholding cardinal cardio cardioid careerist caretaker carian caridoid carminative carmine carnation carnivoran carolingian carolinian carotenoid carotid carriable carryable carryon carthusian cartilaginoid cartooney castaway castilian castiron castoff castrato casual catalan catalanophile cataleptic catalonian catarrhine catastrophist catawampus cathartic cathartical catholic catoptric catty caucasian caudatan causal causative caustic cavalier cavicorn cayenne caymanian cebine celadon celestial celibate cellular celsius cenozoic centauroid centenarian centenary centigrade centralist centrist cephalochordate cepheid ceramic ceratopsian ceratopsid ceremonial cerise cerulean cerumenolytic cesarean cestode cestoid cestrian cetacean cfnm chadian chaldean chaldee chalybeate chameleon chamois champagne champaign champian chapel characteristic charismatic charnel chartreuse chattanoogan chattel chaucerian chauvinist cheapass cheapie cheapjack cheapo chechen chelicerate chelonian chemic chemical chemophobic chemopreventive chemoprophylactic chemotherapeutic cherry chestnut chewa chic chicano chickenshit chief childbearing childcaring chilean chiller chinese chinggisid chinky chipotle chipper chippy chirpy chitty chocolate choctaw choice choleretic cholesteric cholinomimetic choplogic choral chordate christadelphian christian christofascist chromo chronic chubby churchgoing churchy chuvash cidery ciliate cimmerian cincinnatian cinderblock cinemagoing cinereous cinnabar cinnamon circassian circular circumbendibus circumflex circumstantial cisuralian citrine citron citrus civilian cladoxylopsid clairvoyant clamshell claret clarion classic classified classist clathrate clatty claustrophobic cleaner cleanup clearer clerical clericalist climacteric closer closing clubgoing clumsy coalescent coalitionist cockney cocktail cocktailian cocky cocoa codependent coed coeliac coelomate coelurosaurian coequal coeval coffee cognate coherentist cohortative coinsured colic coliform collaborative collagist collateral collectable collectible collective collectivist colloid colombian colonial colonialist colonic colophonian coloratura colored colossian coloured columbian comanche combustible comedogenic comedolytic comestible comic comitative commemorative commensal commercial commie commissive committal common commoner communist communitarian commuter comoran comorian compacter comparative compatibilist completer completist component compostable comprehensive compulsive compulsory concessionary concomitant concubinary condemned conditional conductant confectionary confederationist confessional conformist confucian congolese congratulant congregationalist conic conjunct connectionist connective connexive consequent consequentialist conservative conservatory consistent consonant conspecific constabulary constant constituent constitutional constitutionalist constructionist constructivist consumable consumerist consumptive contemplative contemporary contextualist continent continental contingent continuative contraband contraceptive contradictory convalescent conventionalist conventual convergent convertible convulsant cooler cooperative cooty copenhagener coprophiliac coptic copyrightable coracoid coral coralline cordial cordovan corfiot corinthian cormorant cornflower cornish cornsilk coronal coronary corporal corporate corporatist corrective correlative correspondent corrigent corroborative corrosive corsican cosignatory cosmetic cosmopolitan cotemporary coterminal counterfactual counterfeminist counterrevolutionary counterterrorist country countrypolitan county courtesy couth covert crackajack crackerjack crackpot cracky cracovian crapola crapper creative creek creekside crematory crenate crescent cretacean cretan crickety cricoid criminal crinoid crisper crispy croat croatian cromwellian crosser crowleyan crude crummy crunk crusty cryogenian cryptic crypto cryptofascist cuban cubic cubist cuboid cubozoan cult culturist cuneiform cunning cupreous curacaoan curbside curly curmurring current cursive curtal cush custom customary cutaway cutover cutthroat cuttie cyan cyberfeminist cyberian cybertopian cyberutopian cycloid cygnine cymric cynic cyprinid cyprinoid cypriot cytoprotective cytostatic czech czechoslovak czechoslovakian dacian dactylic dadaist daffodil dagestani dahomeyan daimonic dainty dairy dalmatian damnedest damocloid damper damson dandelion dandy danish danophone danubian daredevil dark darling darnedest darwinian dastard dative daytime dba deadbeat deader deadeye deadweight deaf dear dearest decadent decanal decapod deceased decemberist decembrist decennial decillionth decimal decisionist declensionist deconstructionist deconstructivist decorative decrescent decretal decubitis decycling deductible deerskin defeatist defective defensive definitive deictic deist delawarean delectable delhian delicate delinquent deliverable delivery delphinine deltoid deltoideus democrat demographic demoniac demonstrative demotic demulcent denarian denialist denominative deodorant departed dependent depilatory deponent depositary depressant depressive derelict derivative derogatory descendant descriptive descriptivist desi desiccant designer desirable deskside desktop desmoid detergent determinable determinate determinist deterrent detraque developmental deviant devonian devotional dexter diabetic diablo diacaustic diacritic diagnostic diagonal dialup diamante diaphoretic diatomic dickensian dickey dicky dicty didacticist didactyl diehard dielectric different differential diffusionist digastric digestive digitigrade diglot dihedral dilambdodont dilatant dilettante dilly diluent diminutive dimmer dinocephalian dinosaurian dioptric diploid directional directive directoire dirigible dirigist disabled discordian discriminant disestablishmentarian disinfectant disney dispensationalist disphenoid disposable dissentient dissident dissociative dissolvent distaff disyllabic diterpenoid dithyrambic diuretic diurnal docent docetist doctrinaire documentary dodecyl doeskin doggerel doggy dolichocephalic dolichoderine dolomite domestic domiciliary dominant dominican doner doomsday doper doppio dorian doughnut downbeat downgoing downline downstyle dozenal drab dreadful drier drinkable dropdown dropside drudgey drudgy druggy drukpa druze dryer drystone dual dualist ducky duffer dumbshit dundonian duodecillionth duodecimal duoplural duotrigintillionth durable durative dusky dutch dynamic dyslectic dyslexic dyspeptic dyspraxic dysthymic eager earnest earthian earthican eatable ebon ebony ecbolic eccentric ecclesiastic eclectic eclecticist economy ecru ecstatic ectasian ecuadorean ecuadorian ecumenist ecumenopolitan edentate ediacaran edible editorial edmontonian educational effluent egalitarian eggshell egocentric egressive egyptian eighteenth eighth eightieth ejectile elapid elastic elder elected elective electric electrical elegiac elemental eleutheromaniac elevenish eleventh eligible eliminativist elite elitist ellipsoid elliptical embonpoint embryoid emerald emergency emergent emeritus emetic emirati emo emollient emphatic empiric emplastic empyrean emulgent emunctory enantiornithine enate endemic endocrine endohedral enemy english engrailed enlightened enlisted ensuite entire enzootic eoarchean eobiotic eocene ephemeral ephesian epic epical epicene epicurean epidemic epidural epileptic epinician epipaleolithic episcopal episcopalian epispastic epizootic equalitarian equative equestrian equilateral equine equinoctial equipotential equivalent equivalve equivocal erasmian erewhonian ergative eristic eritrean erratic errhine ersatz ersatzist erse eruptive escapist escharotic esculent eskimo eskimoan esperantist essential essentialist essive estonian etesian ethical ethiopian ethmoid ethnic ethnobotanical ethoxy etruscan euboean eugeroic euphoriant euploid eurasian europan european eurosceptic euroskeptic eutectic eutectoid eutherian eutrophic eutychian evangelical eventualist everliving everyday evidentialist evil ewe excess excitant exclusionist exclusive executable executive exercitive exessive exhibitionist exhortative existentialist exoduster exotic expansionist expat expedient expendable experient expert expletive explosive exponential expressionist expressivist exquisite exterior externalist extinguishant extractive extracurricular extraterrestrial extremaduran extremal extreme extremist extrusive fabian facial fader fae faeroese fairyland fairytale faithful fakie fallback fallen falsificationist familiar family fanatic fancier fantom farmaceutical faroese fascist fashionable fastigiate fattist fatty faultfinding fauvist fav fave febricitant febrifacient fed federal federalist federation feldspathoid feline female feminist feminoid fencible feodatory feral ferroelectric festival fetid feudalist feudatory fictionalist fiducial fiduciary fifteenth fifth fiftieth fijian filipina filipino fils final finest finnic firstborn firstling fiscal fisheye fishy fissiped fitter fixative flamboyant flamingo flammable flatbed flatiron flatscreen flavian fledgling flexible flexitarian flimsy flippy floaty flocculent floppy floral florentine floridian fluid fluorescent fluoroaromatic flyaway flyspeck focusing foldout foldover folk folkie fond footlong forgotten formal formalist formative former formosan forprofit fortean forthgoing forthputting fortieth fouler foursquare fourteenth fourth fracking fractal fractile fractional franciscan francophile francophone franker franquist freebooting freer freezable fremd frequentative frequenter fresh fresher freshling freshwater freudian fricative frisian friulian frizzy froggy frontal frontier frontline frontpage fuchsia fucoid fuegian fugitive fuller functional fundamental funeral fungoid funicular funny furongian furrier furry futilitarian future futurist gabonese gagauz gainsboro gala galenical galician galilean gallant galliform gallophone galwegian gambian gamboge gamer gamine gammy gamomaniac gandharan gangsta ganymedean garnet gascon gastrokinetic gaudy gay gayer gazillionth geminian genderqueer general generic genethliac genevan genital genitive genoan gentile gentilic geodesic geordie georgian geranium gergovian geriatric german germane germanophone germinant geru getaway gewgaw ghanaian ghanan ghetto ghosty giant gibberish gibraltarian giganto gimcrack ginge girlie girly glagolitic glaswegian glenoid global globalist globoid globular glomalean glossy glottal glutton gneissoid gnostic gobby goblinoid goidelic gold goldenrod gombeen gooder goofball googlish googly googolplexth googolth goony gorgon gorgonian gossamer goth gothic gourmet govvy gradable gradual graecian graminoid grand granny grape graphic graver grecian grecophone greeny greige gridelin grizzly grotesque groundbreaking grownup guadalupian guadeloupean guadeloupian guamanian guatemalan guerrilla guilty guinean gules gummy gurkha guttural guyanese gymnic gypsy habiline hadean haggard hagueite hairline hairpin hairshirt haitian hakka halcyon haler halfpenny halfwidth haligonian hallucinogenic hamate hamiltonian hamitic hammy handheld handwaving hangdog hanoian hanoverian haplodiploid haploid hardback hardball hardcore hardcover harder hardline harlequin hartlepudlian hatstand hawaiian hawt hayekian haywire hazel hbd headful hearing heartbreaking heartcut hearthside heathen heather heathery heavyweight hebrean hebrephrenic hebrew hebridean hegemonist helicoid heliotrope hellenic hellenophile hellion helminthic helsinkian helvetian hematic hematinic hemichordate hemipteran hemiterpenoid hendecasyllabic henna hepatic hepatotoxicant heptapeptide herbal hereditarian hereditary hermaphrodite herzegovinian hesperian hessian heteroaromatic heteroclite heteroclitic heterocyclic heterodont heterometal heteropod heterosexual heterospecific hetty heuristic hexactine hexadecimal hexaploid hexapod hibernian hibernophile hickory hieratic hieroglyphic highbrow highland highpass himalayan hind hindoo hindu hip hippie hippy hircine hirundine hispanian hispanic hispano hissy historicist hitlerite hittite hoar hobartian hobohemian hoisanese hokie holo holocene homarine homebrewed homeful homespun homey hominid homo homophile homosexual honduran honey honeydew honorific hookup hooky hopeful horary horizontal horrible horsey horsy hortative hortatory hostile hotshot household houseless human humanist humanitarian humanoid humbler humean humeian humian humpy hundredth hungarian hunky hurrian husky hyaline hybrid hydro hydrocholeretic hydroid hylic hymeneal hymenopteran hymnal hyoid hyperborean hyperepidemic hypergeometric hyperreal hypertensive hypnotic hypnotizable hypochondriac hypocoristic hypodermic hypoglycemic hypomanic hypothecary hypothenar hypothetical hyracoid hysteric hysteroid iambic iberian icebox ichthyoid ickle ideal identical identikit idumean idyllic ignostic iguanian ilk illative illegal illinoisan illiterate ilocano ilokano immeasurable immigrant immortal immovable immune immunoabsorbent immunological immunosuppressant immunosuppressive immunotherapeutic immutable impaired imparisyllabic imped imperative imperfect imperfective imperforate imperial imperialist implex implosive imponderable imponent impossible impromptu inanimate inaugural inbred incandescent incendiary inchoactive incident incidental incipient incombustible incoming incommensurable incompetent incomplete incorrigible incumbent incurable independent indeterminant indexical indian indicative indigent indigo indiscernible indispensable individual indolic indonesian indubitable industrial indwelling inebriant inedible inegalitarian inequivalve inert inessential inessive inevitable infective inferentialist inferior infinitesimal infinitive inflatable influent influential infralittoral infrared ingrate ingressive ingush inhalant initiative injectable injectible inner innocent inorganic insectoid insomniac inspissant instakill institutionalist instructional instructive instrumental insured insurgent inswing intangible integral integrant intellectual intended intensive intensivist intent interarrival intercity intercostal interdune interester interglacial interhalogen interim interior interlayer interlinear interlocutory intermediary intermeshing intermetallic intermonsoon intermorph internalist international internationalist interphase interrogative interrogatory intersex intersexual intershell interstadial interstate interstitial intervarsity intervenient intestine intoxicant intramural intrant intrastate intravenous intrusive intuitive invariant invasionist invasive invective invertebrate invincible inviso invitational invitatory inworking ionian iqalungmiut irani iranian iraqi irish ironclad irony irrational irreconcilable irredentist irreducible irregular irresponsible irritant islamist islamite islamofascist isolationist isometric isopycnic isostatic isothermal israeli istrian italian italic italophone ithacan itinerant ivoirian ivorian ivory jackanape jackleg jacksonian jacobean jacobian jacquard jain jakartan jake jamaican jamerican jammy jannock jansenist jap japanese japonica jaspe jasperoid javanese jazeraint jean jeffersonian jerkwater jerky jerusalemite jesuit jibberish jihadi jihadist jimcrack jingoist jordanian jovian judaean judahite judaica judicatory judicial jugal jugoslavian jugular jumbo jungian junior junky jussive juvenal juvenile kabulese kaki kalmyk kalua kamboh kamboj kamchatkan kampuchean kantean kantian kareli karelian kashmiri katangese katzenjammer kazakh kazakhstani keener kenyan keresan keynesian khaki khurrite kia kiasu kiddie kiddy kidskin kievan killer kin kind kindred kiribatian kitsch kittitian kittsian kiwi kneejerk knockabout knockdown knockout known koepanger korean kosovan kosovar krunk kurdistani kutcha kuwaiti kyivan kymric kyrgyz lab labial labiate labradorian labyrinthodont lacedaemonian lacedemonian lacertilian lachrymatory lacteal lactoovovegetarian lactovegetarian lacunar laestrygonian laggard lagrangian laic lakefront lakeside lamarckian lamed lamellicorn lameo lamer languedoc lao laodicean laotian lapidarian lapidary laplacian lapp lapsarian lardy largemouth larghetto larghissimo laryngeal lastborn latchkey latex latin latino latitudinarian latvian laurentian lavaliere lavender lax laxative laxer lazarist leavening lebanese led leet leftist leftmost leftover leftpondian legacy legal legion legionary legislative lego lemnian lemon lemurian lemuroid leninist lenitive lenticular leonian lepetodrilid lepidopteran lesbian lesbigay lesser lesvonian lethal leveler leviathan levirate lewesian liberal liberian libertarian liberticide libertine libran librul libyan lied liege lieutenant lifesaving lightning lightweight ligurian lilac liliopsid lilliputian lily limey limper lingual lipoid lippy liquid lisboner lissamphibian literal literate lithuanian litoral littoral liveaboard livelong liver liverpudlian livornian ljubljanan llandovery lobstery local localist locative lockean locomotive loden logaoedic logistic londonian lonesome longhair longicorn longsuffering looksist loony lopingian louisianan louisianian lovat lovely lowbrow lowdown lowercase lowpass loxodont lucinid lumbering lumbricine luminal lumpsum lunate lunatic lupine lusatian lusk lusophone lutheran luxembourgian luxury lycian lydian lymphatic lyric maastrichtian macaronic macedonian machiavellian macho macro macrorealist madagascan madagascarian madcap madder madecassee madeiran madrilenian madrileno maduran magdeburgian magenta magistral maglev magnesian magnolia magnoliopsid maharashtrian maiden maigre mainstage makeshift malabarian malachite maladroit malagan malagasy malaitan malaprop malawian malay malayali malayan malaysian malcontent maldivian male malfeasant malglico malian mallorcan mallorquin malted maltese mammaliaform mammalian mammary mammillary mammoth manchu manchurian mancunian mandarin mandibulate mangaian mangalorean manhattanite manichaean manichaeist manichean manichee manila maniot manipulative manitoban mannerist mansard mantinean mantuan manual manuscript manx manzonian maoist maori mapuche marcionite marcosian marginal mariachi mariavite marinara marine marist marlovian marquesan married marshallese marsupial martian martinican martiniquais martiniquan marxist mascarene masculinist masculist maslin masovian massy masticatory mastoid masurian material matey matrimonial matrist matronymic matte mattoid maurician mauritanian mauritian mauve maverick maxi maxillary maximal maximalist maximum maxonian maxwellian mayan mazandarani mazanderani mazarine mccarthyite meagre measurable meccan medean medial median medical medician medieval medinan medium medusoid megadollar megalopolitan megapixel megapod megapode megapolitan megarian megrelian melancholic melancholy melburnian melic meliorist melon melungeon memorial memphite mende mendicant menial mensan mentalist mercantilist mercenary mercurial mercurian meridian meridional meristemoid meristic meseraic meshuggener mesocephalic mesolithic mesopotamian mesoscale mestee metacarpal metacentric metallic metalorganic metamict metamorphic metaphysic metapodial metatarsal metatherian metazoan methodist metonymic metropolitan mexica mexican mezzanine mezzobrow michigander mick mickle micro microcephalic microelectronic microlaser microphase microsurgery midair midconcert middle middlebrow midi midland midlife midmeal midrise midroll midseason midship midsong midsummer midtempo midterm mignon mignonette migrant mild militant militarian military millenarian millennial millikelvin millionth milquetoast mimantean mimetic mimsy minaean mineral miniature minimalist minion minoan minorcan minuscule miscellanist mischiefmaking miscreant misere misocapnist misotheist mississippian missy miwokan mixoploid miz miztec mnemonic mobile moccasin mocha mockney modal modern modernist modified molar molariform moldavian moldovan moldovian molossian monacan monastic monegasque monetarist moneymaking mongolian monitory mono monoaromatic monochrome monoclonal monocular monofractal monogenic monoglot monomaniac monomial monophysite monoploid monosyllabic monoterpenoid monotreme monrovian montanan montane montenegrin montessorian montserratian moony moped moral moravian mordovian mordvinian moribund mormon moroccan mortal mortuary mosaic moslem motel motley mountainslope mountaintop mousseux mouthbreathing movable moveable mozambican mucolytic mudejar mulberry multialgorithm multicable multicast multicellular multichine multicomplex multiculturalist multicuspid multidisciplinarian multiduplex multienzyme multiethnic multifamily multiferroic multiform multifractal multilateralist multimedia multinational multinomial multipath multiplane multiplay multiple multiplicative multiport multiquark multiracial multiring multiskyrmion multistorey multistory multistreaming multitheist multiton multitouch multituberculate multivalve multivariate multivitamin mumbaikar mumsy mundane municipal murcian muscatian muscid muscovian muscovite musculotropic museumgoing musical muslim mustard mutant mutton mutual myanmarese mycenaean mydriatic myelosuppressive myopic myriad mystic nabatean nacroleptic nahua naif naija namibian nanofluid nanophase nanoscale nappy narcoleptic narcotic narnian narrative narrower nasal nassuvian nasty naticoid national nationalist native natriuretic natufian natural nauruan navarran navarrese navicular navy nazarene nazi neanderthal neapolitan neat nebraskan necessitarian negotiable negro negroid nelly nematic neocolonialist neofascist neoliberal neon neopagan neopythagorean neorealist neosocialist neoteric neotraditionalist nepalese nepali nephritic neptunian nerdcore nescient nestorian netherlandish neurochemical neuroleptic neuroprotectant neurotic neutral neutralist neutrophil newborn newcome newfie newlywed newsgathering newsmaking newsy newtonian ngoni nibbly nicaraguan nicosian nietzschean nigerian nigerien niggard nihilarian nil nilotic nimby nineteenth ninetieth ninth nippy nisibene nitrenoid nitro nitroaromatic nitroaryl nitrous niuean noachian noble noetic noggen noir noisette nominal nominative nonacademic nonacid nonadolescent nonadult nonaffected nonafrican nonagenarian nonagreement nonalcohol nonalcoholic nonanesthetic nonanimal nonantique nonanxiety nonaromatic nonassociation nonasthmatic nonbank nonbelligerent nonbilaterian nonbiodegradable nonbisexual nonblack nonblonde nonbusiness noncancellation noncaring nonce nonceramic noncharismatic nonchemical nonclass noncognate noncola noncompete noncomplying noncompound nonconformist noncountry noncrime noncriminal noncrystal nondaily nondance nondepressive nondescript nondesigner nondiabetic nondiscipline nondissident nondrama nondrug nondurable nondyslexic nonedible noneffective nonegalitarian nonelitist nonemergency nonemployment nonepileptic nonequal nonequalitarian nonequestrian nonessential nonevangelical nonevergreen nonevidence nonexecutive nonexempt nonextremist nonfamily nonfeature nonfeeling nonfeline nonfemale nonfiring nonflammable nonfriable nonfugitive nongame nongay nongoal nongroup nonheterosexual nonhistone nonhomosexual nonhorse nonhuman nonhybrid nonillionth nonindigent nonindividual noninjury noninnocent noninteger nonintellectual noninterview noninvestment nonjuvenile nonkilling nonlabial nonlending nonlesbian nonliberal nonlibertarian nonlife nonlistening nonliterate nonlocal nonmale nonmarried nonmarxist nonmilitant nonmineral nonminor nonmixing nonmonetarist nonmortal nonmusical nonmutant nonmystic nonnarcotic nonnative nonnegotiable nonneurotic nonnovel nonobjective nonobservable nonofficial nonpagan nonparanoid nonparticipant nonpartisan nonparty nonpathology nonperennial nonperishable nonphobic nonpolicy nonpollen nonpolynomial nonprimitive nonprofessional nonprofit nonproperty nonprotectionist nonprotein nonpsychic nonpsychotic nonradical nonreading nonrecognition nonrecombinant nonrecyclable nonrelationship nonrelative nonrenewable nonreporting nonrepublic nonresident nonresistor nonretirement nonreturnable nonrevisionist nonrevolutionary nonrival nonroyal nonroyalty nonruminant nonscalar nonschizophrenic nonschool nonsecret nonsectarian nonsedative nonsenior nonserial nonsolvent nonspecialist nonsquare nonstandard nonstaple nonstate nonstative nonstudent nonsuicide nonsurvival nonsympathizer nonsystem nontangible nontargeting nontaxation nonterminal nonthinking nontime nontranssexual nontrinitarian nonunity nonuniversity nonvariant nonvirus nonvisionary nonvitamin nonwar nonwestern nonwhite nonwoven nonzero nordic normal norman normotensive northeast northwest norwegian nostalgic notable noteworthy notoungulate novgorodian novocastrian nth nubile nuchal nude nudist nueir nullifidian numidian nuptial nutbar nutrient nutzoid nuyorican nymphomaniac nymphomanic oak oatmeal objective objectivist oblate oblatum oblomovist oblong obround obscurant obscurer observable obsessive obsidian obverse obviative occidental occipital occlusive occurrent oceanfront oceanian oceanview ocker octal octic octillionth octogenarian octonary octoploid octuple ocular oddball odontalgic odorant oecumenical oecumenist ofay offbeat offensive official offside okinawan old ole olive omani omnibus omnilingual omnitheist omphaloskeptic oncoming oneirocritic onyx ooid oolitic oorie opaline operant operative operculate ophidian opioid oppidan optative optic optimum oral orangey orchid ordinal ordinary ordophone oregonian organic organobromine organochlorine organofluorine organohalogen organoid organoiodine organomercurial organometallic organonitrogen organosilicon oriental original ormolu ornamental orthorexic orthotic osakan oscan osloite ossete ossetian ossetic osteoid ostian ostrobothnian otalgic ottawan ottoman oulipian outboard outer outland outpatient ouvrierist oval overage overharvesting overweening ovibovine oviedan ovine ovoid oxblood oxfordian oxyacetylene oxytocic oxytone pachycaul padanian paedo paedophiliac pagan pahari painstaking paintery paisley paki pakistani palaeoconservative palaeographical palaeolithic palamite palatal palatinate palatine palauan paleocene paleoconservative paleolithic palestinian palliative pally palmate palmetto pamplonan panamanian pandeist pandemic panjabi pannonian pansexual pansy pantheist pantywaist paperback paphian papionine papish pappy paprika papuan paquebot para parabolic paracelsian parachordal paraguayan paralympian paralysant paralytic paramilitary paranoiac paranoid paranuchal paraphilic paraplegic paraprofessional parasitic parasomniac parastatal parasympatholytic parasympathomimetic parathyroid paratyphoid parental parenthetical parietal parisian parmesan parol parotid paroxytone parthian partial participial particular particulate partisan partitive parvenu pascha passe passerine passional passionate passive pastafarian pastoral pasty patagonian patavine paternalist patient patientive patina patrician patronymic paulian pavonine pawnee payable peaker pearly pectinate pectoral pedestrian pedigree pedophiliac pedosexual peekaboo peerie pejorative pelasgian pendent penetrant penitent penitentiary pennsylvanian pensionary pentadecimal pentecostal pentecostalist pentimal penultimate pequiste perciform percipient peregrine perennial perfecter perfective performant performative period periodical peripatetic peripheral perishable periwinkle perlative permanent permeant peronist perpendicular perrisodactyl perse persian personal perspective perthian peruvian petrochemical petunia pewter phanariot phantom pharmaceutical phasianid phenolic philipino philippian philistine phobic phocine phoenician phonetic phoney phony phosphorescent photorealist phrygian phthisic physical phytochemical phytopharmaceutical piano picard picaresque pichileminian picky pictorial pictorialist piedmont piezoelectric piggy pincer pinchbeck pindaric pineal pinky pinniped pinto piscean pisiform pissant pitcairner pitmatic pituitary placeable placental placoid plaid plainclothes planer plantigrade plastic plathelminth platinoid platinum platy playboy player plebeian plebian plenary plenipotentiary plosive plumiped plumper pluperfect plural plush plutonian pluvial pneumatic pneumoniac pococurante poddy pogonophoran pohnpeian poikilotherm pointillist pokey poky polemic polemical political polonaise poltroon poly polyacoustic polyacrylic polyaromatic polybromide polychloride polychord polycyclic polycystid polycystine polyester polyfluoro polyglot polymorphonuclear polymorphonucleate polynemid polynemoid polynesian polynoid polynomial polyodont polypharmaceutical polyphenolic polypiarian polyplacophoran polyplacophore polyploid polypod polyschematist polyseme polysilicon polysomic polysyllabic polytechnic polytene polyterpenoid polyunsaturate polyzoan polyzoic pomeranian pommie pommy pomosexual pompeian pompeiian ponent pontifical pooer poopie poopy poor poppy populist populous porky porn pornograph portable portmanteau portside portuguese posho positive possessive possible postadolescent postcanine postcapillary postcommunist posterior postern postfeminist postgame postgrad postgraduate posthuman postimpressionist postintegration postmodernist postnoun postop postpositive postseason postsectarian poststructuralist potager potential potty povvo pracademic practical praetorian praguian prasine prat preacclimation preadolescent preadult preantepenultimate prebendary precancer precapitalist precative precipitant precision precognitive preconscious prediabetic prediagnosis predicable predicant predicative predominant preferred preflight pregame prehuman prehypertensive preinflation prekindergarten prelim preliminary preliterate premarket premium preop prepollent prepositional prepositive preppy preprofessional preraphaelite prerequisite prerogative presbyterian preschool prescription prescriptivist preservative presphenoid prestart prestimulation prestudy preteen preterite preterm pretrial pretrigger preventative preventive previous primatal primigravid primitive primitivist primo primrose principal priority private privative privy proabort probiotic problematic procathedral procedural processional processionary procoagulant prodigal profaner professional proficient profligate prog prognostic progressive prohibitive proinflammatory projectile proletarian promethean prompter propaedeutic propagandist proparoxytone propellant propellent properispomenon prophylactic prosimian prosthetic prostyle prosumer protectionist protective proteid proteinomimetic protoctist protoctistan protohominid protohuman protostomian prototherian protozoan protreptic proturan proverbial provincial provisional provocative proximate prussian pseudo pseudocoelomate pseudoprime pseudovirgin psittacine psittacosaurid psychedelic psychic psycho psychoneurotic psychostimulant psychotic psychotomimetic psychotropic ptarmic pteropine pteropod pteropodine public puce pueblan puebloan pulmonate punjabi punky purebred purgative purgatoric purist puritan purpure pushbutton pussy pygmalion pygmoid pygmy pyramidal pyrectic pyro pyroelectric pyromantic pyrotic pyrrhic qallunaaq qatari quadragenarian quadral quadrate quadratic quadratojugal quadrilateral quadriliteral quadrillionth quadringentenary quadrinomial quadrumane quadruplex qualitative quality quant quantifiable quantum quartan quartic quartodeciman quasquicentennial querulent quickset quieter quiltmaking quinarian quinate quincentenary quinoid quinquagenarian quinquennial quintic quintillionth quorate quotidian racegoing racist rad radial radiant radical radiochemical radioprotective raelian raglan rah random randy rangoonese ranid rapid rapier rash rasher rastafarian rational ratshit rattletrap reactionary reactionist readymade realis reassortant recalcitrant receivable rechargeable reciprocal recitative recluse recombinant reconcilable reconstructivist recreant rectosigmoid recumbent recusant recyclable redeye redistributable reductionist reductivist redwood reentrant reflexive reformatory reformist refractory reginan regional regionalist regular regulation reichian rejectionist relative reliabilist reliable relict religious remarried remiped remulakian renaissance renewable rental renunciant renunciate repellant repellent replicant reprehensible representative reproductive reptilian republican requisite resale reseda resident residentiary residual resistant resolvent responsorial restorative resultant retardant retinal retinoid retributivist retro retrospective returnable reunionese revanchist reverend reversionary revisionist revivalist revolutionary rexist rhaetian rhenish rheumatic rhinestone rhodesian rhodian rhomboid ribald ricegrowing ridgeside rigan righteous rightmost rightpondian riojan ristretto ritual riverside roadside roan roborant robosexual rococo rollercoaster romaean roman romanian romantic rookie rosicrucian rosy rotary rote rothbardian roughspun roumanian roundabout rounder roundhead rousseauian routine rowdy royal ruby ruddy ruderal rulemaking rum rumdum ruminant rundown rung runtime ruritanian russet russian russki russophone rustic rusyn rwandan rwandese sabaean sabbatian sabbatical sabean sabellian sable sacramentarian sacroiliac saddamist safe saffron sagittarian sahrawi salesian salient salientian saline sallow salmon salmonid salmonoid saltwater saluretic salutatory salvadoran salvadorean salvadorian salvationist salvatorian samaritan samian sammarinese samoan samogitian sandbelt sandgrounder sandy sanitarian sapphire sapphirine saragossan sarajevan sarcoid sardinian sarmentose sartrean sasanian sasanid sassanian sassanid satin saturnian saucier saudi saurian saurischian savonian savory sawney sawtooth saxonian scabious scalar scandinavian scant scaphoid scapular scapulocoracoid scarlet scenic schematic schemey schemie schismatic schizoid schizophasic schizophreniac schizophrenic schizosexual scholastic schooly scombrid scopophiliac scoptophiliac scorpion scorpionate scouse screwball screwtop scurvy scythian seafaring seashell seaside secessionist secondary sectarian sectional sedative seedling segovian segregant selenodont selenoid selenomethionyl seljuk seljuq seltzer semelfactive semese semiautomatic semicentennial semiclassic semidocumentary semifluid semiliquid semipro semiprofessional semivegetarian senegalese senior sensationalist sensitive sentient seoulite separatist sepia sepiolid septic septillionth septothecal septuagenarian sequent serb serbian serbophile sere serene serial serialist seriatum serotine serpentine serpentry servian sesamoid sesquicentennial sesquipedalian sesquiquadrate sesquiterpenoid sessional sesterterpenoid settleable seventh seventieth sevillan sevillian sexagenarian sexagenary sexagesimal sexcentenary sexennial sexist sextile sextillionth sextuple seychellois shakedown shakespearean shan shanghainese shanty shareholding sharper shavian sheeny sheepy shiite shimerian shitfuck shithouse shitter shoddy shojo shorter shortfin shorthorn shortie shortwave siamese siberian sibilant siboglinid sicanian sich sicilian sienese sienna sigmoid signature signified sikh silent silesian silly silver simian similar simoniac simplex sindhi singalong singaporean singsong singular singulative sinhalese sinophone sinusoid siren sirian situationist sixth sixtieth skinnerian skinny skookum skopjan slappy slapstickery sleepy slicker slimmer slinky slipover slovak slovene slovenian slower smartass smectic smiley smoggy smoothbore smoother snell snotnose social socialist socinian sociopathic sofian softcover sogdian solipsist solitaire solitary solute solvent somali somatroph somesuch somnifacient somnolytic sooky sophomore soporific sorrel sorry sortal sounder sourdine sourdough southeast souther southwest sovereign soviet spacefaring spagiric sparky sparoid spastic speccy special specialist specieist speciesist speciest specific specky spectacular spectralist spendthrift spenserian sphenoid spheroidal sphingid spiffy spinny spinoidal spinozist spiritual spiritualist splitist splitsville splittist spoony spotty spouting springfieldian squaloid squiggly stainless stakhanovite stale stalinist stalwart stammel standard standout standover starfucking starvation static statist statistic steamboating stereo sterling stern sternocleidomastoid sternutative sternutatory stiddy stigmatic stimulant stirrup stockholmer stoic stopgap storybook stour stout straightedge straighter stranger straussian straw strawberry streetcorner strikebreaking strippy structuralist stubby stuckist stunod stupefacient sturdy styptic suave subadult subaltern subarctic subconscious subfilter subfossil subfusc subgrid subharmonic subhuman subjectivist subjunctive subliterate submachine submersible submissive submonolayer subprime subregional subsalt subsidiary substantive subsurface subteen subtonic subtropical subversive subwavelength succulent sudanese sudorific sudovian suede suffragan suicidal sulky sulphoaluminate sumatran sumerian summary sundry sunflower sunrise sunshine superciliary superconservative superficial superfluid supergene superheavy superheavyweight superhuman superinvariant superior superlative superluxury supermajor supermax supernatant supernatural supernumerary superplastic superpremium superrich supersessionist superspecial superspeed superstar supertall superwide supine supplemental suppliant supplicant supralittoral supramembrane suprasegmental suprematist surform surinamese surplus surrealist susceptible suspensory suzerain swati swift swiss syllabic sylvan symbiotic sympathizer sympatholytic sympathomimetic synchromesh synthetic syphilitic syracusan syriac syrian syrphian syrphid tabanid tabby tabletop tabloid tactic tadzhik tagalog tahitian taishanese taiwanese tajik tajikistani takeaway takeout tallinner tanganyikan tangent tangerine tangible tanzanian taoist tardigrade tardy tarentine tarragonan tarrier tarsal tartessian tasmanian tatarian tatterdemalion tattletale tatty taupe taurean taurine tawny taxable tchaikovskian teak teal technic technical technicolor technosexual technoutopian tectiform teenage teiid teleost telephoto telltale tellurian temporal temporary tench tenderer tennessean tenochca tenochcan tenor tentative tenth tephritid teratogenic teratoid tercentenary termagant terminal terminative ternary terpsichorean terracotta terran terrestrial territorial terrorist tertian tertiary tetanuran tetradecimal tetraplicate tetraploid tetrapod tetraterpenoid teucrian textbook textile thai thatcherite theatregoing theatrical theban thematic theocratical therian thermal thermoplastic thespian thessalian thessalonian thessalonican thinner thirteenth thirtieth thirtysomething thomist thoroughbred thousandth thumby thyasirid tibetan ticky tidier timewasting timonian timonist tinclad tinhorn tipulid tiranan titanian titian titular tocharian tocolytic togolese toisanese tokelauan tomfool tongan tonian tonic topaz topgallant topiary topical topside torontarian torontonian tort tortoiseshell tory totalitarian toxicant toxophilite traditionary traducian transactinide transcaucasian transdermal transformist transgender transgenic transhuman transient transitionist transjordanian translative transmembrane transnational transnistrian transorbital transpondian transsexual transvaalian transversal transylvanian trendy tribal tribrid tributary tricenarian tricentennial tricolor tricolpate tricorn tricuspid tridentine triennial trifluvian trifluvien trifluvienne triggery trilingual triliteral trillionth trimillennial trimmer trimonthly trimotor trinary trine trinidadian trinomial triplex tripolitanian triquetral trisexual triskaidekaphobic tristate trisyllabic trite triterpenoid triumphalist trochoid troglophile trojan tropic tropical truant trumpery trunk trusty tsarist tubby tudor tufty tumbleweed tungusic tunicate tunisian turbellarian turbinal turbinate turkmen turkoman turkophone turquoise tusky tutelar tutelary tutorial tuvaluan tuvan twentieth twilight twissell twisty twp tyrolean ubersexual udmurt udmurtian ugandan uggo ugly ukie ukrainian ulster ultimate ultra ultraconservative ultracrepidarian ultrafundamentalist ultraliberal ultralight ultramarine ultramontane ultranationalist ultraportable ultrarevolutionary ultrashort ultraviolet umber umbilical umbrian unaccusative unaffected unary uncial unciform unconscious unconventional uncopyrightable uncountable undead undecided undecillionth undefeatable underage underarm undercover undergraduate underinsured underprivileged undersigned understage undesirable unemployed unergative unfamiliar unforgiven unfortunate ungulate unicellular unicity unicursal unicuspid unificationist uniform uniformitarian uniglot uninjured uninsured unionist unit unitarian unitary univalve univariate universal universalist universist univocalic unknowable unknown unlockable unloved unmarried unpredictable unprintable unpronounceable unquantifiable unreachable unsalable unthrift untouchable ununderstanding unwearable upbeat upland upline uplink upper uppercase upstyle uranian urartean urartian urticant uruguayan usanian usonian usp usufructuary uterotonic utile utilitarian utmost utopian uttermost uzbek valedictory valencian valetudinarian vallecular valuable vandal vanilla vanuatuan variable variant varietal varioloid varsovian vasopressor vasorelaxant vast vaunting vegan vegetable vegetarian veggie veggo vegliot vegliote velar velopharyngeal vendible venetian venezuelan venitive venizelist venti venusian verbile verdictive vermeil vermifuge vermilion vermillion vernacular versant vert vertebrate vertical vesicant vesicatory vesicomyid vespid vestal vestiary veteran veterinary vetitive vicenarian victorian viennese vietnamese vigintillionth vincentian vinyl violet virago viral virgate virgin virginal virgoan virid viridian virostatic virtual virtuoso visayan visionary visitant visual vitalist vitreous viverrine vivid vocable vocal vocative volitive voluntary vomitive vomitory vorticist votive voyeurist vulcanoid vulnerary wabbit wack wackadoo wacko wagnerian walachian wallachian walloon walnut wantaway ware warmer warsovian washingtonian watercolor waterside wayside weakling wealthy wearable weeny welterweight wesleyan wessexian western westphalian wetter whacko wheat wheaten whirlwind whist white whitewall whitsun whity whovian wiccan widescreen wight wikipedian windian windowfront windy winky wireless wittgensteinian wobbly wollof wolof woodland woodwind woody wool woolen wooly wordsworthian workaholic workday worsted worthy wounded woven wraparound wrath wrinkly writ wussy wykehamist wyomingite xanthian xaverian xenobiotic xenophobic xerophytic xian xiphioid xiphosuran yachty yeller yemeni yeniseian yerevanian yew yiddish yogi yogist youngling yugoslav yugoslavian yuwaaliyaay zagrebian zairean zalambdodont zambezian zambian zamoran zanzibari zapodid zapotec zapotecan zaragozan zarathustrian zebrine zebroid zen zetetic zilch zillionth zimbabwean zionist ziphioid zoantharian zoophytic zoroastrian zulu zuni zwinglian zygenid zygodactyl zygodactyle 1 AORV inbounds 11 AOV bats butters dis fish gis honors lies loads nuts pants singles 20 AO bananas billions crackers divers emerita gangbusters insurgents inuit jokes langers lds mates millions nongames postgames presales quebecois scots taters trillions 3 AGP concerning pending wanting 3 AGR according effing sidling 467 AG abiding aborning abounding absorbing accepting accommodating accusing aching addicting adjoining admiring adoring affecting affixing agonizing alarming alternating amazing amusing anastomosing annoying antisymmetrizing appalling appealing appetising appetizing appreciating approaching approving astonishing astounding attacking backstabbing baffling balding barnstorming bathing beaming begrudging bellying betting bewildering bitching blazing blinking blistering blithering bordering borning bouncing brachiating bridging bristling budding bursting busting calculating caring challenging charming chilling chording chuffing chugging circulating classifying cliffhanging clinching cloying coaxing coevolving collimating comforting competing compromising condescending conducing confiding conflicting conforming confusing confuzzling conniving consenting conserving consuming contracting contrasting controlling converging convincing coordinating copropagating corking corotating corroborating counterflowing countermoving coying cricketing crippling damaging damning daunting deafening dealkylating dearomatizing debilitating debranching decalcifying dechlorinating declogging decohering deglycosylating degrading dehydrogenating delimiting demanding demeaning demoralising demoralizing departing deprecating depreciating depressing despairing desynchronizing deubiquitylating devastating developing disappointing disbelieving discerning discomposing discouraging discriminating disgusting disheartening disparaging dispiriting displeasing disquieting disspiriting distinguishing distorting distressing disturbing dividing dizzying doddering domineering doting drifting drywalling dwindling edifying effecting electrifying emerging enchanting encircling encouraging encroaching endearing engaging engrossing enravishing ensuing entertaining enticing entrancing ethylating exacting exasperating exciting exhausting exhilarating expecting expiring explaining extenuating exulting fascinating fearing feminising feminizing fetching firming flaking flaming flaunting fleeting floating flustering flying fooking forbearing forbidding forboding forgiving freeping frightening frustrating fulfilling fulminating fuming fuzzifying galling gaping glancing glaring glittering glouting grasping gripping gushing halting harrowing heartening hectoring honeymooning horrifying humiliating immunizing impending imposing incapacitating incriminating incurving inducing infuriating ingratiating ingressing inspiring inspiriting insulting interacting interconverting interlocking interpenetrating interplaying intimidating intoxicating intriguing invigorating inviting iodinating ionising ionizing irritating isomerizing jumping kissing kleptoparasiting knowing lancinating languishing lateralizing latrating lippening lubricating luteinizing maddening marauding masing mating mattifying menacing metabolizing metering methylating misconceiving misdeeming misfunctioning misleading missing mitigating mortifying motivating mutating myelinating mystifying nagging necrotizing neighboring neighbouring nictitating nitrating nodulating normalizing nucleating obliging offstanding operating opposing opsonizing optimizing orientating oscillating osculating overarching overmastering overpowering overtopping overwhelming owing oxidising parching patronizing penetrating perishing perplexing petrifying phosphorylating photodisintegrating photosensitising photosensitizing piddling piffling pinching pitching plodding polarizing polluting polymerizing practicing prancing preceding presiding prevailing projecting punishing raging raking ravishing reacidifying rearomatizing reassuring reciprocating reclining recurring reducing reeking reigning relaxing rending repeating reproving restricting retaining retiring retrotransposing revealing rewarding ridiculing ripping riveting roaring rocking rollicking rotating rousing roving saddening scandalizing scathing scheming scintillating scorching screaming sensitising sensitizing shining shocking shrinking sickening silylating sinuating skinning slamming slavering slighting slimming sloping slumbering sobering sodding soothing sopping sparing sparkling sparsifying spiffing sporting sporulating sprawling staggering startling stifling stimulating stinging stinking stomping stonking stooping striking stunning submarining succeeding sweltering syllabificating tantalizing taunting taxing tempting terminating terrifying threatening thrilling thundering tickling titillating tolerizing tottering touching touring towering trailing transactivating trending trimethylating troubling trying unbending unclinging underperforming undreaming undulating unifying unowning unpausing unrecognizing unruffling unsanctifying unsettling unspeaking unthinking upgoing upstanding vacillating vernalizing vibrating virializing vulgarising wading waking wasting watching wavering welcoming whacking whopping winning withering witting worrying zigzagging 1 APRV near 10 APR abeam after apropos around doon forby inbetween less nearhand regardless 2 APV absent granted 6 AP aged gone imbetween nearer nearest sans 18 ARV bloody darn direct dirty durn even further headlong live mad offshore onshore outright piggyback plump slambang stark unlike 468 AR ablaze ablush abox adoze adrift agog aground akimbo alfresco alike alone aloof aloud alow anticlockwise antisunward aplenty archwise asea askance askant askew aslant aslope asquat asquint astern atilt away awful awry backward backwards badly bally bannerlike barefoot barefooted barehanded bareheaded barelegged batlike behindhand behovely bidaily bigtime bihourly billionfold birdlike biyearly blasted blimming blueward bluewards bluggy bodily boustrophedon bowled breadthwise brotherly bulllike bytewise careerlong castewise chainwise checkerwise chequerwise chickenlike chiefly chockablock chordwise christianly churchwide circumambient cityward classwide cleanly clockward clockwise coastward coastwise communitywide communitywise consarned continentwide contraclockwise counterclockwise courtside cowardly crabwise crosswise cuckoldly cussed dadgum damned darned daylong deadly dearer deathly deathward departmentwide devilish districtwide diverse doglike doubtless dovelike downcanyon downdip downmarket downrange downriver downstream downtempo downward ducklike earlier earliest earthside earthward eastbound eastwardly eath eeny eighteenfold eightfold eightyfold elevenfold else endly enough enuf equatorward ever exgratia fanwise farmward farther farthest featly fele fewfold fiberwise fifteenfold fiftyfold filmwise fing fireward fivefold fleetwide foremost forestward fortyfold fourfold fourteenfold freckly fricking froglike frontward frontwards fuguelike furst gainwise gardenless geet gentlemanly gert ghastly gingerly goalward godward goldang goldurn googolfold gradely gratis graveward grazioso grimly groundly headfirst heah heavenward heightwise hella helluv higgledypiggledy hillward homeward horsely hourwise hundredfold incommunicado infinityfold innerly inshore inward kindly kingly kitchenward knightly laggardly lakeward lateish later least leftward leisurely lengthways lengthwise lento liever listwise little lizardlike longer longest lordlier lordliest lordly loud lowly lubberly mair maist manward manyfold marketwide masterly matronly midfloor midmatch midmovie midround midscene midsequence midsession midtour midverse mightly millionfold mondayish monkeylike moonward motherfucking mouselike much museumwide nearby negatory nextdoor nice niggardly nightlong ninefold ninetyfold none northbound northeastward northeastwards northwesterly northwestward northwestwards oceanward oceanwards octillionfold offhand offline offscreen offstage onboard online only onsite onstage onward orful orse otherwise outward overarm overboard overhand overhanded oversea overseas pagewise pairwise parallelwise parcelwise piecemeal planetside planetward planetwide plotwise ploughwise poleward polewards pondward poolside poorly pooty postconception postinfection postprison postsurgery princely pure pursuant quadrillionfold queenly quicksmart quintillionfold randomwise rascally rathe ratlike rearward rearwards recitational redward redwards reet reight rife rightward ringwise riverward rotten sabbathly scarce schoolward schoolwise seaward secondhand seemly selfly semimonthly sentencewise septillionfold sevenfold seventeenfold seventyfold severalfold sextillionfold sharpish shoreward sideling sidelong sideward sidewards sideways sisterly sitewide sixfold sixteenfold sixtyfold slantwise slapdash sly smartish smegging snuggly societywide sometime somewheres soon soonest soothfast southbound southeasterly southeastward southeastwards southernly southwesterly southwestward southwestwards spiralwise spokewise sprightly spritely squarewise squirrellike stairwise starward stately stateside stepwise sternward stewardly stilly storewide straightforward streetward stripewise stripwise strong subjectwise sudden sunward superfast surlier surliest swanlike swith tandemwise teethly tenfold theretoward thicker thickest thirdhand thirteenfold thirtyfold thousandfold threefold tight together tolerable toothly townward trebly trillionfold truthward twentyfold twofold uber uncleanly uncomely underfoot underhand unmanly unobserved upbound upmarket uppermost upstairs upstate upstream uptempo upwind utg valleyward vanward very virginly wallward warpwise weakly weasellike weekdaily weftwise westbound westwardly whilom widthways widthwise wis wordwise worldly worldwide yearlong yeomanlike yeomanly yon yond yonder 418 AV abbreviate abdicated abrase absolutised absolutized accelerate accrete accumulate acerbate acuate acuminate adapt adulterate aestivated affectionate agglutinate alienate alight alphabetised alphabetized amind anastomose angulate animate apocopate apply appropriate approximate arched articulate asperate attenuate attrite auspicate averse awake awakened backlit bankrupt based bearproof beheld bespoke bifurcate blear blither bold brachiate brazen broke built bulletproof busy caughten cellulate characterised chid childproof clung combated combatted combust complete complicate concorporate congenerate conglobate congregate consummate convolute cool copresent copywritten correct corrival corrupt creaseproof crocked cruel cumulate customised cyber dampproof dang deadstick deafferent decerebrate decussate defunct deliberate depauperate designate desolate diffuse dilatate dilute dim dimidiate disaggregate disbound discalceate disincarnate disjoint disproportionate disproven dizzy downscale draughtproof dressed dry dull dumb edged effuse elaborate elate elongate emancipate emasculate enervate engraft eradiate erect exact exalt excarnate federate fireproof flabaghast flameproof flemish floodproof flung foliate fordone foretold fornicate founded foveate freezeproof frequent frustrate fucken fuckin fungiproof fungusproof furcate futureproof geminate gentle glad got greaseproof groomed gyrate hamstrung handfast handsome harsh heatproof hilited homodyne hot humble hung hypercorrect idealised idealized idle imbricate importunate inable inbound incarnate incurvate indurate infirm ingeminate inlaid inline innate inorder installed integrated interoffice interplant intricate invected irradiate italianate kidnaped kittle knowed kosher laced laevigate lank lapped lavish lean learnt legitimate loike lost louche lower macgyvered maculate mainline maledict malign mastered mature medaled mediate meek misset misspent mizzled moistureproof monodisperse monospace mopy mosied mothproof mozy muddy multipartition myelinate narrow nested newfashion numb numerate nutmegged obligate obnubilate obscure obsolete offski olden outdate outen overbuilt overshot overwater overwound own paired palpate patinate pent peregrinate perfect perforate perspirate pert petrified photowritten plicate plim plowed polarized pollicate pollinate pollute porrect predominate predose predy prepaid prepense preset pressed pressurised prim proportionate prorupt prostrate punctulate pustulate quadruple quits radiate radicate rainproof raisinate rare ready reanimate rebrobate redial reduplicate reekin reiterate remarked remediate reparate replete repressed restruck restrung reticulate revolute rewrought rid roleplayed rotproof rounded rustproof said satiate savvy scandalised scrubbed scuff secure sedate segregate septuple sequestrate seriate serrate shiten shockproof shod shrill sinuate situate skew skim slayed smart snowproof sober sodden solubilised soundproof spatulate spent spilt spoilt sprung stank staunch steady stipulate striate strode strongarm stuck sulphured supple supreme suss swart tame taughten terminate tidy tore transcendent trifurcate truncate twilit typeset typewrote ulcerate unbent unbid unbound uncloaked underly undershot undersold understood undry undulate unfit unground unknotted unlaid unlatched unlearnt unmade unright unsaddled unsaid unset unsteady unwad upscale used utter variegate variolate vermiculate vesiculate wainscoted warm waterproof weary weatherproof wedged welsh went widdle wilder windproof winterproof wise withheld wizen wrought wry xxx yar zhoosh 16685 A aad aalenian abaxile abbevillian abbreviatory abderian abdominocardiac abeyant abgeschmackt abhorrent abhorrible abient abitibian abject abjecter abjectest abjuratory ableist abler ablest ablow ablutionary aboil abolitionary abominationly aboveboard abovedeck aboveground abovesaid abranchiate abrim abristle abrupter abruptest abs absinthian absolut absoluter absolutest absolutory absolvatory absonant absorbifacient absorpt abstersory abstractest abstruse abstruser abstrusest absurder absurdest abubble abundant abustle abuzz acalephoid acalycine acalymmate acanthine acardiac acarine acaroid acaudate acaulescent acauline acaulose acceleratory accendible accessible accipitrine acclamatory accordant accrescent accretionary accumbent accurate accurst accusatory acerata acerb acerber acerbest acerose acervate acervose acervuline acetabuliform acetose achelate achier achiest achillean achlamydate achordate achy aciculate aciculiform acidfree acidproof acidy aciform acinaciform acinetiform aciniform acinose acipenserine acquiescent acquisitory acrawl acrid acrider acridest acro acrocephaline acromiocoracoid acropolitan acrostichoid actorish actorly actressy aculeate aculeiform aculeolate acuminose acuter acutest acutifoliate adamantanoid adamantean adamantine adamesque adangle addible adding additionary additory adducent adducible adeciduate adeniform adenomatoid adenose adepescent adequate adherently adjacent adjudicatory adjuratory admissible admonitory adnate adorabubble adorant adrip adroit adroiter adroitest adsorbant adstringent adulatory aduncate adust advenient adventuresome adverse adverser adversest adversifoliate advertent advisatory advocatory aefauld aegean aeolian aeonian aerian aerier aeriest aeriform aerose aeschylean aesculapian aesopian aetat afebrile afire aflame aflutter aforegoing aforesaid aforethought afraid afrikaans afrindian afroth aftercoming afterfest aftermost afterschool afterseen aftershow aftersun aftertax afterwise aftmost agast agaze agelong aggerose aggri aggry aghast agile agiler agilest aglare agleam aglimmer aglint aglitter aglow agro aguish aidant ailurophiliac aimworthy ainu airblown airbreathing airier airiest airish airmobile airproof airsick airside airtight airwise airworthier airworthiest airworthy airy akan akin alary alaskan alaudine albescent albigensian albinoid alcalescent aldine aleatory alete alexandrian algherese algid algoid algonquian alible alienesque aliform alimentary alkalescent alkaliproof alkalizate alkylmercury allantoid allegiant alleviatory allocrine alloimmune allover almighty almondy alonest alongshore alopecoid alosid alpen alphabetiform alreet alright altarwise alternifoliate althusserian altmanesque aluminian amanitoid amateurish amatory amazonian ambery ambident ambisense ambisinister ambulant ameban amebean amebiform ameboid amendatory amensh amethystine amish amiss amissing ammino ammonian amoeban amoebean amort ampery amphiprostyle ample amplectant ampler amplest amplexicaul amplexiform ampulliform amygdaliform anabranching anacolpate anadromus analept anaphylactoid anaporate anatine anatreme anaxagorean ancienter ancientest anconad andamanese anellarioid angiocarpian angioid angrier angriest angry angstier angstiest angsty anguiform anguilliform anguine anguinine angulaperturate angustifoliate angustimurate anile animalish animesque animose aniseedy anjouan annamese annectant annelidan annulate annunciatory anny anoda anomotreme anopheline anorakish anorchid anovulatory anseriform anserine antaircraft antebellum antefebrile antegrade antelucan antemeridian antemortem antemundane antennary antenniform antepartum anterior anterograde anteroposterior anthelmint antiabortion antiabuse antiacne antiaddiction antiadministration antiadvertising antiageing antiaggregant antiaggregatory antiaging antiair antiairport antialcohol antialgae antialien antiallergy antiambush antiamnesty antianaemia antianemia antianxiety antiapartheid antiapoptosis antiaristocracy antiarmor antiarmour antiarthritis antiasthma antiauteurist antiauthority antiavian antiavoidance antibacklash antiban antibanking antibattery antibeauty antibias antibillboard antiblack antiblast antibleeding antiblue antibonus antiboss antibound antibourgeois antiboycott antibranding antibribery antibritish antibrowning antibudget antibug antibullfighting antibullying antibundling antibureaucracy antiburglary antibusiness antibusing antibussing anticaking anticancer anticandida anticarcinoma anticardiolipin anticaries anticasino anticaste anticavity anticelebrity anticelibacy anticellulite anticensorship antichange antichav antichild antichinese antichip antichoice antichromatin antichurch anticigarette anticipatory anticircumcision anticircus anticity anticling anticloning anticlot anticlotting anticlutter anticoalition anticold anticollege anticollision anticollusion anticommerce anticommission anticommuting anticomputer anticonquest anticontagion anticontra anticopying anticopyright anticorporate anticorrosion anticorruption anticough anticrack anticrash anticrime anticrisis anticruelty anticult anticure antidamping antidandruff antidarkening antidazzle antidebt antideer antidefamation antidefendant antideficit antidepression antidesertification antidetonation antidevelopment antidiabetes antidiarrhea antidiarrhoea antidictatorship antidilution antidisco antidiscrimination antidisestablishment antidoctor antidog antidoping antidraft antidrilling antidrink antidrinking antidrought antidrug antidrugs antidumping antiearthquake antieducation antielite antiepilepsy antiespionage antiestablishment antievolution antiexpansion antiexploitation antiexport antiexpressionist antiextremist antifactory antifade antifamily antifarm antifarmer antifarming antifat antifatigue antifemale antifeminine antifertility antifever antifighting antifilibuster antifish antifishing antiflea antiflicker antiflood antiflooding antiflu antifluoridation antifluoride antifoaming antifog antifogging antifood antifootball antiforeclosure antiforeign antiforeigner antiformalist antifoul antifouling antifraud antifriction antifrost antifungus antifur antigag antigambling antigaming antigang antigangster antigay antigender antigenocide antigiardiasis antigirl antiglare antiglaucoma antiglobalism antigogglin antigoglin antigold antigovernment antigraffiti antigraft antigreen antigrowth antiguerrilla antigun antigypsy antihacker antihacking antihalation antihandgun antihanging antiharassment antihate antiheadache antihelicopter antihelminth antihepatoma antiherbivore antiherpes antiherpesvirus antihierarchy antihighway antihijack antihijacking antihippie antiholdup antihorse antihuman antihumanist antihunting antiimmigrant antiimmigration antiimport antiincinerator antiindependence antiinfection antiinflammation antiinflammatory antiinsect antiintrusion antiitch antijam antijamming antijapanese antijewish antijunta antikick antikickback antikidnap antikidnapping antiklan antilabor antilatent antilaundering antileak antileakage antilearning antileft antileishmania antileprosy antilife antiliteracy antiliterate antilitter antilittering antilock antilogging antiloitering antilopine antilove antilynching antimachine antimacho antimajoritarian antimalaria antimale antimalware antimammalian antiman antimanagement antimanufacturing antimargarine antimarijuana antimarket antimarriage antimarxism antimasturbation antimeat antimedicalization antimedicine antimen antimercenary antimerger antimetastasis antimicrotubule antimigraine antimilitant antimilitary antimilk antimine antimissile antimisting antimonatian antimoney antimonian antimonoan antimonogamy antimonopoly antimosquito antimotility antimouse antimurder antimuseum antimyeloma antinarcotics antinausea antinegro antinematode antinepotism antineutrophil antinucleating antinudity antiobesity antiobscenity antioccupation antioppression antioquenian antioxygen antipaedophile antipaparazzi antiparasite antipatent antipatico antipatronage antipeace antipeddling antipedophile antipeople antiperformance antipersistent antipersonnel antipest antipesticide antipet antiphishing antipig antipigeon antipilling antipiracy antipirate antiplague antiplaintiff antiplane antiplaque antiplatelet antipleasure antipoaching antipoisoning antipolice antipoor antipop antiporn antipornography antipot antipoverty antipredator antipregnancy antipress antiprevention antiprivacy antiprofiteering antiprogress antiprostitution antiprotectionist antiprotest antiprotestant antipsoriasis antipsychiatry antipsychology antiquake antiqueen antiqueer antiquest antiquey antirabbit antirabies antiracing antiracketeering antiradio antirail antirailroad antirailway antirally antirape antirat antirecession antirecoil antirecycling antireferendum antireflection antireform antiregulatory antirejection antirelaxation antireligion antiresearch antiresonant antiretaliation antireunification antirich antiriot antiripening antiroad antirobbery antirobot antirock antirocket antiroll antirotating antirussian antirusting antisag antisagging antisalt antisanctions antisarcoma antisatellite antiscalping antischolarship antischool antiscuff antisecession antisecrecy antisegregation antiseizure antisex antisexism antishake antishark antiship antishock antishoplifting antishopping antisink antisiphon antiskid antislave antislavery antisleep antislip antislippage antismog antismoke antismoking antismuggler antismuggling antismut antisodomy antisoil antisoiling antisoviet antispam antispamming antispanking antispasticity antispatter antispeculation antispending antisphexish antispill antispoilage antispoof antispoofing antisport antisprawl antispyware antistab antistate antistatus antisteroid antistick antistigma antistimulus antistress antistrike antistudent antisub antisubmarine antisubsidy antisubversion antisuicide antisupermarket antisurface antisurfing antisurgery antisurveillance antisway antitakeover antitamper antitampering antitank antitarnish antitax antitaxation antitechnology antitelevision antiterror antitesting antitetanus antithalian antitheft antitherapy antithyroid antitipping antitobacco antitoll antitorque antitorture antitotalitarian antitracking antitrafficking antitrain antitransglutaminase antitrend antitrespass antitruancy antitrust antituberculosis antitumor antitumour antityphoid antiulcer antiunion antiuniversity antiurban antivaccination antivaccine antivampire antivandalism antivegetarian antivibration antivice antivictim antiviolence antivivisection antiwarfare antiwaste antiwelfare antiwhaling antiwhite antiwildlife antiwoman antiwomen antiwork antiwrinkle antiyellow antiyellowing antiyuppie antizoo antoecian antonine antproof antrorse antsier antsiest antsy antwacky anty anucleate aok apennine aperturate apeshit aphrodisian apian apicomplexan apiculate apish apo apocrine apollonian apophian aporose appalachian apparent appeasatory appellate appendant appendiculate appetible appley applicatory appreciatory apprehensible approbatory apricotty apricoty aprilly apt apter aptest aquabis aquiform aquiline aquinian aquiver aracanese arachnoidian arakanese araneiform arawak arbit arbitrary arborescent arboriform arc arcane archaean archconservatism archdiocesan archest archimedean arciform arcuate ardent arean areawide arenose areolate argentian argentophil argmax argmin argute arid arider aridest arielian ariose arisen aristate aristophanean arizen armillarioid armillary armlong arnamagnaean arrabbiata arrant arranter arrantest arretine arrogant arrowy arsenatian arsenian arsenitian arsenoan arsey artemidean artemisian artesian artgoing arthropodan arthropodean arthurian articulatory artier artiest artinian artsier artsiest artsy arty arylating asbestiform ascient asconoid asectarian aseptate asetate ashake ashen ashier ashiest ashine ashmolean ashy asimovian asinine askey asleep asnarl asperulate aspiny aspiratory asprawl assamese assident assimilatory assinine assonant asterid asterostromelloid astir astronomicodiluvian astute astuter astutest aswarm atacamenan aterian athabascan athabaskan athenian athetoid athirst atingle atomate atrabilarian atremble attery atticky attitudey attry atumble atwinkle atwitter atwoodian audenesque audient audile auditory augaean augean augustan auguster augustest augusty aukstaitian aulate auntlier auntliest aureate aurian auriculate auriform auriphrygiate auscultatory aussie austenesque austere austerer austerest australasian australoid authorly autocrine autoethnography autofluorescent autofluorescing autohidden autoigniting autoimmune autoinhibitory autoploid autopolyploid autoregulatory autumny avellane aveniform avernian avertible avesta avestan avid avogadrian avoidant awanting aware awarer awarest awash aweary aweigh awesome awesomer awesomest awestricken awestruck awfulest awfuller awfullest awheel awhirl awkward awkwarder awkwardest awkweird awny awoken awsome axile axillary azatricyclo azeotroping azerty azo azooxanthellate aztecan azurn babelish babish baboonish babyish babylonish babyproof baccate bacciform bacillary bacilliary bacilliform backassward backasswards backbitten backbreaking backest backflowing backmost backreacting backslidden backstabby backstair backswept backwaterish backwood backwoodsy bacony bacterioid baculiform badder baddest baddish badoglian baggier baggiest baion bairnly bakgat bakhtinian balder baldest baldish balinesian balkan balkier balkiest balky ballardian balletgoing balloony ballsier ballsiest ballsy balmier balmiest balmy balsamy bammy banaler banalest bananery bandsawn bandstop bangier bangiest bangsian bankerish bankerly banksian banty banzai barbary barbellate bareboat barebones barebow barehand barer barest barfy barian barkier barkiest barky barmier barmiest barmy barocline baroque baroquey barrener barrenest barside basalmost baseborn baser basest bashy basinwide basipterygoid bassackward bassackwards bassalian bassy bastarding bastardly bataillean batavophone batesian bathukolpian bathykolpian batrachomyomachian battier battiest battish battlesome battleworthy baudelairean baudelairian baulkier baulkiest baulky bawdier bawdiest bawdy bayesian bayside bbc beachbound beachcast beachfront beachier beachiest beachy beadier beadiest beady beakier beakiest beaky beamier beamiest beamish beamy beardier beardiest beardy bearish bearly beastish beastlier beastliest beastly beatemest beaten beatlesque beatley beautifulest beautifullest beckettian beclad bedbound bedfast bedrel bedridden bedroomy bedworthy beechen beechier beechiest beefcakey beefier beefiest beefish beefy beeg beeproof beerbohmian beerier beeriest beerish beery beethovenian beetrooty beey befallen beggarlier beggarliest beggarly begone begotten begun behad behemothian beholden behung beigy belain belchy belieffulness beliven bellairsian bellicose belluine belonoid belorussian beloving belowground beluine bendier bendiest bendsome benedictory beneficent benign benignant benigner benignest benzylating beowulfian berberophone beresque bergamask bergmanian bernankean bernese berryish berylline berzelian beseen besetten bespoken bestest bestolen bestrewn bestridden bestselling besung betaken betjemanesque betjemanian betther bewitching bewritten biauriculate biblethumping bibovine bicarinate bicaudate bichrome biciliate bicolligate bicomponent biconcave biconjugate biconvex bicornuate bicrenate bicyclo bidden bidentate bidisperse bifid bifold bifoliate bifoliolate biforate biform bifront bigender bigfin biggest biggish biggity bigleaf bigleague bihamiltonian bijugate bilabiate bilateran bilgier bilgiest bilgy biliary bilinguis billowier billowiest billowy bilobate biloculine bimaculate bimboesque bindaas bindup binetian binucleate bioaccessible bioaccumulatory bioaffluent biocompatible biodeficient biodiverse biofriendly bioinert bioluminescent bioregulatory bioremediating biosensory bipalmate biparting bipartisan bipartite bipeltate bipennate bipenniform bipinnate bipotent biquinary biradiate biradicaloid biraphid birchen birdish birdly birdproof birdseye birefringent birostrate birotate bisaryl biscuity biscutate bisectarian biserrate bismarckian bismuthatian bismuthian bismuthoan bisonant bisontine bistate bistratose bisulcate bitchen bitchier bitchiest bitchin bitchinest bitchy biternate bitey bitier bitiest bitsy bitten bitterer bitterest bitterish bittier bittiest bitty bitwise biuncinate biunique bivariant bivittate bivoltine bizarre bizarrer bizarrest bizarro blabbier blabbiest blabby blacker blackest blackish blacklip blahdy blameworthy blancmangey bland blander blandest blandiloquent blanker blankest blankety blase blastproof blastworthy blatant blate blavatskian blavatskyan bleaker bleakest blearier bleariest bleary bleaty blebby blechy bleen bleepier bleepiest bleepy bleh blesseder blessedest bliddy blimpish blindest blingier blingiest blingy blippy blistery blithe blithesome blithest blizzarding blobbier blobbiest blobby blockbustery blockier blockiest blockish blocklong blockwise blockworthy blocky bloggy blogish blokeish blokey blonder blondest blondish bloodcurdling bloodier bloodiest bloodshot bloodsucking bloodthirstier bloodthirstiest bloodthirsty bloomier bloomiest bloomy blossomest blossomy blotchier blotchiest blotchy blottesque blottier blottiest blotto blotty blousier blousiest blousy blowier blowiest blown blownup blowsier blowsiest blowsy blowy blowzier blowziest blowzy blubbery bluechip bluegrassy blueish bluer bluesier bluesiest bluest bluesy bluetail bluewater bluey bluffest bluish blunter bluntest blurrier blurriest blurry blushy blustery blytonesque blytonian bobbly boccaccian bodleian bodywide bodyworn boggier boggiest bogglesome boggy bogus bohmian boingy bok bolder boldest bolognian bolshier bolshiest boltzmannian bombycine bonafide boncer bonedry boney boneyer boneyest bonier boniest bonkbusting bonkers bonnie bonnier bonniest bonny bonser bony bonza bonzer boobish boofier boofiest boofy bookier bookiest bookish bookishly bookly booksy bookwormish bookwormy booky boomier boomiest boomy boorish boosterish boostglide boozier booziest boozy boppier boppiest boppish boppy boratian boratoan boresome borgesian borgian borian borky borne bornean boroughwide boskier boskiest bosky bosomy bossier bossiest bossy bostin botchier botchiest bothersome botticellian bottomfeeding bottommost bottomy bottony botuliform bouffanty bouldery boulle bouncier bounciest bouncy bounden bounderish bourgie boutiquey bowbent bowery boxier boxiest boxy boyish boysy brachyuran brackish bracteolate bracteose braggest braggier braggiest braggy bragworthy braille braindead brainier brainiest brainy braky bramblier brambliest brambly branchiate branchier branchiest branchy brasher brashest brashier brashiest brassier brassiest brattier brattiest brattish bratty braver brawlier brawliest brawnier brawniest brawny breaden breadier breadiest bready breakbulk breakneck breakproof breaky breasty breathier breathiest breathtaking breathy brechtian breechloading breezier breeziest breezy bressonian breton breughelian breviloquent brevipennate brevirostrate brezhnevian briary brickier brickiest brickle brickwise bricky briefest briery brigandish brighter brightest brightish brinier briniest brisant brisbanian brisk brisker briskest bristlier bristliest bristly british brittish brittler brittlest broadacre broader broadest broadscale broadspectrum brockle brokeback brokedown broken broking bromatian bromian bronchodilatory bronchopulmonary brontean bronzen bronzey bronzier bronziest bronzy broodier broodiest broomier broomiest broomy brosey brosy brothier brothiest brothy browbeaten brownean browner brownest brownian brownier browniest brownish browny bruegelian brueghelian brummagem brung brunswikian brushier brushiest brushy brusk brusker bruskest brusque brusquer brusquest brutish brutist bryalean bubblier bubbliest budgetary buffest buffoonish buffy bugfree buggier buggiest bugproof buildingwide bulbiform bulgier bulgiest bulgy bulkier bulkiest bulksome bulky bullate bulliform bullish bullshittiest bullshitty bummest bumpier bumpiest bumpy bunchier bunchiest bunchy bungfu buoyance buoyant burblier burbliest burbly burdensome burglarproof burgundian burlier burliest burly bursiform bursten burstier burstiest bursty bushian bushier bushiest bushy busier busiest businesswide businessworthy businessy bustiest busty butchy butterier butteriest buttermilky butterscotchy buttondown buxom buxomer buxomest buzzier buzziest buzzworthy buzzy byblian byronesque byzantinesque caballine cabbagey cabbagy cabellian cabre cacatory cacciatore cackly cactusy caddish caddoan caddywompus cadent cadgy cadmian caducicorn caerulean caesian cagey cagier cagiest cagy cairene cakey cakier cakiest caky calcariform calceiform calcian calciform calculary calculatory calculiform caledonian calescent calfbound caliciform calliopean callipygean callipygian callistonian callow callower callowest calmest cameline campaniform campanulate campest campier campiest campodeiform campuswide campy camusian canaliculate canaliform canalside cancriform cancrine candent candescent candlelit canescent caniniform cannier canniest canny cantabrian cantaloupey cantatory cantorian canty canvassy capabler capablest capacitary capeverdean capilliform capillose capitatim capoid caprid capriform caprine capsian capsulate capsuliform caraboid carbonatian carbonian carbonmonoxy cardboardy cardiac cardiopulmonary cardiorespiratory carefree carelessest caretaken careworn carfree cariban caribbean caricaturesque caricaturish carinate carnivalesque carnose caroline carpathian carpellary carpellate carrollian carroty carsick cartesian carthaginian cartoonish cartoony carven casebound casewise cashflow caspian cassubian catalanophone catarrhy catchier catchiest catchy catechetick catenulate catharist cathodoluminescent catilinian catproof cattellian cattier cattiest cattish cattycorner cattywampus caucasoid cauchy caudate caudiform caudine caulescent cauliform cauline cautionary cavitary caycean cebuano cedarn cedary celebratory celiac cellary celliform cellularizing censitary centralian centremost centum centuple centuriate cephaloid cephalopagus cerambycoid ceratoid cerebriform cererian cerian ceroan certain cerule cerulescent cervicorn cervine cesarian cesian cessile chaffy chagallian chainwide chairbound chairfast chalkier chalkiest chalky chamorro chancier chanciest chancriform chancy chandleresque chandlerish chapfallen chaplinesque charcoaly charcotian charier chariest charmest charminger charmingest charonian charrier charriest charry chary chaste chaster chastest chatoyant chattery chattier chattiest chatty chavish chavvier chavviest chavvish chavvy cheap cheaper cheapest cheapish cheatier cheatiest cheaty cheddary cheekier cheekiest cheeky cheerfuller cheerfullest cheerier cheeriest cheerleaderish cheery cheesecakey cheesefare cheeseparing cheesier cheesiest cheesy chekhovian chelating cheliform chemiluminescent chemoluminescent chemorefractory chemoresistant chemosensitizing chemosensory chemosterilant chequy cher cherty chestier chestiest chestnutty chesty chewier chewiest chewy chicer chicest chichi chickeny chidden chiefest childfree childish childly childsafe chillier chilliest chilly chinesey chingisid chinglish chinnier chinny chintzier chintziest chintzy chipperly chirpier chirpiest chirrupy chlamydate chloralkaline chloratian chlorian chloriney chloroid choate chocker chockers chocolatey chocolaty choicer choicest chomskian chomskyan choosey choosier choosiest choosy chopfallen choppier choppiest choppy chosen christing christmassier christmassiest christmassy christmasy chromaffin chromatian chromian chryselephantine chrysippan chthonian chubbier chubbiest chukchi chummier chummiest chummy chumpier chumpiest chumpy chunkier chunkiest chunky chur churchillian churchlier churchliest churchly churlish churrigueresque chutzpadik ciceronian ciconine ciliary cilician ciliform cinerary cingulate cinnamony circadian circean circinate circlewise circulatory circumadjacent circumbinary circumburst circumcinct circumfluent circumjacent circumlocutionary circumlocutory circummeridian circummultiple circumnavigatory circumplanetary circumprimary circumscissile circumscript circumsecondary circumspect circumsporozoite circumvolant circussy circusy cirrate cirrhose cirrigrade cirrose cis cisacting cisalpine cisgender cismarine cismasculine cismontane cisoid cisplanckian cispontine citatory citigrade citizenish citizenly citrusy citybound citywide civil civilish claggier claggiest claggy clairaudient clairsentient clamant clammier clammiest clammy clandescent clandestine clane clangier clangiest clangy clankier clankiest clanky clannish clarificatory clarkean classier classiest classificatory classwise classy clattery clattier clattiest clausewitzian clavate clavicorn claviform clayey clayier clayiest clayish claytons cleanest cleanish cleanshaven clearcut clearest clement clerkish clever cleverer cleverest cleverish clickier clickiest clicky clientside cliffy clifty climatory clingier clingiest clingy clinkery clinky clinoid clinquant clintonesque clintonian cliquey cliquish cliquy clithridiate clockworky cloddish cloddy cloggy clompy clopen closest closish clost clothbound clothy clottish cloudcapt cloudier cloudiest cloudy cloven clownish cloysome clubbier clubbiest clubby clucky cluey clumpier clumpiest clumpy clumsier clumsiest clunkier clunkiest clunky cluttery coadjacent coadjoint coadunate coalier coaliest coalitionary coaly coarctate coarse coarser coarsest cobaltian cobaltoan cobbly cobby cobordant cobwebbier cobwebbiest cobwebby cochannel cochleariform cochleiform cockamamie cockamamy cockier cockiest cockroachy cocksure cocompact coconutty codgerly codicillary codominant coelacanthine coercible coercionary coevolutionary coexistent cofinite cogent cogitabund cogitant cognisant cognizant cogongrass cogredient coherent cohesible coincident coindicant cointegrating coky colder coldest coldish coldproof coleopteroid coleridegy coleridgean coleridgian colicky collaboratory collagey collapsible collegebound collegewide collegey collegiate colliest collinsian colorblind colorfast colourblind colourfast colpate coltish colubriform colubrine columbiform columelliform columniform comatose combinatory comcaac comelier comeliest comely cometary comfier comfiest comfy commanding commandwide commemoratory commendatory commensurate comminatory commonest commonish commonsense communicatory comorbid compactest compactible companionate companywide comparing compassionate compatible compelling compensatory competent compilatory complacent complaisant compleatest complementary completest compliant complicit complimentary compony composerly compossible composty comprehendible comprehensible compressible compulsatory computerate computeresque computery concentrating concertgoing concessible conchiform conciliant conciliary conciliatory concise conciser concisest conclamant conclusory concolorate concordant concordatory concrescent concrescible concretionary concupiscent concupiscible concurrent condemnatory condign condolatory conductible conductorly conductory conduplicate condyloid confabulatory confarreate confessory confident confirmatory confiscatory conflagrant conflagratory conflictory confluent conformant confronte confusible congestant congestible conglutinant congratulatory congruent coniform conjectory conjoint connate connectible connivant conoid conradian conrotatory consanguine consecratory considerate consignificant consilient consolatory consolute conspiratory constantinian constat constructible consummatory contemptible contestible contone contortionate contourne contractible contractile contractionary contragredient contraindicatory contraplex contrarotating contrasty contrasuggestible contraterrene contravariant contributory contrite controvertible convenient conversant convex cooingly coolest coolio coolish copernican coppery coprime copulatory coquettish coraciiform coralliform coralloid corally corbusian corbusierian cordate cordiform corkier corkiest corkscrewy corky cornellian corniculate cornier corniest corniform cornuate corny corolliform coronoid corporatewide corporationwide correcter correctest corrigible corroboratory corrodible corrosible corruptest corruptible corticate corticopontine coruscant corvine corymbiform coryneform cos cos2 cosegregating cosier cosiest cosmogonically costiform costimulatory costlier costliest costly costumey cotswold cottagey cottony cotyledonary cotyliform cotylosaurian couchant couchbound counterair counterattracting counterbattery countercorruption counterdrawn counterdrug counterflory counterguerilla counterguerrilla counterpropagating countersniper counterstreaming countersung countersunk countertrafficking countryish countrymade countrywide countywide coupley couply courtlier courtliest courtly cousinly covariant cowardesque cowardian cowardy cowboyish cowiest cowperian cowy coy coyer coyest cozier coziest crabbier crabbiest crabbit crabby cracid crackback crackier crackiest cracklier crackliest crackly crackproof craftier craftiest craftsy crafty cragfast craggier craggiest craggy crampy cranker crankest crankier crankiest cranky crappest crappier crappiest crappy crapy crashier crashiest crashworthy crashy crass crasser crassest crassulacean crawly crazier craziest creakier creakiest creaky creamier creamiest creamy creationary creaturely credible creditworthy creepier creepiest creepy crenulate crepey crepier crepiest crepitant crepy cressy crestfallen cretinoid cribriform cribrose crimean crimefree crimeridden cringemaking cringeworthy cringy crinkly crinky crispate crispest crispier crispiest cristate criticproof croaky cronenbergian crossbench crossborder crossclass crosscourt crossest crossfield crossgender crossparty crossrange crosstown crostinis crotchetier crotchetiest crotchety croupy crowdier crowdiest crowdy cruciate cruciform cruddier cruddiest cruddy cruder crudest crueler cruelest crueller cruellest cruftier cruftiest crufty cruisey cruisier cruisiest cruisy crumbier crumbiest crumblier crumbliest crumbly crumby crummier crummiest crumply crunchier crunchiest crunchy crunker crunkest crushproof crustier crustiest crustose crypticity cryptocrystalline crystalline cteniform ctenoid cthulhu cubiform cubomedusan cuckoldy cuculine cucullate cuddlesome cuddlier cuddliest cuddly culinary cultish culty cumaean cumbersome cumbrian cumhungry cummingsesque cummy cumthirsty cumuliform cunctatory cuneate cunninger cunningest cuntier cuntiest cunting cuntish cunty cupboardy cupidinian cuppy cuprian cuproan cupulate curetonian curiouser curlier curliest curmudgeonlier curmudgeonliest curmudgeonly currenter currentest currish cursedest cursory curt curtate curter curtest curule curvier curviest curvy cushdie cushdy cushier cushiest cushiony cushite cushty cushy cuspidate cuspier cuspiest cuspy custardy cute cuter cutesie cutesier cutesiest cutest cutesy cutglass cutty cvd cyanophycean cyanose cyberpunkish cybersavvy cycadean cyclopean cyclopropenoid cyllenean cyllenian cymose cyprine cysteinyl cytherean cytocompatible cyzicene czarian czarish dacent daddyish daedalian daffier daffiest daffy daft dafter daftest daggier daggiest daggy dagnasty dahlian daintier daintiest dakotan daliesque daltonian damfool damnatory damnfool dampest dampish dancegoing dancerly dancette dancey dancy dandier dandiest dandruffy dangly dank danker dankest dankish dantean dantesque dapper darker darkest darkhorse darkish darksome darlingest darwinulid dastardlier dastardliest dastardly dat daughterly davidian dawkinsian daydreamy dazy deacyl deadborn deadest deadlier deadliest deadset deafblind deafer deafest dealate deathworthy debonair decadelong decadeslong decapartite decatenatory decemberish decembery decent decentish declamatory declaratory declasse declassee decoherent decollete decolletee deconfining deconjugating decorrelating decreasing decrepit decretory decumbent decuple decurrent decurtate dedicatory deducible deedy deeper deepest deepfelt deepish deepwater def defamatory defaulty defeasible defectible defensible deferent deffer deffest defiant deficient definite deflagrant deflationary deflex deflorate deft defter deftest deglucosyl degravitating dehiscent dehydroamino deletionist deleuzean deleuzian delible delightsome deliquescent delish delitescent delphine delusionary delusory deluxe dementing demibold demilune democritean demure denary dense denser densest dentate denticulate dentiform dentproof denunciatory deoxy depascent depletant deprecatory depreciatory depressible depressionary deregulatory derisively derisory dermatoid dermoid dernier derridean descendent descendible deserty designatory designerly designy deskbound desmethyl desmostylian desolatory desperate despondent destitute destructible desultory detectible detractory deubiquitinating deubiquitinylating devanagari developmentary devoid devolutionary devout devouter devoutest dewier dewiest dewy dexterwise dextrorotatory diacranterian dialectally diaperish diasporan diazido diazo diblock dicey diciest dickian dickier dickiest dickinsonian dickish dicy diddier diddiest diddy didelphine dideoxy diderotian didine didonian diel dietary diety difficult diffident diffusible difluent digestible digitaloid digitate digitiform dihydroxy diisopropyl dilatory dilettantish diligent diluvian dimissory dimmest dimmish dimplier dimpliest dimply dingier dingiest dingy dinkier dinkiest dinkum dinky dinosaurish dinq diocesan diogenean dioicus dionean dionysiac dionysian diophantine dipeptidyl diphtheroid dippy diradicaloid dire directer direr direst dirgy dirigiste dirtier dirtiest dirtproof dirtyish discarnate discernible disciform disciplinary disclamatory discoid discompassionate disconcerting disconfirming disconsolate discordant discorporate discreet discreeter discreetest discrepant discrete discretionary discriminatory discussible disequalising disequalizing dishier dishiest dishonest dishwatery dishy disinflationary disinhibitory disintermediary dismissible disobedient disorderly disparate dispassionate dispersible displaying disrotatory dissatisfactory dissectible dissimilatory dissoluble dissolute dissonant distant distensible distinct distingue distortionary distractible distrait distraught disulfur disuniform disuniformly ditchy dithery ditsier ditsiest ditsy ditzier ditziest ditzy divaish divergent diversionary divey divinatory divinest divisible dizzier dizziest djiboutian doabler docile doctorish doddery dodgier dodgiest dodgy dodwellian doggier doggiest doggish doggone dogproof doldrum dolefuler dolefulest dollopy dolorose doltish dominating donnish doodly doolally doomier doomiest doomwatch doomy dopest dopey dopier dopiest dopy doris dorkier dorkiest dorkish dorky dormant dormie dorty dotier dotiest dottier dottiest dotty doty doubtworthy douce douchey doughier doughiest doughtier doughtiest doughty doughy dour dourer dourest doveish dovish dowdier dowdiest dowdy downbent downblouse downcoming downcore downest downfallen downfield downflowing downgone downhole downier downiest downlevel downsloping downstair downtrodden downy doylean dozier doziest dozy drabber drabbest drabbier drabbiest drabby draconian draconine draftsmanly drafty draggier draggiest draggy dragonish drapey draughtier draughtiest draughtsmanly draughty drawish drawly drawn dreambound dreamier dreamiest dreamwrapt dreamy drearier dreariest drearsome dreary dreich dressier dressiest dressy dribbly driest driftier driftiest drifty drillproof drinkworthy drippier drippiest drippy dritten driven driverside drizzlier drizzliest drizzly droll droller drollest droney dronish drony droogish drooly droopier droopiest droopy drossier drossy droughtproof droughty drowsier drowsiest drowsy drugfree druggier druggiest drunken drunker drunkest drusy druzy drydenesque drydenian dryest dryish dryopithecine drywipe dubby duchampian duchessy ductible ductile dudely dulcet duller dullest dullish dumasian dumber dumbest dumbish dumbstruck dumpier dumpiest dumplingy dumptier dumptiest dumpty dumpy duncey dungeonesque dungier dungiest dungy dunnish dunsanian dunzo duobinary duodecuple duodenary duple durkheimian duskier duskiest dustfree dustier dustiest dustproof dusty dutchier dutchiest dutchophone dutchy dutybound dutyfree dvorak dwarfish dwarven dwarvish dweebier dweebiest dweebish dweeby dworkinian dykey dylanesque dym dysprosian dystectoid dystopian dyun earlyish earsplitting earthborn earthbound earthen earthier earthiest earthlit earthmoving earthshaking earthshattering earthwards earthy earwiggy easier easiest eastern easternmost eastery eastmost easy easygoing easyish eaten eatworthy ebber ebbest ebracteate ebracteolate ebullating ebullient eburnean eburnine ecaudate ecchi eccrine echinulate echoey echonian echt ecky eco ecofriendly economywide ecostate ecotopian edematose edgier edgiest edgy edificatory educible edwardian eelfare eeliest eely eensy eentsy eerie eerier eeriest eerisome eery eeyorish effectible effectory effeminate efferent effervescent effete efficient efflorescent effluviant effulgent eggbound eggier eggiest eggy egobese eighteenish eighteenpenny eightpenny eightyish einsteinian ejaculatory elapine elastocapillary elderly eldritch electrocapillary electrochemiluminescent electrochemogene electrogene electroluminescent electrophosphorescent electrosensory electrospun electrostrong electroweak electrowon eleemosynary elegant elementary elephantiac elephantine elephantoid eleusinian elevenpenny eleventeenth elfin elfish eliminatory eliotian elizabethan elizabethian elmy elocutionary eloquent elpidian elucidatory elusory elven elvisesque elvish elvisy elysian elysium emanant emancipatory emarginate emberizine embracingly emersonian eminent emirian empsonian emptier emptiest emptyish enantiocontrolling enantiodiscriminating enantiopure enantiornitine enceinte enceladan enceladean endian ending endmost endocavitary endoeuropean endometrioid endometroid endoreversible engirt englishy enneastyle ennuye enrapt ensiform enteroendocrine enterprisewide enterprisey enterprising entomoid entrywise enturbulant enuff envirofriendly eny eolian eonian eotvos ephemeride epidermoid epifluorescent epigene epileptiform epistemologically epistolary epitheliod epithelioid epithelizing epulary equidistant equifrequency equifrequent equiluminant equinecessary equipotent equisonant equitant equivariant erbian erectile ericksonian ericoid eridian eriksonian erodible erose errant errorfree erstwhile eruciform erudite erumpent erythroid escheresque espanish esquamulose estuarine esurient etaprime etchi ethmosphenoid ethnosectarian euahlayi euchelicerate euclidean euclidian eulerian eumenine eunuchoid eupsychian eurabian euripidean euronesian europian europoan euryhaline euthyroid evacuant evadible evanescent evasible evener evenest everbearing everblooming everchanging everfalling everflowing evergoing evergrowing everlasting everlearning evermoving everrunning evershifting eversible everwhat evident evidentiary eviler evilest eviller evillest evolutionary exaggeratory exanimate exarate exascale excandescent excaudate excitatory exclamatory exclusionary exclusory excretory excruciating exculpatory excurrent excusatory executory exemplary exhalatory exhaustible exhortatory exigent exigible exilian existent existing exocrine exoplanetary exorbitant exoterrene exotrojan exp expansible expansile expansionary expectant expeditionary expertest expiatory expiratory explanate explanatory explicatory explicit explodey exploratory explosible expositionary expository expostulatory expressible expurgatory exsanguine exstipellate exstipulate exsufflicate extant extemporary extendible extense extensible extensile exterminatory extinct extortionary extortionate extrabellum extrabodily extracardiac extractivist extralarge extraliterary extralong extramedullary extramundane extraordinaire extraordinary extrapair extraparliamentary extraplanetary extrapulmonary extrasensory extrastatutory extrastriate extrauterine extravagant extremotolerant extropian extrorse extry exuberant exultant exurban exxy exy eyecatching eyeopening eyewatering fabbest fabbier fabby fabiform faboo facesaving facety facile faciliatory facilitatory faclempt factorywise facty faddier faddiest faddish faddy fadeproof fadest fadish faggier faggiest faggoty faggy faginesque fahrenheit failproof failsafe failureproof fainter faintest faintish fairer fairest fairish fairtrade fairweather fakest fakey faklempt falcate falciform falconine fallaway fallible fallopian false falser falsest falstaffian fanboyish fanciest fandabidozi fanfold fangy fanmade fannish faraway farby farinose farkakteh farnesoid farouche farrant farreaching farseeing farspoken farthermost fashiony fastest fastgrowing fatherly fatiloquent fattening fatter fattest fattier fattiest fattish faulknerian faultier faultiest faulty faustian faustiest fausty faux favonian favoritest favourablest favouritest favy fawce fearfuller fearfullest fearsome feasible featherier featheriest featherlight feathery febrile fecund fecundist feeble feebler feeblest feelbad feelgood feely feepaying feer feetlong feistier feistiest feisty fellest felliniesque felty femmer fenceline fenestrate fennoscandian fenny ferine ferior ferklempt ferny ferrety ferrian ferroan ferrocenyl ferromagnesian ferryl fertile fervent fervid fescennine festy feuillemorte feverish few fewer fewest fewscore fey feyest fibery fibriform fibrillary fibrillatory fibroblastoid fickle fictile fictiveness fiddlier fiddliest fiddly fidgetier fidgetiest fidgety fiendish fiendly fierce fiercer fiercest fierier fieriest fiery fifteenish fifteenpenny fiftyish figgy fightingest figulate figurate filamentary filamentoid filamentose filemot filetail filiform filmier filmiest filmworthy filmy filthier filthiest filthy fimbriate finer finespun fingery finickety finickier finickiest finicking finickity finicky finikin finitary finite finito finnier finniest finnish finnophone finny fireballing firelit fireworky firmer firmest firmish firmwide first firstest firsthand firstmost fishier fishiest fishish fissile fittest fivepenny fizzier fizziest fizzy flabbier flabbiest flabby flabellate flabelliform flaccid flagelliform flagrant flain flakey flakier flakiest flaky flamethrowing flamier flamiest flammant flamy flannelly flapperesque flappier flappiest flappy flashier flashiest flashy flatleaf flattest flattish flatwater flavescent flavid flavorsome flavoursome flaxen fleaborne flearidden fleecier fleeciest fleecy fleeter fleetest fleshier fleshiest fleshly fleshy flexile flickery flickier flickiest flicky fliest flightier flightiest flightworthy flighty flimsier flimsiest flinchy flintier flintiest flintstonian flinty flippant flippest flippier flippiest flirtier flirtiest flitten flitty floatier floatiest flobby floccose floodlit flooey floppier floppiest flopsy florescent florid flory flossier flossiest flossy flouncier flounciest flouncy flourier flouriest floury flowerier floweriest flowery flowier flowiest flown flowy floydian fluctuant fluent fluffier fluffiest fluffy flukey flukier flukiest flukish fluky fluorian flushest flutey flutier flutiest fluttery fluty fluviatile flyblown flycatching flyproof foamier foamiest foamy foetid fogbound fogeyish foggier foggiest foggy fogyish foine foldaway foldup foliose folkier folkiest folkish folklorish folksier folksiest folkstyle folksy folky fonder fondest foodborne foody foofier foofiest foofy foolhardier foolhardiest foolhardy foolish foolisher foolproof foorth footballing footloose footsore foppish forbidden forborne forcasten forcene forcible fordrunken foredone foregone foreign foreknown foresaid foreseen foresty forgettil forgettle forgitty forgiven forgone forky forlorn forlorner forlornest formfitting formican formicarian formicine fornicatory forold forridden forsaken forsworn forthcoming forthpushing forthright fortis fortunate fortyish fortypenny forwardmost forworn fossulate fossy fou foucaldian foucauldian foucaultian foudroyant foulest foundherentist fourche fourierite fourpartite fourpenny fourteenish fourteenpenny fousty foxier foxiest foxy fragile fragmentary fragrant fraidier fraidiest fraidy frailer frailest frammit francoesque francoist franconian frangible frankensteinian frankensteinish frankest frankish fraudproof freakier freakiest freakish freaky freash frecklier freckliest freeborn freeform freehand freemium freest freestanding fregean frekel frem fremder fremdest frequentest freshest fretty fricken friendish friendlier friendliest friendworthy friggin frightsome frigid frillier frilliest frilly frim fringey fringier fringiest fringy friskier friskiest frisky frizzier frizziest frizzlier frizzliest frizzly froggish frolicsome frommian frondescent frondose fronter frontest frontmost frontside froofy froren frory frostbitten frostier frostiest frostproof frosty frothier frothiest frothy froward frownier frowniest frowny frowsier frowsiest frowsty frowsy frowzier frowziest frowzy frozen frugiferent fruitier fruitiest fruity frum frumentary frumpier frumpiest frumpish frumpy frutescent fruticose fubby fubsier fubsiest fubsy fuckish fudgier fudgiest fudgy fugazi fugient fuglier fugliest fugly fulgent fulgid fulgurant fulicine fuliguline fullcourt fullest fullish fullmade fullscale fullwidth fulminant fulsome fumatory fumid fumiest fumy fundiform fundu funerary funest fungible fungiform funkier funkiest funky funloving funnelform funner funnest funnier funniest funnish furanoid furder furibund furriest furrin furshlugginer furtherest furthermost furthest furzy fusible fusiform fusimotor fusionesque fusoid fussier fussiest fussocky fussy fustier fustiest fusty futhermost futile fuzzier fuzziest fuzzy gabbier gabbiest gabby gadgety gadiform gadoid gadolinian gaga gagworthy gainly gainsome galaxian galaxywide galeate galeiform galeproof galerinoid gallian galline gallus galore gamesome gamest gamey gamier gamiest gaminesque gamy ganglier gangliest gangliform gangling ganglioform gangly gangsterish ganymedian gappier gappiest gappy garagey garbagey garbagy garboesque gardnerian gargantuan garish garlicky garrisonian garveyan gashly gasiform gaslit gaspier gaspy gassier gassiest gassy gastight gatesian gatvol gauche gauchest gaudier gaudiest gaulish gaunt gaunter gauntest gaussian gauzier gauziest gauzy gawkier gawkiest gawky gayest gayish gdynian geekier geekiest geekish geekly geeky geezerly geezery gelatinoid gelid gemmary gemutlich generich geniculate geniohyoid genitourinary genomewide genovese genteel gentlemanish gentler gentlest genuine geopolitically geostationary geraldine germanatian germanian germanoid germfree germier germiest germproof germy gesticulatory gewd ghastlier ghastliest ghentish ghey ghostlier ghostliest ghostly ghostwritten ghoulish gibsonian giddier giddiest giddy gifty gigajillion gigantesque gigglesome gigglier giggliest gigglish giggly gilaki gilbertian gilliamesque gimlety gimmicky gimpier gimpiest gimpy ginchiest ginchy gingerish gingery ginny ginsbergian giocoso giottesque gipsyish giraffine girlfriendly girlier girliest girlish girthier girthiest girthy glabrescent glace glacimarine glaciolacustrine glaciomarine gladder gladdest gladsome glaiky glaky glammy glandiform glassier glassiest glassy glatt glazen glazy gleamier gleamiest gleamy glib glibber glibbest glimmery glinty glitchier glitchiest glitchy glitterier glitteriest glittery glitzier glitziest glitzy globose glomeromycotan gloomier gloomiest gloomish gloomy gloopier gloopiest gloopy gloppier gloppiest gloppy glossier glossiest glossopalatine glost glowy gluey gluggy gluier gluiest glum glummer glummest glurgy glutaryl glutenfree gluttonish glycoprocessing glycosylating gnarley gnarlier gnarliest gnarly gnashy gnatty gnawn gneissose gnomish goalbound goatier goatiest goatish goatly goatproof goaty gobbier gobbiest gobsmacking goddamn goddang godfatherly godfearing godforsaken godlier godliest godly godmotherly godsent godwinian goebbelsian goethean gogetting goggly gogolian goldarn golden goldeny goldiest goldlip goldtail goldy gollumish gompertzian goncharovian gonzo goodest goodish goodo goodwife gooey goofier goofiest goofy googlier googliest gooier gooiest gooky goopier goopiest goopy goosebumpy goosey goosy gopping gorbachevian gordian goreyesque gorier goriest gorillian gormenghastian gormy gorsy gory goshdarn goshdurn gospelly gossipier gossipiest gossipy gothically gothicky gothy gotten gouty governessy governmentwide goyish grabbier grabbiest grabby gracile gradelier gradeliest gradewide gradgrindian grainier grainiest grainy grande grander grandest grandfatherly grandiloquent grandiose grandmotherly graney grapefruity grapey grapier grapiest grasscourt grassier grassiest grassroots grassy gravelly graven gravesian gravest gravid gravogyro grayer grayest grayish greasier greasiest greasy greater greatest greedier greediest greedy greeker greekest greekish greenean greener greenest greengagey greenish greenside gregorian grenadian greyer greyest greyish gricean griesly grievousest grim grimier grimiest grimlier grimliest grimmer grimmest grimy grippier grippiest grippy grislier grisliest grisly gristlier gristliest gristly grittier grittiest gritty grizzlier grizzliest groanworthy grodier grodiest grody groggier groggiest groggy groovesome groovier grooviest groovy grosser grossest grottier grottiest grotty grouchier grouchiest grouchy groundward groundwards grouty grovy growlier growliest growly grown growne grubbier grubbiest grubby grudging grueling gruelling gruesome gruesomer gruesomest gruff gruffer gruffest gruffish grum grumblier grumbliest grumbly grummer grummest grumpier grumpiest grumpy grungier grungiest grungy guardant gud guestfriendly guffmanesque guidebookish guiltfree guiltier guiltiest guiltridden guitary gujarati gulfy gullah gullible gulliverian gullwing gummier gummiest gungey gungier gungiest gungy gunkier gunkiest gunky gunshy gunslinging gurgly gushier gushiest gushy gustatory gustier gustiest gusty gutenbergian gutsier gutsiest gutsy guttate guttiest guttiform gutty gutwrenching guyish gypsyish gyratory gyrosynchrotron habile hackerish hackerproof hackier hackiest hackish hackly hackproof hacky hadronizing haedine haemagglutinating hafnian haggish hagrid hagridden haimish haircurling hairier hairiest hairraising hairy haken hakkanese halesome halest halfawake haline hallmarkish hallmarky halloweeny hallucinatory hammier hammiest hamose hamulate hamulose handblown handbuilt handier handiest handly handmade handsewn handsfree handsomest handspun handsy handwavey handwavy handwoven handwritten handy hangoverish hangry haphazard haplodeficient haploinsufficient haplophyte happeningest happier happiest happy haraam haram harborside hardbitten hardbound hardest hardier hardiest hardish hardscrabble hardshell hardwearing hardwon hardworking hardy hardyan hardyesque harlequinesque harpyish harsher harshest hasslefree hastate hastier hastiest hasty hateworthy hattier hattiest hatty haughtier haughtiest haughty hauptmannian haurient hausdorff hautest hawkish hawky hawthornean hawthornian hawthorny hazardproof hazelly hazelnutty hazier haziest hazy headachy headier headiest headish headmasterly headmost headrushing headstrong heady healsome healthier healthiest healthy heapier heapiest heapy hearn hearsome heartachey heartachy heartbroken heartfelt heartier heartiest heartrending heartsick heartsore heartstopping heartwhole heartwrenching hearty heathenish heathier heathiest heathy heavenlier heavenliest heavenly heavenwards heavier heaviest heavyish heavyset hebbian hecka heckuva heegaard hefnerian heftier heftiest hefty hegelian heideggerian heightist heinleinian heliborne hellbent hellbound hellish helluva hellzapoppin helmholtzian helminthoid hemagglutinating hemilabile hemingwayesque hemolymphoid hempen hep hepatobiliary hepburnian heptastyle herbose herby herculaean herculean herdwide herile hermian hermitian herodotean herpetiform herschelian hertzian hesitant heteroaryl heterodisperse heterodox heterofriendly heteroousian heterophase heterophile heteroploid heteroresistant heterosexually hevery hewn hexacoordinate hexacore hexastyle hiccupy hidden hidebound hifalutin highborn highbush highcut higher highest highfalooting highfalutin highfaluting highflying highish highprofile highresolution highrisk hiligaynon hillier hilliest hilly hindermost hindi hindustani hinkier hinkiest hinky hintermost hintikkian hiphugger hipper hippest hippieish hippier hippiest hippocrepiform hippoid hippopotomonstrosesquipedalian hippotigrine hippyish hipshot hipsterish hircose hirquine hirrient hirsute hispanophone hissier hissiest hitchcockian hitlerian hitlerish hitmaking hmong hoarier hoariest hoarse hoarser hoarsest hoary hobbesian hobbity hobbly hobbsian hocclevean hocclevian hochwohlgeboren hodiern hofstadterian hoggish hoggy hognose hokey hokier hokiest hoky holaspid holey holier holiest hollower hollowest hollywoodesque hollywoodian hollywoodish holmesian holmian holy homeborn homebound homegrown homelier homeliest homely homemade homeowning homerian homesick homestyle homewards homier homiest homodiploid homodont homoiousian homoousian homoresistant honest honestest honeyish honorary honourary hookier hookiest hooty hopperesque hoppier hoppiest hopposite hoppy horatian hornier horniest horny horowitzian horrid horrider horridest horrisonant horrorstricken horrorstruck horsedrawn horsier horsiest hotcha hotelwide hott hotter hottest hottish houdiniesque hourlong hourslong housebound housebroken housemade housewide housewifely housewifey housewifish hoyden hoydenish hubbardian hucksterish huffingly huffy huge huger hugest huggermugger huggier huggiest huggy hughesian huipil hulking hulky humane humaniform humanmade humblest humbucking humdrum humid hummin hummocky humongoid humpier humpiest humusy hungover hungrier hungriest hungry hunkier hunkiest hunkish hunseemly hurtier hurtiest hurty husbandly huskier huskiest husserlian hyacinthine hyalescent hyaloid hyblean hydatidiform hydatoid hydrido hydrogenian hydronian hydrosaline hydrosanitary hydroskimming hydrosoluble hydrostationary hydroxy hydroxylian hygrophoroid hylobatine hymeniform hyper hyperaccreting hyperacid hyperacute hyperalert hyperarid hyperarticulate hyperaware hypercapitalist hyperclean hypercompact hypercomplex hyperconfident hyperconsumerist hyperdiploid hyperefficient hypereutectoid hyperextensible hyperfast hyperfeminine hyperfine hyperfinite hyperforeign hyperhygienist hyperinflationary hyperintelligent hyperintense hyperionian hyperkahler hyperlegible hyperlight hyperliterate hyperluxe hypermasculine hypermobile hypermodern hyperpartisan hypersaline hyperscaling hypersoft hypersomniac hypersusceptible hypertense hyperthyroid hypervigilant hypervisible hypervivid hyphy hypnoid hypogean hypogene hypohamiltonian hypomethylating hypostyle hypothyroid hypsodont hystricine hystricomorph ianthine iapetian iberomaurusian ibizan ibsenesque ibsenian icebound icebreaking icelandish icey ichthyosiform icier iciest ickier ickiest icklest icky icterine icteroid icy idean idem idempotent identarian ideomotor idiotproof idlest iffier iffiest iffy ignescent ignoble ignorant ignorantest iid ikey ileac iliac ilka illegible illegitimate iller illest illicit illinois illiquid illish illlit illocutionary illuminatory illusionary illusory illuster illyrian imaginary imido immaculate immanent immarcescible immature immeasurably immediate immense immersible imminent immiscible immiserizing immobile immoderate immodest immotile immund immunocompatible immunocompetent immunodeficient immunodominant immunoelectron immunoenhancing immunofluorescent immunogene immunomodulating immunomodulatory immunoprecipitating immunoregulating immunoregulatory immunostimulating immunostimulatory immunotolerant imparipinnate impassible impassionate impatient impenitent imperceptible impercipient imperiality impermanent impermeant impermissible impertinent impish implausible implicit impolite impotent impraescriptible imprecatory imprecise impressible improper improvident improvisatory imprudent impudent impunctate impune impure impurer impurest inaccessible inaccurate inacquiescent inadept inadequate inadmissible inadvertent inamyloid inane inaniloquent inapparent inapposite inapprehensible inappropriate inapt inarticulate inaudible inauguratory inavertible inband inborn inbroken inbuilt incalcitrant incalescent incan incantatory incessant inchlong inchwide incivil inclement includible inclusible inclusionary inclusionist incognizant incoherent incoincident incommensurate incompatible incompossible incomprehensible incompressible incomunicado incondign incondite incongruent inconsiderate inconsistent inconsolate inconsonant inconstant incontestible incontinent incontrovertible inconvenient inconvertible incony incorrect incorrupt incorruptible increasing increate incredible incriminatory incruent inculpatory incult incurrent incut indecent indef indefeasible indefectible indefensible indefinite indehiscent indeliberate indelible indelicate indescript indestructible indeterminate indianan indicatory indicible indifferent indigestible indignant indigoid indirect indiscreet indiscrete indiscriminate indiscriminating indiscussible indissoluble indistinct indivisible indoaryan indochinese indocile indoeuropean indoor indrawn inducible indulgent industrywide industrywise inefficient inelegant ineligible ineloquent ineludible inept inerrant inevident inexact inexhaustible inexistent inexpedient inexpert inexplicit inexpressible inextendible inextensible infallible infalling infantile infantine infeasible infecund infeft infertile infinitary infinite infirmer infirmest inflammatory inflationary inflexible inflight inflorescent inflowing informatory infradian infrangible infrequent infrequently infuckingcredible infundibulate infundibuliform infusible infy ingenuine ingestible ingoing ingrowing ingrown inherent inhibitory inhouse inhuman inhumane initiatory inkier inkiest inky inlying inmost innercity innermost innerspring innocenter innominate innovatory innumerate inoperant inopportune inordinate inplane inquisiturient inquorate inrushing insane insanitary insatiate insatiaty inscient insectan insectile insectproof insecty insecure inseducible insensible insentient insequent insiderish insidery insignificant insincere insipid insipient insistent insober insoluble insolvent insouciant inspiratory institutionwide instore insubordinate insufficient insurrectionary insusceptible inswinging inswung intact intaken integrating integumentary intelligent intelligible intemerate intemperate intense intenser intensest interagency interamerican interarm interatom interband interbank interbasin interbeat interbinary interborough interbranch interbuilding interburst intercalary intercamp intercarrier intercaste intercave intercavitary intercessory interchain interchannel interchromatin interchurch intercloud interclub intercluster intercollege intercollegiate intercollision intercommunity intercommuting intercompany intercompartment intercomponent intercomprehensible interconference interconvertible intercorporate intercountry intercrater intercrystalline intercurrent intercycle interday interdealer interdendrimer interdependent interdictory interdimer interdisciplinary interdistrict interdomain interdot interelectrode interelectron interesting intereuropean interevent interfaction interfaith interfamily interfemale interfilament interfleet interfluent interforce interform interfulgent interfullerene intergender intergrain intergroup intergrown interhelix interhuman interisland interjacent interjudge interkinetochore interlaboratory interlacustrine interladder interleaflet interleague interleukine interlevel interlibrary interline interlinking intermale intermaxillary intermembrane interminate interminiband intermittent intermodel intermonomer intermountain internecine internucleon internucleoside internucleotide interobserver interorgan interpair interparent interparticle interparty interpatient interpeak interpeptide interphotoreceptor interphylum interplane interplanetary interplate interplayer interploidy interprocess interprocessor interproject interprotein interprotocol interprotomer interpulmonary interpulse interpupillary interquark interquartile interqubit interrater interreducible interresidue interridge interruptible intersample interscale interschool intersectarian intersegment interservice interset intersheet intersite intersong interspecies interspike interstack interstage interstep interstereocilia interstimulus interstrain interstrand interstring interstroke intersubband intersubject intersubunit intersurface intersurvey intersymbol intersystem intertaxon interthread intertrack intertrimer intertube interunion interuniversity interurban interuser intervalence intervalley intervehicle intervein intervenose intervillage intervortex interword interwoven interzoo intestate intimidatory intolerant intraband intrabank intrabinary intrabuilding intraburst intracardiac intracarotid intracase intracavitary intracavity intracell intrachain intracity intraclade intracloud intraclub intracluster intracompany intracomponent intraconference intracoronary intracrater intracrine intracycle intraday intradimer intradistrict intradivision intradot intraexon intrafamily intragrain intragroup intrahost intralayer intraleague intramembrane intramode intramonthly intranight intransient intransigeant intransigent intraoffice intrapair intraparticle intrapartum intraparty intrapathway intrapatient intraphase intrapipette intraplate intrapolaron intrapore intrapulmonary intrapulse intraresidue intraschool intrasite intraspecies intrasquad intrasubband intrasubunit intrateam intratumor intraunion intraurban intrauterine intravalley intrepid introducible introductory intromittent introrse intruse intumescent invasible invasionary inverecund invertible investible investigatory inveterate invex inviolate inviscid invisible involatile involuntary inwrought iodatian iodian iowan iracund irascible irate irater iratest iridescent iridian irksome ironshot iroquoian irradiant irrealis irredundant irrefrangible irrelevant irremissible irreparate irreprehensible irrepressible irreproducible irresistible irresoluble irresolute irreverend irreverent irreversible irruent irvingian isiac isidian islamicate islamitish islandwide islandy isocapacitary isocrystalline isodisperse isodispersion isoenergy isofemale isofrequency isosceles israelite issuant isthmian itchier itchiest itchy iterant ith itsier itsiest itsy itty ivorine jabberwocky jabbery jabby jacksonesque jacobethan jaden jaggeder jaggedest jaggedy jaggier jaggiest jaggy jailbroken jamesian jammier jammiest janglier jangliest jangly janian janiform janitory jankier jankiest janky janner japanesey japetian japhetite jargony jas jasest jasminy jaspery jaspidean jatvingian jauntier jauntiest jaunty javan jawdropping jaynesian jazzier jazziest jazzy jeevesian jejune jellyish jerkier jerkiest jerkish jerksome jerran jerrybuilt jesusian jesusy jetset jewish jhatka jigglier jiggliest jiggly jiggy jigsawn jillionth jimp jimper jimpest jinglier jingliest jingly jingoish jinkier jinkiest jinky jitterier jitteriest jittery jivey jobsian jockish jocky jocose jocund johannine johnsonian jokesome jokey jokier jokiest joky jollier jolliest joltier joltiest joltproof jolty jominian jongian jonsonesque jonsonian jouncy jowlier jowliest jowly joycean joycian joyridden jrm jubilant judean judenrein jugate juicier juiciest juicy julian jumpier jumpiest jumpout jumpy junglier jungliest jungly juniorest junkier junkiest junoesque junonian juster justest justificatory justinian juvenescent juvey juxtamembrane kaalgat kabuli kafkaesque kaflooey kagyu kalian kamboji kambuja kanny kansan kapampangan kapingamarangi kaput kaputt karabakhi kartu kartvelian kashubian katywampus kawaii keatsian keenest keirseyan kelantanese kemalist kempt kempty kennedyesque kenspeckle keplerian keratinoid keratose kerflewie kerflewy kerflooey kerouacian ketchuppy kewl kewler kewlest khinalug kickass kickier kickiest kicky kiddish kidhood kidhoods kierkegaardian kiganda kimilsungist kinder kindest kindlier kindliest kingian kinglier kingliest kingsize kinkier kinkiest kinky kinociliary kinseyan kiplingesque kiplingian kirlian kissiest kissingerian kissy kitscher kitschest kitschier kitschiest kitschy kittenish kittler kittlest kittycorner kittywampus kleinian klezmerish klimtian kludgy klutzier klutziest klutzy knaggier knaggiest knaggy knaveproof knavish kneedeep knobbier knobbiest knobblier knobbliest knobbly knobby knockproof knottier knottiest knotty knownst knuckly knurlier knurliest knurly kolmogorov kookier kookiest kookish kooky kool kordofanian koreshian kroeberian kruegeresque kubrickian kuhnian kurdish kvetchier kvetchiest kvetchy kwaai labelloid labent labile laborsaving laborsome laboursome labyrinthian labyrinthine laccate lacertian lacertine lacey lachrymary lachrymose lacier laciest laciniate lackluster lacklustre lactescent lacunary lacunose lacustrine lacy laddish laden ladyish ladykilling laevorotatory lageniform laggier laggiest laggy laidback lain laingian lairy lakewide lakoffian lakovian laky lambdoid lambent lamby lamellate lamelliform lamest lanate lancastrian lanceolate landbound landladyish landowning landside landward languedocian languid lanker lankest lankier lankiest lanky lanose lanthanian lappish laqueary lardier lardiest large largeish largeleaf largenose larger largest largish larkinesque larkinian larky lasting latent latescent lathery latian latinate latish latrorse latter latterday laudatory laughsome laughworthy lauryl laveyan lavy lawrentian lawyerly laxest layerwise lazier laziest lazuline lazy lazyish leaden leading leadoff leafbearing leafen leafier leafiest leafy leaguewide leakier leakiest leakproof leaky lealer lealest leaner leanest leastest leatherbound leatherier leatheriest leathern leathery leavy lechy lecythiform leerier leeriest leery leesome leetle leeward leftfield lefthand leftish leftwing legatine legendaire legendary leggier leggiest leggy legible legit leibnizian lekker lemony lengthier lengthiest lengthly lengthy lenient leninian lenis lenns lenten lentiform leonese leonine lepiotoid leporine leptokurtosis lesbianish lethean letten lettish lettucey lettucy levantine levelest levorotatory lewd lewder lewdest lewer lewest liberalish liberatory librarianly libre licey licit lickle licky liefer liefest liefsome lifechanging lifedraining lifegiving lifelong lifesize liftin lightest lightfast lightfoot lightish lightproof lightsome lightstruck ligulate likelier likeliest likest likish lil limacine limbate limber limerent limicoline limiest limitary limoniform limpest limpid limpish limy lincoln lincolnesque lincolnian lindberghian lineny linguiform linguisticky lingulate linian linking linky linnaean linnean linsey lintfree linty lionish lipoamino liposoluble lippier lippiest lipschitz lipsticky liquescent liquidly liquidy liquoricey lirate lispy lissom lissome listy lisztian literary lithe lither lithesome lithest lithian litho lithoid littler littlest livebearing liveborn livelier liveliest lively liverish livid lizardly lizardy ln loamier loamiest loamy loath loathest loathiest loathlier loathliest loathly loathsome lobachevskian lobate lobopodian lobsterish locellate lochside locomotor locomotory locrian loegrian loftier loftiest lofty log logamediate logier logiest logy lojban londonesque londonish lone lonelier loneliest lonely longheld longiloquent longish longlasting longnose longrunning longshore longstanding longterm longtime longward longwave lookist looney loonier looniest loopier loopiest looptail loopwise loopy looseleaf looser loosest lophodont lophophorate loricate lorra loserish losingest lossmaking lossy loth lother lothest lotsa louder loudest loudish loungey loungier loungiest loungy loury louseborne lousier lousiest lousy loutish louty lovecraftian lovelier loveliest lovelorn loverly lovesick lovesome lovestruck loveworthy lowborn lowbush lowcost lowcut lowermost lowery lowest lowgrade lowish lowlier lowliest lown lucasian lucent lucid lucilian luckier luckiest lucky lucretian lucullan ludibund ludlovian ludlow lukasiewiczian luke lukewarm lulzier lulziest lulzworthy lulzy lumicrine luminant luminescent luminiscente lumpen lumpier lumpiest lumpish lumpy lunkish lunky lurid lurvely lusher lushest lusitanian lustier lustiest lusty lutecian luteinising luvverly luxembourgish luxuriant lyard lyart lymphoblastoid lymphoid lyncean lynchian lyonnaise lyotardian lyrate lyriform lysyl lytdybr macabre macanese macaronesian macbethian maccabean machiolate macneicean macrobian macrocephalus macrocrystalline macrodont macroevolutionary macropine macropodine macrospin maculatory maculose maddest maddish madid madreporiform madurese magdala maggiore maggotish maggoty maghrebi maghrebin maglemosian magnetocoriolis magnetocrystalline magnetoresistant magnicaudate magnificent magniloquent magrittean mahoran maidenly maileresque mailorder maily maimonidean mainest majorcan majoritarian makah makeout makhani makhonee making malabarese malapropos maledicent maleficent malestream malignant malleiform malshapen maltesian malthusian maltier maltiest malty mamillary mammate mammery mammiform mammilloid mammonish mammose mancalline mancipatory mancude mancunide mandatory mandibuliform mandibulohyoid manganian manganoan mangier mangiest mangy manhattanese manicky maniform mankier mankiest manky manlier manliest manly manmade mannerly mannish manque manques manslaughtering mantegnesque manualiter manubiary manueline manurey manycore mapley maply maraging marathi marbly marcescent marchy mardier mardiest mardy marfanoid margariney marginate marian marioesque maritime markan markovian markworthy marlier marliest marly marmaladey marmalady maroonish marrowish marshier marshiest marshmallowy marshside marshy martellato martuthunira martyrish martyrly marv marvy marxian masaman masculine mashy masqueradish massaman masseterine massier massiest masturbatory matchlit matchwinning matchy materterine matin matt mattery matthean matty maturer maturest maturish maudlin maughamesque maughamian maumish mauretanian mausolean mauvest mauvish mawkish mawky max maxillipedary mayberry mayonnaisey mazier maziest mazy mccarthyesque meadowy meady meager meagerer meagerest meagrer meagrest mealier mealiest mealy meandry meaner meanest meanish measlier measliest measly meatier meatiest meaty mechanosensory meddlesome mediad mediating mediatory mediocre mediterranean mediumwave medullary medullate meeker meekest mega megachiropteran megacool megarich megascale megaselling megavariate megavitamin megawealthy meh meiji melanesian meline melkite mellifluent mellower mellowest melony melpomenean melpomenish meltaway meltier meltiest meltproof melty membraniform memoirish memorylessness menckenian mendelian mennish menschier menschy mensuralist meowy mephistophelean meraspid mercantile merchantile mercuroan merest meringuey merocrine merodiploid merrier merriest merry merulioid meseraick meshuga meshugah meshugga meshuggah meshugge mesoamerican mesoarchean mesocrystalline mesokurtosis messier messiest messy meta metabelian metalating metalbearing metalpoor metasedimentary metatectoid metidian mettlesome miaphysite michelangelesque microblade microcirculatory microcrystalline microdiverse microevolutionary microfine micrometazoan micronesian micropapillary micropolitan micropower microreversible microscanning microsize microsoftian microstock microtine micturient midadolescent midaltitude midblock midbrow midbudget midcall midcampaign midcap midcareer midcentury midchapter midcoast midconstruction midcontinent midcourse midcycle middlemost middling midengine midflight midfoot midfrequency midfuck midgey midgrade midheight midlevel midlist midmarriage midmonth midmost midmountain midpark midperiod midprice midquarter midranking midscale midsentence midsex midshow midsize midstrength midtier midweekly midweight midwestern miffy mighter mightest mightier mightiest migratory milanese milch milder mildest mildewy mildish milelong milewide miliary milkier milkiest milkwhite milky millean millenary millenne millerian millian milligrade milquetoasty miltonian milvine mimantian min minatory mindbending mindblowing mindboggling minerally mingent mingier mingiest minging mingy miniscule minkowskian minneapolitan minnesotan minorish mintier mintiest minty minuter minuteslong minutest minxish miny miocene mirandan mirandian mirier miriest mirky mirrory miry misbegotten misborn miscible miscut misdone miserly misfortunate misgiven misgone misgotten mishuga misproduce misseeming misseen misshapen missileproof missish mistaken misthrown mistier mistiest misty miswritten mitigatory mitosing mixeder mixolydian moany mobbish modalist modelesque modelly modest modish modishest modulatory moist moister moistest moisty molassine moldier moldiest moldy molieresque molluscan molluskan molten molybdian momentary monaxonid monetary monetesque moneygrubbing moneyspinning mongoloid mongrelly moniliform monkeyish monkish monocrystalline monodentate monogyne mononucleate monopartite monopeptidyl monophyte monorchid monosulcate monotectoid monstrose montagovian monthlong monthslong moodier moodiest moody moonier mooniest moonish moonlit moonstruck moorish moory moosey mopey mopier mopiest mopish moppy moratory morbid morbilliform mordvin moreish moreso moresque moriform morish mornay morose morphophonologically mosquitoey mossier mossiest mossy mostest mothbally motherfuckin motherish motherloving motherly mothier mothiest mothy motile motorik mouldier mouldiest mouldy mountainy mouseproof mousey mousier mousiest mousy mouthier mouthiest mouthwatering mouthy moviegoing moving mown mozartian mucho muckier muckiest mucky mucociliary mucoid mucousy mucronate muddier muddiest mudproof muggier muggiest muggletonian muggy muhammadan mulcible muley mulish multiaccess multiacre multiact multiaddress multiage multiagency multiagent multiamplifier multiangle multiantenna multiapplication multiarchitecture multiarea multiarray multiatom multiauthor multiball multiband multibank multibarrel multibaryon multibathroom multibay multibeam multibedroom multibillion multibit multiblade multiblock multibody multiboot multiborough multiboson multibranch multibrand multibrane multibridge multibuffer multibuilding multibuy multibyte multicamera multicampus multicandidate multicarat multicarbon multicarrier multicase multicat multicell multicenter multicentre multichain multichallenger multichannel multichapter multicharacter multichromatid multicity multiclade multiclaim multiclan multiclass multiclassifier multiclient multicluster multicoat multicode multicollection multicollision multicolor multicolour multicolumn multicommittee multicommodity multicompartment multicomponent multicomputer multiconductor multiconfiguration multiconsole multiconstituent multicopy multicore multicountry multicounty multicourse multicraft multicriteria multicult multiculti multicurie multicurrency multicurrent multicustomer multidate multiday multideath multidecade multidefendant multident multidentate multidepartment multidetector multidevice multidigit multidirector multidirectory multidisc multidisciplinary multidiscipline multidisk multidoctor multidog multidomain multidose multidriver multidrop multidrug multielectrode multielectron multielement multiemployer multiengine multiepisode multiexchange multifacet multifaction multifactor multifaith multifare multifarm multifibre multifid multifield multifigure multifilament multiflash multiflight multifluid multifold multifoliate multifood multiformat multifracture multifragmenting multiframework multifrequency multifront multifunction multigame multigap multigas multigate multigender multigene multigeneration multigenome multigenre multigerm multigluon multigrade multigrain multigram multigravid multigraviton multigrid multihadron multihazard multihectare multiheterodyne multihole multihomer multihop multihorse multihour multiindustry multiitem multijet multijoin multijudge multijugate multijurisdiction multikey multikilobase multikilogram multikilojoule multikilometer multikilowatt multilabel multilane multilanguage multilaser multileg multilepton multilevel multilibrary multilight multiline multilink multiliter multilitre multilobulate multilocation multiloculate multilocus multiloop multiloquent multimagazine multimanager multimarket multimedium multimegaton multimember multimeson multimessenger multimethod multimode multimodel multimonitor multimorbid multimove multimovement multimuseum multination multinetwork multinight multinitrogen multinucleate multinucleon multiobject multioctave multioperation multiorgan multioutlet multipackage multipacket multipage multipane multipanel multiparameter multiparcel multiparent multipart multiparticle multipartite multiparton multiparty multipass multipattern multipayer multipayment multipeak multiperson multiphase multiphonon multiphoton multipicture multipiece multipion multipipe multipipeline multipiston multipixel multiplanet multiplant multiplatform multiplatinum multiplayer multiplot multipoint multipolicy multipool multiposition multipotent multipound multipower multipresent multiproblem multiprocess multiproduct multiprogram multiprong multiprotein multiprotocol multiprovince multipurpose multiquanta multiqubit multirace multirack multirange multireel multireference multiresistant multiresolution multiresponse multirestaurant multiride multirisk multiriver multirole multiroom multirow multisample multiscale multiscaling multiscene multischema multischeme multischool multiscience multiscreen multiseason multisectarian multisection multisector multisegment multisense multisensor multisensory multisentence multiserver multiservice multisession multishade multishell multiship multishipment multishop multisite multisize multiskill multisoliton multisolution multisource multispacecraft multispanning multispeaker multispeciality multispecialty multispecies multispeckle multispectra multispin multispore multisport multisports multistage multistate multistatement multistation multistep multistop multistore multistrain multistrand multistrange multistrategy multistream multistreet multistrike multistudent multisubunit multisulcate multisulfur multisulphur multisurface multisymptom multisystem multitab multitargeting multitaxon multiteam multitemperature multitenant multiterm multitest multitheater multitheatre multitherapist multitherapy multithread multiticket multitier multititle multitooth multitower multitown multitrace multitrack multitrillion multiturbine multiunion multiunit multiuse multiuser multivalley multivalue multivariant multivehicle multivendor multivenue multiverb multivessel multiview multivoltine multivolume multiwall multiwarehouse multiwarhead multiwavelength multiway multiweek multiwell multiwindow multiword multizone mumbly mummiform mumpish mumpy mumsier mumsiest mundaner mundanest mundificatory munificent munting muricate murine murkier murkiest murky muscicapine musclebound muscley musclier muscliest muscly museumesque museumworthy mushier mushiest mushroomy mushy muskier muskiest musky mussy mustardy mustier mustiest musty mutest muybridgean muzaky muzzleloading mycelioid mycenoid myeloid myocadiac myoendocrine myoid myoxine myrrhy mysterioso mythy myxoid nabokovian naevoid naevose naff naffer naffest nagelian naggier naggiest naggy naiant naifer naifest nailbiting naily nameworthy nangry nanocrystalline nanoid nanoparticulate nanosize napiform nappier nappiest nariform narky narratorly narratory narrowband narrowest narrowhead narrowish narsty nary nascent nashian nastier nastiest natant natatory nationist nationwide natrian nattier nattiest natty naucorioid naughtier naughtiest naughty nauseating nausicaan nautiliform naviform neaper neapest neapy nearish neater neatest nebbie nebbier nebbiest nebbishy nebby nebuly necessary necrotising nectarean nectarel nee needier neediest needlenose needly needy nefast negligent negligible nehruvian neighborhoody neighborly neighbourly nekkid nematoid nemean neoadjuvant neoarchean neodymian neogene neomodern nerdier nerdiest nerdish nerdy nerts nertz nervier nerviest nervine nervy nesh nessary nether netherlands nett nettlesome nettly networkwide neurodiverse neuroendocrine neuroevolutionary neurofibrillary neuroid neuromotor neurosecretory neurosensory neutrois nevadan neverending nevisian newbuilt newer newest newfound newish newmown newsier newsiest newspaperish newsroomwide newsworthy nfg ngarrindjeri ngcha niceish nicer nicest nichey nicois nicomachean niddering niffier niffiest niffy niftier niftiest nifty niggardliest niggerish niggerly niggly nightclubby nightmarish nijinskian nilpotent nimbier nimbiest nimble nimbler nimblest nimbyer nimbyest ninepenny nineteenish ninetyish niobatian niobian nippier nippiest nipply nipponese nitid nitpickier nitpickiest nitpicky nitratian nitrian nitrifying nitty noarch nobbier nobbiest nobblier nobbliest nobbly nobby nobel nobiliary nobler noblest nocent noctilucent noctivagant nodose nodulose noetherian nogai nogo noice noirest noirish noisemaking noisier noisiest noisome noisy nonabelian nonabsorbent nonabsorbing nonabstract nonabutting nonacademically nonaccelerating nonaccepting nonaccounting nonaccusatory nonacetate nonacting nonadapting nonaddicting nonadherent nonadipose nonadjacent nonadjoint nonadjusting nonadopting nonadsorbent nonadventure nonadverse nonadvertising nonadvisory nonaerospace nonaffectionate nonafferent nonaffine nonaffluent nonageing nonagency nonagenda nonaging nonagouti nonagrarian nonagreeing nonaid nonairborne nonairfield nonairline nonairport nonairtight nonalarm nonalarming nonalarmist nonalbum nonalienation nonalimony nonalloy nonaluminum nonambient nonambulance nonambulatory nonamino nonanalog nonanalogue nonancillary nonangry nonanimation nonannealing nonantioxidant nonantiparallel nonantisense nonapparent nonappealing nonappearing nonaquarium nonarbitrary nonarcing nonarid nonarmy nonarousing nonartillery nonarts nonary nonasbestos nonasian nonaspirin nonassignment nonattack nonattacking nonattending nonattracting nonauction nonaudio nonauditory nonauto nonautoimmune nonautomation nonauxiliary nonauxin nonavian nonaviation nonawake nonback nonbacklit nonbacktracking nonbad nonbaking nonbald nonbalding nonballet nonbanana nonbanking nonbankrupt nonbankruptcy nonbarbecue nonbarking nonbarley nonbarren nonbasalt nonbaseball nonbaseline nonbasement nonbasketball nonbattery nonbattle nonbauxite nonbayesian nonbeach nonbedside nonbeer nonbelieving nonbellicose nonbenign nonbetting nonbidding nonbiliary nonbinary nonbinding nonbiology nonbiomass nonbirding nonbirefringent nonbiting nonbladder nonblameworthy nonblank nonbleach nonbleaching nonbloc nonblockbuster nonblocking nonblog nonblogging nonblue nonblurring nonblurry nonboard nonboarding nonboating nonboiling nonbold nonbonding nonbonus nonbony nonbookkeeping nonboom nonbooting nonborderline nonboring nonboron nonborrowing nonbotulinum nonbound nonbourgeois nonbovine nonboxing nonbraille nonbranching nonbrass nonbread nonbreaking nonbreastfeeding nonbreathing nonbrewing nonbridge nonbridging nonbrittle nonbroadband nonbroadcast nonbroadcasting nonbroken nonbromine nonbronze nonbrown nonbubbly nonbudget nonbudgetary nonbullying nonbuoyant nonburger nonburning nonburrowing nonbusy nonbutter nonbutterfat nonbuying nonbyte noncabinet noncaching noncactus noncadmium noncaking noncalcifying noncalcium noncalculus noncampaign noncampaigning noncamping noncampus noncanadian noncancer noncanine noncanvas noncarb noncarbon noncard noncardiac noncardiopulmonary noncareer noncarotid noncasein noncash noncasino noncassette noncaste noncatalog noncatchment noncattle noncavitary noncelebratory noncelibate noncement noncensoring noncerium noncertificate noncesium nonchalant nonchalky nonchallenging nonchanging noncharging noncheating nonchecking noncheese nonchelating nonchemistry nonchess nonchicken nonchildbearing nonchinese nonchipping nonchlorine nonchlorofluorocarbon nonchloroplast nonchocolate noncholera noncholesterol nonchord nonchromium nonchurch nonchurchly noncigarette noncinema noncircadian noncirculating noncircus noncitrus noncity noncivil nonclandestine nonclassifying nonclassroom nonclay nonclayey nonclean noncling nonclosing nonclothing nonclotting noncloudy noncloying noncoaching noncoalition noncobalt noncocoa noncoding noncoffee noncognizant noncoherent noncoincident noncoinciding noncoking noncold noncollapsible noncollecting noncollectivist noncollege noncollegiate noncolliding noncolorfast noncombat noncombustible noncommon noncommunicating noncommunity noncommuting noncompact noncompassionate noncompatible noncompetent noncompeting noncompetition noncomplementary noncomplementing noncomplete noncomplex noncompliant noncomplimentary noncomposite noncomprehending noncompressible noncompulsory noncomputer noncon nonconcave nonconcert nonconcessionary nonconciliatory nonconcurrent nonconcurring noncondemning noncondensate noncondominium nonconducting nonconference nonconfessing nonconfident nonconfining nonconfirmatory nonconflicting nonconfluent nonconforming noncongealing noncongruent nonconjoint nonconsensus nonconsequent nonconserving nonconsolute nonconstant nonconstituency nonconstricting nonconstruction nonconsulting nonconsumerist nonconsuming noncontact noncontaminating noncontemporary noncontending noncontingent noncontinuing noncontraband noncontract noncontractile noncontracting noncontradictory noncontributing noncontributory noncontrolling nonconvergent nonconverging nonconversant nonconvertible nonconvex nonconvincing noncooking noncooperating noncoordinating noncopper noncoralline noncore noncoronary noncorporate noncorrect noncorrelating noncorridor noncorrodible noncorroding noncorrupt noncorrupting noncosmopolitan noncotton noncount noncounterfeit noncounty noncoupon noncourt noncovariant noncreaky noncreationary noncredible noncredit noncreditworthy noncrossing noncrumbly noncrustacean noncrustose noncrystalline nonculinary noncult noncurfew noncurly noncurrency noncurrent noncussing noncustom noncustoms noncut noncute noncutting noncyber noncycling noncylinder noncytochrome noncytokine noncytosol nondairy nondamaging nondamping nondancing nondatabase nondating nondead nondeadly nondeaf nondealership nondebt nondecaying nondeclaring nondecreasing nondeducible nondeductible nondeep nondefault nondefecting nondefence nondefense nondeficient nondeficit nondefining nondefinite nondeflationary nondefoliating nondegenerate nondegree nondehydrating nondelaying nondelegation nondeliberate nondemanding nondemonstrating nondenaturing nondenticulate nondeodorant nondepolarizing nondepot nondepreciating nondesensitizing nondesert nondeserving nondesign nondesignating nondesktop nondesperate nondessert nondestination nondeterminate nondeterrent nondeviant nondextrose nondialect nondialup nondialysis nondiamond nondiapausing nondictionary nondiet nondietary nondieting nondifferent nondiffracting nondiffuse nondiffusible nondiffusing nondigestible nondiploid nondipole nondirect nondirty nondisaster nondiscerning nondisciplinary nondiscordant nondiscretionary nondiscriminant nondiscriminate nondiscriminating nondiscriminatory nondisjoint nondisjunct nondisqualifying nondistant nondistinct nondistinguishing nondistorting nondistracting nondisturbing nondivergent nondiverse nondividing nondiving nondivisible nondivision nondivorce nondivorcing nondocking nondoctrinaire nondocumentary nondoing nondomain nondomicile nondominant nondonating nondoorman nondormant nondormitory nondouble nondrainage nondraining nondream nondreaming nondrilling nondrinking nondrip nondriving nondrowsy nondrunken nondrying nonductile nonduplex nondying nonearly nonearning nonearthbound noneastern nonechoing nonecholocating noneducation nonefficient nonegg nonejaculatory nonelderly nonelecting nonelection nonelementary nonelevator nonelite nonemergent nonempty nonemulsion nonendocrine nonenergy nonenforcing nonengaging nonengineering nonenterprise nonentertainment nonequine nonequity nonerect nonerectile noneroding nonerosion nonerupting nonerythroid nonescrow nonestablishment nonestrogen nonestuarine nonethanol nonethylene noneuro nonevaporating noneven nonevil nonevolutionary nonevolving nonexamination nonexcess nonexciting nonexclusionary nonexculpatory nonexecuting nonexercise nonexercising nonexhaust nonexhibit nonexhibiting nonexhibitionist nonexistent nonexisting nonexpense nonexplanatory nonexplicit nonexploiting nonexploratory nonexport nonexpository nonextant nonextensile nonextreme nonfacsimile nonfactory nonfaculty nonfading nonfailing nonfallout nonfalse nonfantasy nonfarm nonfarming nonfashion nonfast nonfasting nonfat nonfattening nonfatty nonfaulty nonfeasible nonfebrile nonfee nonfeeder nonfeeding nonfeminine nonfertile nonfertilizer nonfighting nonfilamentary nonfilming nonfinance nonfinite nonfire nonfirefighting nonfish nonfishery nonfishing nonfission nonfissioning nonfit nonflaccid nonflaking nonflaky nonflashing nonflat nonfleet nonflexible nonflickering nonfloating nonfloor nonflour nonflow nonflowering nonflowing nonfluctuating nonfluent nonfluffy nonfluorescent nonfluorine nonflush nonflushing nonflying nonfoam nonfoaming nonfoamy nonfoliate nonfoodborne nonfootball nonforaging nonforbidden nonforcible nonforcing nonforeclosure nonforeign nonforest nonforestry nonfossil nonfoveate nonfracture nonfracturing nonfragmentary nonfragrant nonfraud nonfree nonfreestanding nonfreeway nonfreezing nonfreight nonfrench nonfrequent nonfriendly nonfrigid nonfrilly nonfringe nonfrozen nonfructose nonfruit nonfruiting nonfuel nonfulfilling nonfull nonfunctioning nonfundraising nonfungible nonfurnace nonfurry nonfusion nonfussy nonfuture nonfutures nonfuzzy nongadget nongadolinium nongambling nongaming nongang nongarden nongardening nongarrison nongasoline nongaussian nongelling nongender nongenuine nongeography nongeology nongermane nongermanium nonghetto nonghostly nongiving nonglare nonglass nonglassy nonglaucoma nongloss nonglossy nonglucose nonglue nongluten nonglycerol nonglycogen nongold nongolf nongoods nongourmet nongoverning nongovernment nongraduating nongrainy nongraphics nongraphite nongrass nongrassy nongravitating nongray nongrazing nongreasy nongreat nongreedy nongreen nongreenhouse nongrey nongrocery nongrooming nonground nongrowing nongrowth nonguerrilla nonguideline nonguilty nongullible nonhair nonhairy nonhanging nonhaploid nonhappy nonhardcore nonhardening nonhardware nonhardy nonharvest nonheadline nonhealing nonhealthcare nonhealthy nonhearing nonheart nonheavy nonheavyweight nonhelium nonheme nonhereditary nonheritage nonhidden nonhighway nonhilly nonhip nonhockey nonhollow nonholy nonhome nonhomework nonhorror nonhospitality nonhostile nonhot nonhotel nonhourly nonhousehold nonhousing nonhumanitarian nonhumiliating nonhungry nonhunting nonhydrazine nonhydrogen nonhyperdiploid nonhypertext nonidempotent nonidentifying nonidle nonidling nonill nonilliterate nonimmediate nonimmune nonimpact nonimperialist nonimport nonimportant nonimporting nonimpotent nonimpressionist nonincandescent nonincendiary noninclusionary nonincreasing nonindependent nonindium noninducing nonindustry noninert noninfantile noninfecting noninfinite noninflammatory noninflationary noninflecting noninformation noninfrastructure noninherent noninheriting noninhibiting noninhibitory noninput noninsane noninspiring noninsulating noninsulin noninsulting noninsurance noninsurrectionary nonintegrating nonintelligent nonintense noninteracting nonintercourse noninterdependent noninterdisciplinary noninterest noninteresting noninterface noninterfering noninterim noninterlocking noninterlocutory nonintermediate nonintermittent noninterpolating noninterrupt nonintersecting nonintimate nonintimidating nonintoxicating nonintroductory noninvading noninvariant noninventory noninverting noninvestigatory noninvesting noniodine nonionizing noniridescent noniron nonirritating nonitinerant nonjade nonjail nonjapanese nonjava nonjazz nonjogging nonjoining nonjoint nonjudging nonjungle nonjunk nonjuring nonjury nonkeratinizing nonkeyboard nonkindergarten nonkinky nonkitchen nonkosher nonlab nonlabor nonlaboratory nonlaboring nonlabouring nonlactating nonlake nonland nonlandowning nonlaptop nonlarge nonlaser nonlatex nonlathering nonlattice nonlaughing nonlaundry nonlaying nonlazy nonlead nonleading nonleafy nonleague nonleaking nonleaky nonleap nonlearning nonleather nonlegacy nonlegendary nonlegitimate nonleukemia nonlevel nonlibrary nonligand nonlimbate nonlimiting nonlinen nonlinking nonliterary nonlithium nonlittering nonliver nonlivestock nonliving nonlobbying nonlocking nonlocomotory nonlodging nonlogistics nonlonely nonlookahead nonloopback nonlooping nonlosing nonlottery nonloving nonlower nonluxury nonlymphoid nonmachine nonmacrophage nonmagazine nonmagnesium nonmail nonmainframe nonmainstream nonmaize nonmalaria nonmalignant nonmammalian nonmanagement nonmandatory nonmanganese nonmanufacturing nonmarble nonmarijuana nonmarine nonmaritime nonmarket nonmarketing nonmarketplace nonmarrying nonmasculine nonmasing nonmassage nonmasticating nonmasturbating nonmasturbatory nonmatching nonmaternity nonmath nonmating nonmatrix nonmature nonmeat nonmeaty nonmedia nonmediating nonmedication nonmeditating nonmedullary nonmembrane nonmemory nonmenthol nonmercenary nonmercury nonmerger nonmessy nonmetro nonmetropolitan nonmexican nonmicrophone nonmigraine nonmigrating nonmigratory nonmilitary nonmilk nonmining nonmissile nonmissionary nonmobile nonmodem nonmoderate nonmodern nonmoisturizing nonmolybdenum nonmonetary nonmoney nonmonthly nonmoralizing nonmorbid nonmortgage nonmortuary nonmotile nonmotivating nonmotorcycle nonmouse nonmovie nonmoving nonmultilayer nonmultimedia nonmultiplex nonmultiplexing nonmultivariate nonmundane nonmurder nonmurine nonmuscle nonmuseum nonmutating nonmutation nonmute nonnegligent nonnegligible nonnegotiating nonnesting nonnetwork nonnew nonnews nonnewsworthy nonnewtonian nonnickel nonnitrogen nonnodulating nonnorthern nonnull nonnursing nonnurturing nonobese nonobjecting nonoblate nonobligate nonobligatory nonobscene nonobservant nonobsolescent nonobsolete nonobstructing nonocean nonodd nonoffice nonofficiating nonoil nonoily nonold nonolfactory nonomnipotent nonomniscient nonopalescent nonopaque nonopera nonoperating nonopposing nonorange nonorderly nonordinary nonorthodox nonoscillatory nonosmium nonoutlet nonoutlying nonoutput nonovarian nonovergrown nonoverhanging nonoverlapping nonovernight nonoverridden nonovert nonovoid nonovulating nonoxidising nonoxidizing nonoxygen nonozone nonpackaging nonpaging nonpaid nonpaint nonpainting nonpalmate nonpaper nonpapillary nonparacompact nonparaffin nonparallel nonparish nonpark nonparkinsonian nonparliamentary nonparsing nonparticipating nonparticipatory nonpartizan nonpasserine nonpassionate nonpast nonpasta nonpasture nonpaternity nonpatronizing nonpaying nonpeak nonpedigree nonpenetrating nonpenicillin nonpenile nonpeptidyl nonperceiving nonperching nonperfect nonperforming nonperiod nonpermanent nonpermeating nonpermissible nonpersistent nonpersonality nonpersonnel nonpertinent nonpetroleum nonphage nonpharma nonpharmacy nonphoning nonphosphorus nonphoto nonphysics nonpiano nonpine nonpink nonpitching nonpituitary nonpivoting nonpixel nonpizza nonplacement nonplague nonplanetary nonplankton nonplant nonplantation nonplantigrade nonplaque nonplatelet nonplatinum nonplaying nonplayoff nonpliant nonplutonium nonplywood nonpoints nonpoisoning nonpoker nonpolarizing nonpolice nonpolite nonpolling nonpolluting nonpolyester nonpolymerizing nonpolypoid nonpolyurethane nonpoor nonporcine nonpork nonpossessory nonpostmodern nonpostpartum nonpotassium nonpotato nonpottery nonpoultry nonpoverty nonpowdery nonpower nonpracticing nonpractising nonpraying nonpreaching nonprecipitating nonprecise nonpredatory nonpredicate nonpregnant nonprehensile nonpremature nonpremium nonprescription nonpresent nonpress nonpressuring nonprestige nonprickly nonpriestly nonprimary nonprime nonprint nonprinting nonprison nonprivate nonprocrastinating nonproducing nonprofane nonprogram nonprogramming nonprojectile nonproliferating nonproofreading nonpropellant nonproper nonproportionate nonproprietary nonpropulsion nonprosecution nonprotesting nonprotozoan nonprotruding nonproven nonprurient nonpubescent nonpublishing nonpulmonary nonpulse nonpurchasing nonpure nonpurine nonpurple nonquantum nonquarantine nonquarterly nonqueer nonquestioning nonqueueing nonqueuing nonquiescent nonquiet nonquota nonrabbit nonracing nonradiate nonradio nonradiopaque nonradium nonradon nonrail nonrailroad nonrailway nonrainforest nonrainy nonranching nonrandom nonrape nonraster nonratifying nonrating nonraw nonreactionary nonrealtime nonrecent nonreceptor nonrecession nonrecessionary nonreciprocating nonrecirculating nonrecoil nonrecombining nonrecording nonrecourse nonrecruiting nonrecurrent nonrecurring nonreducible nonreducing nonredundant nonreference nonreflecting nonreflex nonreform nonreforming nonrefracting nonrefractory nonrefreshing nonregister nonregulatory nonrelaxing nonrelevant nonrelocating nonremote nonrenewing nonrepeat nonreplicating nonreplying nonreproducible nonreproducing nonreptilian nonresearch nonreservation nonreserve nonresilient nonresin nonresistant nonresisting nonresonant nonrespiratory nonresponsible nonrestaurant nonresting nonrestraining nonresurgent nonretail nonretaliatory nonretractile nonretracting nonretrograde nonrev nonrevenue nonreversible nonreviewing nonrevisionary nonrevolving nonrewarding nonrhyming nonrice nonrich nonriding nonriemannian nonright nonrights nonrigid nonrioting nonriparian nonripe nonrisk nonrisky nonriverine nonroad nonroaming nonrobbery nonrobust nonrocky nonromance nonroof nonroster nonrotating nonrotting nonround nonroutine nonrubber nonrubella nonruby nonrugby nonruminating nonrunning nonrusting nonrusty nonsaccharine nonsafe nonsailing nonsalary nonsale nonsales nonsalient nonsaline nonsalivary nonsalmon nonsalt nonsalty nonsalutary nonsandstone nonsapient nonsatisfying nonsaturating nonsave nonsavvy nonscalding nonscaling nonscaly nonscanning nonscarce nonscary nonschizoid nonscholarly nonscholarship nonscissile nonscoring nonscreaming nonscrolling nonscuff nonsea nonsecondary nonsecretory nonsecure nonsecurity nonsedating nonsedimentary nonseeing nonsegregating nonselenium nonselfadjoint nonsemisimple nonsenate nonsenile nonsensationalist nonsensory nonsentient nonseptate nonserotonin nonserum nonserver nonservile nonserving nonsessile nonsevere nonsex nonsexist nonsexy nonshaking nonshallow nonshareholding nonshattering nonshearing nonshedding nonsheep nonshell nonshiny nonshipping nonshivering nonshoe nonshooting nonshopping nonshower nonshowy nonshrink nonshrinking nonshy nonsignificant nonsigning nonsilicon nonsilicone nonsilk nonsilly nonsilver nonsimple nonsimplex nonsimulation nonsinging nonsingle nonsiphonate nonskid nonslack nonslaveholding nonsleepy nonsliding nonslip nonslippery nonsloping nonsmall nonsmart nonsmoking nonsmooth nonsnack nonsnow nonsoapy nonsoccer nonsocializing nonsociology nonsodium nonsoftware nonsoil nonsoiling nonsolicit nonsolicitation nonsoliciting nonsolitary nonsoluble nonsoundtrack nonsoup nonsouthern nonsovereign nonsoviet nonspacing nonspalling nonspare nonsparking nonsparkling nonspeaking nonspecializing nonspecialty nonspecification nonspeech nonspending nonspicy nonspinning nonsplintering nonspoken nonspongy nonsponsoring nonsport nonsporting nonstaff nonstaining nonstale nonstarchy nonstarving nonstationary nonstatutory nonsteak nonsteam nonsteel nonsterilizing nonstick nonsticky nonstiff nonstiffening nonstimulating nonstipendiary nonstockholding nonstolen nonstorage nonstore nonstraight nonstrange nonstratiform nonstray nonstreaming nonstretch nonstretchy nonstrict nonstrike nonstriking nonstudio nonstudying nonstupid nonsubmarine nonsubordinate nonsubordinating nonsubscribing nonsubscription nonsubstrate nonsubtle nonsuburban nonsucrose nonsufficient nonsugary nonsuing nonsulfhydryl nonsulfur nonsulphur nonsummer nonsuperconducting nonsuperfluid nonsupermarket nonsupervisory nonsupplementary nonsupporting nonsurplus nonsurvey nonsusceptible nonsushi nonsustaining nonswearing nonsweet nonswimming nonswitching nonswollen nontabby nontaboo nontackle nontactile nontape nontarget nontariff nontarnish nontaxing nontaxpaying nonteaching nonteak nonteam nontech nontechnology nonteenage nontelescoping nontelevision nontellurium nontemperate nontempering nontemplate nontemple nontennis nonterminating nonternary nonterrible nonterror nonterrorism nontertiary nontest nontext nontextile nonthallium nontheater nontheft nonthickening nonthorium nonthreatening nonthrowing nonthrust nontimber nontin nontipping nontitanium nontitle nontobacco nontorpid nontort nontotalitarian nontouching nontouring nontourism nontouristy nontournament nontrade nontrading nontrain nontransgender nontransient nontransit nontransition nontransitioning nontransitory nontranslucent nontransmissible nontransparent nontransportation nontransverse nontrapping nontravel nontraveling nontreasury nontrendy nontrespassing nontroublesome nontrue nontrump nontuberculosis nontuition nontumescent nontungsten nontwist nontwisting nontyphoid nonultrasound nonultraviolet nonunary nonunderground nonundulating nonuniform nonuniformitarian nonunion nonunique nonunitary nonupper nonupset nonuranium nonurban nonurea nonurethane nonurgent nonurinary nonurine nonusing nonuterine nonutilitarian nonutopian nonvacant nonvacation nonvacationing nonvaccine nonvalid nonvalidating nonvanadium nonvanilla nonvanishing nonvarsity nonvarying nonverbatim nonverbose nonvertebrate nonvertex nonveterinary nonvibrating nonvibratory nonvictimizing nonvideo nonviewing nonvintage nonvinyl nonviolet nonvirile nonvisa nonviscid nonvisible nonvisiting nonvivid nonvocabulary nonvocalizing nonvoice nonvoid nonvolant nonvolatile nonvolume nonvoluntary nonvolunteering nonvomiting nonvortex nonvoting nonvuggy nonwage nonwaiting nonwaiver nonwalking nonwarehouse nonwartime nonwater nonwaterborne nonwaterproof nonwatertight nonwatery nonwave nonwaveform nonwaveguide nonwavering nonwaxy nonweak nonwealthy nonweapon nonweapons nonweather nonwedding nonweekend nonweekly nonwetting nonwhale nonwhaling nonwheat nonwheelchair nonwhiskey nonwhole nonwholesale nonwild nonwilderness nonwildlife nonwind nonwinding nonwine nonwinning nonwinter nonwobbly nonwood nonwooden nonwoodland nonwoody nonwool nonworking nonworkplace nonworkshop nonworthwhile nonwriting nonwritten nonxanthine nonxenon nonxylene nonxylitol nonxylose nonyellow nonyellowing nonyielding nonyoga nonyoung nonzinc nonzirconium nonzonate nonzone noobish noodly normalish norse northeasterly northeastern northeasternmost northern northernly northernmost northmost northwestern northwesternmost nosey noshore nosier nosiest nosy notchy notewise noteworthier noteworthiest nott nouny nourishing nouveau novatian novelesque novembery nubbly nubby nubian nuder nudest nudiustertian nuevo nugatory nuggety nullary nulliploid nullipotent numbest numerary nummy numptyish nunly nurturant nutant nutbrown nutmeggy nutso nutsy nuttier nuttiest nutty nyc nycer nycest nyctian nymphean nymphine nymphish nymphly nymphoid nyunga oafish oaken oakier oakiest oaky oaten oathbound oaty oaxacan obcordate obdeltoid obdurate obedient obeisant oberonian obese obfuscatory objurgatory oblanceolate oblatory obligatory obliteratingly oblyrate obmutescent obovate obovoid obpandurate obpyriform obreniform obsagittate obscene obscener obscenest obscurest observant obsolescent obstinant obstinate obtect obtuse obtuser obtusest obzocky oceangoing oceanside ocellary octan octapartite octastyle octavating octobery octopoid octostyle oculomotor odd odder oddest oddish odontoid odyssean oecumenopolitan offbase offfield officewide offish offlist offputting offroad offsite offsuit offtrack offwing ogreish ogrish ogry oikish oilier oiliest oilproof oily okayish older oldest oldish oldskool olfactible olfactory olid oligocene oligocyclopropyl oligopotent olivary oliver olivey omakase omissible omnicompetent omnificent omnipotent omnipresent omniscient omnisentient omphalinoid omy onefold onetime oneway onfield onglaze ongoing onhand onionier onioniest oniony onkus onliest onlooking ono onrushing onry onscreen onside onsides onsight ontarian onwing oofy oozier ooziest oozy opalescent opaquer opaquest opencast operagoing operose opportune oppugnant optomotor orangeish oranger orangest orangier orangiest orangish orangy orbiculate orbitomaxillary orbitosphenoid orcadian ordovician organoaluminium organoaluminum organobarium organobismuth organoboron organocadmium organocalcium organocarbon organocerium organocesium organochromium organocobalt organocopper organodysprosium organoerbium organoeuropium organogallium organogermanium organogold organohafnium organohydrogen organoindium organoiridium organoiron organolanthanum organolead organolithium organolutetium organomagnesium organomanganese organomercury organomolybdenum organoneodymium organonickel organoniobium organoosmium organooxygen organopalladium organophosphorus organoplatinum organoplutonium organopolonium organopotassium organorhenium organorhodium organorubidium organoruthenium organosamarium organoscandium organoselenium organosilver organosilyl organosodium organostrontium organosulfur organosulphur organotantalum organotechnetium organotellurium organothallium organothorium organotin organotitanium organotungsten organouranium organovanadium organoxenon organoytterbium organoyttrium organozinc organozirconium orientationist originary orinoco orkish ornate orne ornee ornerier orneriest ornery orodispersible orosirian orotund orthodox orthograde orthoprax ortonesque orwellian oscillatory oscine osmeriform osmian osmoregulatory osmoresistant osseocarnisanguineoviscericartilaginonervomedullary ostensible othersome otherworldish otherworldly otherworldy otiose otsu ould oulder ouldest ourie outbound outbursting outcoming outdone outdoor outdoorsier outdoorsiest outdoorsy outdrawn outdriven outermore outermost outflowing outflown outflung outgrown outlain outlandish outlying outmost outre outridden outsiderish outsiderly outspoken outspread outstanding outstate outsung outsworn outworn outwritten ovarian ovate ovenproof overabundant overbank overbattle overbearing overbeaten overbitter overblown overbold overbore overbought overbright overbroad overcompensatory overcomplete overcomplex overconfident overcontact overconvergent overcute overdemanding overdense overdependent overdone overdrawn overdriven overdue overeager overearnest overeaten overelaborate overexuberant overfine overflown overfond overfrequent overfriendly overfull overgone overgreedy overground overgrown overhasty overhot overindulgent overjubilant overkeen overladen overlain overland overlarge overlavish overlong overloose overloud overluxuriant overlying overmighty overmodest overmuch overnice overprecise overproof overproportionate overproud overready overreliant overridden overripe overrude oversanguine overscale overseen oversimple oversize oversoft oversold overspeeding oversquare overstage overstrict overstrung oversubtle oversweet overt overtaken overthrown overtrusting overwise overwordy overworn overwritten overwrought oviform ovulatory owld owlish oxbridgian oxonian oxycalcium oxygenian oxyhydrogen ozymandian pabulary pacesetting pacey pacier paciest pacy paenultimate pagnolesque painkilling painstaken painterly paintier paintiest painty paiwan palaeeskimo paleoarchean paleochristian paleofantasy paleogene paler palest palish palladian palladoan pallescent pallid pallier palliest palmatifid palmatipartite palmatisect palmerian palmerstonian palmiest palmy palpitant paltrier paltriest paltry palustrine panamax pancyprian pandaedalian pandean pandoran pandurate panduriform pangasinan panglossian panicky paniculate pantagruelian panzoist paperbound papery papillary papillate papilliform papillose papulose papyriform paracompact paraconsistent paracrine paradisiac paramount pareve paripinnate parkier parkiest parkinsonian parkside parky parliamentary parmenidean parmese parmigiana parro parroty parsnipy partaken partible participatory partite parturient partygoing partywide pascalian passant passeriform passible pastier pastiest patchier patchiest patchworky patchy patellate patelliform patelline pathbreaking pathetisad pathwise patibulary pauce paucibacillary paucidisperse pauciloquent pauline paultry paunchier paunchiest paunchy pavid pavlovian pavonian pawkier pawkiest pawky paydirt peacefullest peachier peachiest peachy peacockian peacockish peacocky peakean peakier peakiest peaky peanutty pearlescent pearlesque pearlier pearliest peary peatier peatiest peaty pebblier pebbliest pebbly peccant peckish pecksniffian pectiniform pecuniary pedaliter pedate pedicellate pediform pedunculate peepier peepiest peepy peevish peircean pekid pelagian pellucid peltate pencilly penicillate penile penisy pennate penniform pennyante pennywise pensile pentacoordinate pentacuspid pentadactyl pentadentate pentakis pentaploid pepperminty peppery peppier peppiest peppy peptidyl pepysian peralkaline perceptible perceptuomotor percoid percurrent perdu perdue peremptory perfectest perfectible perfecto perfervid perfluoro perfoliate perforant perfumey perfunctory perhydro peribiliary pericapillary periciliary periclean perigastrulation periinfarct perimammary perimortem periovulatory peripartum peripubescent perisylvian peritectoid periurban perivitelline perkier perkiest perky perlish perlocutionary perlsian permafrozen permian permissible pernickety peronate persecutory perseverant perseverent persistent persnickety perspiratory persuasible perter pertest pertinent pertuse perugian perverse perviest pervy peskier peskiest pesky pesty petaloid petascale petit petite petrean pettier pettiest pettish petty petulant pezizoid phagostimulatory phantasmagorian pharate phasematching phaseoliform phat phatter phattest phildickian philippine phlegmier phlegmiest phlegmy phoebean phonier phoniest phosphatian phosphorent phosphorian phossy photoconvertible photodamaging photodissociating photoinducible photoionizing photolabile photolithographically photoluminescent photoreversible photostationary photostimulating phototransducing phthisicky phunky phytelephantoid phytosanitary picassian picayune picayunish piccata pickier pickiest pickproof picksome picnicky picoscale picturesque piddlier piddliest piddly piebald piggier piggiest piggish pigmentary pigovian pilferproof piliform pillowtop pillowy pilose pimpish pimplier pimpliest pimply pimpy pinchy pindling pineappley pineapply piney pinguid pinier piniest piniform pinker pinkest pinkier pinkiest pinkish pinnate pinnatifid pinnatipartite pinnatisect pinteresque piny piquant piriform piscatory pisciform piscine pissier pissiest pissy pistillate pitcairnese pitchier pitchiest pitchside pitchy pithier pithiest pithy pitifuller pitifullest pixieish pixyish pizazzy pizzaiola pizzazzy placatory placid plaguesome plaguey plaguier plaguiest plaguy plainer plainest plainish plainspoken planckian planeside planest planetary plangent planoconcave planoconvex plantwide plashy plasmacytoid plasticky plateresque platey plathian platinian platinoan platonian platykurtosis platyrrhine plausible plautine playline playsome pleasant pleasanter pleasantest plebby pleistocene plexiform pliant plinian plinky pliocene ploppier ploppiest ploppy plotlessness plottier plottiest plotty pluckier pluckiest plucky plumbean plumbian plumboan plumiliform plummier plummiest plummy plumose plumpest plumpish plumpy plumulose plumy plunderage pluriform pluripotent plusher plushest plushier plushiest plushy plutarchian pluterperfect pobby poddier poddiest podgier podgiest podgy poean poesque poignant pointier pointiest pointwise pointy pokier pokiest polite politer politest polliniate pollinose pollockian pollyannaish pollyannish poltroonish polyacid polyadelphian polyandrian polycarpellary polycatenary polychrome polycotyledonary polycrystalline polydactyl polydent polydentate polydisperse polydomain polydrug polyembryonate polyendocrine polygamian polygonate polygyne polygynian polyhalogeno polyhydroxy polyinstanton polyloquent polymorphean polymyarian polymyodian polymyoid polynemiform polynucleate polyorchid polyphase polypiform polypine polypoid polypotent polysectarian polysperm polystrate polysubstance polyvariant polyvinyl pomeridian pomoan poncey poncier ponciest poncy pondian pondy ponerine pongier pongiest pongy pontine ponzi poochy pooey poofier poofiest poofy pooiest poorer poorest poorish popcorny popean popish popperian poppier poppiest poppish porciform porcine porkier porkiest porkish pornier porniest porny porridgey porridgy portlier portliest portly pos posey posh posher poshest positiver positivest possessory possibler possiblest postaccident postadministration postadsorption postapartheid postarrest postassembly postassessment postattachment postauction postbaccalaureate postbailout postbankruptcy postbattle postbellum postbinge postboomer postbounce postboxing postbreakup postbubble postcampaign postcancer postcapitalist postcaucus postcollege postcollegiate postcolumn postconcert postconcussion postconflict postconsumer postconviction postcopulatory postcorrelation postcourse postcrash postcrisis postdeadline postdebate postdefection postdeployment postdisaster postdischarge postdoctorate postdose postdraft postearthquake postelection postepisode postevent postexecution postfight postfilm postflight postflood postflop postfuck postfusion postgadolinium postgelation postgenocide postgermination postharvest posthearing postherpes postholiday posthurricane postimplantation postindependence postinformation postinitiation postinjection postinvasion postisolation postlapsarian postlayoff postlegislation postliberation postliterate postlockout postlunch postmagma postmarathon postmarket postmarketing postmarriage postmatch postmedium postmerger postmeridian postmidnight postmigratory postmillennium postmodern postmonsoon postmove postmovement postnucleation postobese postorder postovulation postovulatory postpaid postpainterly postpartisan postpartum postperformance postpetroleum postplaying postpolio postpoliomyelitis postpolymerization postpractice postpregnancy postpremiere postprenylation postpresidency postprimary postprocedure postpuberty postpubescent postpublication postpunk postqualifying postrace postracist postratification postreaction postrecession postrecruitment postrelease postresidency postresonance postretirement postrevolutionary postround postsale postsaturation postscreening postsecondary postselection postsemester postsermon postservice postsex postshock postshow postslavery postsleep postsnap postsocialist poststimulus poststorm poststrike postsuicide postsurge postswim posttraining posttransfer posttransition posttransplantation posttrauma posttreatment posttumor postundergraduate postvacation postverdict postveto postvictory postviewing postvote postweaning postworkout potassian potatoey potatory potbound potent potterian pottier pottiest poufier poufiest poufy poulantzasian poundian poutier poutiest pouty pov powdery powerfullest poxier poxiest poxy praeeminent praiseworthier praiseworthiest praiseworthy prancy prankier prankiest prankish pranksome pranksterish pranky praseodymian prasugrel prawny preacherly preachier preachiest preachy preadipose preadmission preassessment preattack preauction prebankruptcy preblog preboom preborn prebound prebreak prebubble prebudget prebuilt precambrian precampaign precatory precaucus precautionary precharge precinema precise preciser precisest preclair precode precognisant precognizant precollapse precollege precombustion precommunist precompetition precomputer preconcert preconference preconquest preconsumerist precontact precontest preconvention preconviction precopulatory precorrelation precrash precredit precrisis precursory precurtain predatory predebate predecimalisation predecimalization predefection predeparture predeployment predialysis prediluvian predinner predisaster predischarge predisco prediscount prediscussion predraft predrought preemergent preeminent preemptible preemptory preequilibrium preexposure prefatory prefeminist prefight prefilm prefire preflare preflood preflop prefocus prefuck pregenocide pregentrification preggers preggo pregnant pregraduate preground prehatch prehatching prehearing prehensile prehiatus prehire preholiday prehung prehurricane preimmune preimpact preimplantation preimpressionist preinauguration preincident preindictment preinjection preintegration preintermission preinvasion prejudicate prejump prelabour prelanding prelapsarian prelaugh prelaunch prelegislation preliberation prelife preliminatory prelockout prelunch premalignant premammalian premarketing premarkup premarriage premarxist prematch prematernity premature premaxillary premechanization premeeting premerger premilitary premisory premodern premonitory premonsoon premorbid premotor premyelinating prenewtonian prenex prenubile prenucleation preobese preocclusion preopening preoperation preparatory prepartum preperformance prepetition preplanetary preplayoff preponderant prepopulist prepossessing prepotent preppier preppiest prepractice prepregnancy prepremiere prepress preprimary prepuberty prepubescent prepublication prepurchase prequalify prequantum prerace preratification prerecession prerecessionary preregulation prerelease preremote prerenovation prereplication preretirement prerevolution prerevolutionary preride prerock preround presaturation prescient prescriptible presectarian presecurity presenescent presenile presentence presentencing presentient presentist preservice presex preshift preshock preshot preshown preshrunk preslavery presleyesque presmoking presnap prespill prespin prestimulus prestissimo prestorm prestrung presuburban presuicide presupernova presurge presurgery preswim pretassel pretax pretaxation preteenage pretelecast pretheater pretorian pretour pretournament pretraining pretransplantation pretransport pretravel prettier prettiest prettyish pretumor preunion preurban prevacation prevenient preventible prevote prewedding prewritten pricey pricier priciest pricklier prickliest prickly pricy pridoli priestlier priestliest priestly priggish prima primavera primetime primmer primmest princelier princeliest princessly princessy priscan prissier prissiest prissy pristine privater privatest prizewinning prizeworthy proabortion probationary proboscidate probosciform prochoice proclamatory procreant procrustean procumbent prodeath prodefendant prodemocracy prodrop producible profanest profinite profitmaking profitseeking profligatory proforma profound profuse progeroid prograde progredient prohibitory prolate prolix promarket prominent promising promissory promotility promptest promulgatory promyelinating prone pronunciatory proper properer properest propitiatory proplaintiff proplanetary proprietary proprietory proresearch proscience prosier prosiest prosuicide prosy protaspid protean protestant protistan protobacco protobinary protocollary protocuneiform protofascist protofeminist protominimalist protomodern protoneutron protoplanetary protractedly protractile protrade protrusible protrusile protuberant proud prouder proudest proustian proven provident provincewide proviolence provisory prowest prowhaling prudent prudish pruinose pruney prurient pryany pseudoagouti pseudobinary pseudoconcave pseudoconvex pseudohallucinatory pseudohypersensitivity pseudoliterary pseudopregnant pseudoprofound pseudoproper pseudorandom pseudoreversible pseudy psychobabbling psychomotor pterygiate pterygoid pterygopalatine ptolemaian ptolemean pubbier pubbiest pubbish pubby pubescent pucka puckeroo puckery puckish puddingy puddley puddly pudgier pudgiest pudgy pudibund puellile puerile puffier puffiest puffingly puffy puginesque puisne puissant pukey pukka pulicene pulicine pulmonary pulpier pulpiest pulpish pulpy pulsatile pulsatory pulverulently punchier punchiest punchy punctate pungence pungent punier puniest punkest punkier punkiest punkish punnier punniest punny puny pupillary puppyish purblind purdier purdiest purdy pureplay purer purest purificatory purkinjean purpler purplest purplish purply pursy purty purum pushdown pushier pushiest pushy pussier pussiest pustuliform putrefacient putrescent putrescible putrid puttier puttiest puzzly pynchonesque pyranoid pyrenean pyriform pyrrhonian pythagorean pythian pythonesque qid quackish quadcore quade quadratfrei quadrible quadricostate quadridentate quadrifid quadrifoil quadrifoliate quadriform quadrijugate quadrilobate quadripartite quadripennate quadrivariate quadrivoltine quadrupartite quaggier quaggiest quaggy quagmiry quaint quainter quaintest quaintish quakeproof quakerish quakerly quakey quakier quakiest quaky qualificatory qualmish quarrelsome quartersawn quartzier quartziest quartzose quartzy quasi quasiblack quasibound quasiconcave quasiconvex quasicrystalline quasidocumentary quasifree quasigovernment quasiparallel quasiperfect quasirandom quasisplit quasistationary quate quaternary quaternate quavery queachy queasier queasiest queasy queazy quechuan queenish queenlier queenliest queeny queerer queerest queerish quercine quethen quibbly quicker quickest quickfire quickfrozen quicksandy quicksilvery quiescent quietest quietish quilly quilty quinary quinian quinonoid quinquedentate quinquefid quinquefoliate quinquefoliolate quinquelobate quinquepartite quinquevalve quintenary quippiest quippy quirkier quirkiest quirky quivery quondam quoteworthy quotinoctian qwerty rabbity rabblerousing rabelaisian rabid raccoonish racemiform racemose racier raciest rackety racy radcliffean radcliffian radiationproof radicant radiculose radiodense radiofrequency radiolitid radiolucent radioopaque radiopaque radiopure radioresistant radiosensitizing radonproof raffish rafty raggedier raggediest raggedy raggier raggiest raggy ragtag ragtimey railside rainbowish rainbowy rainfast rainier rainiest rainstormy rainswept rainy raisiny rajasthani rakish rallentando ralline ramiform rammy ramose rampant ramshackle ranarian rancid randian randier randiest randomest randomish rangant rangebound rangefree rangier rangiest rangy raniform ranine ranivore ranker rankest ranty rapey raphanoid rapider rapidest rapscallionly rapt rareish rarer rarest raring rashest rashy raspberryish raspier raspiest rasputinesque raspy ratchety ratproof rattier rattiest rattish rattlier rattliest rattly ratty raunchier raunchiest raunchy ravening raw rawer rawest rayproof readdicting readerly readier readiest readworthy reaganesque realer realest realler realtime rearmost rearview reattribute reawoken rebegun reborn reborne recent recessionary recessionproof recherche rechosen recognizant recommendatory reconciliatory recondite reconstructible recriminatory recrudescent rectouterine recurrent redbrick redder reddest reddish reddy redivivus redmondian redneckish rednecky redone redrawn redressible reducible redundant redux reechy reedier reediest reedy reefy reeky reemergent referrible reflationary refluent refractile refrangible refringent refrozen refulgent regalian regardant regionwide regiven regnant regrown regulatory reheard rehidden reichenbachian reillustration reiterant relationshippy relevant reliant religiose relucent reluctant remaining remanent rembrandtesque reminiscent remiss remissible remittent remoter remotest renascent reniform renitent renunciatory reordrant repentant reporterly repressible reproducible reproductory repudiatory repugnant requisitionary resawn researchy resemblant resewn reshaken residuary resignedly resilient resiny resistible resoluble resolute resoluter resolutest resonant resown respiratory resplendent responsible restiff restitutory restrainedly restricken resupinate resurgent resworn retaken retaliatory rethrown reticent retiform retinogeniculate retorn retractile retrocedent retrofire retroflex retromingent retroserrate retrousse retuse revegetation revelationary revelatory reverberant reverberatory reverent reversible revertant revertible revisionary reworkability rewoven rewritten reynoldsian rhabdoid rhadamanthine rhean rhenian rheumaticky rheumatoid rheumy rhonchisonant rhubarby rhyacian riant ribbony rich richer richest richish ricketier ricketiest ricketty rickety ridden ridgy ridibund riemann riemannian rifer rifest riffier riffiest riffly riffy righter rightest righthand rightish rightwing rigid rilkean rimose rimy ringent ringleading ringside rioplatense riparian riper ripest ripply ripshit ripsnorting ripstop ripuarian risen risible riskfree riskier riskiest risktaking risky risque ritenuto ritzier ritziest ritzy riven riverain riverine roadgoing roadshown roadworn roadworthy robespierrean robust robuster robustest rocambolesque rockbound rockier rockiest rockingest rockish rockwellesque rocky rodentproof rodenty rogatory roguish roily rollaway rolldown rolltop romanesque romany romish rooky roomier roomiest roomwise roomy roopit roopy rootsy ropey ropier ropiest ropy rorty roscian roseate rosid rosier rosiest rosish rotatory rotiform rottener rottenest rotund rougher roughest roughish roughshod roundarm roundest roundish rousseauesque rovian rowdier rowdiest rowleian rubberier rubberiest rubberoid rubbery rubbishy rubblier rubbliest rubbly rubenesque rubescent rubicose rubicund rubidian rucervine ruddier ruddiest rude ruder rudest rudimentary rufescent ruffly ruggeder ruggedest rugose rulebound rulier ruliest ruly rumanian rumbly rummest rumsfeldian runcible runcinate runiform runnier runniest runny runty runyonesque rupestrian rurban rushy russificatory rustier rustiest rustly rusty ruthenian rutherfordian ruthian rutilant ruttiest ruttish rutty sabbatine sabelloid sabinian sabulose sacagawean saccate saccharine saccharoid sacciform sacculate sacrosanct sad sadder saddest saddish saddlesore sadducaean sadducean sadduceean sadean sadian saditty safeish safer safest saffrony safranophile sager sagest sagey saggier saggiest saggy sagier sagiest sagittate sagittiform sagy sahaguntine saharan sahelian sailworthy saintish saintlier saintliest saintly salady salafi salamandrian salamandriform salamandrine salamandroid salian salingerian saliniform salique salishan salitrose salivary salivatory sallower sallowest sallowish sallowy salmoniform salmony salopian saltatory saltfree saltier saltiest saltish saltproof salty salutary salvifying samarian samean samely samey sanatory sandblind sandier sandiest sandpaperish sandpapery sandwichy sane saner sanest sanguinary sanitary sanserif sapid sapient sappier sappiest sappy sarcomatoid sardanapalian sarkier sarkiest sarky sartin saskatchewanian saskatonian sassier sassiest sassy satem satiny satisfactory satrapian saturnalian saturnine sauciest saucy sausagey sausagy savantish savilian savoury savvier savviest sawdusty sawn saxicoline saxon saxophony scabbier scabbiest scabby scabrosity scalariform scalefree scalene scaleproof scalier scaliest scaly scampish scandent scandian scanian scanter scantest scantier scantiest scanty scarabaeoid scarcer scarcest scarecrowish scaredest scarier scariest scary scattershot scattery scattier scattiest scatty scaturient scelerate scelidate schizy schlockier schlockiest schlocky schloopy schlubbier schlubbiest schlubby schlumpier schlumpiest schlumpy schmaltzier schmaltziest schmaltzy schmalzier schmalziest schmalzy schmancy scholarly schoolbookish schoolboyish schoolgirlish schoolgirly schoolgoing schoolish schoolmarmish schoolteacherish schoolwide schtum schumpeterian schwarzeneggeresque scient scillonian scintillant scissile sciurine scleractinian scombroid scorchy scoriac scoriform scornworthy scorpaeniform scorpioid scorsesean scortatory scottish scoundrelly scouty scraggier scraggiest scraggly scraggy scrambly scrappier scrappiest scrappy scratchier scratchiest scratchproof scratchy scrawnier scrawniest scrawny screamier screamiest screamingest screamy screechier screechiest screechy screenbound screwier screwiest screwy scribblier scribbliest scribbly scrimy scrolly scrotiform scroungy scrubbier scrubbiest scrubby scruffier scruffiest scruffy scrummier scrummiest scrummy scrumtrelescent sculpturesque scummier scummiest scummy scumsucking scungier scungiest scungy scurfy scurvier scurviest scutate scutiform scuzzier scuzziest scuzzy sdrucciola seaborn seaborne seagirt seagoing seamanly seamier seamiest seamy seasick seasonlong seaswept seaweedy seaworthy sech seclusionary second secretory sectionwide securer securest securitarian sedater seddity sedecuple sedentary sedgier sedgiest sedgy sedimentary seducible seedeating seedier seediest seedy seemlier seemliest seen seethrough segmentary segmentwise segreant sejant sejunct selachian seld selecting selenatian selenian selenitian selfadjoint selfcongratulatory selfconsistent selfgravitating selfish selforganizing selfsame selfsome selfstanding seljukian semee semiabstract semiamusing semianimate semiarid semibold semibuoyant semiclad semicoherent semiconducting semiconjugate semicrystalline semidefinite semidilute semidirect semidiscrete semidivine semidry semifertile semifinite semiflexible semiforce semifrozen semigloss semihallucinatory semihidden semihollow semihuman semiinfinite semilegible semilegitimate semiliterate semilunate semiluxury semimajor semiminor seminude semipermanent semiplausible semiposh semiprivate semiquantum semirare semirecumbent semirevealing semirigid semischolarly semisecret semisimple semisoft semisolid semistupid semisweet semiterete semitransparent semivolatile semiweekly semiwild semperjuvenescent sempervirent semy senary senescent senile seniorest sensate sensible sensorimotor sensory separatory septate septembery septempartite septenary septenate sequoian serener serenest serer serest serfish seri serocompatible serodiscordant serrasalmine serrulate serverside servile sesotho sesquialterate sesquiplicate sessile setiform seussian sevenpenny seventeenish seventyish severe severer severest sewn sexagenerian sexier sexiest sexpartite sexy seychellean shabbier shabbiest shabby shacky shadier shadiest shadowier shadowiest shadowy shady shaggier shaggiest shaggy shaken shakespearian shakey shakier shakiest shaky shaley shallower shallowest shallowish shaly shamanesque shambling shambly shampooey shannonian shapelier shapeliest shapely shareowning sharky sharpest shatneresque shatnerian shatterproof shaven shearfree sheepier sheepiest sheepish sheerer sheerest sheisty sheldonian shellproof shelly shelvy shepherdly sherbety sherlockian shermanesque shetlander shewn shier shiest shife shiftier shiftiest shifty shimmery shingly shinier shiniest shinto shiny shipboard shipborne shipbound shipshape shipwide shirty shish shitey shitier shitiest shittest shittier shittiest shitty shiveringly shivery shlocky shlubby shmexy shodden shoddier shoddiest shoegazey shonkier shonkiest shonky shoogly shopkeeperly shoppier shoppiest shoppy shopworn shorebound shoreside shortcrust shortest shorthold shortish shortleaf shorttail shoutier shoutiest shouty showbizzy showerier showeriest showery showier showiest shown showstopping showy shrewd shrewder shrewdest shrewdish shrewish shrieky shriller shrillest shrimpier shrimpiest shrimpy shrinky shriven shrubbier shrubbiest shrubby shrunken shticky shtokavian shtoom shtum shuddery shuffly shure shyer shyest shyish shysterish sialyl sibylline sicker sickest sickish sicklier sickliest sickly siderian sidescrolling sidesplitting siftproof sightlier sightliest sightly sightseen sightworthy sigmate significant silicatian silician silken silkier silkiest silky sillier silliest siltier siltiest silty silurian silvan silverier silveriest silverish silvern silvery simpatico simpler simplest simpsonian simpy sin sin2 sincere sincerer sincerest sinewy singlehandedly singleplayer singsongy sinister sinisterwise sintery siouan siphonapteran sisyphean sisyphusean sitwellian sixpenny sixteenish sixteenpenny sixtiesish sixtyish sizey sizy skankier skankiest skanky skaterly skeely skeevier skeeviest skeevy skeezier skeeziest skeezy sketchier sketchiest sketchy skewampus skewbald skewiff skewwhiff skiddier skiddiest skiddy skidproof skiey skilfull skillo skimmy skimpier skimpiest skimpy skinnier skinniest skint skintight skippy skipworthy skittery skittish skronky skunky skyborne skyclad skyey skylit skyscraping skywards skyworthy slabbier slabbiest slabby slackerish slackerly slackest slaggiest slaggy slain slangier slangiest slangy slanty slaphappy slapsticky slatternly slaty slaveholding slavish sleazier sleaziest sleazy sleeker sleekest sleepaway sleepbound sleepier sleepiest sleetier sleetiest sleety slender slenderer slenderest sleuthy slickest sliddery slidey slier sliest sligh slighter slightest slightish slimier slimiest slimline slimmest slimy slingshotten slinkier slinkiest slipperier slipperiest slippery slippier slippiest slippy slipshod slithery slithy slitten slittier slittiest slitty sliven slobbery slobbier slobbiest slobbish slobby slopeside slopey sloppier sloppiest sloppy slopy sloshier sloshiest sloshy slouchier slouchiest slouchy sloughy slovakian slovenlier slovenliest slovenly slowest slowish sludgier sludgiest sludgy sluggardly sluggish sluggisher sluggishest slummier slummiest slummy slumpy slurpy slurrier slurriest slushier slushiest slushy slutsky sluttier sluttiest sluttish slutty slyer slyest smaller smallerscale smallest smallish smallscale smalltime smaragdine smarmier smarmiest smarmy smarter smartest smarting smashmouth smashproof smearier smeariest smeary smeggy smellier smelliest smelly smexier smexiest smexy smilier smiliest smilish smirkier smirkiest smirky smithian smithsonian smitten smoggier smoggiest smokefree smokeproof smokey smokier smokiest smoky smoochier smoochiest smoochy smooshy smoothest smoothish smudgier smudgiest smudgy smug smugger smuggest smurfier smurfiest smurfy smushy smuttier smuttiest smutty snacky snaggier snaggiest snaggy snailish snakebit snakebitten snakey snakier snakiest snaky snappier snappiest snappish snappy snapshooter snarkier snarkiest snarkish snarky snarlier snarliest snarly snatchier snatchiest snatchy snazzier snazziest snazzy sneakier sneakiest sneaky sneery sneezier sneeziest sneezy snellest snide snider snidest sniffier sniffiest sniffly sniffy sniggery snippier snippiest snippy snittier snittiest snitty snobbier snobbiest snobbish snobby snoof snoopier snoopiest snoopy snootier snootiest snooty snoozier snooziest snoozy snottier snottiest snotty snoutier snoutiest snouty snowblind snowbound snowflakey snowflaky snowier snowiest snowstormy snowsure snowswept snowy snufflier snuffliest snuffly snuffy snugger snuggest snugglier snuggliest soapier soapiest soapy soaraway sobby soberer soberest sociorealist sockdologizing socko sodian soft softbound softer softest softish softnose softpaste softshell softspoken softwater soggier soggiest soggy soigne soignee soilborne solartype soldierly solemn solidary solider solidest solivagant solly solovian soluble solzhenitsynian somalian somatoform somatomotor somatosensory somber somberer somberest sombre sombrest somethingth somnambulant somnambulatory somnolescent sonant songworthy songwriterly songy soople sootier sootiest sooty sophoclean soppier soppiest soppy sorbian sordid sorer sorest sorrier sorriest sottish soubrettish soulagean soulish soundest soupier soupiest soupy sourer sourest sourish southeastern southeasternmost southern southernmost southeyan southmost southwestern southwesternmost sown sowwy soz spaceborne spacesick spaceworthy spacey spacier spaciest spacy spammier spammiest spammy spanglier spangliest spangly spanwise sparer sparest sparklier sparkliest sparkly sparry sparse sparser sparsest spartan spathulate spazzy specieswide speciose speckly speculatory speedier speediest speedy spellbinding spellbound spendier spendiest spendy spermatozoan spesh speshul sphexish sphingian spicier spiciest spicy spidery spielbergian spiffier spiffiest spikey spikier spikiest spiky spillproof spilly spinachy spindlier spindliest spindly spinechilling spinescent spinier spiniest spinnier spinniest spinoid spinose spinozan spinsterish spinsterly spintrian spiny spiry spitten spitty spivakian spivvish spivvy splashier splashiest splashproof splashy spleeny splendid splendiloquent splintery splitproof splodgier splodgiest splodgy splotchier splotchiest splotchy spludgy spluttery spockian spoken spongeworthy spongey spongier spongiest spongiform spongy sponsible spoofier spoofiest spoofy spookier spookiest spookish spooky spooney spoonier spooniest sporebearing sportier sportiest sportsmanly sporty spottier spottiest sprack sprauncy sprawly sprayproof sprier spriest sprightlier sprightliest springier springiest springy sprinkly sproingy sprote sprouty sprucer sprucest spry spumy spunkier spunkiest spunky spunlaid sputtery spyproof squabbly squalid squaliform squallier squalliest squallish squally squamiform squamulose squarefree squarer squarest squarish squarrose squashier squashiest squashy squattier squattiest squatty squawkier squawkiest squawky squeakier squeakiest squeaky squeamish squeezy squelchier squelchiest squelchy squewiff squickier squickiest squicky squidgier squidgiest squidgy squiffier squiffiest squiffy squigglier squiggliest squintier squintiest squinty squirmier squirmiest squirmish squirmy squirrelish squirrellier squirrelliest squirrelly squirty squishier squishiest squishy squooshier squooshiest squooshy sravya stabby stabler stablest staccatissimo stagebound stagestruck stagewide stagey stagflationary stagier stagiest stagnant stagy staid staider staidest staler stalest stalinian stalkerish stalkier stalkiest stalky staminate standalone standoffish stannary stannian stannoan starchier starchiest starchy starey starfaring starforming stargazy starker starkers starkest starkish starlit starrier starriest starry starstruck starting stary statant statelier stateliest statesmanly statewide statherian staticky staticproof stationary statuesque statusy statutory stauncher staunchest steadfast steadfaster steadfastest steadier steadiest stealthier stealthiest stealthy steamier steamiest steamy steatopygian steelier steeliest steely steeper steepest steepish steeziest steezy steinbeckian stellate stelliform stemmy stenchy stendhalian stennian stenohaline stentorian stepford stereoblind stereoblock stereociliary stereocontrolling stereofluorescent sterile sternean sterner sternest sternmost sternocleid sternomastoid stewy stibatian stibian stiboan stickery stickier stickiest stickily stickproof stiddiest stiffer stiffest stiffish stillborn stiller stillest stilliform stilty stimulatory stingier stingiest stingy stinkier stinkiest stinko stinky stipellate stipendary stipendiary stipitate stockier stockiest stocky stodgier stodgiest stodgy stokavian stolen stolid stolider stolidest stompier stompiest stompy stonebuilt stoneground stonehard stonier stoniest stonish stony stoopid stoopider stoopidest stoopy stoppardian stopping storebought storky stormbound stormier stormiest stormproof stormwater stormwaters stormy storybookish stoss stouter stoutest stoutish stoveside stragglier straggliest straggly straightest straightish strange strangelovian strangest strappier strappiest strappy straticulate stratiform strawberryish strawen strawn strawne strawy streakier streakiest streaky streamside streamwise streamy streetlit streetside streetsmart streetwise streety strengthier strengthiest strengthy strepent stressfree stressy stretchier stretchiest stretchy strewn stricken strickenthrough strict stricter strictest stridden strident strigine strigose strikebound strindbergian stringent stringier stringiest stringy stripey stripier stripiest stripy striven strombolian stronger strongest strongish strongside strontian stroppier stroppiest stroppy strowen strummy struthian stubbier stubbiest stubblier stubbliest stubbly stubborn stubborner stubbornest studenty studlier studliest studly stuffier stuffiest stuffy stultifying stumbly stumpier stumpiest stumpy stunk stupent stupider stupidest stupidish sturdier sturdiest stush stuttery stygian styliform stylish styloid suaver suavest suaviloquent subacid subacute subadamantine subadnate subaffluent subalpine subangstrom subarachnoid subarcmin subarcminute subarcsecond subaverage subcabinet subcampanulate subcentimeter subchelate subclavian subconducting subconfluent subdecurrent subdetection subdiffraction subellipsoid subfemtosecond subfertile subfreezing subfulgent subgap subhertz subhorizon subhumid subinhibitory subinvestment subjacent subkiloton sublacustrine sublageniform subleading sublight sublimer sublimest sublunary submicrometer submicrometre submicron submillimeter submillimiter submillisecond subminiature subminimum submontane subnanometer subnanoscale subnanosecond subnivean suboptimum subovoid subparallel subparsec subpercolating subpicosecond subplanetary subpremium subpruinose subradiant subrhomboid subsea subsequent subservient subshock subsinuate subsistent subsolidus substandard substitutionary subsultory subterahertz subterranean subterrene subthreshold subtle subtlest subtopian subulate subumbonate suburban suburbicarian subviscid subweekly subzero succedent succinct suckier suckiest sucky sudanian suddenwoven sudsier sudsiest sudsy suetty suety sufficient suffolky suffrutescent suffruticose sugarfree sugarier sugariest sugary suggestible sulcate sulfa sulfatian sulfitian sulfosalt sulfurian sulfury sulkier sulkiest sullen sullener sullenest sulpha sulphatian sulphitian sulphosalt sulphurian sulphury sultrier sultriest sultry summerish summerlong summerly summery sumptuary sumpy sunbeamy sunblush sunburnt sundanese sundayish sunfast sung sungrazing sunk sunken sunlit sunni sunnier sunniest sunny sunshiney sunshiny sunshot sunstricken sunstruck sunswept superabsorbent superabundant superachieving superaffluent superalert superalkaline superalmighty superarachnoid superb superbad superber superbest superbold superbright supercheap supercoherent supercold supercompact superconducting superconfident superconsumerist superconvenient supercosmically supercozy supercute superdeluxe superdense superduper superefficient supereminent supererogatory superexcruciating superextensile superextreme superfalse superfeminine superfilter superfine superfit supergauge supergeeky supergood supergroovy superhard superhealthy superheterodyne superhigh superhip superhorizon superhot superimmense superimportant superincumbent superintelligent superinteresting superjacent superlarge superlean superlight superlightweight superliterate superlong superlow superluminescent superlunary supermacho supermasculine supermassively supermaximum supermicron supermodelesque supermodern supermorbid supermundane supernice superoinferior superordinary superoscillatory superoverwhelming superparallel superpolite superprecise superquick superquiet superradiant superresistant superrotating supersafe supersalty supersecret supersecure supersenior supersensible supersensory supersexy supersharp supershort supersimple superskinny supersleek superslick superslim supersmall supersmart supersoft supersport superstimulating superstrict superstrong supersudden supersweet supertechnicolor superterranean superthick superthin superthreshold supertight supertiny supertough supertrue superugly supervenient supervirile supervisory supervoting superwash superwavelength superweak superwealthy superwelterweight superwhite supplementary suppler supplest supplicatory supporting suppressible supraglenoid suprahuman supramillion supramundane suprasensible supremer supremest surculose sure surer surest surferish surfier surfiest surfside surfy surgent surly sussultatory susurrant svalbardian svelt svelte svelter sveltest svo swabian swaggery swampier swampiest swampy swanker swankest swankier swankiest swanky swarthier swarthiest swarthy swashbuckling swearier sweariest sweary sweatier sweatiest sweatproof sweaty swedenborgian swedish sweer sweeter sweetest sweetish sweetsmelling swelf swellegant sweller swellest sweptback swifter swiftest swiftian swindonian swingeing swingy swinish swirlier swirliest swirly swisher swishest swishier swishiest swishy swivelly swole swollen swonken swoonsome swoony swoopy swordbearing swordproof sworn swottier swottiest swotty swum swunk sybilline sydneyan symbionese symbolist sympathoadrenomedullary sympathoexcitatory syn syncranterian syntectoid synthy syrophoenician syrupier syrupiest syrupy systemwide tabescent tabid tableside tabloidish tabloidy tacit taciturn tackier tackiest tacky tactile tadpolish tagliacotian tagliacozzian tailormade taken taliacotian talibanesque taligrade talkier talkiest talky tall taller tallest talleyrandian tallish tallowy tamest tamil tamperproof tan tan2 tandoori tangier tangiest tanglesome tangly tangy tannest tannish tantalian tantalising tantamount tarantinoesque tardier tardiest tarriest tartare tartarean tarter tartest tartier tartiest tartish tarty tastemaking tastier tastiest tasty tattier tattiest taut tauter tautest tawdrier tawdriest tawdry tawnier tawniest taxfree taxpaying teacherly teamwide tearier teariest tearjerking teary teasy techier techiest technicolour techniquewise techy teenagery teenier teeniest teensier teensiest teensy teeny teetotaling teetotalling teflon tehrani teleparallel telepresent teletypewritten telluratian telluritian temperate tempory tenderest tenebrose tenible tennesseean tennysonian tenpenny tenser tensest tensile tenuis tepid terascale terbian terebinthinate terefah terephah terete termly ternate terrene terrible terrorstricken terrorstruck terse terser tersest testamentary testate testiculate testier testiest testudinate testy tetchier tetchiest tetchy tethyan tetracoordinate tetracyclo tetradactyl tetradentate tetraglot tetrakis tetrapartite teugh textbookish textbooky thackerayan thalian thallian thalline thalloan thalloid thamesian thameside thanatoid thankfuller thankfullest thatcheresque theaterwide theatrewide thecate theftproof themistian theopneust therizinosauroid thermocapillary thermohaline thermolabile thermoluminescent thermoparticulate thermoregulatory thermoremanent thermoreversible thermosensory thermosetting thermotolerant thetidian thewy thickish thickset thievish thingish thingly thinky thinnest thinnish third thirstier thirstiest thirsty thirteenish thirteenpenny thirtyish thirtypenny thisclose thistly thongy thoreauvian thorian thornier thorniest thornproof thorny thoro thoroughgoing thoughten thracian thrashier thrashiest thrashy threadbare threadier threadiest threadsafe thready threepenny thriftier thriftiest thrifty thrillseeking thrilly thriven throatier throatiest throaty throwaway thrown thrung thuggish thuggy thulean thulian thumpy thunderstormy thunderstricken thunderstruck thundery thymey thymy tiberian tibiiform tickborne ticklish tickly tiddly tideover tidgy tidiest tiebreaking tigerish tighter tightest tightfitting tightish tightknit tigrine tigrish tilty timebound timeconsuming timelier timeliest timely timesaving timeworn timid timider timidest timonean timorese tindery tingible tinglier tingliest tingly tinier tiniest tinkly tinnient tinnier tinniest tinny tinpot tinselly tintinnabulatory tiny tippy tipsier tipsiest tipsy tireder tiredest tiresome tironian tissuey titanoan titchy titianesque titsup titubant tlingit toadyish toastier toastiest toasty tobaccoish tobroken tocquevillian toey toilsome toilworn tolerant tolkienesque tolkienian tollfree tolstoyan tomatoey tomboyish tomentose tonier toniest tony toothachey toothachy toothcombing toothier toothiest toothpasty toothsome toothy topazine topdown topflight topfree topfull topheavy toploading toplofty topmost topnotch toppo toppy topspun topsy topwater torchier torchiest torchy torfer torfere torn torpid torquemadan torricellian torrid tortile totipotent tottery touchier touchiest touchy tougher toughest toughish toughly touristy towardliest towardly towery townish townwide toxophil toxophile toysome tracible trackside trad traditionbound trafe trafficky traif trailblazing trailside trainsick traitorly tramontane trampier trampiest trampish trampy trancey tranquil tranquiler tranquilest trans transalpine transborder transboundary transcardiac transcatheter transdanubian transdisciplinary transearth transeunt transfermium transfinite transfluent transfusible transiliac transilient transitory translationary translatory translawrencium translesion translocus translog translucent translunary transmale transmarine transmasculine transmigratory transmissible transmittant transmontane transmundane transmutant transocean transoid transondent transpadane transparent transpartisan transplanckian transplanetary transplutonium transpontine transregionate transrhenane transtiberine transtigritane transuranium transverse transworld trapeziform trappy trashier trashiest trashy trayf treaclier treacliest treacly treblier trebliest treebound treif treife trembly trenchant trenchardian trendier trendiest trendsetting trepid trepidatory treyf treyfe triacid tribalesque triblock tribunician tricholomatoid trichrome trickier trickiest trickish trickledown tricksier tricksiest tricksy tricky tricomponent tricoordinate tricorner tricounty tricyclo tridactyl tridentate trifid trifling trifold trifoliate triform triggest trilaminate trilly trilobate trimmest trinitarian trinkety trinkly trioculate tripartisan tripartite triphase triploid trippier trippiest trippy triquarter triservice triste triter tritest tritonian triumphant triune triweekly trochilidine trodden trollish trollopy troo troppo troublefree troublesome trouty troy truckish truer truest truffley truffly trumpian trustier trustiest trustworthy truthier truthiest truthsome truthy tsarian tsarish tubbier tubbiest tuberculate tuberculoid tudorbethan tulgey tumbledown tumescent tumid tumourigenicity tungstatian tungstenian tunnelly tupian tuppenny turbid turdiform turfy turgescent turgid turinese turkish turneresque turnippy turnipy turpid turpsy turquoisey turquoisy turrible turvy tuscan tussocky twainesque twainian twangy twattier twattiest twatty twee tweedier tweediest tweedy tweenage tweezer twelvepenny twentyish twentypenny twerpish twerpy twiddly twiform twiggier twiggiest twiggy twilightish twilighty twilitten twinborn twinight twinklier twinkliest twinkly twirlier twirliest twirly twistfree twistier twistiest twitchier twitchiest twitchy twittery twopartite twopenny typesafe typewritten tyrolese tzarian uberwealthy ubiquarian uffish uglier ugliest ugsome ulterior ultrablond ultrabright ultrabroad ultracharming ultracheap ultraclean ultraclever ultracold ultracompact ultracompetent ultracomplex ultracontemporary ultracool ultracrisp ultradeep ultradelicate ultradense ultradian ultradiscreet ultradiscrete ultradistant ultradistinct ultradry ultraefficient ultraelegant ultrafaint ultrafast ultrafeminine ultrafine ultrafunky ultraglossy ultragreen ultrahard ultraheavy ultrahigh ultrahip ultrahot ultrahuman ultraintense ultralean ultraleft ultralightweight ultralong ultralow ultraluxury ultramacho ultramasculine ultraminimalist ultramobile ultramodern ultramoist ultramundane ultranarrow ultraorthodox ultrapotent ultraprecise ultrapure ultraquantum ultraquick ultraquiet ultrarapid ultrarare ultrarich ultraright ultraripe ultrasafe ultrasecret ultrasecure ultraselect ultrasharp ultraslick ultraslim ultraslow ultrasmall ultrasmart ultrasmooth ultrasnug ultrasoft ultrastrong ultraswift ultrathick ultrathin ultratight ultratough ultravast ultrawarm ultraweak ultrawealthy ultrawide ultrawideband umbilicate umbonate umbrielian umpteen umptieth umpty umteenth unabating unabrupt unabsorbing unaccessible unaccommodating unaching unaffecting unaffectionate unafraid unagile unaging unairworthy unalluring unaltering unamazing unamerican unamusing unangry unanimitarian unapparent unappealing unappetising unappetizing unapproving unapt unarousing unasleep unaspiring unassuming unattaining unaustralian unavailing unawakening unawaking unaware unawoken unbaroque unbeaten unbeautifulness unbecoming unbefitting unbegun unbeholden unbeknown unbelieving unbenign unbereft unbidden unbitchy unbitten unblameworthy unblanching unblinking unblown unblue unblushing unbookish unboring unborn unbought unbounden unboxy unbright unbritish unbroadcast unbroken unbrotherly unbudging unbuilt unburnt unbustling unbusy uncalculating uncalm uncandid uncannier uncanniest uncanny uncapitulating uncaring uncast uncatchy uncate uncaught uncavalier unceasing uncertain unchallenging unchancy unchanging uncharming unchaste unchildish unchilly unchosen unchristian unchurchly unchurlish uncinate uncincate uncircumspect uncivil unclad unclean uncleaner uncleanest uncleanlier uncleanliest unclearer unclearest unclever uncloudy uncloven unco uncollapsible uncollectible uncomelier uncomeliest uncomfy uncommon uncommoner uncommonest uncompassionate uncompelling uncomplaining uncomplaisant uncomplimentary uncomprehending uncomprehensible uncompressible uncompromising uncomradely uncondescending unconfident unconsenting unconsoling unconstraining unconsuming unconversant unconvincing uncool uncoordinate uncoquettish uncorrect uncorrupting uncosy uncourtly uncousinly uncouth uncouther uncouthest uncowardly uncozy uncrafty uncreditworthy uncruel uncrying uncurly uncurrent uncustomary uncut uncute undancerly undaring undaunting undazzling undealt undecadent undecaying undeducible undefiant undegenerate undemanding underabundant underate undercabinet underconfident underdense underdone underdrawn undereaten undereye underfloor undergoing undergone undergrown underheard underhill underhood underhung underknown underlain underlit underlying undermost underpaid underproof underripe undersea underseen undersize underslung undersnow understair understrength undersung undertaken underthrown underway underwhelming underwound underwritten undeserving undesigning undesponding undeviating undifferentiating undigestible undiligent undirect undiscerning undisclosing undiscriminating undistinct undistraught undisturbing undivine undivisible undoctorly undoctrinaire undone undoubting undrawn undreamt undriven undrunk undrunken undue undug undulant undulatory undying uneager unearnt unearthly uneasier uneasiest uneasy uneaten uneath uneating unebbing unechoing unedifying unelaborate unelegant uneloquent unembarrassing unempowering unenchanting unencouraging unendearing unending unenforcible unengaging unenlightening unenquiring unenriching unenterprising unentertaining unenthralling unenticing unerring unerudite uneven unevener unevenest unexact unexacting unexciting unexistent unexisting unexplanatory unexplicit unextendible unextraordinary unfading unfailing unfair unfairer unfairest unfallen unfalling unfaltering unfancy unfatherly unfattening unfeasible unfecund unfeeling unfelt unfeminine unfeminist unfertile unfervent unfeverish unfinicky unfishy unfitting unflabby unflagging unflamboyant unflashy unflattering unflickering unflinching unflowering unflowery unfluctuating unfluent unfond unforbidden unforeseen unforetold unforgetting unforgiving unforgotten unforsaken unforthcoming unfought unfound unfragrant unfraught unfree unfresh unfriendlier unfriendliest unfriendly unfrightening unfrilly unfrozen unfruiting unfrumpy unfulfilling unfun unfunky unfunnier unfunniest unfunny unfussier unfussiest unfussy unfuzzy ungainlier ungainliest ungainly ungainsaid ungallant ungazing ungeeky ungenteel ungentle ungentlemanly ungerminating ungimmicky ungirlish ungiven ungiving unglitzy unglossy ungodlier ungodliest ungodly ungood ungratifying ungreat ungreen ungrieving ungrudging unguiculate unguligrade unhale unhandsome unhandsomer unhandsomest unhandy unhappier unhappiest unhappy unhardy unhasty unhealthier unhealthiest unhealthy unheard unhearing unheavenly unheeding unheimlich unheld unheppen unhesitant unhesitating unhewn unhinderedly unhip unhirsute unhit unholier unholiest unholy unhomely unhot unhousebroken unhuman unhumanitarian unhung unhungover unhungry unhurt uniat uniate unicase unicast unicolor unificatory uniflow unifoliate uniformer uniformest unijugate unilateralist unilluminating unimportant unimposing unimpossible unimpressible uninformedly uningratiating uninquiring uninsistent uninspiring unintelligent unintelligible uninteresting uninterruptible unintimidating unintriguing uninucleate uninviting uninvolving unipartite unipennate unipotent unique unisectarian unisex unisulcate unitarist univallate univariant universitywide univoltine unixy unjewish unjolly unjudging unjuicy unjust unkeen unkempt unkept unkind unkinder unkindest unkindlier unkindliest unkingly unkinky unknightly unknowing unkosher unlachrymose unladen unlaughing unleafy unlet unlevel unlikelier unlikeliest unlistening unlit unliterary unliving unlonely unlovelier unloveliest unlovely unloving unluckier unluckiest unlucky unlying unmaidenly unmanifest unmanlier unmanliest unmasculine unmeaning unmeant unmelancholy unmenacing unmeriting unmerry unmessy unmet unmighty unmilitary unmisleading unmistaken unmodern unmodernist unmotherly unmotivating unmourning unmoving unmown unmurmuring unnecessary unneighborly unneighbourly unnessary unnewsworthy unnice unnoble unobjecting unobliging unobservant unobtuse unoffending unorderly unordinary unorthodox unoverridden unpaid unparanoid unparliamentary unpassionate unpatronising unpatronizing unperceiving unperfect unpicturesque unpitying unplausible unpleasant unpleasing unpliant unpolite unpossible unpostmodern unpraying unprepossessing unpresuming unpretending unpretty unpriestly unprincely unpristine unproducible unprojecting unpromising unproofread unproper unproportionate unproven unpure unquailing unquavering unqueenly unquestioning unquiet unquirky unquivering unradiant unrainy unrandom unread unreadier unreadiest unready unreasoning unreflecting unreflectively unrefreshing unregarding unregenerate unrelaxing unrelenting unreluctant unremembering unremittant unremitting unrepaid unrepentant unrepenting unreproducible unrepublican unreset unresistant unresisting unresonant unresting unreticent unrevealing unreverent unrevolutionary unrewarding unrewound unridden unripe unriper unripest unriven unroadworthy unrude unrulier unruliest unruly unrun unsafe unsafer unsafest unsaintly unsalty unsanguine unsanitary unsappy unsatisfactory unsatisfying unsavory unsavoury unsavvy unscary unscheming unscholarly unseaworthy unsecret unsectarian unsecure unseeing unseemlier unseemliest unseemly unseen unselfish unsensationalist unsensing unsent unserene unservile unsewn unsexier unsexiest unsexy unshaken unshakespearean unshapely unshapen unsharp unshaven unshining unshiny unshod unshone unshorn unshot unshown unshowy unshrinking unshriven unshrunk unshrunken unsighing unsightlier unsightliest unsightly unsilly unsisterly unslain unsleek unsleeping unsleepingly unsleepy unslick unslumbering unsmiling unsmitten unsmooth unsmug unsneezing unsold unsoldierly unsoppy unsordid unsought unsound unsounder unsoundest unsown unspaceworthy unsparing unspent unspilt unsplendid unsplit unspoilt unspoken unsporting unsportsmanly unsprightly unspun unsqueaking unsqueaky unsqueamish unstabler unstablest unstagey unstagy unstaid unstatesmanly unsteadfast unsteadier unsteadiest unsterile unstewardly unstill unstimulating unstinting unstirring unstodgy unstolen unstrange unstraying unstreetwise unstrewn unstricken unstrong unstruck unstuffy unstung unstylish unsuave unsubtle unsudden unsugary unsullying unsummery unsung unsunny unsupporting unsuppressible unsure unsurer unsurest unsurprising unsurrendering unsusceptible unsuspecting unsvelte unsweet unswept unswerving unswollen unsworn unsympathizing untaken untasty untaught untaxing untenably untender untenty unthorough unthreatening unthrifty untidier untidiest untidy untimelier untimeliest untimely untiring untold untomboyish untoothsome untorn untouristy untoward untranquil untrembling untrendy untrod untrodden untroublesome untroubling untrue untruer untruest untrusting untrustworthy ununiform ununique unvacillating unvain unvarying unvictorian unvisionary unvivid unwaking unware unwarier unwariest unwarping unwary unwavering unwealthy unweary unwearying unweeping unweird unwelcome unwelcoming unwell unwept unwhole unwholesome unwieldier unwieldiest unwieldy unwild unwilling unwincing unwinesque unwinking unwise unwiser unwisest unwithering unwithstood unwitting unwitty unwizardly unwoken unwomanly unwon unworldly unworn unworrying unworthier unworthiest unworthwhile unworthy unwoven unwritten unwrought unwrung unyielding unyoung upcoming updrawn upfield upflung upgiven upgrown uphand upholdatory uplandish uplevel uplifting upmost uppish uppitier uppitiest uppity upsidedown upstair upswept upswollen upthrown uptight uptonian uptorn upwinding uranoan uranylian urban urbane urbaner urbanest urceolate urdu urgent urinant urinary urinatory urinose ursiform ursine userfriendly usurpatory utahn uterine utriculate utterest vacant vacillatory vadose vagile vaginate vaginatoid vague vagueish vaguer vaguest vain vainer vainest vairy valiant valid valvate vampier vampiest vampiresque vampirish vampish vampy vanadatian vanadian vanadoan vanadylian vaniloquent vapid vapider vapidest vaporish vapory vapourish vapoury varangian varicose variform varimax varying vascon vasoconstricting vasodilatory vasomotor vaster vastest vasty vatican vaticinatory vatinian vaultworthy vealy vectisian vegete vehement veiny velvetier velvetiest velvety venerian venitian ventilatory ventricose ventripotent ventrolaterally venturesome verbose verboten verdant verecund verier veriest verklemmt verklempt verlainesque vermian vermiform veronese verruciform verrucose verruculose versatile versicolour verticillate vespertine vespine vestian vestimentary vestpocket vetoproof vibrant vibratory vibrioid vibrotactile vicariant viceregally vicissitudinary victimy viewy vigenary vigilant vigilantist vile viler vilest villagey villainously villiform villose vilnian vincible vindicatory vinegarish vinegary vinier viniest vintagey viny violaceus violeter violetest violetish viperish virescent virgilian virginian viridescent virile virilescent virussy viscerosensory viscid visible visuomotor vitelline vitrescent vittate vixenish vixenly vociferant voegelinian voetstoots vogueing voguish volage volant volatile voltairean voluble volucrine voluntariest volvate vomity vonnegutian voodooish vorticose vowelly vuggy vughy vulgarer vulgarest vulpine vulturine vulviform wacker wackest wackier wackiest wacky wafflier waffliest waffly wafty waggier waggiest waggily waggish waggly waggy waifish waistlong waitressy walnutty walrasian wambly wan wanchancy wanderlusty wankerish wankier wankiest wankle wanky wanner wannest wanthriven wapanese warbly warholesque warholian warier wariest warmest warmish warring wartier wartiest wartorn warty warworn wary washier washiest washy waspish waspy waterborne waterier wateriest waterish watertight watery watry waugh waughesque waughian wavery wavier waviest wavy waxen waxier waxiest waxy wayward waywise wayworn weak weaker weakest weakish weaklier weakliest weaksauce weakside wealden wealthier wealthiest wearier weariest wearisome weaselier weaseliest weaselly weasely weatherbeaten weatherly weathertight webbier webbiest webby websafe weddingy wedgy weedgrown weedier weediest weedy weeklong weekold weensy weepier weepiest weepy weer weest wegenerian weightier weightiest weighty weirder weirdest weirdsome weirdy wellborn wellesian wellknown wellsian wenlock werewolfish westcottian westernmost westmost westy wetproof wettest wettish whackier whackiest whacky whartonian whatever whatsoever wheatier wheatiest wheaty wheelback wheely wheezier wheeziest wheezy wheyey wheyish whichever whiffier whiffiest whiffy whiggish whiney whingy whinier whiniest whiny whippier whippiest whippy whirlier whirliest whirly whiskery whispery whistly whitebread whitelip whiter whitest whitish whizzier whizziest whizzy wholescale wholesome wholewheat whoreish whorish wibbly wickeder wickedest widdler widdlest wideband wideish wider widerscale widerspread widescale widespread widest widish wieldier wieldiest wieldy wifelier wifeliest wifely wifty wiggier wigglier wiggliest wiggly wiggy wildean wildest wildish wilhelmine wilier wiliest willowier willowiest willowy wily wimpier wimpiest wimpish wimpy windbitten windblown windborne windbound windbreaking windfallen windier windiest windswept windthrown windtight winey winier winiest winningest winsome winterier winteriest winterish winterlong winterly wintery wintrier wintriest wintry winy wiredrawn wirier wiriest wiry wisconsinite wisecracky wiselier wiseliest wiser wisest wispier wispiest wispy witchier witchiest witchy withdrawn withholden withier withiest withspoken wittier wittiest wittle witty wizardly woaden wobblier wobbliest wodehousean wodehousian woebegone woggish woken wolffian wolfish wolframatian wolframian womanish womanlier womanliest womanly wonderfool wonderfulest wonderfullest wonderstruck wonkier wonkiest wonkish wonky wontedly woodburning wooden woodest woodfree woodier woodiest woodish woodsier woodsiest woodsy wooley woolfian woolier wooliest woollen woollier woolliest woolly woozier wooziest woozy wordier wordiest wordish wordy workaday workfree working workly workshy worksome worky worldlier worldliest worldlywise worldshaking wormier wormiest wormish wormy worn worrisome worser worsest worstest worth worthen worthier worthiest worthwhile wrathier wrathiest wrathy wretcheder wretchedest wrier wriest wrigglier wriggliest wriggly wrinklier wrinkliest wristy writerly writhen writhy writing written wroclavian wroth wryer wryest wud wussier wussiest wycliffite xanthochroid xenophanean xenophontean xerarch xerxean ximenean xiphoid xiphoidian xlnt xxxx xylary xylocopine xyloid yachtboard yachtier yachtiest yackety yago yaller yapese yappier yappiest yappy yardlong yare yarer yarest yarny yarrish yatvingian yawnier yawniest yawny yclept yearbookish yearslong yeastier yeastiest yeasty yeatsian yechier yechy yella yellower yellowest yellowier yellowiest yellowish yellowy yelpier yelpiest yelpy yeshivish yeuky yiffest yiffier yiffiest yiffy yobbish yoghurty yogurty yolky yoong yotvingian younger youngest youngish ypresian ypsiliform ypsiloid ytterbian yttrian yuckier yuckiest yucky yukkier yukkiest yukky yummier yummiest yummo yummy zaftig zairese zamenhofian zanier zaniest zany zappaesque zappier zappiest zappy zarking zazzy zeitgeisty zeldaesque zennish zeolitiform zephyry zeroary zeroth zestier zestiest zesty zhlubby ziggety ziggy zigzaggy zincian zincky zincoid zincy zingier zingiest zingy zinky zippier zippiest zippo zippy ziptop zirconian zittier zittiest zitty zizekian zoanthoid zoftig zolaesque zonary zonate zoomier zoomiest zoomy zoosanitary zooty zooxanthellate zoquean zorkian zygobranchiate zygoid zygose 25 C eight five four i ii iii iv ix nine one seven six ten three two v vi vii viii x xiii xix xx xxi zero 2 NGP barring failing 1 NPRV post 6 NPR across aside behind beyond but contra 7 NPV bar come cum par save sub till 9 NP ala bout despite longa midst modulo mong pro upside 22 NRV alias amen bang bit broadside dab ditto flop fuck hen nope pitapat plonk sidearm slap smack spang stag stop supply yes yet 85 NR abroad alot ana argal atm aye beauty byembye cuz deiseal elsewhere felly foretime forever forth friday heor hereafter horseback hotfoot innard ipof jist kerchunk kerslap kerslop kerwallop kinda leafmeal legato longhand manana maybe meantime meanwhile midnightmare midswing midthought midway monday nation needer nowhere nowt obiter outdoors overtime owt peradventure pianissimo pizzicato plenny plenty presto saturday scienter sho sidesaddle sorta sostenuto straightway sunday tanto thar there thursday today tomorrow tonight tricorne tuesday tutti way wednesday whereabouts wherefore yah yay yea yep yesterday yestertide yestertime yesterweek yup 5477 NV aah abandon abate abend abode abort abscess absciss abseil abuse accent access accession acclaim accolade accord accost account ache acrospire act action acupuncture add addend addict address adduct adenylate adlib admin advantage adventure advert advocate adze affect affection affiliate affix affray affright affront age aggress ague ahh aid ail aim air airbrush airdrop airfreight airlift alarm alibi aliment allomother alloy allure ally amaze amble ambuscade ambush amends ammoniate amnesty amount amp anagram anchor angel anger angle angst anguish ankle annex annexe annoy answer ante anticross antidote apparel appeal append applicate applique apprentice approach aquacise aqualung aquaplane aquatint arbiter arbitrage archetype architect archive armor armour array arrest arrow arse article arylate ash ask asphalt assart assassin assault assay assegai assent assert assfuck assign assist asterisk atrophy attack attaint attempt attire attitude attribute auction auctioneer audiotape audit audition auger augment augur author autocancel autoclave autodestruct autofocus autograft automobile autopilot autopsy autosave avail avalanche avenge aver award awe axe baa babbitt babble bach backbite backburn backchannel backchat backcross backdoor backfill backfire backflip backflush backgammon background backhaul backheel backhoe backlash backlight backlist backlog backpack backscatter backsheesh backshift backsight backslash backspace backspin backstitch backstop backstroke backtalk backtrace backtrack backwater backwind badge badger baff baffle baffs bag bagpipe bail bait bake bakeout baksheesh balance bale balk ball balladeer ballast balloon ballot ballyhoo bam ban band bandage bandish bandsaw bane bangtail banhammer banjax banjo bank bankroll banquet banter barb barback barbecue barber bard barf bargain barge bark barney barrack barrage barrel barricade barter baseline bash basket bassoon bastinado bat bate bath bathe batik baton batten batter baulk bayonet beach beacon bead beagle beak beal beam bean beard bearhug beast beatbox bebop bed bedizen bee beeline beep beeswax beetle befall beg begeck beggar begin begunk belay belch bell bellow belly bellyache belt bench benchmark bend benefice benefit berm berry berth bespeak bet bevel bever bevvy bias bibblebabble bicycle bid biff bigfoot bike bilge bill billet billow bimble bin bind binge biograph biography biopsy birch bird birdie birdlime birl bisect bitbucket bitch bitchslap bite bitmask bitt bivouac bivvy bivy blab blabber blackball blackboard blackjack blacklead blacklist blackmail blacktop blade blame blamestorm blanch blare blarney blaspheme blast blat blather blatter blaze blazon bleach bleat bleb bleed bleep bleg blemish blend blether blevey blidget blight blimp blindfold blindside blink blinker blip blister blit blitz blizzard bloat block blockade blog blood bloom blooter blop blorp blossom blot blotch blouse blow blowtorch blubber bludge bludgeon blueprint bluescreen bluewash blunder blur blurb blush bluster board boast boat bob bobar bobbar bobbasheely bobble bobsled bobtail bode body bodyboard bodycheck bodyguard bodyslam boff bog bogart bogey boil boldface bollix bollock bolster bolt bomb bombard bond bong bongo bonk bonus boo boob boogie boogieboard book bookend bookmark boom boomerang boondock boondoggle boost boot bootblack bootjack bootstrap booze bop border bore borg bork boro borrow bot botch bother bottle bottleneck boulder bounce bow bowel bowl box boy boycott braai brace bracket braid brail brain brainstorm brainwash braise brake branch brandish brandy brangle brank brawl brawn bray breach bread breadcrumb break breakdance breakeven breakfast breast breaststroke breed breeze brew bribe brickfilm bridesmaid bridge bridle brigade brilliantine brim brine bristle broach brocade brock brogue broil broker bromate brood brook broom brother brownnose browse bruise brunch brush bubble buccan buccaneer buck bucket buckle buckram buckrams bud buddle buddy buffalo buffet buffoon bug bugger bugle build bulge bulldog bullet bulletin bullshit bullwhip bulwark bumble bump bunch bunco bund bundle bungle bunk bunker bunt buoy burble burden burke burl burn burp burr burrow burst bury bus busk buss bustle butcher butler butt butter butterfly buttfuck button buttonhole buttress buy buzz bycatch byname bypass cabbage cable cache cack cackle caddie caddy cadence cadge cage cake calcimine calendar calender calk call callus calque cam camber came cameo camo camouflage campaign campus canal cancan cancel candle candy cane canker canna cannon cannonade cannonball canoe canter cantilever canton canvas canvass cap caparison cape caper captain caption capture caracole caravan carbonado carbonate carboxylate card care career caricature carol carom carp carpet carpool carry cart cartoon cartwheel cartwhip cascade caseate cash cashier cast castle catalog catalogue catapult catcall catch caterwaul catnap caucus caulk cause caution cave caveach caveat cavil caw ceil cellar cement censor censure census centerpunch centrifuge certificate cess chafe chaff chaffer chagrin chain chainsaw chair chalk challenge chamber chamfer champ change channel chant chap chaperon chaperone chapter char charge charioteer chark charleston charm chart chase chasse chat chatter chauffeur chaulk chaw cheat check checker checkmate checkpoint checksum checkup cheddar cheek cheep cheer cheese chequer chest chevron chevy chew chib chicane chilltime chime chimney chimp chin chink chinkle chinwag chip chirp chirr chirrup chisel chit chitchat chiv chivvy chivy chloroform chock choke chomp chop chopper chord chore chortle chorus chromatograph chrome chronicle chuck chuckle chug chum chunder chunk church churn cinch cincture cinder cipher circle circuit circumfix circumstance citrate clabber clack clag claim clam clamor clamour clamp clang clangor clangour clank clap clash clasp clatter clause claver claw clay cleat cleave cleft clem clench clerk clew click climax climb clinch clink clip clive cloak clobber clock clog cloister clomp clone clonk clop closet clot clothes clothesline clothespin cloud clout clove clown club cluck cludge clue clump clunk cluster clutter coach coagulate coal coapt coast coat coauthor coax cob cobble cock cockblock cockfight cockle cocktease cocoon coculture cod code codename coffer coffin cog cohost coif coil coin collage collapse collar collect collocate colour comb combat combine comfort comix command comment commerce commission commit commune comp compass compere compilate compile complement compliment compost compress compromise con concentrate concern concert concertina conch concord condition conduct cone confab confection confine confines conflict confuzzle conga conge conjecture conjugate conjure conk consarn consense consent conserve consist console consort construct construe consult contact contest continue contract contrast control conversation converse convert convict convoy cooee cook coom coon coop cop copay cope copilot copperplate coppice copse copter copy copypasta copyright coquet cord cordon corduroy core cork corn corner cornhole corpse corral correlate corset cosplay cosponsor cosset cost costar costume cottage couch cough counsel count countdown countenance counterattack counterbalance counterbid counterbore countercheck counterclaim counterflow countermand countermarch countermove counteroffer counterpicket counterplot counterpoint counterpoise counterpressure counterpunch countersign countersink counterstain counterstrike counterweight couple courier course court covenant cow cowboy cowgirl cox crab crackle cradle craft cram cramp crane crankle crate crater crawfish crawl crayon craze creak creampie crease credit creed creep creosote crescendo crest crew crib crick cricket crimp cringe crinkle critique crizzle croak crochet crock crome crop croquet crossbreed crosscheck crossclaim crosscut crossfade crossgrade crosshatch crosslink crosspost crossref crossruff crotchet crouch crow crowbar crowd cruise crumb crumble crumple crunch crusade crush crust cry cryosection cryptograph cub cube cuckold cuddle cudgel cue cuff culch cull culls cully culture cuntfuck cup curate curb curd cure curl curlicue curmur curry currycomb curse cursor curtain curtsey curve cushion cwtch cyberattack cyberbully cybersex cycle cyclostyle cypher dado dag dally dam damage damages dance dander dangle dap dare dart dash dashboard database date dateline daub dawn daydream daylight daytrade daze deaccession deacon deadbolt deadhead deadlift deadlink deadlock deathmatch debate debauch debouch debut decay decease deck decline decoke decontrol deconvert decoupage decoy decrease decree decrement decypher dee deed deejay deekies deem default defeat defect defilade defile defy deke delay delayer dele delegate delete delight deluge delve demagogue demand demanufacture demean demise demo demur den denizen dent deposit dequeue derail descant desert design desire desk desolvate despair despatch detail detent detour detox devel deviate devil devise devvel dew diadem diagram dial dialogue diaper diaphragm dibble dibs dice dick dicker dictate diddle die diesel diet diff difference dig digest dike dildo dill dime dimension dimple din dinge dint dip diplomate dirk dirt disaccord disadvantage disarray discard discharge discipline disco discomfort disconnect discord discourse disdain disease disengage disfavor disfavour disgrace disguise disgust dish dishonor dishonour disillusion disinterest dislike dismay dismount disparage dispatch display disposition dispute disregard disrelish disrepute disrespect diss dissent dissolve distance distaste distemper distress district distrust disuse disvalue ditch divide divorce divvy diy dob dock docket doctor document dodder dodge dog dogear dogfight dogfood dogleg dogpile dogsled dole doll dollop dolly dom domesticate dominate don donk doodle doom door doorbell doorstep dosado dose dot dote dots doublecross doubt douche dough dought dove dovetail dower downgrade downlink download downvote dowse dox doze drabble drag dragoon drain drape draw drawbore drawl dreadlock dreads dream dredge drench dress dribble drift driftnet drill drink drip drive drivel drizzle drone drool droop drop dropkick drove drowse drudge drug drum druther drydock drywall dub duchess duck duct duel duet dug duke dummy dump dunch dung dunk dunker dunt duodecimate dupe dusk dust dwell dye dynamite eagle earmark earplug earth earthscape earwig ease eats eavesdrop echelon echo eckle eclipse ecoculture eddy edge edit eel eep effect efflux effort egg egocast egress eisegete ejaculate eject elbow electroplate electroshock electrotype ellipse email embarge embargo embrace emcee employ enamel encore encounter encroach end endeavor endeavour endplay enfilade engineer entail enter entrail entrance entreat enucleate environs envy equipoise ermine ern errand error escalade escape escheat escort escrow espalier esquire essay esteem estimate ethoxylate ettle euchre evidence example excerpt exchange excise excuse exegete exercise exfiltrate exhaust exhibit exile exit expense experience experiment exploit exploiter expose extract eye eyeball eyewitness fable fabulate face facebook facelift facemail facepalm faceplant facet facsimile factor fade fadge fag fail falcon fall falsecard falter fame fan fandango fang fansub fantasy fap fard fare farm farrow farspeak fart fartarse fash fashion fate father fathom fatigue fatwa fatwah fault favor favour fearmonger feast feather featherbed feature feck fecks feddle feed feedback feedforward fellowship felt fence fend ferment ferret ferry fess festoon fetch fete fetter fettle feud fianchetto fib fid fiddle fidget field figger fight figure file filetype filibuster filigree fill fillet fillip film filter filtrate fin finance finch finesse finger fingerbang fingerpaint fingerpick fingerprint finish fink fire firebolt firebomb firehose firewalk firewall fishtail fission fissure fist fistfight fisticuff fix fixture fizz fizzle flabbergast flack flag flail flake flambee flap flare flatline flavor flavour flaw fleck fleece flesh fletch flex flick flicker flimflam flinch flint flipflop flipper flite float flob flock flood floodlight floor floss flounce flounder flour flourish flow flower flox flub fluff fluke flump flurry flurt flute flutter flux flyer foal foam fob focus fog foil foist fold fondue fool foot footer footle footnote footslog foozle forage foray forbear forbisen forbode force ford forearm forecast foredoom foreflow forefoot foreground forehold foreken forelook foremind foreread foresmell forest foretaste foretoken forewalk forewit forfeit forflutter forge fork forklift form format fortress founder fountain fourpeat fowl fox foxhunt foxtrot fraction fracture frag fragment frame franchise fratch fray freckle freebase freecycle freefall freeroll freestyle freewheel freeze freight fresco fret fricassee friend frieze frig frill frisbee frith fritter fritz frivol frizz frob frock frog frogmarch frosh frost frostbite frot froth frother frottage frounce frown frowst fruit fry ftp fuddle fudge fuel fulminate fumble fume function fund funk funnel fur furlough furnace furnish furrow fuse fusillade fuss futz fuze fuzz gab gad gaff gaffle gag gage gaggle gaincome gait gall gallop gallows gam gamahuche gamble gambol gamemaster gamemasters gammon gander gang gangbang gangrape gaol gap gape garage garb garbage gargle garland garner garnett garnish garnishee garotte garrison garrote garrotte garter gasconade gash gaslight gasp gat gate gatekeep gather gauge gaum gauze gavage gavel gawk gaze gazette gazunder gear gedge gee geek gel geld gelt gender genlock genotype geocache geranylate gerbil germ gerrymander gesture getter gherao ghost gib gibber gibbet gibe gift gig giggle gillie gillnet gilravage gimlet gimme gimmick gin ginn gird girdle girt giss git glance glare glass glaze gleam gleek gleg glide glimmer glimpse glint glissade glisten glister glitch glitter gloat glob globe glomp gloom gloop glop glory gloss glove glow glower gloze glue glug glut glutch glycate gnar gnarl goad goat gob god godfather goggle goggles goldbrick golf golly gong goo goof google googlewhore goose gore gossip gouge governess gown grab grace grade graffiti graft grain gralloch grandfather grandstand grant graph grapple grasp grass grate gravel graylist graze grease greenwash greets greylist grid griddle grief grieve grift grig grimace grime grin grind grip gripe groan groin groom groove grope grouch groundfish group grout growl grub grubstake grudge grumble grump grundle grunt guarantee guard guerdon guess guesstimate guest guestimate guff guffaw guggle guide guile guillotine guilt guitar gull gulp gum gummer gunge gunzel gurgle gurn gush gust guy guzzle gybe gyp gyre habit hack hackle hacksaw hade haemorrhage haft hail haint hale halftone hallelujah hallmark hallo halloo halo halt halter ham hammer hamper hance hand handbag handball handbrake handcraft handcuff handicap handle handplant handsel handwave hang hansel hap haplotype harangue harbinger harbor harbour hare harm harnass harness harp harpoon harrow harrumph harumph harvest hassle hasta haste hatch hatchet hate haul haunt haven haver haves havoc haw hawk haxor hay hazard haze headbutt headline heaf heap hearse heart hearthstone heat heave hedge heed heel heft heist helicopter heliograph helm help hem hemorrhage hemstitch herald herd heterograft hex hiccough hiccup hick hickup hide hie highball highjack highlight hijack hike hikoi hilite hinge hinny hint hire hiss histogram hit hitch hive hoard hoax hob hobble hobnob hobo hock hockle hoe hog hoik hoist hoke hold hole holiday holler hollo holster holystone homebrew homer homeschool homestead hone honeycomb honeymoon honk honor honour hoodoo hoof hook hoon hoop hooray hoot hoover hop hope hopscotch horlicks horn hornpipe horse horseplay horseshoe horsewhip hose host hotbox hotdog hothouse hotline hotlist houdini hough hound house housemaid hovel howl hoy huck huckster huddle huff hug huggle hull hum humbug humor humour hump hunch hunger hunker hunt hurdle hurl hurrah hurry hurtle husband hush husk hustle huswife hut huzza huzzah hydrate hydroplane hymn hype hyperlink hypertexture hypertrophy hyphenate ice icq illuminate image immunoblot imp impact implant implement import impress imprint inbeat inblow inbreak inbuild incense inch incline inconvenience increase increment incross indent indenture index indite indulgence inebriate infare infill infix influence ingress initiate ink inkle inlay inlead inosculate input insert inset instal install instance institute instream instructs instrument insuck insult intake interact intercept interchange intercrop intercross interdict interest interface interfix interflow interlace interleaf interlink interlock interlude intermix intern internetwork interplay interrupt interspace interview interwind intrigue intro inventory invert invest invite invoice inwheel inwork irc ire iris island isolate isotope issue itch iterate ixnay jab jabber jack jackal jackaroo jackass jacket jackhammer jackknife jackrabbit jacuzzi jag jail jailbreak jam jambok jangle japan jape jar jaundice jaunt jaup jaw jawbone jazz jedge jeer jell jelly jerk jerkoff jess jetski jettison jew jib jibe jig jigger jiggle jigsaw jill jilt jimmy jingle jink jinx jit jitter jitterbug jive jizz job jock jockey jog join joist joke jol jolt jones jook josh jostle jot jounce journal journey joust joy joyride joystick judder judge jug juggle juice juke julienne jumar jumble jump jumpstart junk junket jupe jury jut juxtaposition kabob kalsomine karyotype kayak kayo kaypoh kazoo kebab keck kedge keek keel keep keeve ken kennel kerb kern ketch kettle keyboard keyframe keynote keypunch keyword kibble kick kickflip kickstart kid kidnap kill killfile kiln kilt kink kip kipe kipper kiss kist kite kiteboard kitemark kitten kleptoparasite kludge knack knacker knag knap knapsack knee kneecap knell knife knight knob knock knoll knot knout know knuckle knuckleball knurl kotow kowtow label labor labour labyrinth lace lack lackey lacquer lacquey lactate ladder ladle laff lair lake lallygag lam lamb lament laminate lamp lampoon lance landfill landmark landscape lant lap lapper lapse lard larf lark larrup laser lasso latch lathe lather laud laugh launch launder lavage lave lawyer layaway layer leach leaf leaflet league leak leam leap leapfrog lear leash leave leaven lech lecture leech leg lek lens lesion lessee lesson let letter lever leverage levy libel licence license lick lickspittle lid lie lien lift lilt limb limewash line link linker lip liposuction liquor lisp list lithograph litter liveblog livescan load loaf loan loanshark lob lobby lock lockpick lodge loft lollygag longboard longe look lookbook loom loop loophole loot lop lope lopper lord losings lounge louse lout love lowball lube luck luff lug luge lull lumber lump lunch lunge lurch lure lurk lurv lurve lust luster lute luv maas mace macerate machete machine machinegun mack macule malfunction malky mallet malloc malt mambo man manacle manage mandate manet maneuver mangle manicure manifesto manoeuver manoeuvre manscape mantle manufacture manure manwhore map mar marble marcot margin marinade mark marker marl marmalade marmite marshal martyr marvel marver mascara mash mask masker mason masquerade massacre massage mast mastermind mat match mate matter maul mawn maximin maze meal meander measure medal medevac medivac medley meed megaphone meld melt memo menace mend mense mention mentor meow merchandise merchandize merge merit mesh mess message messenger met metablog metal metaphrase mete meter methylate metre mezzotint miaou miaow mic microblog microchip microcrack microfilm micropattern microphone microprogram microsoft microtome microwave midwife miff mike mildew milk mill mime mimeograph mimic mince mind mindfuck mindwipe mine minimax miniprep minister minnow mire mirror misbeat misbid misconduct misconjugate misconnect miscopy miscue miscure misdate misdeal misfall misfield misfire misfit mishit miskick mismatch misnomer misparse misprint misrhyme misrule miss mission missort misstep mist mistake mistell misthrow mistle mistrust misuse misyield miter mither mitre mix mizzle moan mob moblog mod moil mold molder mollycoddle molt monger monitor monkey monogram monograph monolog monologue montage moo mooch moon moonlight moonwalk moor mop mope morph mortar mortgage mortice mortise mosquito moss mote moth mothball mother motion motorbike motorboat motorcycle mottle mould moulder moult mound mount mountainboard mountebank mourn mouse mousetrap mousse mouth move mow muck mud muddle muff muffle mug muggle mulch mulct mull muller multiload mumble mummy munch mung murder murmur muscle muse mush muss muster mutiny mutter mux muzzle myspace nag nail name namespace nance nanny nanoimprint nap napalm nape narc nark narrowcast narrows natter neck necromance necropsy need needle neglect neigh neighbor neighbour nerve nest netsplit nettle network neuroimage nevermind newspaper nibble nick nickel nicker nickname niggle nightclub nim ninja nip nitrate nix nock nod nog noise nom nonplus nonsense nonsuit noodge noodle noogie noose norm nose nosedive nosegrind noseprint noseslide nosh notch note notice noun nudge nudzh nuke nurdle nurl nurse nursemaid nurture nut nutmeg nutshell oar oath object occasion octavate offcast offer officer offload offset offstand ogle oil oink ollie omen oncome onde onfall ontake oompah ooze opinion option orb orbit order orgasm orienteer ornament outbox outbreak outburst outcaste outcross outcry outdent outfall outfire outfit outflux outgo outlaw outlay outleap outline outpour output outrage outreach outride outsend outshow outskin outspan outtake outthrust outwork overbet overbid overburden overcall overcommit overdesign overdose overdraw overdub overfall overfill overflow overgo overhang overhaul overhold overissue overkill overlap overlay overleverage overline overload overmake overman overmatch overorder overpass overpressure overprint overpull overreach override overruff overrun oversample overshoot oversit overspill oversteer overstitch overstock oversupply overtalk overthrow overtype overuse overview overvote overwatch overwear overwork overwrap oxidate ozonate pack package packet pad paddle paddock padlock page pain paint paintball pair pal palaver palimpsest palisade pall palm palp pam pamphleteer pan pancake pander pandy panel pang panhandle pant pantomime parachute parade paraffin paragon paragraph paraphrase parasail parbuckle parcel pardon parent parget park parlay parley parleyvoo parody parole parp parquet parrot parry parse partition partner party pash pasquinade pass passage passenger password paste pastiche pastime pastor pasture patch patchwork patrol patronage patter pattern paunch pause pave pavilion paw pawl pawn pay pcr pdf peak peal pearl pebble peck pedestal pedicure pee peel peen peep peer peeve peg peise pellet pelt pen pencil pend penny pension pep pepper perch percolate perfume peril periphrase periscope perk perm permaban permablock permit peroxide peruse perv pervert pestle pet petard peter petition phagocyte phase phenocopy phenotype phial philander philibuster phish phone phosphate photo photocopy photoduplicate photograph photomap photometer photoset photostat phrase phreak phrensy physic picaroon pick pickax pickaxe picket pickle pickpocket picnic picture piddle pie piece piffle pig pigeon pigeonhole pigment pike pikey pile pill pillage pillar pillory pillow pilm pin pinball pinch pincushion pine pinfold pinion pinnacle pinprick pinwheel pioneer pip pipe pipeclay pipeline pipet pique pirouette piss pistol pit pitch pitchfork pith piton pitter pittle pity pivot pize placard place plague plait plan plank plant plash plaster plasterboard plat plate plateau platform platoon plaw play playfight playlist pleasure pleat pledge plight plink plip plod plop plot plotter plough plow pluck plug plume plummet plunder plunge ply pock pod podcast podium podreel pogo point poise poison poke pole poleaxe police polka pollard pollock polyadenylate polygraph pomade pommel pompador pompadour ponce pond pong poniard pontificate poo pooch poof pooka pool poop poot pootle popple pore pork porpoise portage porter portion portscan pose posit position posset postcode postfix postil postlude postmark postulate posture pot potter pouch pounce pound pour poussette pout powder power powerpoint powwow practice praise prance prang prank prate pratfall prattle prawn prebake precancel precaution precis precondition preculture predate predecease predicate preface prefilter prefix preform prejudice prelease prelude premiere premise premix prep preposition preprint preread presage presence preserve preshow presoak press pressure pretest pretext preview prevision prewash prewrite prey price prick prickle pride prig prink prison priss privateer prize probate probe proceeds process procession prod produce proffer profile profit profiteer program progress project prolapse promenade promise pronk prop proportion proposition prose proselyte prospect prostitute protest prototype provision prune prusik pry psalm psyche pub pucker puddle puff puggle pule pull pulp pulse pumice pump pun punch puncture punt pup purchase puree purfle purge purl purport purpose purr purse push pushbike put putt putter putz puzzle pwn pyrograph quaere quaff quahog quail quake quarantine quarrel quarry quarterback quaver quay queef queen quell quench query quest question queue quibble quicken quicklime quicksort quickstep quid quiff quill quilt quine quinella quip quire quirt quitch quitclaim quitter quiver quiz quonk quote rabbet rabbit race rack racketeer raconteur radar raddle radio radioassay radiobroadcast radiolabel raffle raft rag rage raid raik rail railbank railroad rain raise rake rally ram ramble ramp rampage rampart ramraid ramrod ranch range rankshift ransom rant rap rape rappel rapture rase rasp rat rataplan ratchet rate rathole ration ratoon rattle ravage rave rawk ray razor razz reach read readies ream reap reason reattempt reaudit rebate rebel rebleed rebluff reboot rebrand rebuff rebuffer rebuild rebuke rebuy rec recall recanvass recap recaption recapture recast receipt recess rechallenge recharge recharter recheck reclaim recoat recoil recompense recon reconnoiter reconnoitre record recount recover recross recruit redbait redd reddle redesign redirect rediscount redline redo redraft redraw redress redrum redshirt redub reduct reecho reef reek reel reencounter reeve referee reference refill refit reflux reform refrain refresh refund refurb regale regard regas regen regift regiment register regraft regress regret rehab rehash reheat reign reimport rein reissue reject rejoinder rekick relapse relaunch relay release relegate relent relet relish relook remain remake remand remark rematch remedy remise remit remix remortgage remount remove render rendezvous rendition renounce rent rentback reoffer rep repaint repair repartee repartition repast repatriate repeal repeat replay replevin reply report repose repress reprieve reprimand reprint reprise reproach repulse repurchase repute request requisition reraise rerecord rerelease rerun rescue research reserve reserves reset reshoot reshuffle resist resit resolve resort resource respite respond respray rest restart restreak restrike result resume resupply resync retake retard retcon retest retire retort retouch retrace retread retreat retrieve retrospect retry return reuse reveal revel revenge revere reverence revert review revise revisit revoke revolt revote reward rewash rewind rework rewrite rez rhyme rib ribbit ribbon rice rick rickshaw ricochet riddle ride ridge ridicule riff riffle rifle rift rig rim rinse riot rip riposte ripple ripsaw rise risk rival rive river rivet rmgroup roadblock roadshow roar robe robocall robotrip rock rocket rode roleplay roll rollback rollerblade romp roof rook roop roost roostertail root rope roquet rort roshambo rosin roster rot rotoscope roughcast roughhouse roughneck roundhouse roup rouse rout route router row rowel rub rubberneck ruck ruddle rue ruff ruffle rufie ruin rule rumba rumble rummage rumor rumormonger rumourmonger rupture rust rustle rut sabotage sabre sac sack sacrifice saddle safeguard sag sail sailboard saint salaam salamander salary sally salsa salute salvage salve sam samba sample sanction sandbag sandboard sandbox sandpaper sap sarge sarse sashay sass sat sate sauce sauna saunter savor savour saw say scab scaffold scag scale scallop scalp scam scamp scamper scan scapegoat scar scare scaremonger scarf scat scene scent scepter sceptre schedule scheme schlep schlepp schlomp schmooze school schoolmaster schuss schvitz scissor scissors sclate scoff scollop scone scoop scoot scooter scope scorch score scorn scourge scours scout scow scowl scrag scram scramble scrap scrapbook scrape scrawl scream scree screech screed screen screenshot screeve screw scribble scribe scrimmage scrimshander scrimshaw script scrobble scrod scroll scrounge scruff scruffle scrummage scrunch scrunt scruple scrutineer scuba scuffle scull sculpture scum scumber scumble scummer scunner scupper scut scutch scuttle scythe seajack seal sealift seam sear search season seat secretary section sed sediment seel seep segfault segment segue segway seine seiyuu sell sellotape semaphore semiquote sense sent sentence sentinel sepulcher sepulchre sequence serenade serotype serve service settle sex sext shack shackle shade shadow shadowbox shaft shag shake shale shambles shame shampoo shanghai shape shard share shave sheaf shear sheath sheave shed sheet sheetrock shell shellac shellack shelter shelve shemozzle shepherd sherpa shield shift shill shim shimmer shimmy shin shine shingle shinny ship shipwreck shirk shitcan shiv shiver shlep shock shoe shoegaze shoehorn shook shoot shop shore shoulder shout shove shovel shovelbum show showboat showcase shower shrank shred shriek shrimp shrine shrink shrinkwrap shroom shroud shrug shuck shudder shuffle shuggle shunt shut shutter shuttle shuttlecock shvitz shylock side sideline sidestep sideswipe sidetrack sidle siege sieve sigh sight sign signpost silence silhouette silkscreen silo silt simmer simper simulcast singe sink sinter sip sipe siphon sir sire sister sit site size sizz sizzle sjambok skank skate skateboard skeet skell skelp sketch skewer ski skiboard skid skin skink skip skipper skirmish skirt skit skitter skittle skive skrike skulk skull skunk sky skydive skylark skyline skyrocket slab slabber slag slalom slam slander slang slant slash slat slather slaughter slave slaver sled sledge sledgehammer sleep sleet sleeve sleigh sleuth slew slice slide slime slingshot slip slipstream slit slive sliver slobber slog sloganeer sloosh slop slope slosh slot slouch slough slowplay slub slubber sludge slue slug sluice slum slumber slump slunk slur slurp slut smail smarm smarts smash smatch smear smell smelt smile smirk smithy smog smooch smother smouch sms smudge smurf smush smut smutch snack snaffle snag snaggle snake snap snapshot snare snark snarl snatch sneak sneck sneer sneeze snib snick snicker sniff sniffle snigger snip snipe snirt snitch snivel snog snood snook snooker snoop snooze snore snorkel snort snout snow snowball snowblade snowboard snowdrop snowmobile snowplow snowshoe snuff snuffle snuggle soak soap soapbox soar soccer sock sod softsoap soil sojourn solace solder soldier soliloquy solvate somersault soogee sook soother sop sophisticate sorb sorrow sort sortie sot sough soundtrack soup source souse sow space spacewalk spackle spad spade spall spam span spancel spangle spank spar spark sparkle spasm spat spatchcock spawn spay spaz spazz speak spear spearfish spearhead spec speckle speed speedrun speedskate speel spell spellcheck spelt spend spew spider spiderweb spiel spiff spike spile spill spindle spire spirit spit spitball spitchcock spite splash splat splatter splice splint splinter splish splodge splotch splurge spoil spoils spoke sponge sponsor spoof spooge spook spool spoon spoor spore spork spot spotface spotlight spouse spout spraddle sprain sprawl spray spread sprig springboard springle sprinkle sprint spritz sprog sprout spud spume spunk spur spurn spurt spurtle sputter spy squabble squall squash squawk squeak squeal squee squeegee squeeze squelch squib squick squidge squiggle squinch squint squire squirm squirrel squirt squish squitter squizz squop squush ssh stab stack staddle staff stage stagger stain stake stalemate stalk stall stammer stamp stampede stanchion standby standoff staple star starburst stare start startle stash state statement station stave stay staycation stead steal steals steamroller steek steel steeple steer stell stem stencil stenograph step stereotype stet stevedore steven stevvon stew steward stick sticker stickybeak stifle stilt stim stimy stink stint stip stipple stir stirfry stitch stockade stockpile stodge stoke stole stomach stomp stonk stook stoop stoor stopper stopple store storm storyboard stot stove straddle strafe strain straitjacket strand strap streak stream streamline stress stretch stretcher stride strike strikethrough strip stripe striptease strobe stroke stroll strop structure struggle strum strut stub stucco study stuff stum stumble stump stunt stutter sty style stymie stymy subclass subclone subculture subgrant subgroup sublease sublet sublicense submeter subnet subpoena subsample subsign substitute subtitle subtotal subtype subvert subway succor succour suck sucker suffix sugar suicide suit suitcase suitor sulfate sulfonate sulk sulphate sulphur sum summer summit summons sump sun sunburn sunscald sunset suntan sup supercalender superclass supercoil supercruise superglue supersede supershift superstrate supertitle supertype supper supplement support surcease surcharge surf surface surfboard surfeit surge surmise surname surprise surrender surround surrounds surtitle survey sustain suture sux swab swag swage swagger swallow swamp swan swap swarm swash swat swathe sway swear sweat sweep swelter swig swill swim swindle swingle swipe swirl switch switchback swivel swizz swizzle swoon swoop swoosh swop swot syllable symbol symlink synapse sync synch syndicate syphon syringe sysop tab table tack tackle tag tail tailgate tailor taint take tale talk tallyho tamper tang tangle tango tank tap tape taper tapestry tar tare target tariff tarmac tarnish tarp taser task tassel taste tat tatter tatters tattle tattoo taunt taw tawn tax taxi tchick tea teabag team tear teargas tease teasel ted tee teen teetertotter telecast telecine teleconference telefax telegram telegraph telemonitor telephone teleprint telescope teletype telework telex tell telnet telpher temp temper tempest template tenant tenon tension tent tenter tenure term terp terrace tetch tether text texture thack thatch thaw therapy thew thimblerig think thirst thole thorn thort thou thought thrall thrash thread threap threepeat thrill throb throne throng throttle throw thrum thrust thrutch thud thumb thumbnail thumbshot thumbtack thump thunder thwack thwart tick ticket tide tie tier tiff tile tiller tilt time timeline timestamp timetable tincture tinge tingle tinker tinkle tinplate tint tip tipple tiptoe tire titer tithe title titre titter tittup titwank toady toast toboggan toe toenail toepoke tog toggle toil toilet toke toll tomahawk tomato tomb tombstone tomcat tone tong tongue tonsure tool toot toothbrush topline topspin topstitch torch torment torpedo torque torture toss tot tote totter touch tour touse tout tow towel tower toy trace track trademark traffic trail trailer train traipse tram trammel tramp trample trampoline transect transfer transfix transform transit transition translate transplant transport transpose trap trapeze trash travail travel traverse travesty trawl tray tread treadle treasure treat tree trek tremble tremor trench trend trepan trephine trespass tress triage tribotest trice trickle tricycle trifle trigger trike trill trindle triplicate triumph troat troll trolley trollop troop trope trot trouble trough troupe trouser trout trowel truckle trudge trump trumpet trundle truss trust trustee try tryst tub tube tuck tucker tuft tug tumble tump tune tunnel tup turf turn turtle tush tusk tussle tut tutor twaddle twang twat tweak tween tweet twerk twig twine twinge twink twinkle twirl twist twit twitch twitter twizzle twonk type typo ultracentrifuge umbrage umlaut ump umpire underbet underbid undercast undercoat undercut underdose underestimate underhang underhold underkeep underlay underlead underlook underorder underplant underplate underplay underrate underruff underscore underseal underset underspend understeer understock understudy underuse underwire underwork undress unfriend unicycle unknot unreason upbreak upchuck upcome update upfault upgrade upkeep upload uppercut uprate uprush upsend upsert upshift upstand upsurge upsweep upswell upthrow upthrust uptilt upturn upvalue upvote urge use usher vacation vacuum vagabond valet value valve vamp vang vanpool vapor vapour varnish vasal vaseline vat vault vaunt vector veel veer veil velcro velvet veneer vent venture verb verge vermicompost verse vest vet veto vial vibe vibrate victory victual vidcast viddy video videocast videoconference videotape view vignette vill vinegar vision visit vitriol vittles viva vocalise vodcast vogue voice volley volplane volunteer vom vomit voodoo vote vouch voucher vow voyage vurp wad waddle wade waffle waft wag wage wager waggle waggon wagon wail wain wainscot wait waitress waiver wake wakeboard wale walk wall waller wallop wallpaper waltz wamble wand wander wane wang wangle wank want wanter war warble ward wardrive warehouse wark warp warrant warranty wash wassail watch watchdog watchlist water waterboard waterfall waterflood watermark waterski wattle watusi wave waveguide waver waw wean wear weasel weather weatherstrip weave web webcast wedge weds weight welch weld welt wend wester wether wetnurse whack whale wham whap wheek wheel wheeze whelp whicker whid whiffle whig whimper whine whinge whinny whip whiplash whipsaw whipstitch whir whirl whirr whish whisk whisper whistle whitelist whitemail whitewash whittle whiz whizz whoop whoosh whop whore whorl whump wibble widow wig wiggle wigwag wiki wikipedia wildcraft wildfowl wile wilt wimble wimp wimple win wince winch wind windmill windproofs wine wink winnow winter winterfeed winterkill wipe wire wireframe wiretap wisecrack wit witch withers witness woad wobble wog wok wolf woman womble won wonder woodshed woof woos word wordsmith wore work workshop world worm worry worship woulder wound wow wrack wrangle wrap wreath wreck wrench wrestle wriggle wrinkle writhe wuffle wunner wuv wyte xenograft xeriscape xerox xor xylograph yabby yacht yack yak yakka yammer yandy yang yank yap yard yarm yarn yatter yaw yawl yawn yawp yeast yed yell yelm yelp yen yeuk yield yiff yip yodel yoik yoke yomp youtube yowl yoyo zag zap zed zest zig zinc zip zipper zizz zone zonk zoom zorb zot zouk 4340 N aal aar abdabs abdal abducens abettal abhal abraxas abuttal academicals acalephae acarminative accouterments accroides accrual accusal acephal acetable acetal achar achimenes acibenzolar acinaces acinetae acquittal acrocephaly acromegaly acrostic activewear acylal adeling adeps adidas admiral advergaming advertorial aedes aegilops aelotropic aeolotropic aequative aerobraking aerocolpos aeromechanic aeromodelling aerophilately aerotowing aerotrekking affixative afterburning aftercooling afterdeal afterings afterpotential afterpulsing afters agal agar agaric agogic agonistes agremens agrichemical agrochemical agueweed ailing airbed airconditioning airshed airspeed airwaves ajapsandal ajvar akonting akropolises alatae albicanal alcazar alegar alembic alexanders alkermes alkynal allenylphosphonates alleygating allheal alligatoring allobar allobarbital allodizing allografting alloparenting alloplastic allseed alluvials alms almsdeed almsgiving alphametic alphos altar ambages aminal aminodeoxysugar aminopropanal ammonal amobarbital amphiboly analects analloerotic analvos anamonic ananas anencephaly aneolithic aneurismatic angolar angries anhydrosugar animatic animelles aniseed anisophylly annal anomaly anopheles antbear antialiasing antialigning antianginal antiar antibunching anticommons anticounterfeiting antiderivative antidiagonal antifogmatic antifundamental antigropeloes antigropelos antiking antimacassar antimusic antinarrative anting antiphasing antiphonar antipodes antipruritic antisceptic antiscreening antistar anycasting apar apehangers apikoros appliable applicatorful appraisal apprisal approval apronful arachnodactyly arbelos arborvitae arcading archbishopric archcriminal archgrounds archrival arctophily argininal aries arisings arkful armful armorsmithing armoursmithing arousal arras arrear arrival arsenal arsenosugar arsinous arsoles artic artmaking ascar ascites ashing ashlar ashweed asperges assembly asterids astragal astrophilately atar atgar atheling athleticwear atlas atled attar attokatal aughts aulos auriculars aurochs autoblanking autoboxing autocephaly autochthones autoclitic autodial autodocking autogas autogating autoindexing autolearning automagic automaking automapping autonumbering autopartitioning autopoisoning autopositioning autoprocessing autorenewal autoreply autoscanning autoscattering autoscrolling autoshaping autotools aval avatar avens averral avgas avowal awning azasugar azidosugar azkal azygos babalaas babbelas babycakes babyproofing babywear backbenches backcrossing backloading backmasking backsies backstepping backswing backtesting badderlocks badders badfic badgemaking badlands bagful bagmaking bagpipes baldric balkar balletwear ballhandling ballocks balmoral balthazar bandpassing banns bantling barbering barbital barbitos barcoding barebacking bareboating barefooting barfly barful barkeeping barleymeal barnstar barrelful barristering barwalking barytes baseboarding baserunning basinful basketful basketweaving bathful bathos bathydemersal batwing bauks bayes bazaar beable beachcombing beachful beachgoing beachwear beakerful beakful beamforming beanmeal beanspilling beastings beatmatching beavering bedclothes bedful bedspring bedwetting beechdrops beehive beekeeping beermaking beestings beeswing begar beggarticks beheadal bejabbers bejeebers bellbottoms bellmaking bellringing bellyful belowstairs beltful benchmarketing bengal benthos benzobarbital bequeathal beremeal bestowal betrayal betrothal beylic bezoar bhuddas bialy biceps biclustering bicrystal biestings bifocals bigos bikeshed bikeshedding bikewear bilberrying bilboes billboarding billpaying billposting billy bindweed bing binocs binoculars binormal bioadhesive biobanking biobed bioceramic biochar biocomputing bioengineering biofabric biofouling biogas biogeneric biohacking bioimaging bioleaching biologicals biomanufacturing biomaterial biometal biomineral biomixing biomodelling biomonitoring biomusic bionanomaterial biopharmaceutical biopharming biopic bioplastic bioprinting bioprocessing bioprospecting biosensing biosignal biosimilar biotherapeutic biovar biped biradical birdcatching birdfeed birding birdkeeping birdling birdseed birdwatching birdwing bishopric bishopsweed bitstring bitterling bitters bitts bivocal blackberrying blackbirding blackfly blackfriar blanketweed blazar blessing blewits bling blinkenlights blockbusting blogoholic blogworking bloodletting bloodred bloodshed bloodshedding blowfly blueberrying bluecurls bluejeans blueshifting bluesnarfing bluestocking blundering blutchers boar boardsailing boardshorts boatbuilding boatful bocal bodybuilding bodyguarding bodyless boerewors boing bolivar bollocking bombmaking bonefishing bonemeal bongoes bookbinding bookful bookmaking bookselling boondocks boonies boosies bootmaking borating bordar boresighting borstal bosal bossnapping bossyboots bostal botfly bottlefly bottleful botts bouldering bowhunting bowlful bowstring boxcar boxful boxspring boyar boyloving boyshorts boyswear brachycephaly brachydactyly brae braies brainwashing brambling brandcasting brandling branks branmeal bratling breadmaking breadwinning breakables breakdancing breastful breeching breeks brekkers brending briar bribetaking bricklaying brickmaking brickworks bridalwear brinelling brinjal brisling bristols britches brittlestar broadwing broguing brolly bromal bromosugar bronzemaking bronzewing bronzeworking brushbar brushmaking bubkes bucketful buckjumping buckskins budgerigar bugbear bugleweed buildering bulerias bulgar bullbaiting bullfighting bullring bumsters bunburying bunkbed bunning buntal bupkes burglar burial bursar busbar bushing bushranging bushwalking businesswear busybodying butanal butenal butterfingers butyral bvds bwoys bygones cabal caballing cabbaling cabbeling cabbing cabdriving cabinetmaking cablecar cabrales cacoethes caddisfly caerphilly caesar cageling cahoots caic cajal cajones cakemaking calcar calends calipers callicarpenal callipers calvados cambric camcording camiknickers camming campanulids candlemaking candlemas candyflipping canful cannibal cantal cantar cantharides canuding canyoneering canyoning capful capias cappabar capperbar car caracal caramoussal caravanning carbophos cardiomegaly cardmaking cardplaying cardtable caregiving caretaking carful caricae caries carling carmaking carnassial carnitas carnival carotenal carousal carpal carpentering cartful cartonful cartophily carwashing caseful castanets castful castlebuilding castling casualwear catacaustic catchfly caterpillar catfighting cathar catharping cathedral catholicos cauldronful caviar cazic cedar ceiling cellpadding cellspacing celly centenar centennial centikatal centroiding ceramal ceras cereal cerevisiae chadar chaddar chaffweed chainring chairmaking chamar chamets champers chandlering changeling chantefable chantilly chaos chaparral chappal charas chazal chebs checkstring cheesemaking cheffing chemorepellent chemosignal chemovar chequing chervonets chesed chessboxing chestful chesticles chewings chicharrones chickenfeed chickling chickweed childbed childraising childrearing childrenswear chinar ching chinos chipmaking chipmusic chiromegaly chiropractic chital chitlins chitterlings chive chlamys chleuasmos chloral chlorethoxyfos chlorfenvinphos chlorosugar chlorpyrifos chocaholic chocoholic chokedar cholent choros chowkidar christmas chubes chuddar chuddies chulent chumar cicely cidermaking cigar cigarmaking cilly cinefilming circs circumambages cirriped citeable citral citronellal civies civils civitas civvies cks claes clamdiggers clarithmetic clas classloading classroomful clearcutting clearwing cleric clerkling cleverclogs clickjacking cling clinic clitic clockmaking closetful clothesmaking clothmaking cloudbusting cls clubwear cmos coachbuilding coachful coachwhipping coalbed coalheaving coaming coassembly coasteering cobbing cobblestoning cobinding cochineal coclustering cocrystal codebreaking codemaking codiverged codling codoping coffeehousing coffeemaking cognisances cognos cogwheeling cohousing coinflipping cojones coking collapsar collins colluvies collywobbles columbusing combings combjelly commissar commital communitas companding comptrolling concepting conferral confirmities confucianisms confusopoly congeries congratudolences conibear connegative constable construal containerful contradancing contragestive contrapositive contretemps contumely conveyancing coolibar cooly cootling copacking copal cophasing copolymerizes copperas copperbars coppersmithing copperworks copyediting cording cordovans corduroys cornflakes cornicular cornmeal corps corsetmaking corsive cortinar corydoras cosmaceutical cosmeceutical cosmos cotes cottaging cottar cottonseed cottonweed cotunneling cotunnelling cougar coumaphos counterappeal counterconditioning counterflashing counterinitiative counterkilling countermeeting counteroffensive counterprogramming counterproposal counterrally counterspying countertactic counterwar cous couscous covariable coveralls coving cowling coworking cowshed cracklins craic cranberrying cranefly crateful creamcups cred creekbed cremains crimebusting crimefighting cringeling critic crofting croplands crossbar crossbenches crossbones crossbracing crosscoupling crossfostering crowdfunding crowdsourcing crudites cruisewear cryocooling cryoelectroncs cryofocusing cryosampling cryosectioning cryotrapping cryovial cryptomaterial cryptoprocessing crystal csardas cts ctvhcs cudweed culottes cultivar cuntlicking cuntlips cupboardful cupful curlies cusping custumal cyberbanking cybercapital cybercheating cybercounseling cybercriminal cyberczar cyberdating cyberdetective cyberequivalent cyberflirting cybergambling cybergaming cyberissues cyberlearning cyberloafing cybermarketing cybermentoring cybernews cyberoperations cyberpal cybershopping cyberslacking cyberspying cybersquatting cyberstudies cybersurfing cyberteaching cybervandal cyberwar cyberwear cyberwedding cyclewear cyclops cymar cymbal cymbaling cynocephaly cysteinal cytomegaly czar czardas daal dactyly daffodowndilly daggering dagmar dahling dairying dal daled dalmatic damar dampproofing damselfly danceaholic dancemaking dancewear darbar daric datacasting daybed daylily daysailing daystar daywear dealloying dealmaking dealy deasphalting deathbed deathfic deathstar debiasing deblending deblurring debunching decakatal decal decasyllable dechanneling decikatal decisionmaking declawing declustering decompensated decrial dedal deeksies deferral definiens definitioneering defrayal degumming dehors dehubbing dehydriding delative delts demurral denar denial denims denimwear denoising deodar deoxysugar depairing dephasing depinning depointing deprival deschooling deshelving deshielding deshopping desiderative designerwear desolventizing despisal dessertspoonful detective determinans determinative dethreading detwinning deviless dewar dhal dhobying diabetes diadumenos dialectic diapositive diaromatic dichlorvos dickens dickweed dicrotophos diddly didemnaketal dideoxysugar diflunisal diking dillseed dimictic dinar ding dingaling dinnerwear diplegic dipperful diradical disapproval disassembly disavowal disbudding disbursal discowear discretionaries dishful dishwashing disincentive dismissal disobeyal disordering dispersal disposal dissavings dissyllable disyllable dithioacetal dithiohemiacetal dithioketal divewear divvers dobsonfly docklands dockworking dodecasyllable doeling dogballs dognapping doily doings doldrums dollar dollmaking dolos domaining dominos doos douar doughmaking downfolding downlighting downsampling downsizings downswing downwelling dragonfly drainings drawbar drawerful drawfiling drawgear drawspring drawstring dreadlocks dregs dressmaking drins dromos droppings dropseed droughting drugtaking drumbeating drumful druthers dryas dsms duar duckling duckweed duds dumpling dundrearies dungarees duniwassal dunking duopoly durbar duxelles dwarfling dyirbal dyking ear earful earing earlies earmuffs earnings earring earthling earthstar earwear easting eaves eburones ecliptic ecocritic ecodesigning econocar ecowar ectocommensal ectotympanic edgebanding editioning eelspear efaproxiral eggar egosurfing eic einherjar ejective elative elbowful elderberrying elding electroblotting electroceramic electrocoating electrofishing electroforming electroloading electropolishing electrorefining electrospinning electrospraying electrowetting electrowinning elevenses elevensies elotropic emotronic emptins enal encaustic enclitic encyclical endive endocannibal enhydros enquires enriched ensanguining ensembling entertailing entomophily entrails entremets eolotropic epanodos epiboly epizoodic equipartitioning erastes eric erlking eromenos eros errorbar erysipelas escargots eschar eschewal escolar espial espousal etaloning eteostic ethanal ethanoic ethic ethnomusic ethos eudicotyledons euouae eurodollar eurostar eutely eveningwear eventing everclear evildoing exakatal excretable excusal execs exemplar exergaming exocannibal exophthalmos explanans extrados extrudites exuviae eyas eyebar eyeful eyering eyewear fabids fabric faceful facesitting facetiae facies fackins factfinding factorial faeces fafrotskies faggoting fagmosexual fagoting fairyfly fal falderal fambly fancypants fanfic fanlisting fantasylands fanwear faravahar farthing fasces fasciating fatling fatliquoring faujdar fauxmosexual fauxtatoes fawnlily fbs feces feldspar fellwalking felspar femtoengineering femtokatal fenks ferrometal fetishwear fibreglassing fic fictionmaking fiftysomething filesharing filly filmgoing filmmaking filmstar financials finching fingerful fingerling fingerpointing fingerspelling finial finings finning firefighting firefly firehosing fireweed fireworks fishfinding fishfly fishkeeping fishmeal fishmongering fisking fistful fiveling fivestones fixings flamewar flanging flaskful flatcar flatlands flaunching flavouring flaxseed fledgeling fleming fleshfly fleshings flews flexecutive flexihours flexwing flightseeing fling flitterjigs flixweed floodwaters floorless floorplanning flowcharting flowerbed flowerfly fluorimaging fluorochemical fluorosugar fluorspar flyboarding flyfishing flyspecking flyting folar folksinging folly foobar foodaholic foodshed footbed footbinding footdragging footgear footing footprinting footwear footwriting forceps forebear foredeal foreking forewing forkful formalwear formfeed formfilling forslitting forthdeal fortunetelling fortysomething fosterling foundationwear foundling fracas fracing frameshifting framily freebanding freebirthing freediving freerunning freeskiing freethinking freewriting friar frogling frontrunning frugging fruitfly fryling fulmar fumblefingers funbags funboarding fundable fundholding fundraising furfural fustic futsal fynbos gable gadfly gaincoming gaingiving gainsharing gal galanas galangal galashiels galimatias galletting gallfly gallinaceous galluses gally galpal gamekeeping gar gardenful garlic gasfitting gasworks gathering gavial gaybar gaydar gaywings gazar gbs gcns geas geekwear genderbending genetive gengineering genitals geniting genomovar gens gentlefolks geocaching geoengineering geomaterial geophily geopotential geranial gerundive gharial ghazal ghostbusting ghosthunting ghosting gibbs giblets gigakatal gigapascal gigayear gimbal ginsing girlswear girlwatching girning giros gisaring glacading glaive glamping glanders glassblowing glassful glassmaking glasswashing glassworking glassworks gleed glenzing glimms gloaming gloated globemaking glossohyal gloveful glucal glycal glyceral glycinal glycopeptidomimetic glyoxal goal goalkeeping goalscoring goatling gobar gobful godling godmoding godsakes godspeed golddiggers goldenseal goldilocks goldsmithing gomeral goniolens gonys googlewhacking goolies gooseberrying goral gosling gossipmongering goutweed goyal grammar gramps grandmothering grantmaking grapeseed grasscutting gravastar graveclothes graverobbing graviscalar gravitas grayling greed greedyguts greenfeed greenfly greengrocing greenkeeping greenling greenskeeping greenweed gribenes gridding grolies grossular groundling grounds groundskeeping gruds grundies gts guar gubbins guestmeal guidwilly gujjar gully gummies gunkholing gunmetal gunrunning gunsmithing gurning gutful gwas haar habdabs habeas haemoderivative hagseed haircutting hairdressing hairpulling hairsplitting hairspring hairstyling hairwashing halfbreed halfling halfsies halmos haloaromatic halosugar halvans hamadryas hamal hamets hammal hammochrysos hammocking hamstring handcar handclapping handful handholding handlebar handspring handwashing handweaving handwringing hangar hanimal haras harddrive hardstanding harmal harmdoing harns harpings harras hartal hashbrowns hashtable hatchling hatelisting hatemongering hatful hatmaking hatred havable havildar hawaladar hawkweed haymaking hayseed hayshed hazing headcollar headgear headies headlighting headphones headquarters headshaking headspring headwaters headwear heapings heartcutting heartful heartstring heartstrings heavyhanded hectokatal hectopascal hed heelies heightening heliboarding heliskiing hellenismos hemiacetal hemiaminal hemiketal hemimegaloencephaly hemoderivative hempseed hendecasyllable hendiadys hepatomegaly hepatopancreas hepatosplenomegaly heptanal heresthetic heretic herpes herring heterophylly heteroradical heteroring heterostyly heuretic hexacoral hiccoughs hieroglyphed higgs highlands highlining hijinks hilding hillbilly hillclimbing hillwalking hindwing hiphuggers hippocras hireling hirsuties histogramming histostaining hobelar hobilar hocketing hodening hogweed holidaymaking hollands holliers holly holming holoprosencephaly hols homebuilding homebuying homecoming homemaking homeschooling homeshoring homesourcing homewares homeworking homewrecking homily hommos homocoupling homophily honeymaking hongweibing hoodening hornfels horsefeathers horsefly horseracing horseriding horseweed hosannahing hospital hospodar hosteling hostelling hostessing hotbed hotdesking hoteling hotelling hotlinking hotpants hots hotting hoummos hoummous houmous housebuilding housebuying housecar housefly houseful househunting housekeeping houselights housepainting housewares housewarming hoverboarding hovercar hoverfly huanglongbing huevos hundial hundred hurdies hurling hussar husting hustings hydriding hydroblading hydrocephaly hydrochronic hydrodewaxing hydroengineering hydrofining hydroforming hydrofracking hydrofracturing hydrometrocolpos hydropillar hydroprocessing hydrops hydroseeding hydroxymethylfurfural hylleraas hyperarousal hyperchaos hypercinnabar hypercritic hyperdactyly hyperdrive hypergraphic hyperlens hypermiling hyperscalar hyperspeed hypnobirthing hypospadias iceboating icemaking ichnofacies ichthys idear iftar iliopsoas illderly illogic imagemapping iminosugar immunoassaying immunoblotting immunocontraceptive immunoediting immunoimaging immunophenotyping immunostaining immunotyping impatiens imping inbetweening inbreaking incentive incunable inerting infeed inferencing inferognathal infighting infodemic infographic infoholic infomercial infommercial informercial infowar ing inholding iniencephaly injunctive inkling inning innkeeping inpainting inpouring inshoring instar instreaming interbeing interiorscaping interlining internals internegative interoceanic interposal interpositive interspersal interstacking intertrons interval intervising interwebs interworking intrados introverting invar investigable iodosugar ironmaking ironmongering ironsmithing ironweed ironworking ironworks irreconcileable islandful isobar isopycnal isoscalar isoscaling isoseismal iwar jacal jacamar jackpudding jacktar jacobs jaggies jaghirdar jaguar jamadar jameed jamjar jandal janitoring janjaweed jankers japanning jarful javascripting jeanswear jegging jeggings jellybelly jemadar jemidar jeos jetsetting jewelweed jharal jibbing jimjams jimsonweed jingal jobseeking jodhpurs jodies jogpants johannes jointing jointweed jonkmanskas joual jougs jubbly judas jugful juggins jumpseed kafal kahal kairos kajal kalends kamal kamees kantar karbovanets karting kashkaval katal kaval kecks ked keepalive kees keftedes kegful keks kermes kes ketal kettledrumming kettleful kettling kevlar keybinding keyboarding keylogging keymapping keypal keyring keytar khachkar khaddar khanjar khedive khimar khitmatgar khitmutgar khoums kickboxing kicksled kidswear kiladar kilobar kilocal kilokatal kilopascal kiloyear king kingmaking kirtankar kitchenful kiteboarding kitemaking kittening klackers klismos knapweed knar kneecapping knickerbockers knickers knicks knifemaking knitwear knotweed kobzar kogal kommos kotwal kouros kourotrophos kouskous kraal kriging krumping ksar kunjoos kunming kursaal kvas kymys labiovelar laborshed labourshed labrys lacemaking lacewing laches ladieswear ladyparts lagering lahar lakebed lambic lamiids lammas lampas lamping lancers lanczos landholding langar laniquidar lantibiotic lapwing lar largened largening largens larimar lascar latchstring latexwear latic lative lats launchings lawbreaking lawing lawmaking lawnmowing lawyering lazar lazybones leafcasting leafleteering leapling leathergoods leathermaking leatherwear leatherworking leatherworks leavings lebesgue_stieltjes legwear leisurewear lekvar lemming lennard_jones leptomeninges letteral leucinal leudes liar lias lidar lifecasting lifeguarding lifehacking lifestreaming lightbar lighting lightspeed lightyear lignicolous lineaging linebacking linefeed ling linseed lisencephaly lissencephaly listmaking listwashing litas lithal lithofacies lithops litotes litterboxes loadstar loblolly lobscows lockpicking lockring locksmithing locoweed lodestar lodging loggets logic logodaedaly logrolling lolly longboarding longhauling longjohns longlining lookalike lordling lorryful loukoumades loungewear loutrophoros loveling lovemaking lowriding lucas lues luggable lungful lupanar lustmaking lynching maar machosexual macrocephaly macrocracking macrodiagonal macrofamily macroing macromixing macroprogramming macropteres macroradical macroseeding madras madrigal maecenas mafficking magar magnetar mahal maimings mainspring maizemeal makar mal malling mallomar malternative malvertising mammal manas mandyas mangal manimal maniped mansplaining manyplies maoming mapmaking mapvertising marae marans marathoning marechal mareschal marketeering masdar mastic matchboarding materfamilias maths matins matric maxilliped mayfly maying mayweed measles meatpacking meatworks mebos mechanic mechanicals mechanosensing mecuricals medfly mediamaking medic medivacking medlar medmal meeting megabuilding megadeal megakatal megamusical megapascal megaportal megasiemens megastar megatrial megayear mehmandar menses menswear menubar menuing mephobarbital mereswines meroving merrymaking mescal mesoclitic mesonephros metacinnabar metagrammar metaheuristic metalens metalogic metalworking metamaterial metamodeling metamodelling metanarrative metaperspective metar metareasoning metastring metatable metathinking methamidophos methamphetamines methanal methohexital methylal methylglyoxal methylphenobarbital metic metical metrosexual mezcal microalloying microbar microbleed microbrewing microbunching microcar microcephaly microcharcoal microcomputing microcosmos microcrystal microdistilling microdrive microengineering microfabric microfinancing microforceps microinjecting microkatal microlearning microlending microlens microlensing microlidar micromachining micromanufacturing micromaterial micromineral micromixing micromosaic micropillar micropositioning microprinting microprocessing microquasar microremains microring microseed microseeding microsensing microstamping microtargeting microtear microtubing microwear midding middlings midmeeting midmorning midteens midyear migradollar milkbar milkweed milletmeal millful millibar milliequivalent millikatal millipascal millisiemens millworks mimbar minbar minesweeping mineworking ming minibar minicanal minicar minicomputing miniepic minifacial minifestival minimusical miniretrospective miniserial miniseries minispiral minisupercomputing minitrial miniwar mipmapping mips mirrorshades misandric misassembly misbidding mischmetal misconstrual misdeed miseryguts misfiling misgendering misgiving mishandling misincentive miskal mispriming missal missive misspeaking mistal mistrafficking mistral mistrial mithqal modacrylic mogas molding molly moly monal moneylending monial monkeywrenching monkies monocrotophos monocrystal monodactyly monoderivative monophyly monopoly monosyllable monotal monotasking monothioacetal monothiohemiacetal mons monthling moondial moongazing moonseed moonshining mores morgellons morning morningstar morphospecies morphotyping mosaicking motorboating motorcar moulding mountainboarding mountaineering mouthbrooding mouthful moval moviemaking msys mudsled mudslinging mudwrestling mugful mugging muggins mujahed mukhtar mulligrubs multibillions multibooting multibranding multibuffering multicasting multicrystal multihoming multilayering multipathing multipotential multiprocessing multisampling multiskilling multiskills multisourcing multithreading multitracking mumps munchies municycling mural music musicing mustanging muttonbirding muttonchops muttonheaded mylar mythmaking mythos nabal nachos nads nailbed nakharar namaskar namevoting nanobunching nanocable nanoceramic nanocoating nanocomputing nanocosmetic nanocrystal nanodielectric nanoengineering nanoequivalent nanofocusing nanoforging nanofractal nanokatal nanolensing nanomanufacturing nanomaterial nanometal nanomoulding nanopatterning nanopharmaceuticals nanopillar nanopositioning nanoprobing nanopublishing nanoring nanosiemens nanostring nanostructuring nanotweezers naos narcodollar nariyal narwhal nasheed nates natting navbar navier_stokes navigates naxarar nebuchadnezzar necessaries neckwear necrophily nectar ned needleful needleworking nekropolises nenuphar neoconservative nephromegaly nephros nephs nerdic netbeans netful nethers netminding netraising netroots neuromarketing neuticles neutraceutical news newsfeed newsweekly newton_cotes nibling nibral niding nightclothes nightdreaming nightgear nighthawking nightjar nightwear nilas nilradical nitpicking nitriding nitrofural nixtamal nomos nonagesimal nonally nonanal nonanalgesic nonantibiotic nonarousal nonarrival nonbeing nonbereaved nonbias nonbully noncannibal nonchaos noncompos noncritic nondiabetes nones nongas nonking nonliar nonmammal nonmeaning nonmetal nonnational nonplastic nonproposal nonrefusal nonrenewal nonreply nonscandal nonsceptic nonscholar nonsibling nonsked nonskeptic nonsports nonstar nonsugar nonsuperstar nontalent nonworkaholic nootropic nopal nopales northing nosebleed nosebleeding noseful noshoring notaphily notetaking nothospecies notifying noughties nous nowcasting nucleofecting nullisomic numbnuts numeral nuptials nursling nutraceutical nylons nymshifted nymshifting nymshifts oakling oarweed oathbreaking obsequies octavofinal octocoral octosyllable odds oddsmaking oersted offal officeholding offroading offscouring offspring ogive oilseed oilskins oleocanthal oleochemical oligohydramnios oligopoly olisbos olivegrowing omkar omphalos onboarding ontos oodles opal opisthenar opisthodomos ops opticals orbifolding orbital orcharding orcos ordeal organometal orienteering orling orofecal oscar osmosensing osteocartilaginous othering oughties ouroboros oustering outbreeding outbuilding outcoupling outcropping outerwear outlands outpouching outpouring outswing overbar overcooling overdelivering overdrive overhedging overhunting overling overlining overlogging overparenting overplanning overpotential oversocks overswing overthrowal overtrousers overyielding overzeal owling oxfords oxyradical oysterbed oysterling pachymeninges padkos pageful pailful paintmaking pairbreaking pairforming pajamas paladar palatovelar palmas palmreading pamphleteering pancreas pandal panegyric paneling panful panoply panpipes pansharpening pantalets pantalettes pantaloons paperhanging papermaking parable paracrystal parados paragraphos paralegal parallelepiped paramedic paramotoring paraoptometric paraphily paraphyly pararealgar parascending paratroops paregoric pargeting paries parseval parthanatos partywear pascal pasilaly passcodes passepied pastrymaking patas patchouly paterfamilias pathfinding pathic pathing pathos pathovar pathworking patternmaking pawful pawnbroking payables paytable peacebuilding peacekeeping peacemaking peacemongering peagrowing pear peating ped pedlar peds peening peierls pelike pemetrexed penates pencilmaking pendentive penmaking pennyroyal penpal pentadactyly pental penthos pentobarbital pentothal peplos peptidomimetic pergal perusal pes petakatal petal petrichloral petrodollar petroholic phal pharming phasetrafficking phelloplastic phenobarbital phenotyping philately philharmonic philippic pholas phosphoimaging phosphomimetic phosphorimaging photoaging photoblinking photoceramic photocoupling photocrosslinking photocuring photodarkening photofading photofinishing photoheating photoimaging photokilling photolabeling photolabelling photomosaic photomural photopatterning photoreversal photoswitching phototuning phototypesetting phragmites phrasemaking phytobezoar phytomining pibal pic pickerelweed picokatal picosiemens piemaking pigling pigopoly pigweed pilates pilliwinks ping pingas pinstriping pipeful piperonal pipesmoking piridosal pisces pissabed pisspants pitful placeshifting plagiocephaly plakous planeful planetesimal planimetric plateful platterful playgoing playmaking plaything playwear playwrighting playwriting pleuroperitoneal pling plowing pls plumbing pocahontas pocketful podagric podfading podslurping poes poffertjes pointling poitrinal pokedollar pokeweed polestar policlinic policyholding policymaking poltergeistic polyacetal polyclinic polycrystal polydactyly polyderivative polydrugs polyforming polyhydramnios polyking polyphyly polyradical polysyllable pondweed pons popcorning poplar poppyseed popstar pornstar portal porteous portrayal portugal postprocessing potables potbelly potful potholing pothos pothunting potjiekos potscaping pouchful poundal pous powerboating powerbroking powerlifting powersharing practic preapproval preassembly prebaiting prebuttal preclamping precleaning preclear precoding prediabetes predrinks preincubating preionizes premed premelting premetric premolar prenursing prephilately preplanetesimal preplanning preplating prepotential preschooling presulfiding pretargeting priar prilling primorial princeling printmaking printworks prizefighting prizzly proadjective proclitic proferens prokinetic promwear pronaos pronephros propanal propedeutic propenal propenoic prophases prophesied propheteering proposal proseminar proslambanomenos prosopagnosic protanomaly proteomimetic prothetely protomammal protostar prototyping protuberancies proxenos prybar pseudocereal pseudocoding pseudocoloring pseudocolouring pseudofaeces pseudofeces pseudoideal pseudointellectual pseudologic pseudomonas pseudopotential pseudoradical pseudoscalar pseudosibling pseudostuttering pseudotyping psoas psogos psychobilly psychopharmaceutical psyops psywar pubbing publands puckhandling puddening pudding pufferbelly pullikins pully pulsar pumpkinseed punding punies punkabilly punkling puppeteering pursestring pyjamas pyknic pyramiding pyridoxal pyrosequencing qadar qantar qawwal qindar qintar qiyas qlipothic qsar quadrans quadrantal quadric quadriceps quadriplegic quadrisyllable quadrivial quadruped quadruplexing quaily qual qualificative quantic quarterfinal quartzing quas quasar quasicrystal quasipolynomial quasispecies quasistar quetzal quilling quinquesyllable quintal quisling quiverful quotative raajmahal rabies racebending racecar racewear rackabones radiometal radiopharmaceutical radiopulsar radioscanning radiosounding radiotracking radiowaves ragweed railbed railcar railfanning railful railworks raines raingear rainmaking rainwear rakshas raltitrexed rangering rantings rapeseed rascal rastering ravewear raycasting raytracing realgar reappraisal reapproval reassembly rebar rebinding rebirthing rebrightening reburial rebuttal recessional rechipping recital recombineering recordkeeping recusal redbed redbelly redcedar redshifting redwing reed reedbed reeding refarming referral refreshaholic refusal refutal reggae regimentals registrar rehearsal reimbursal reinking relic relvar remittal remoting removal rendezvoused renditioning renewal repointing reposal repricing reprisal reproval republic requital rereading reredos rereferral res rescattering resequencing reshoring resilencing resourcing respacing ressaldar restauranteering restaurateuring restoral retable retiral retrial retrieval retrocomputing retrogaming retrosexual revers reversal reviewal revisal revival rewetting rezoning rhetoric rhinoceros rial ricemeal ricercar riches rickets ridesharing ridgeling ridgewalking ridgling riesling rillettes rims ring risped rissaldar riverbed rixdollar riyal rms roadbed roastnear robemaking rockabilly rockhounding rockstar rogering roguelike rollbar romanichal rompers rooibos rooigras roomful ropemaking rorqual rosemaling roundheels roundtable rtos rubberwear rubric ruching rugging rulebreaking ruminates rupes russies ryemeal sabal sabellic sackful saddlebred sads safebreaking safecracking safekeeping safranal saggar sahidic sahiwal saibling saic sailboarding sailboating sailmaking saintling sakkos sal salading salal salicional salmanazar saloonkeeping salopettes saltcellar saltmaking saltworks salubrinal salwar sambal sambar samovar sandal sandbar sandboarding sanderling sandfly sanguinivorous sanies sapiens sapling sarking saros sashichigal sassafras satchelful satcomms satcoms saucerful saunders sausagemaking sawbones sawfly scabies scaffolding scally scandal scandalmongering scanties scantling scaphocephaly sceptic sceptically schilling schizodactyly schmear schnapps scholar schooldays schoolteaching schoolwear scimitar scoopful scorekeeping scorpionfly scorpionweed scouting scoutmastering scratchings screencasting screenful screenreading screenwriting scripophily scriptwriting scrollbar sculpting scumming seabed seakeeping sealegs seamstressing seastar seaweed secateurs secobarbital sectoring seedbed seizings selfassembling selfassembly selfdual selfheal selfing selfquenching semiacetal semifinal semiketal semimetal seminar semiochemical semiring semirural semisyllable semitutorial sendal seneschal sepal sequellae serdar series seronegative serovar serval setar sevenless seventysomething sewadar sewering sexaholic sexdactyly sferic shabbos shadowboxing shadowcasting shaheed shalwar shamal shammes shampers shants shaobing shapewear sharwal shaveling sheading shealing shearling sheeling sheepherding sheepshearing sheerlegs sheetful sheeting shegging sherryvallies shieling shikar shillyshallying shipbroking shipbuilding shipful shirting shirtmaking shive shockvertising shoegear shoelacing shoemaking shoestring shoewear shofar shoofly shopaholic shopful shopkeeping shoreweed shoring shortalls shortcoming shortfalling shortribs shotmaking shovelful showjumping shreddies sial sibling siccative sickbed sidebar sideburns sidecar siemens sieveful signboarding signwriting silkwear silverling silversmithing silverweed simar sing sinkerballing sirdar sirkar sisal sitar sizar sked skeevies skeezicks skeiling skelly skeptic skibobbing skimboarding skinful skinnymalinks skiwear skopos skraeling skully skunkweed skunkworks skurfing skyfarming skyful skysurfing skywriting slacklining slapsies sleepdriving sleepwear sleevenotes sleighful sling sliotar slippering slivovic slugabed slurring slyboots smackeroonies smallclothes smallgoods smallholding smalls smartweed smartypants smellies smirting smithing smores snakefly snakeling snakeweed snappily sneakers sneezeweed snookums snootful snowbear snowbilly snowmaking snowmobiling snowshed snuggums soapmaking soapstar sobersides sociative sockful socred sofabed sofar softlifting solebar solubles sombrely sonar songfic songwriting soothsaying sordes sorites sortes sos soukous soundalike soundbar soundpainting soupspoonful sourbelly southing sowar sowbelly spacebar spacegoing spacelegs spaceling spacewear spadeful spalting spamdexing spankies sparable sparagmos sparsening sparsing spearfishing spearphishing species spectatoring speechmaking speechreading speechwriting speedboarding speedboating speedskating speedsolving spelling speltmeal spendaholic speos sphereing sphering sphugmicks spic spinar sping spiroacetal spiroketal spittal spitted spivias splenomegaly spoligotyping spondulic spondulicks spoonbending spoonful sportscar sportscasting sportswear sportswriting spreadsheeting spring springhaas spriting squarial squegging stadial staffing stageful stagewear stakebuilding stakeholding standardbred stapes starling starveling stationkeeping stats steamfitting steelmaking steelworking steelworks steeplechasing stepfamily stepparenting stepsibling stereometamaterial sterndrive sternsheets stickfighting stickweed stieltjes stillsons sting stinkweed stipes stirling stockbroking stockfeed stockholding stockingful stockjobbing stocktaking stolly stomachful stonefly stooly stoozing stoping storekeeping storytelling stovies streambed streetcar streetfighting streetful streetlighting streetwalking streetwear streptomyces strewing string sts studentizing studentships stymphalides subadar subassembly subceiling subcooling subcycling subderivative subdual subedar subfamily subflooring subgoal subheading subinterval sublative sublogic submittal subring subsampling subspecies substring subtable subtelomeric subtopic subvertising suffers sugarally sugarholic sugarolly sugging suitcaseful sukkos sulfiding sulfonal suling sulphonal summerful summerwear sunbed sundae sundial sundowning sundrops sungazing sunglasses sunseed superarrival superbeing supercar superclimbing supercoiling supercollapsar supercomputing supercriminal superdetective superembedding superessive superfactorial superfamily superfatting superficies superfly superglobal superharmonic superhumeral superhumping superlens supermusical superpositioning superpotential supersedeas superspecies superspinar superstitial superstring supertonic supervisal superweed surbahar surfriding surrebuttal surreply surroyal survival suspenders swanling swapsies swaybar sweatpants sweethearting sweetling sweetlips swillking swimwear swing swishing switchgear swordmaking swordsmithing symboled symboling symbolled symbolling symbrachydactyly syndactyly syndic syngas synophrys tabes tableful tablespoonful tableting tabletting tacops takable talebearing talent talipes tallevas talonas talukdar taluqdar tamal tankful tanling tapas tapesponding taring tariquidar tartar tarweed tas taskbar tasselseed tatar tavernkeeping tbs tchervonets tcs tdrs teacupful teamaking teambuilding teaspoonful technocritic technofear technomusic technopoly teddybear teddybears tehsildar teinds telebanking telecomputing telegaming teleheating telemarketing telementoring telepersonals telepresencing teleprinting teleprocessing teleprogramming telesales teleseminar teleshopping teletutoring telly temefos temenos temephos templar tennies tentful tepal terakatal teras tercentennial tertial testbed testimonial tetraarsenic tetraplegic tetrasyllable texas textaholic thanadar thanatos thanksgiving theatergoing thenar thermocycling thermohardening thermophily thermoprinting thermos thial thickening thimbleful thimerosal thing thining thinnings thioacetal thiohemiacetal thiohemiketal thioketal thiomersal thiopental thneed tholos thomas thornproofs threadjacking thresholding thrifting thrips throughgoing thrushling thugging thunking thymos tic ticketing tiddlywinks tiding tidytips tightlacing tights tilemaking tilly timar timbal timbering timekeeping timeserving timesharing timeshifting tinful ting tinsmithing tiswas titanides toastmastering toches toeprinting togemans toileting tokhes tolar tolerancing tollbar tomling toolbar toolmaking toolshed toolsmithing toothypegs topic topos torchmaking tournedos towbar townful townwear toxophily toxotes toymaking tracing trackbar trackbed tracklisting tradewinds trailerful trainful trainspotting tramcar transexual transferal transferral transfugitive transhistorical transmittal trapshooting traversal trayful treadmilling treadwear treatymaking treemapping treggings trendspotting trevally trews tribar tribbing tribunal triceps triceratops trichobezoar trichording tridactyly triens triflic trifluoroacetic trifocals trimmings trional trioval tripos triradical trisyllable trocar troosers troublemaking troupial trousers troutling trowelful truckbed trucking truckmaking truffling truing trunkful trunking trupial trustbusting truthmaking truthtelling tryscoring tsar tsimmes tsores tubful tuches tulwar tumblerful tunesmithing tunic tureenful turmeric turntable turps tweed tweens tweezers twentysomething twilling twining twinling twosies twothirds tymbal tympanites typebar typosquatting tzar tzimmes uae uglies ultradiscretizing ultramarathoning ultraradical underbar underbelly underbuilding underclothes underclothing undercrackers underdrawers underdrawing underfilling underhedging underling undermatching underoos underpainting underpants underpotential underpredicting undersampling undershorts understairs understanding underthing undertrial underwear underwebbing underwing undies unicasting uniped unmakable unmentionables unnecessaries unranking unsatisfiable unschooling unsoiling upas upbringing upheaping upheaval uproar uprootal upscattering upskirting upspring upswimming upswing upwelling urial urinal urnful utas valeral valuables vanful vanitas varchar varifocals vas vaseful vates vaultful veal vectorpotential veepstakes vegies veining ventriculomegaly verballing veritas veronal versal versemaking versioning vertexing ves vespers vetchling viaticals vicar vidding videodating videogaming videomaking videorecording viewsers viewshed viking vinbarbital vintenar violinmaking virial vishing vitals voguing volatiles vortal vortexing vraic vrykolakas vsic vtable vysar wabs wadding wadmal wagonful wainscoting waisting wakeboarding walkies wallcovering wallcrossing wallhacking wally warblefly wardriving warehouseful warfighting wargaming warlording warning warragal warrigal wartweed warwalking watchkeeping watchmaking watchstanding waterbed waterboarding waterlily watershed waterskiing waterweed waterworks wattleseed wattling wavetable waxwing waxworking wayfinding waymarking weal weanling weaponsmithing weatherboarding weatherstripping webbing webcomic webfeed webinar weblogging webring websquatting weightlifting wellbeing wellderly wellies wellspring welly wels werebear westing wheal wheatear wheatmeal wherewithal whimperative whing whipmaking whiskering whistleblowing whiteboarding whitecedar whitefly whitegoods whitening whiteprinting whitesmithing whitewing whiting whitling whoremongering wicketkeeping wikiholic wiking wildcarding wildling willy windfarming windowful windowing windowmaking windpants windspeed winebar wineglassful winegrowing winemaking winetasting wing wingding winkers winnings wintersports winterwear wiremaking wirewalking wireweed witblits witchweed withdrawal witherling witling wolfling womenfolks womenswear woodcarving woodchipping woodcutting woodshaving woodturning woodworking woolens woolgathering woollens woolshed wordbuilding wordprocessing workalike worktable workwear worldbuilding worldling wormseed worryguts worrylines wors wrongdoing wurly xenophanes xenygloxal xiphias xyloketal yaar yachtful yardful yeanling year yearful yearling yellowbelly yellowlegs yellowshanks yestermorning yesteryear yngling yoctokatal yogalates yonks yottakatal ysterbos zaatar zaildar zamindar zeal zemindar zenzizenzic zenzizenzizenzic zing ziplining zoar zoografting zookeeping zoophily zoophorous zorbing zosuquidar zygodactylae zzzs 1 OPV times 5 ORV blazes forwards needs tops winters 10 OR balls days een fridays lots mondays nights noons probs summers 3501 OV aahs abandons abates abends abjects ablegates abodes abords aborts abrupts abscesses abseils abstracts abuses accents accessions acclaims accolades accompts accords accounts accreases acronyms acrospires actions acts acupunctures addicts addresses adds adducts adlibs advances advantages adventures adverts advocates adzes affects affixes affrays affrights affronts ages aggregates aids ails aims airbrushes airdrops airlifts airs ajars alerts aliens aliments allies alloys alternates ambles ambuscades ambushes amels amens amounts anagrams analyses anastomoses anchors anchours angles anguishes annexes annoys anticrosses antics appeals appends applauds appliques apprentices approaches arbitrages arches archetypes archives arcs arms arses assarts assaults assays assegais assents assfucks assieges assigns assists associates asterisks attacks attempts attributes auctions auditions audits augers augurs authors autocancels autoclaves autographs automobiles avails avalanches avaunts awaits baas babbitts babies backbites backchannels backchats backcrosses backfills backfires backflushes backgrounds backhands backheels backpacks backs backscatters backspaces backstitches backstops backstrokes backwaters badgers badges bags baits balances balloons ballots ballparks ballyhoos bams bandages bandishes bands banes bangs bankrolls banks banquets barbecues barbers barbs barges barks barneys barracks barrels barricades bars barters bases bashes baskets bassoons bastinadoes batches baths batiks batters battles baulks bays beaches beacons beagles beaks beams beans beards bears beatboxes beats beds beelines beeps beetles beggars begs belays belches bellies bellows bellyaches benches benchmarks bends benefits berms berries berths besoms bests betas bets betters bevels bevers biases biasses bicycles bids bields biffs biggers bikes bilges billets billows bills bimbles binds binges bins biopsies birches birdies bisects bitches bitchslaps bites bivouacs blabbers blackballs blackboards blackjacks blamestorms blankets blanks blares blasphemes blasts blazons bleaches bleeps blegs blemishes blends blidgets blimps blindfolds blinds blinkers blips bloats blockades blocks blogs bloods blooms blossoms blotches blots blows blowtorches bludgeons blueprints blues bluescreens bluewashes bluffs blunders blurs blushes blusters boards boasts bobbles bobs bobsleds bobtails bodes bodyboards bodychecks bogarts bogeys bogs boils boldfaces bollocks bolsters bolts bombards bombs bonds bones bongs bonks boogies bookends bookmarks books boomerangs booms boos boosts bootjacks boots bops borders bores borgs borns borrows bosses botches bothers bottlenecks bottles bottoms bounds bowls bows boxes boycotts braais brackets braids brails brainstorms brakes branches brandies brands brangles braves brawls breaches breads breakdances breakfasts breaks breasts breaststrokes breedes breeds breezes brews brickfilms bridesmaids bridges bridles briefs brigues bristles broaches broadcasts broadsides brobs brocades brocks broils brokers bronzes broods brooks brooms brownnoses browns bruises brunches brushes bubbles buccans buckles buddies buddles budgets buds buffaloes buffers buffs buggers bugles bugs bulks bullies bulwarks bumbles bumps bunches bundles bungles bungs bunks bunts buoys burdens burls burns burps burrows bursts buses busks busses bustles busts butchers buttfucks buttons buttresses butts buys buzzes bypasses cables cackles caddies cadences cadges cakes calcimines calendars calenders calks calls calluses calms calves camos camouflages campaigns camps campuses canaries cancels candies canes cankers cannonballs cannons canoes cans canters cants canvases canvasses caparisons capers caps captains captures caravans careers cares caresses caroms carpets carpools carps carries cartoons cartwheels cascades caseates cases cashiers casts catalogs catalyses catcalls catches caters catnaps cats caucuses causes cautions caves caws censors censours centerpunches centers centres cesses chains chairs challenges chambers chamfers champions chances changes channels chants chaperones chaperons chaps charges charioteers charks charms charts chats chaunts chaws cheats checkers checkmates checks cheddars cheeps cheers cheeses chevrons chews chibs chicanes chickens chills chimes chinks chins chirps chirrs chisels chits chivies chivs chivvies chocks chomps chops chores chortles choruses chronicles chucks chuffs chugs chums chunks churns cinches cinctures circles circumfixes cites citrates claims clamors clamours clamps clangors clangours clangs clanks clashes classes clatters clauses claws clays cleans cleats clems clerks clicks climaxes clings clinks clips cloaks clobbers clocks clogs cloisters clomps clonks clops closets clots clouds clowns clubs cludges clues clunks clutches coaches coals coauthors cobbles cockblocks cockles cocks cockteases cocoons cocultures coffins cohosts coiffes coifs coils coins collages collapses collars collects collies colors colours combats combines comforts commands comments commissions compacts companies complements composites compounds compresses compromises concaves concentrates concerns concertinas conches concords conditions conducts confects conferences confixes conflicts congas conjectures conjugates conks conquests cons conscripts consents conserves consoles consorts constructs consults contacts contents contests contracts controls converts convicts convoys cooks coops coordinates copays copes copies cops copypastas copyrights coquets cores corks corkscrews corners corpses corrals corsets cosies cosponsors costars costs costumes couches coughs counsels counterattacks counterbids counterchecks countermarches counterpickets counterpoints counterpoises counterpressures counterpunches counters countersigns countersinks counterstains counts couples couriers courses courts covenants cows coys cozies crabs crackles cracks crafts cramps cranes cranks craps crashes craters crates cravens crawls creaks creams creases credits creeps creosotes crescendoes crests cries cringes crinkles crisscrosses croaks crochets cromes crooks crops crosschecks crossclaims crosses crossfades crossgrades crosshatches crosslinks crossposts crossruffs crouches croups crowbars crowds crowns crows crumbles crunches crusades crushes cubes cuckolds cuddles cudgels cues cultures curds cures curls currycombs curses curtains curtseys curtsies curves cushions cuts cyberbullies dabs dadoes dallies damns dams dances dapples daps dares dashes dates daubs dawns dazes deaccessions deadheads deadlifts deadlinks deadlocks deals debauches debits debouches debuts decks declines decons decontrols deconverts decreases decrees decrescendos decyphers deeds defaults defeats defects defies defiles degenerates dekes delayers delays deletes delights delipidates deluges demagogues demands demises denizens dents deposits dequeues descants designates designs desires desks desolvates despatches details detours detoxes deviates diadems diagnoses diagrams dials diamonds diapers dibbles dices dicks dictates dies diets diffs digests digs dimensions dings dinks dins diplomates dips dirks disadvantages discharges disciplines discomforts discords disfavours dishes disillusions dislikes dismounts disorders dispatches displays dispositions disputes dissents disses distances districts ditches dive dives divorces divvies djs dockets docks doctors documents dodges dogears dogfights dogfoods doglegs dogpiles dogs donks dons doodles doorbells dopes doses dotes doublecrosses doubles doubts douches dovetails dowers downgrades downlinks downloads downs dowses dozes drafts dragoons drags drains drapes drawls draws dreams dredges dresses drfs dribbles dries driftnets drifts drills drinks drives drools dropkicks drops drugs drums dubs dumps dungs dunkers dunks duns dusts dwarfs eagles ears earwigs eavesdrops ebbs echoes eclipses edges edits eeps effects eggs egocasts elbows electrophoreses electroplates embargoes embraces empties enamels encores encounters endeavors endeavours ends enfilades engineers ensamples entails entrances entreats enucleates envies epoxies equals errands errors escheats escorts escrows espaliers essays ethoxylates evens evidences excerpts excommunicates excuses exegetes exempts exercises exes exfiltrates exhausts exhibits exits expenses experiments exploits exposes expresses extracts eyeballs eyes fabs facebooks facelifts faceplants faces facets factors fades fadges fallows falls fancies fans farms farrows farts fashes fasts fates fathers fathoms fatigues favors favours fawns faxes fears featherbeds features feddles feedbacks feedforwards feeds feels feints fells fences ferments ferrets ferries festoons fetes fets fetters fettles fiddles fidgets fields figgers fights figures files filetypes filibusters filigrees fillets fills films filters finances fines fingerpaints fingerpicks fingerprints fingers finishes finks firebombs fires firewalks firks firms fishes fishtails fissures fistfights fists fits fixes fizzes flabbergasts flacks flails flambees flambes flames flaps flares flashes flatters flavours fleets fletches flexes flickers flies flings flints flipflops flips flirts flites flits floats flocks floodlights floors flops flosses flourishes flowers flows fluffs flumps flurries flushes flutters flyers focuses fogs folds fools footnotes footslogs forays forbears forces foregrounds forelooks foreminds foreshows forests forfeits forks formats forms fortunes fosters fouls founders fountains fowls foxhunts foxtrots fractures fragments frags frails frames franks frays freaks freecycles freerolls frees freezes frets fricassees fridges fries frigs fringes frisbees fritters frobs frogmarches frogs fronts frowns frowsts fruits fucks fudges fuels fulminates fumes functions funds funnels furloughs furrows fuses fusillades fusses fuzes gads gaffs gaggles gags gains gallops gambles games gams gangbangs gangs gaols gaps garages gardens garlands garners garnishes gasconades gases gashes gasps gasses gates gathers gavels gears gees gelds genders genotypes geranylates gerbils gerrymanders gestures getters gheraos ghosts giggles gigs gillnets gimlets gimmicks gimps gins girdles girds girts glances glazes gleams glimmers glimpses glitches gloats gloops glories glouts glozes glutches gluts glycates gnarls gnars goads gobs gods goldbricks gongs googles googolplexes goos gooses gores gorges gossips gouges gowns grabs graces grades graduates grandfathers grandstands graphs grapples grasps grasses graylists grays greeks greens greylists griddles grids grieves grifts grills grimaces grinds gripes grips grits grizzles groans grooms grooves gropes grosses grouches groups grubs grumbles grunts guarantees guaranties guerdons guesses guffaws guggles guides guillotines gulches gulls gulps gummers guns gurns gushes gusts guts gutters habits hackneys hacks hacksaws hades haemorrhages hafts hallows halos halters halts halves hammers hampers hances handcrafts handcuffs handles hands haplotypes haps harangues harbours hares harms harnasses harnesses harpoons harrows harrumphs harumphs harvests hatches hates haunts havers hawks haws haxors hays hazards hazops headbutts heads heaps hearses hearts heaves hedges heeds hefts heists heliographs helps hemstitches heralds herds hexes hiccups hides highjacks highlights hijacks hikes hilites hinges hinnies hints hisses hitches hits hives hoards hoaxes hobbles hocks hoes hogs hokes holes holidays hollows holsters holystones homebrews homes hones honeycombs honks honours hoods hoofs hooks hoops hoorays hoots hoovers hopes hops horses horseshoes horsewhips hoses hosts hotdogs hothouses houghs hounds housemaids houses hoys hucksters hucs huddles huffs hugs hulls humbugs humours humps hums hunches hungers hunkers hunts hurdles hurries husbands husks hydrates hydrolyses hymns hyperlinks icqs images imagines impacts implants implements imports impresses imprints inboards inches inconveniences increases incrosses incuses indents indexes inebriates infills influences initiates inlays inputs inserts instances institutes insults intakes intercepts intercrosses interdicts interests interfixes interlocks intermixes interrupts interviews interwikis intimates intrigues inventories inverses inverts invites involutes irons isolates issues itches jackals jackets jackhammers jacuzzies jacuzzis jades jags jailbreaks jails jamboks jams japes jarks jars jaunts jawbones jazzes jeers jellies jerks jesses jests jets jetskis jettisons jigs jilts jimmies jinks jitters jives jockeys jogs joins jollies jolts joneses jostles journals journeys joyrides joys juggles jugs jumbles jumps jumpstarts junkets junks jupes justs juts kalsomines karyotypes kayoes kazoos keeks keels keens keeps kens kerns keyboards keys kibbles kicks kickstarts kids kills kilns kinks kipes kips kisses kists kludges knackers knacks knags knapsacks knees knells knifes knocks knolls knots knouts knuckles knurls kotows kvetches labels labors labours laces lacks ladles laffs lakes lames lams lances landfills landmarks lands landscapes lappers laps lapses larfs larps lashes lasts latches laterals lathes lauds laughs launches launders lawyers layers lays leaches leads leafs leagues leaks leashes leavens leaves lectures leeches leers lefts legs lesions lets letters levants levels levers levies libels librates licences licenses licks lifts lights likes lilts limbers limewashes limits limps lines links liquours lisps lists lithographs litters liveblogs liveries lives loafs loansharks lobsters lockpicks locks lodges lofts logs longs looks looms loops lopes lops lords lounges louses louts loves lowballs lows luffs lugs lulls lunches lunges lurches lushes luvs luvz macerates maces machetes machines mackles maeanders mails malfunctions mambos mammocks mandates maneuvers manicures manifestos manifests manoeuvers manoeuvres mans manscapes manufactures maps marbles marches marcots marinades markers marks marmites maroons marshals marvels marvers masks masquerades masses masterminds matches matters mauls maunches mawns meanders means measures medals medevacs medivacs meets megaphones memorates memos menaces mends mentors meows merges merits meshes messages messengers messes metablogs metals metamorphoses metaphrases meters metes methylates metres mew miaous miaows microblogs microcracks microfilms micropatterns microphones microwaves midwives miffs mikes milks mills mimeographs mimes mimics minces mindfucks minds mines minimaxes ministers mints mirrors mirrours mirvs misconducts misconnects miscopies miscues misdeals misfires misfits mishits miskicks mismatches misnomers misprints misrhymes misses missions missorts mistakes mistells misthrows mists misuses mithers mixes moans mobs mocks models moils molders molts moments mongers monitors monkeys monograms monologs monologues moons moors moos moots mops morphs mortars mortgages mortices mortises motions motorbikes motorcycles motors moulds mounds mountebanks mounts mouses mousetraps mousses mouths mows muddles muffles muffs mulches mulcts mules mulls multiplexes munches murmurs murthers muscles muses mushes musters mutinies mutters muzzles myspaces names nanoimprints naps narcs narks narrowcasts natters neaps necks necromances necroses needles neighbors neighbours neighs nerves nests nets neuroimages neuters newspapers nibbles nicks niggles nightclubs nips noises noodges noodles nopes nosedives noshes notches notices noughts nourishes nudzhes nukes nulls numbers nursemaids nurses nutmegs oars objects octavates offers offloads offprints oils oinks oks omens oozes opens opiates options orbits orders orgasms ornaments orphans osmoses outcrosses outlaws outlines outpours outrages outreaches outrides outthrusts overbets overburdens overcalls overdoses overdubs overfalls overflows overhangs overhauls overholds overloads overmatches overnights overorders overpasses overprints overreaches overrides overruffs oversamples oversteers overstocks oversupplies overswings overvotes oxidates ozonates paces packages packets packs paddles paddocks padlocks pads pages pains paintballs paints pairs pales palimpsests palls palms pals palsies pandars panders pandies pangs panics pantomimes papers paps parades paralyses paraphrases parasails parcels pardons parents parks parlays parodies parries parrots parties partitions parts pashes passages passes pastes pastours pasts pastures patches patents pauses pawns peaches peaks peals pearls pebbles pecks pedals peels peeps peers pees peeves pegs peises pellets pens pensions people peoples peps perches percolates perfumes periphrases perks permabans permablocks permits perms peroxides perpends perverts pervs pestles peters pets phials philanders phones photocopies photographs photolyses phrases phreaks picaroons pickaxes pickets pickles picks picnics pictures piddles pieces pies pigeonholes pigments pikeys pillories pills pimps pinches pincushions pines pinfolds pings pinions pinnacles pinpoints pins pinwheels pioneers pipes pirouettes pitches pitters placards places plagues plaits planes plans plants plasters playfights pleasures pleats plies plights plinks plonks plops plots plows plugs plumbs plummets plums pms pockets podcasts podreels points poisons pokes polishes polkas polls polygraphs pomades pommels pongs poniards pookas poops poos pootles pops pores porpoises portages porters portscans positions posits possets postcodes postfixes postmarks posts postulates pots pouches pounds pouts powders powerpoints powers practices praecipitates praedicates praefaces praejudices praeludes praeserves praises prances prangs pranks prates prawns precasts precultures predates predeceases predicates prefaces prefilters prefixes preforms preleases premieres premiers prepositions preprints preps prereads presages preseeds presents preserves presoaks pretties previews previsions prewashes prices prickles pricks prides primes prints prisons privateers privileges probates probes processes processions prods proffers profits programs projects prolapses promises prompts proportions propositions props prospects protests provisions prunes prusiks puckers puddles pukes pules pulls pulps pumps punches punctures punks puns punts purchases purees purls purposes purrs pushes putters putties putts puzzles pyrographs pyrolyses quacks quadruplicates quaeries quaffs quails quarrels quarterbacks quats quavers queefs queens queers quells queries questions quests queues quicksorts quiets quilts quintuplicates quips quires quirts quivers quizzes quotes rabbets races racketeers radges radios raffles rafts rags raids raiks railbanks railroads rains rakes rambles ramps ramraids ramrods rams ranges ranks rants rapes rappels raps raptures rasps rataplans ratholes ratoons rats rattles ravages raves reaches reams reanalyses rears reasons reattempts reaudits rebates rebels reboots rebounds rebrands rebuffers rebuffs rebuys recalls recanvasses recaps recaptures recces receipts recesses recharters rechecks recoats reconnoiters recoopers records recounts recrosses recruits redds redesigns redirects rediscounts redlines redrafts redresses redubs reducts reechos reefs reencounters references refills reforms refrains refunds refurbs regards regens regifts regiments registers regrafts regrets rehabs rehashes reheats reigns reimports reins reissues rejects relays releases relents relishes remainders remakes remarks rematches remedies remises remortgages remounts removes rencounters renders renditions rents reoffers repairs repartees repartitions repasts repeals repeats replevins replies reports reprieves reprimands reprints reproaches reprobates repulses requisitions reraises rescues researches resets reshoots reshuffles resists resorts respects respites responds resprays restarts restrikes rests resumes resyncs retakes retards retcons retests retorts retouches retreads retreats retries retrofits reverses reverts reviews revises revisits revolts rewards rewrites rhymes ribbits ribs rices ricks ricochets riddles rides riffles riffs rifles rifts rigs rimes rings riots ripples rips ripsaws risks rivals rivers rives rivets rmgroups roadblocks roars roasts rocks rollerblades rolls romances romps roofs rooks rooms roops roostertails roosts ropes roquets rorts roses rosins rosters rots roughs rounds roups rouses routers routes routs rows rubs rues ruffles ruins rules rumbas rumbles rumormongers runs ruptures rustles rvs sacks sacres sacrifices saddles safeguards sails saints salaams sallies salts sambas samples sanctions sandpapers sands sandwiches sarcles sarses sauces saunters saves savors savours scags scales scalps scamps scans scapegoats scapes scarfs scars schemes schmoozes schools schusses sclates scoffs sconces scoops scooters scoots scopes scorches scores scotches scourges scouts scowls scows scrambles scrapbooks scrapes scraps scratches scrawls screams screeches screeds screens screeves screws scribbles scrimmages scrimps scripts scrobbles scrolls scruffles scrummages scrunts scruples scrutineers scuffles scunners scuppers scuttles seals seams searches seasons seats seconds secretaries secrets sections seeps sees segfaults seines selects sells semiquotes senses sentences separates septimates sequences serves sets sexes sexts shacks shades shadowboxes shadows shafts shakes shales shampoos shanks shapes shards shares sharps shaves shears sheds sheers shells shelves shepherds sherpas shews shields shies shifts shills shimmers shims shins ships shites shits shivs shoals shocks shoehorns shoots shops shores shotguns shoulders shouts shovelbums shoves showboats showcases showers shrieks shrieves shrouds shucks shudders shuffles shunts shuts shuttlecocks shylocks sidearms sides sidesteps sideswipes sidles sieves sighs sights signals signs sikes silences silhouettes silkscreens simpers simples simulcasts singes sings sinks sins siphons sires sits sizzles skanks skateboards skates sketches skewers skids skies skins skips skirmishes skirts skives skunks skylarks slacks slags slanders slants slaps slashes slates slathers slats slavers sleds sleeps sleighs sleuths slices slights slimes slings slips slipstreams slits slivers sloganeers slopes slots slouches sloughs slowplays slubbers slubs slugs slumbers slums slurps slurries slurs sluts smacks smarms smashes smells smelts smiles smirks smokes smooches smoothes smooths smothers smouches smses smurfs smutches snacks snags snakes snaps snares snarls snatches snecks sneezes snickers sniffs snipes snips snitches snites snookers snoops snoozes snorts snowballs snowboards snows snowshoes snubs snuggles snugs soaks soaps soars sobs socks soils sojourns solaces solders soldiers solvates somersaults sops sorrows sorties sorts sounds sources sours sows spaces spacewalks spades spads spams spangs spanks spans spares sparkles sparks spars spasms spatchcocks spearheads spears speedruns speeds speedskates spellchecks spells spice spiels spies spiffs spikes spills spins spires spirits spits splashes splats splatters splices splints splits sponges sponsors spoofs spooks spools spoons spores sports spotfaces spotlights spots sprains springs sprinkles spritzes sprouts spruces spurns spurs spurts squabbles squalls squares squashes squawks squeals squeezes squelches squibs squicks squints squires squirts squishes squizzes squushes stabs stacks staffs stages staggers stains stakes stalemates stalks stalls stammers stamps stanchions stand stands staples starches stars startles starts stashes states stations staves stays steads steamrollers steels steeples steers stems stents steps stews sties stifles stills stimies stims stings stinks stints stips stirfries stirs stitches stocks stodges stomachs stomps stones stonewalls stonks stoops stops storms storyboards stounds straddles strains strands straps strays streaks streams stresses stretches strides strikes stripes strips strobes strokes strolls structures struggles struts stubs stumbles stumps stums stunts stutters styles stymies subclasses subclones subcultures subgrants subjects sublets submarines submeters subordinates subpoenas subs subsets substitutes subtotals subverts sucks sugars suicides suitors suits sulfates sulfonates sulfurs sulks sulphates sulphurs summonses sumps sums sunburns suntans superglues supershifts superstrates suppers supplements supplies supports surfaces surfeits surnames surrenders surveys suspects sustains swabs swages swallows swamps swaps swarms swathes swats sways swears sweats sweeps swelters swigs swims swindles swirls swishes switches swoops swooshes swots swounds synapses syncs syphons tables tabs tackles tacks tags tails taints talks tallies tangoes tangos tantamounts tapestries taps targets tarries tars tartans tarts tasers tasks tastes tats taunts taws taxes taxies tchicks teams teargases tears teds telegrams telemonitors telephones teleprints teletypes telexes tempers templates temps tenants tenders tenons tenses tensions tensors tests tethers texts thatches thaws therapies thews thieves thimblerigs thinks thins thirds thirls thirsts thralls thrills throbs thromboses throngs throttles throws thrums thrusts thrutches thumbs thumps thwacks thwarts ticks tiers ties tiffs tiles tillers tilts timelines timeouts timestamps tingles tinkers tins tints tipples tips tires tithes toadies toasts toboggans toenails toggles togs toils tolls tomahawks tombs tongs tongues tools toots toplines torches torments torpedoes tosses totals totters touches tourneys tours touts towels towers toys traces tracks trademarks trades trails trains traitors tramples tramps transects transfers transfixes transforms transgenders transits translates transports traps travails travels traverses trays treads treasures trees treks trellises trembles tremors trenches trends trephines trespasses tresses tribotests trices trickles tricycles tries trifles triggers trills trims triples trips trists triumphs troats trobles trolleys trolls troops trots troubles trouts trucks trumpets trumps trundles trusses trusts trysts tubes tubs tuckers tucks tufts tugs tunes turfs turnkeys turns turtles tussles tutors twangs twats tweaks tweets twerks twigs twinges twinks twins twirls twists twitches twits twitters twizzles twonks types umbraids umlauts umps underbets undercasts undercuts underdoses undergrounds underleads underorders underplates underruffs underscores underseals understeers understudies underwaters underwires unfavorites updates upfaults upgazes upgrades upgushes uplifts uploads uppercuts uprates ups upsets upshifts upsurges upsweeps upswells upturns upvalues urges uses vacuums vails vamps vasals vaselines vats vaults vaunts vectors velvets veneers vents verbals verbs verges vermicomposts vests vetoes vials vibes victories victuals vidcasts videocasts videoconferences videos views vignettes visits vitriols voices voids votes vouchers vouches vows voyages waddles wades wagers wages waggons wags wails wainscots waits waivers waives wakeboards wakes wales walks wallers wallops wallpapers wallpresses walls wambles wanders wanes wanks wantons wardrives wards warehouses warisons warranties warrants wars washes wastes watchdogs watches watchlists waterboards waterfalls waterfloods watermarks waters waterskis watusis wavers waves waxes wears weaves wedges weeds weekends weights weirds welches welcomes welds wells welts wends wetnurses wets whacks whales whams wheeks wheels wheezes whelps whickers whiffles whiffs whigs whimpers whinges whinnies whips whirrs whishes whispers whistles whitemails whitewashes whizzes whoises wholesales whoops whooshes whops whores whumps wicks widows wiggles wigwags wikipedias wildcrafts wills wilts winches windmills winds wines wings winks winnows wins wires wiretaps wisecracks witnesses wizards wobbles wonders wones woods woodsheds words works worms worries worships wounds wrangles wreaths wrecks wrenches writhes wrongs xeriscapes xors yachts yacks yandies yanks yaps yarns yatters yawps yaws yellows yells yelms yelps yeuks yields yiffs yips yodels yoiks yokes yomps youtubes yowls zaps zeroes zests zigs zigzags zings zones 3397 O aaliis aartis abaci abacisci abaculi abassis abazis abecedaria abisetaoshis aboideaus aboideaux aboiteaus aboiteaux abomasa abomasi abortogenics abstandsprachen abstracta academics acais acajous acanthi acari acatalectics acataleptics acciaccature acephali acervuli acetabula acinaci acini acroamata acrocentrics acrocephalics acromegalics acropodia acropoleis acropoli acrostics acroteria acrylics actinobacteria actinotrichia addenda adenomata adieus adieux adivasis admen adpeople adwomen adynata adzukis aecia aecidia aedeagi aegagri aeromechanics aesthetics afficionadi afghanis afghanistanis aficionadi agarics agenda agnomina agnostics agogics agoraphobics agoroth agoutis agribusinessmen agrimis agrypnotics ahis ahlspiessen ahmadis aidmen aiolis aircraft aircraftmen aircraftsmen aircraftswomen aircraftwomen aircrewmen airmen airwomen ais akiapolaaus akousmata albarelli albumina alcaics alcoholics aldermen alderpeople alderwomen alembics alexiterics alhajis alibis aliphatics aliyot alkalis allodia alloplastics alluvia almiquis almsmen alphametics alphaproteobacteria altocumuli altostrati alumni alveoli amakhosi amakosi amakwerekwere amapakatis amatis ambulacra ambulancemen ambulancewomen ameli ameloblastomata amenorrheics amenorrhoeics amenta amici amnesics amnia amoretti amphibia anabolics anacoloutha anacolutha anacreontics anaesthetics analeptics analgesics anamonics anaphora anapodota anastasis anasyrmata anathemata anchormen anchorpeople anchorwomen ancone androecia anecdota anesthetics angioleiomyomata angiomata anhidrotics anionics anis annuli anorectics anorexics anorexigenics anosmics antarthritics antasthmatics antependia anthelmintics anthemia antheridia anthocauli anthropophagi antiallergenics antiangiogenics antiarrhythmics antiarthritics antiasthmatics antibiotics antibrachia anticatholics anticholinergics antidiuretics antiemetics antiepileptics antifibrinolytics antifibrotics antifogmatics antigalactics antihelminthics antihemorrhagics antiherpetics antihistaminics antihyperglycemics antileukaemics antileukemics antilipidemics antilithics antiluetics antimicrobics antimitotics antimuscarinics antimusics antimycotics antineoplastics antinephritics antinicotinics antinuclei antiparasitics antipasti antiphlogistics antipruritics antipsoriatics antipsychotics antipyretics antirachitics antirheumatics antiromantics antis antisceptics antiscia antiscorbutics antiseptics antisera antispasmatics antispasmodics antispastics antisyphilitics antithrombotics antitragi antoniniani antra anxiolytics apemen aphasics apiculi apikorsim apis apocalyptics apocolpia apodeictics apopemptics apotreptics apparachiki apparatchiki appletinis appressoria apronsful aprosdoketa aptychi aquaholics aquamanilia aquaria arboreta arcana archaea archaebacteria archaics archbishoprics archebacteria archegonia archei archencephala archentera archmagi areg argumenta arie arithmetics armamentaria armsful arnis aromatics arthritics artics artillerymen ascetics asci ascomata ashkenazim aspergilla aspersoria aspics assemblymen assemblywomen associahedra asterisci asthmata asthmatics astragali asyndeta ataractics ataris atheromata atria attackmen attics auditoria aulics auloi aurar aurei aurochsen ausbausprachen autistics autobahnen autoclitics automata automatics autopodia avocadi awqaf axemen axiomata axmen azerbaijanis azeris babassus babus bacilli backfische backmen backwoodsmen bacteria bacula badfics badmen baggagemen baghdadis bagmen bagsful bahrainis bahus bahuvrihis baijis bailsmen bajaus balanghais baldrics ballotechnics baloi balsamaria baltis bandeaus bandeaux bandsmen bangladeshis barbitoi barfis bargemen bargewomen barmen barramundis barrelsful baryonia baseis basemen basenjis basewomen bashkortostanis basicrania basics basidia basidiomata basipterygia basketsful basotho batmen batsmen batswana batswomen baymen bayous beakersful beaus beaux beedis beggarmen beggarwomen bellinis bellmen beltsful bengalis bergamaschi berimbaus betamimetics bhajis bhangis bhelpuris bhikkhus bhikshus bhindis bicyclics biennia bigorexics bijous bikinis bildungsromane biminis binbashis bindiis bindis binmen binomina bioceramics biofabrics biogenerics biologics biopics bioplastics biotherapeutics bipkwele birdmen birdwomen birianis biriyanis biryanis bis biscottis bishoprics bispectra bitumina bivis blackfeet blastoise blastomata blinis blogoholics bluesmen blueswomen boatmen boatsful boatsmen bogeymen bogeywomen bogymen boilermen bondmen bondsmen bondswomen bondwomen bonesmen bonsais boogeymen boogiemen boogymen booklice bookmen borborygmi bordereaux borzois bostangis bostanjis bottlesful bottomonia boubous bouzoukis bowlsful bowmen boyaus boychildren brachia brachycephalics braggadocii brainchildren brakemen branzini bregmata brennschlusse brewskis brickmen bridesmen brindisis brinksmen broccolis bronchi brothermen bryozoa btus bucketsful buckteeth bucolics bucrania bulbospongiosi bulimics bungus bureaus bureaux burkinis burnous burqinis bushmen bushwomen businessmen businesspeople businesswomen busmen buttinskis buttonmen cabassous cabmen cacti cadis caducei caeca cafetoria calcanea calcanei calculi caldaria caliculi calpollis calpoltin calyculi camaieus cambia cameramen camerawomen camis campi canaliculi cancelli candelabra candirus candrabindus candymen cannolis canoemen cansful cantatrici canthari canthi capitula capitulationer capitulationest capsful caravansarais caravanserais carcajous carcinomata carcinosarcomata carcinostatics cardecus caribous carmen carpi carpometacarpi carsful cartmen cartonsful cartsful carus castellani castrati catacaustics cataleptics catechus catfishermen cathari cathartics catheti catholics catoptrics cattlemen cattlewomen cauldronsful cauris caustics cavalrymen cavalrywomen cavemen cavewomen caxixis cazics cebus ceca cecidia cedis ceilidhean cellaria cellarmen celli cembali centermen centra centremen ceramics cerata cerci cerebella cerebra ceromata cerumenolytics cgis chaddis chadris chainmen chairmen chairpeople chairwomen chalazia chalumeaux chantis chapatis chapattis chapeaus chapeaux chapmen chaprassis characteristics charismata charismatics charizard charmonia charwomen chasmata chateaus chateaux checkweighmen chederim chedis cheilocystidia chemodectomata chemophobics chemoprophylactics chemotherapeutics cherubim chervontsy chessmen chestsful chiantis chiasmata chiasmi chibis chics chilis chillis chillun chimichurris chinamen chis chloralkalis chocaholics chocoholics choleretics cholesteatomata cholesterics cholinomimetics cholis chondrosarcomata choonz chordomata chorioangiomata choriocarcinomata choristomata chromonemata chubis chunnis chuppot churchmen churchpeople churchwomen ciceroni cics cilia cipollinis circumradii cirri cismen ciswomen citharai clansmen classics classroomsful claustrophobics clawfeet cleistothecia clergymen clergypeople clergywomen clerics cleroteria climacterics clinics clitics closetsful clubfeet clubmen clypei coachmen coachwomen coalmen coastguardsmen coatimundis coatis cocci cocksmen coelomata coemeteria coenoecia cognomina cognoscenti colics colloquia colluvia collyria colobomata colonics colormen colossi colourmen coltsfeet columbaria combis comedogenics comedolytics comics comitadjis commata committeemen committeewomen compacta compendia conatus concerti concreta congressmen congresspeople congresswomen conidia conmen conopss consiglieri consortia conspecifics containersful continua contrafacta contralti conundra convolvuli conwomen coquis corgis corgwn coria cornermen cornishmen cornishwomen corpora corpsmen corrigenda coryphaei cosmoi cosmopoleis councilmen councilwomen countermen countertactics counterwomen countrymen countrywomen cowmen cowpeople coypus cpus cracksmen craftsmen craftspeople craftswomen cragsmen crania craniopagi cratesful crayfishermen crematoria creminis crenarchaea crescendi crewmen criminis criteria critics croci crorepatis crossbowmen crura crus crustacea cryptics cryptococci cubics cubicula cuboctahedra cudighis cumuli cumulonimbi cuniculi cunjevois cupboardsful cupsful curricula cyanobacteria cybermen cynganeddion cynics cysticerci cystidia cytostatics cywyddau dactylics dagestanis daggermen daiquiris dairymen dairywomen dalasis dalesmen dalmatics damakzevkis danceaholics dangermen darbaris dashikis data daysmen dcis dcss deadmen deathfics deathsmen decahedra decennia decrescendi defencemen defensemen definienda definientia degus deictics deliria delis deliverymen deliverypeople deltaproteobacteria deltohedra demesmen demis demoi denari denarii denis derrickmen desiderata designata deskmen dessertspoonsful detrita devadasis dhakis dhimmis dhobis dholkis dhonis dhotis diabetics diacaustics diacritics diagnostics dialectics diaphoretics diaromatics diastemata diatomics dicta didactics didicois didjeridus dielectrics diencephala dihedra dilemmata dilettanti dioptrics dipinti diplegics diplococci diplomata dippersful discoboli disequilibria disir disyllabics dithyrambics diuretics diverticula dizis djelis djinnis docus dodecadodecahedra dodecahedra dogmata dogmen dolia domatia domestics doofi doormen doorpeople doorwomen dorgis dormice doubleyous doufus doujinshis douroucoulis drachmai draftsmen draftspeople draftswomen dragomen dramata drapur draughtsmen draughtspeople draughtswomen drawersful draymen dreamchildren dromoi drumsful drusen dsis dumky duodena dupondii durbaris durukulis durzis dustmen dutchmen duumviri dyslectics dyslexics dyspeptics dyspraxics dysthymics dziggetais ealdormen earsful earthmen earthsmen earthwomen ebbermen ecbolics eccentrics ecclesiastics eclectics ecliptics ecocritics ecstatics ecthymata ecumenopoleis ecus eczemata edemata effendis effluvia efis egocentrics eidola eigenspectra einsatzgruppen eisteddfodau elastics electroceramics electrophori elemis elytra emacsen emalangeni embola emboli emeriti emetics emeus emiratis empirics emplastics emporia empyrics emus enanthema encaustics encephala enchiridia enclitics encomia endarteria endemics endobacteria endocardia endocrania endometria endomysia endoplasma endosporia endostea endothecia endothelia endotheliomata enemata enginemen englishmen englishwomen englynion enigmata enokis enterobacteria enterococci entozoa envois ephebi ephemera epicardia epicedia epics epidemics epigastria epileptics epilimnia epimanikia epiphaenomena epiphenomena epirrhemata epis epistemai epithalamia epithelia epithelialisation epitomai epizootics eponychia epsila epyllia equilibria equiseta erastai erhus erics eristics eroge eromenoi errata erratics eruvim erythemata erythrodermata escharotics esophagi eteostics ethanoicer ethanoicest ethe ethea ethnica ethnics ethnika ethoi etuis etyma eubacteria eucalypti eugeroics eukarya eurosceptics euroskeptics eutectics eutrophics everymen everywomen exanthemata excisemen exempla exopoda exotica exotics exozodis explananda expressmen extrema eyen eyesful eyeteeth fabliaux fabrics facemen famuli fanatics fanbois fanfics fantis fasciculi fascina fatawa fedayeen feet feiseanna fellahin fellowmen feminazis femora ferraris ferroelectrics ferryboatmen ferrymen ferrywomen festschriften fianchetti fiaschi fiasci fibromata fichus fics fideicommissa fieldmice fila filipodia filopodia fingersful firemen firepeople firewomen fishermen fisherpeople fisherwomen fishwomen fistsful flagella flagmen flambeaux flambergen flatfeet flatus flavobacteria flittermice flocci flokatis floorpeople florilegia flumina fluoroaromatics flus flyfishermen flymen foci foederati foemen foeti fogous foodaholics footmen fora foramina forefeet foremen forepeople foreteeth foretopmen forewomen forgemen forksful formicaria fornicatoria foundrymen fraenula frangipanis fraus freedmen freemen frenchwomen frenula freshmen freshpeople freshwomen fretmen frigidaria frogmen frolics frontiersmen frontierswomen frontmen frontwomen froufrous frusta fsherwomen fuglemen fulcra fumetti fungi funnymen furfen fyrdmen gabbais gadgetbahnen galge gametangia gametogonia gammaproteobacteria ganglia ganglioneuromata gaohus gardai gardensful garibaldis garlics gasmen gastrinomata gastrocnemii gastrokinetics gateaus gateaux gatemen gatewomen gdis geese geis gemachim geminis genera generics genii genioglossi genizoth gennelmen gentlemen gentlepeople gentlewomen geodesics geriatrics ghazis ghiblis gilgais gilgulim girlchildren gladioli glassesful gleemen gleewomen glioblastomata gliomata glissandi glomeruli glovemen glovesmen glutaei gnaborretnis gnostics gnus gobsful godchildren godis gomesis gonadoblastomata gonangia gonococci gonopodia goodmen gooris gothics gouramis gownsmen goyim grana grandchildren granthis granulomata gravamina grocerymen groomsmen groszy groundsmen groundswomen guardsmen guardswomen guarris gubernacula guembris gunbais gunmen gunwomen gurrnkis gurujis gurus guslis gutsful gwarris gymnasia gynoecia gyri gyroradii hackmen hadhramautis hadjis hadramautis haematomata haeretics haflis haiku haikus hajis hajjis halachot halachoth halfpence halloumis hallucinogenics haloaromatics halobacteria halonuclei hamantaschen hamantashen hamentaschen hamentashen hammermen hamuli handakuten handcraftsmen handicraftmen handicraftsmen handsful handymen handypeople handywomen hanghang hangmen happis haptonemata haptotropics hapukus hardmen hardwaremen harkis harmonics harvestmen hassidim hatchetmen hatchmen hatsful hausfrauen hausfraus haustoria headmen headsful headsmen heartsful hebrephrenics heliobacteria helminthics helmsmen helmswomen hemangiopericytomata henchmen henchpeople henchwomen hentai hepatics hepatomata hepatopancreata heptahedra heptaparallelohedra herbaria herdmen herdsmen herdswomen heretics heroa herrenvolker hetairai heteroaromatics heteroclitics heterocyclics heterospecifics hetime heuretics hexahedra hexecontahedra hibachis hibernacula hieroglyphics highlandmen highmen highwaymen highwaywomen hillsmen hindian hindus hindustanis hippocampi hippopotami hirdmen hispanics hitmen hitwomen hodmen hokkus holyhedra homunculi honoraria honorifics honus hordeola hormogonia horsemen horsewomen hosen houdinis houndsteeth houris housebois housemen housesful huhus humeri huntsmen huntspeople huntswomen husbandmen hydrocholeretics hydroecia hylics hymenia hypaspistai hypemen hyperbata hypergeometrics hypergraphics hypernuclei hypnotics hypochondria hypocoristics hypodermics hypogaea hypogea hypoglycemics hypomanics hyponychia hypoptila hypothalami iambics icemen ichnogenera ichthyosauri icosahedra icosidodecadodecahedra icosidodecahedra icositetrahedra idiomata idlis idola idyllics ignorami ignostics ilea ilia imartis imbroglii immunotherapeutics imparisyllabics impedimenta imperia impluvia imprimantur impromptus improvisatori improvisatrici inconnus incubi incunabula indolics indusia infantrymen infodemics infographics infoholics infraphyla infundibula inia inkosis innuendis inorganics inradii inss insulinomata intermetallics interstitia interwebz intrichi inukshuit inuksuit invadopodia ious ipus iqalummiut irishmen irishwomen ironmen irukandjis ischia ischiocavernosi isocola isometrics isopycnics isostatics israelis isthmi italics ithyphalli izibongo izimbizo izinyanga jabirus jaborandis jackmen jaguarondis jaguarundis jalfrezis jambeaux jambus jamdanis jarsful jazzmen jazzwomen jehadis jehus jejuna jellia jerseymen jhampanis jiaozis jidaigekis jigglypuff jihadis jinnis jivanmuktis jndis jnis jokis josekis journeymen journeypeople journeywomen jtwis judogis jugsful jugula jujus jukskeis junkmen jurymen jurywomen jus kabaddis kabassous kaffeeklatschen kagus kahaus kaikis kaisekis kajis kakis kalamkaris kana kangris karahis karelis kashmiris kathakalis katis kauris kazakhstanis kazis kegsful keiretsus kemonomimis kendis kepis keratoacanthomata kerugmata kerygmata kettlesful ketubbot ketubot khachapuris khasis khatris khazis kibbutzim kibeis kidsmen kielbasis kikois kimono kincajous kingsmen kinkajous kinocilia kinsmen kinspeople kinswomen kippot kipunjis kiwis klansmen klanswomen kleroteria klezmorim klismoi knifemen knifesmen kobzari kohlrabis kokoretsis kolkhozy kolkozy komondorok kongonis kooris korun kouroi kourotrophoi kovshi kowhais krais kroner kronor kronur krooni kudus kudzus kuffar kufis kukis kukris kukuis kulfis kulichi kumazemis kunstlerromane kurdistanis kuvaszok kuwaitis kyus labara labella lacemen lactobacilli lactococci lagerstatten lahmajous laics lais lambics lamborghinis lamellipodia lamellopodia lanais landaus landmen landsmen lantibiotics lantzmen lasagne lassis latera lathis lati laundrymen laundrywomen lawmen laymen laypeople laywomen leadfeet leadsmen leathermen lebensraume lebenswelten leetmen legendaria legmen lei leiomyomata leiomyosarcomata leis lemmata leprosaria lepta leptocephali leptocystidia leptomata lesspeople lettermen leucodermata leucomata leukomata leva levermen lexeis lexica leylandiis libretti lice lieder liegemen liegewomen liftmen lightermen lightweighter lightweightest linemen linesmen linespeople lineswomen linkmen lire lisente litai litchis lithophyta litui liulis liverymen lizardmen lobstermen lobsterwomen loci locomen loculi logaoedics logia logics logistics lolis longbowmen longshoremen longshorewomen loreleis loti lotis lovechildren lrne luaus lubki lulus lumbermen lumina lunatics lungis lungsful lustra lymphangiomata lymphatics lymphoedemata lymphoepitheliomata lymphomata lymphonodi lyrics maare macaronics machiavellis machzorim macra macroconidia macronuclei madmen madwomen maestri mafiosi maggidim magi magsmen maguaris maharanis maharishis mahmudis mahzorim mailmen mailpeople mailwomen makis makuta mala malayalis malibus malihinis mallei malleoli mallus maloti maltmen mamudis manatiq manchildren manchus manicous manitous manjis mankinis manteaus manubria maoris mapaus maqamat marabous maravedis maria mariachis mariengroschen markkaa markmen marksmen markspeople markswomen marsupia martinis martyria mashgichim masseboth mastercraftsmen mastics mastmen masus matatus matrics matronymics matsuris matzot matzoth mausolea maxima maxis mazandaranis mazanderanis mazzeboth mbaris mealmen meatmen mechanics media mediastina medics mediostrata meese megafeet megalopoleis megalopoli megapoleis megara megatsunamis meharis melancholics melanomata melics melismata melodramata memoranda men menaia menchildren meningococci menisci menologia menoroth menschen menstrua menus meowth merchantmen merchantwomen merchildren meristics mermen merpeople merwomen meseraics mesocephalics mesoclitics mesonephroi mesotheliomata metacarpi metacentrics metadata metaheuristics metallics metalogics metalorganics metaphysics metapodia metatarsi meticais metics metoeci metrics metropoleis metropolia mewtwo mezuzot mezuzoth miasmaler miasmalest miasmata mice microcephalics microconidia microcosmoi microelectronics microemboli microminis micromosaics micronuclei microphenomena microsporidia microvilli mics middlemen middlewomen midis midshipmen mikveot milieus milieux militiamen militiawomen milkmen milkwomen millenia millennia mimetics miniepics miniloci minima minis minshukus minutemen minyanim mipss misandrics miscellanea missingno mitochondria mitzvot mitzvoth mmapis mmis mnemonics mochis mocktinis modacrylics modica moduli modulini mogwais mohelim mokihis momenta monastics moneymen mongeese monoaromatics monogenics monokinis monophyla monosyllabics monsignori moolis moonchildren moose moratoria morioris moronis mortaria mortarmen mosaics moshavim moshavot motormen motorsportsmen mottis mousambis mouthsful mss mucolytics mueslis muftis mugsful muhajireen muhajirun mujtahidun multiethnics multiferroics munis muri musaea musclemen musclewomen musculotropics musea musics muskoxen mussulmen mutanda muthammanis muumuus muzungus mycelia mycobacteria mydriatics myelomata myocardia myocloni myomata myopics myrmecodomatia mystics mythoi mythopoeics myxobacteria mzungus nacroleptics naevi nanobacteria nanoceramics nanocosmetics nanotori narcissi narcoleptics narcotics nasturtia natatoria natriuretics nauplii nautili nazis nebulosi necropoleis needlewomen nematics neostriata neoterics nephritics nephroi nestohedra netsful neura neurocrania neuroepithelia neurofibromata neurofibrosarcomata neuroleptics neuromata neurosarcomata neurotics nevi newsmen newspapermen newspaperwomen newspeople newswomen nexus ngonis nidi nidopallia niggaz nighantus nightwatchmen nightwatchwomen nikis nilgais nilghais nimbi niqaab nitroaromatics nitrobacteria nivkhi noblemen noblewomen noemata noetics nonacademics nonalcoholics nonanalgesics nonanesthetics nonantibiotics nonaromatics nonasthmatics nonceramics noncharismatics nonchildren nonclergymen noncritics nondiabetics nondyslexics nonepileptics nonequilibria nonetti nonis nonmen nonmystics nonnarcotics nonneurotics nonpeople nonphobics nonplastics nonpsychics nonpsychotics nonrepublics nonsalesmen nonsceptics nonschizophrenics nonskeptics nonwomen nonworkaholics noobz nootropics nordics norsewomen northmen nostalgics nostra noumena novelle noyaus noypis nozzlemen ntamanis nubcakez nuclei nucleoli nuis nullisomics numina nunavummiut nunchakus nuristanis nurserymen nurserywomen nychthemera nycthemera nyepis nymphaea nymphomanics oarsmen oarswomen obeli obis oboloi occipita oceanaria ocelli octahedra octics octopi oculi odea oeconomi oedemata oesophagi oestri oidia oilmen okapis olisboi omasa ombudsmen ombudspeople ombudswomen omegala omenta omicra ommatidia omophoria omphaloskeptics onagri oncomice oneirocritics onia ooecia oogonia oolitics opera operanda opercula opia optics optima orangemen orangewomen orchardmen organics organometallics oribis origamis orthorexics orthotetrahedra orthotics oscula osmotica ossa osteosarcomata ostinati ostraca ostraka otakus otalgics otoconia ouakaris ouroboroi ous outdoorsmen outdoorswomen ova overmen overweeningness owsen oxen oxymora oxytocics oystermen pacemen pacis packmen paczkis pagatis pagesful pagris paharis pailsful paise pakistanis pali palladia pallia pancreata pandemics pandemonia panegyrics paninis panjabis panni pansful panthea pantrymen paparazze paparazzi pappi papyri parablepsia parabolics paradigmata paragangliomata paralytics paramecia paramedics paramoecia paraoptometrics parapegmata paraphilics paraphyla paraplegics parapodia pararescuemen parasitics parasympatholytics parasympathomimetics paregorics parhelia parsis parvenus passersby pastophori pastramis patagia pathics patrolmen patrolwomen patronymics pawsful peevishlyer peevishlyest pelmenis pence pendula pengulus penii penmen pentahedra penwomen pepperonis pepsis peptidomimetics pericardia peridia perihelia perikarya perinaea perinea perineuria perioeci periostraca peripatetics peripli periploi peris perithecia peritonaea peritonea permutohedra pessima petroholics petrolea pfennige phaenomena phaeochromocytomata phalli phantasmata phaseoli phenolics phenomena pheochromocytomata philerass philharmonics philippics philodendra philtra phis phobics phocomeli phoeti photini photobacteria photomosaics photostimuli phthisics phyla phytotelmata pianissimi pianoforti picalillis piccalillis pichvais picocyanobacteria pics piemen pierogis piewomen pigsnie pikachu pikachus pikemen pilaus pilgarlics pili pilotis pinealomata pineoblastomata pineta pipemen pipesful pirogis pis pitchmen pitchwomen pitmen pitohuis pitsful pivotmen pizze pizzelle placemen plainclothesmen plainsmen plainswomen plana planaria planesful planetaria plasmalemmata plasmodesmata plasmodia plastics plateaux platemen platesful plattersful platypi platysmata plectra plena pleopoda plethra pleura pleurocystidia ploughmen plowmen pluralia pneumococci pocketsful pocula podagrics podia poleis policemen policepeople policewomen policlinics pollinia poltergeister poltfeet polyacrylics polyaromatics polyclinics polycyclics polyhedra polymethacrylicer polymethacrylicest polyphenolics polypi polyptota polysomics polyspectra polysyllabics polytechnics polyzoa polyzoaria polyzoics ponceaus pooris portmanteaus portmanteaux portmen positronia possibilia postcrania postmen postpeople postscripta postulata postwomen potawatomis potmen potpourris potsful poultrymen poultrywomen pracademics practica praefixa praemia praenomina prahus prediabetics prefixa premia presidia pressmen pretecta primordia probiotics problemata problematics probosci procambia proclitics prognostics prokinetics prolactinomata prolegomena pronuclei prooemia propaedeutics prophylactics propionibacteria proscenia prosciutti prosopagnosics prospermatogonia prosthetics protei proteinomimetics proteobacteria proteomimetics prothalli prothallia protonemata protozoa protreptics proventriculi proxeni proxenoi prutot prytanea prytaneis psalteria pseudanthia pseudopodia pseudothecia psoai psoi psus psychedelics psychics psychoneurotics psychotics psychotomimetics psychotropics ptarmics pterygia publics pudenda puerperia pulaskis pulik pulis pulvini puncta punjabis punnais puris purlieus putamina putti pygidia pyknics pylori pyodermata pyramidia pyrectics pyritohedra pyroelectrics pyromantics pyrosoma pyrotics pyrrhics pysanky qadis qataris qawwalis qazis qindarka qinghaosus qis quadratics quadrennia quadrics quadriplegics quadrivia qualia quanta quantics quarkonia quarrymen quartics quasimomenta questmen quindecemviri quinquennia quinqueviri quintics quipus quiversful quora rabbis radarmen raddlemen radialia radii radiolaria radioli radiomen raftsmen ragmen ragus railwaymen rajkumaris rakhis rakis rakshasis rami ranchmen ranchwomen ranis ranunculi rapakivis rastamen raviolis reais rebetika recta recti reddlemen referenda regatte regimina regna reguli reikis reinsmen relata relics remaindermen repairmen repairwomen representamina reptilia republics rescuemen residua retiari retiarii retinoblastomata rewritemen rhetorics rheumatics rhinoceri rhinoceroi rhizobacteria rhizobia rhombi rhombohedra rhonchi riflemen riflewomen rishis rmis roadmen rodmen rokurokubi romantics rondeaus rondeaux roomsful ropesmen rosaria rostis rostra roundsmen rsis rttis rubrics ruckmen rumina rusalki rusalky russkis rustics saamis sabzis sacella sacksful sacra sacraria sadgurus sadhus saepta safaris saffis sahaba sahrawis saics sailormen sailorwomen saimiris sajous saketinis sakkoi salamis salarymen salesmen salespeople saleswomen saliceta salivaria salmagundis salmis saltarelli salukis saluretics salvis samis sampis samurais sanatoria sandmen sandwichmen sanitaria sanitoria sanseis santokus sarangis sarcomata sarcophagi saris sartorii sashimis sastrugi satchelsful satgurus saucersful saudis sawteeth scallopinis scaloppini scenaria scenarii scenics sceptics schemata schematics scherzi schismatics schizophasics schizophrenics scholastics scholia schoolchildren schoolmen schwannomata sclerotia scoopsful scotchmen scotchwomen scotomata screensful scriptoria scrota scrubwomen seamen seamice seaquaria seedsmen selectmen selectwomen semantra semata semiautomatics seminomata senitis senryus senseis sensilla sephardim sephirot sephiroth septa sequuntur sera seraphim seris servicemen servicepeople servicewomen sestertii sewermen sexaholics sferics shakuhachis shamen shangani shaomais shearmen sheep sheepmen sheetsmen shekalim shellfishermen shentlemen sheqalim sherwanis shieldmen shieldsmen shikaris shinobis shipmen shipsful shittim shiurim shkotzim shochetim shofroth shopaholics shopmen showmen shrewmice shtetlach shuftis sicilici sidemen sidesmen sievesful sifus sigla signalmen signalwomen signori signorine silkmen silkwomen silphia similia simulacra sinfonie sistra skeptics skiesful skis skus slaughtermen smectics snafus snaggleteeth sne snorlax snowmen snowpeople snowwomen sociopathics soferim solaria solatia solidi somalis somata somnolytics somonis songfics soporifics soredia soum soundmen sous souvlakis sox spacemen spacewomen spadesful spahis spastics spearmen spearsmen spearwomen specifics specimina spectra spectrahedra specula spendaholics spermatagonia spermatogonia spermatozoa spheria spics spicula spinosauri spissati splayfeet spokesmen spokespeople spokeswomen spoonsful sporangia sporogonia sportsmen sportspeople sportswomen spreiten spumonis sputa stadia stamina staphylococci statesmen stateswomen statistics status staus steamboatmen steersmen stegosauri stemmata stepchildren stepgrandchildren stereocilia sterigmata sterna steroidogenicer steroidogenicest stewardii stickmen sticksmen stigmata stigmatics stimuli stockingfeet stockmen stoics stomata stomia stomodea storemen stotinki strangeonia strata strategi strati streetsful streptococci stromata strongmen strongwomen stuntmen stuntpeople stuntwomen styli stylobata styptics subashis subepithelia subgenera subharmonics sublemmata sublogics submenus subphyla subregna subsellia subspectra substrata subtaxa subtonics subtopics succedanea succubi sudokus sudorifics sufganiyot sugarmen suitcasesful sulci sulus supercilia supercolossi supercontinua superharmonics supermen supermice superminis superpeople superphenomena superphyla superplastics superregna supersalesmen superstimuli superstrata supertaxa supertonics supertori superwomen suppedanea supraspinati suprema surfaris surilis surrogata sushis suzanis svarabhaktis svengalis swagmen swamis swatis sweese swingmen switchmen swordsmen swordswomen sylis syllabi syllabics symbiotics sympatholytics sympathomimetics symposia synandria syncitia syncytia syndics synoptics syntagmata synthetics syphilitics tableaus tableaux tablesful tablespoonsful tabus tacksmen tactics tafoni tagmata taijis takfiris talesmen tali talismen tallymen talwege tankinis tanookis tanukis tapus tarakihis targumim tarsi tarsometatarsi tatakis tatamis taus taxa taxis taxmen taxwomen tchervontsy teacupsful teaspoonsful technics technocritics technopoleis tecta teeth teethbrush tefillin tegus telebureaus telebureaux teledus telencephala teletsunamis temenoi tempi tenderfeet tendus tengus tentoria tentsful tepidaria teppanyakis terais terata teratogenics teratomata teriyakis termini terraria tessiture tetani tetrahedra tetrahemihexahedra tetralemmata tetramethylammonia tetraplegics tetrevangelia teus textaholics thais thalami thalis thalli thalwege thankyous thecia thematics theorics thermoplastics thesauri thesaurusi thimblesful thingmen tholoi thrombi thugz thymi thyrsi tics tikis tillermen timbermen timpanis tinamous tinmen tinsful tintinnabula tipis tiramisus titis titmen titmice tocolytics tofinus tohubohus tokajis tolais tomenta tonics topics topmen topoi toponia toquis torchmen tori torsi tortonis townsful townsmen townspeople townswomen toxotai toymen toywomen trackmen tradesmen tradeswomen tragi transgenics transmen transwomen trapezia trapezii trapezohedra trashmen traumata travaux trax traysful tremata trenchermen triacontahedra tribesmen tribeswomen trichobothria tricola triennia triggermen trihedra trikinis triskaidekaphobics triskelia trispectra trisyllabics tritocerebra triumviri trivia tropics trousseaus trousseaux trowelsful truchmen trumeaus tsarevichi tsitsiyoth tsotsis tsunamis tucuxis tuis tulkus tumblersful tumuli tunics tureensful turmerics tuttis tutus tympana tyrannosauri tzatzikis uakaris ubermenschen ulstermen ultimata umbilici umlaute umus uncini underclassmen understrata underworkmen undulipodia unis univocalics unpeople untermenschen upperclassmen upsila uraei uranisci uredinia urnsful ursprachen urtis ushabtis ushabtiu uteri uterotonics utilitymen uzis vacua vagi variora vatus vaus vela veniremen ventis ventriculi verfremdungseffekte vestrymen viatica vicechairmen vici victoriati videmus villi vincula virelais virgalieus viri virii virostatics virtuosi viscera vivaria vizslak vleis vodkatinis vomitoria wadis wagemen wagonsful wahabis wahhabis wais waitpeople walis walkthrus walrusser wanderjahre wangteeth wapitis waragis warehousemen warehousesful waris wasabis washermen washerwomen washwomen watchmen watchwomen watermen wazungu wealdsmen wealsmen weathermen weatherpeople weatherwomen webcomics webfeet weighmen welchmen welshmen welshwomen weltanschauungen whalemen whanaus wheelmen whipmen wikiholics wikis wildmen windowsful wineglassesful wingmen wiremen wolfmen women wonderchildren wonderwomen woodlice woodmen woodmice woodsmen woodswomen workaholics workingmen workingwomen workmen workpeople workwomen wunderkinder xanthelasmata xanthogranulomata xanthomata xenobiotics xenodocheia xenodochia xenophobics xerophytics xiphiplastra xiphisterna xiphopagi xis xoana xus xylostromata xysti yachtsmen yachtspeople yachtswomen yadim yagis yagouarondis yagouarundis yaguarondis yaguarundis yalis yandere yangmeis yaravis yardmen yarramen yashikis yearmen yearsmen yeggmen yemenis yeomen yeowomen yeshivot yesmen yetis ynambus yoginis yogis yonis yorkshiremen yorkshirewomen yous yuzus zadruge zafus zaibatsus zakouski zakuski zambonis zamindaris zamis zanzibaris zastrugi zebus zeitgeister zemindaris zemis zemstva zeppole zetetics zeugmata zionazis zlotych zoa zoili zonohedra zoocytia zoodendria zooecia zoosporangia zoris zucchinis zugzwange zulus zunis zuzim zuzzim zyga zygantra zygomata zygomatici 5 GP bating excepting excluding including regarding 2 GR awing bleeping 4 U and or versus vs 1 B between 1 F from 4 I for in of on 2 PRV affor nigh 23 PR abaft aboard aboon afore agin agyen along alongside apart astride atop ayein ayen ayond ayont below beneath besides endlong forbye imell notwithstanding throughout 2 PV belong except 75 P abaht aboot about acrost aftah afther against ago ahn aka amid amidst among amongst anear apres arter at athwart atwix befo behither bencath benorth beside betune betwixt bewest bove by chez circa down during ere faw fer foreby furth gainst intiv into mauger neath off offa onto ontop out outta outwith per pon pre rel since than thru til toward towards twixt umb umbe under until up upon via wid wif with within without wiv 1 Q as 1 T to 17 RV abraid abroach bareback belive bereft betides caught chugalug dooced hyar ish multiply please pray rather sic whither 644 R aback abask abed ablings ablins abloom aborad abread abreast abuilding aburst acapella acock acockbill adagissimo adance afar affrettando afield aflare afloat afoot aforehand afoul afresh aft afterhind afterward afterwards again agewise aglee agley ahead ahold ahorseback aht ahull aiblins aight ajog ake aland alee aliter allargando allegretto allegrissimo allus aloft already also altogether always alwuz amain amidship amidships amock amok amuck anaphorical ance andantino anew anglewise antispinward anyhoo anyhow anymore anyplace anyroad anyway anyways anywhen anywhence anywhither anywho anywise apace apiece aport approx apriori arco arguendo aright arriswise artwise asahp asaic asap ashore assai assward asswards astraddle astray asunder aswell aswirl atcha athwartship athwartships atiptoe attacca aways aweather awhile awluz ayelp babywise barebacked barwise batspit battleward bce beachward beachwards bedeen bedward bedwards beforehand beggarwise belowdecks bendways bendwise betime betimes bimeby boldlier bookwise boxwise breadthways brushwise bulkwise businesswise capriccioso careerwise carpetward cashwise catwise certes chairward chevronwise churchward citywards classward cloudwise colorwise colourwise combwise comodo contrariwise cornerwise crescentwise crosslots crossways cuntward cupboardwise cupwise cyberstyle daint deasil deff deffo defo deosil deskward deuced disregardless divint doggo dogwise dolente dollarwise doosed downcourt downright downsection downwards downwind dreamward dreckley dropwise duncy eastwards ectad edgeways edgewise eliminable elsewhen elsewhence elsewhither elsewise endlang endways endwise enside entad ergo espressivo etc evar evermore everso everyplace everytime everyway everywhen everywhere facedown facefirst faceup featurewise fesswise flatwise foodwise foothot forasmuch forevermore fornigh forrard forthwith forthy freshlier frice fulltime furioso furthermore gatewise goalside goalwards godwards golfwise greenward groinward growthwise guisto halfway harshlier harshliest headforemost headling healthwise hellward hence henceforth henceforward hereabout hereabouts hereat hereaway hereby herein hereinabove hereinafter hereinbefore hereinto hereinunder hereish hereof hereon heretofore hereunder hereuntofore hereupon herewith hillwards hither hitherto hithertofore hoo hotelward however howso howsoever howsomdever iceward iinm imprimis inbye inchmeal indeed indeedie indeedy indoors infra insofar insomuch instanter instead inwards iow iwis jailward januarys jeah jildi jildy lacrimoso lamentoso landwards langsyne lapward lashwise leastaways leastways leastwise leftwards legerrio lief likewise limbmeal literatim loadsa longways longwise looard lookswise loverwise madonnawise maestoso makai manwise mapwise marcato mauka mayhaps mebbe mebby memberwise midbite midbow midleap midperformance midphrase midplay midpursuit midrun midset midships midstep midstretch midstride midtrip militarywise mirrorwise moar modificatory moneywise moonwise morendo moreover mouthward mouthwards natch nathless nauther nebber nerehonde nevah never nevermore nevertheless nobbut nohow nonetheless noo nopers noplace northwards not nowadays noway noways nowheres nowhile nuch obvi obvs offkey oft often oftener oftenest oftentime oftentimes ofter oftest ofttimes once onwards oop orad othertimes otherways otherwhere ottava outbye outwards overleaf pagemeal palewise parkward partway passim perchance perforce perhaps peripherad permyriad phantomwise phoneward phonewise pianississimo pickaback piecewise plankwise plantwise policywise portato posthaste praps precipitato profitwise pronto qua qualitywise quantitywise quindicessima quite rathering ratherish redhanded regretable riffwise rightwards ritardando roofward sackwise sacrad saddlewise saleswise saltirewise saturdays scarfwise scilicet scissorwise scotfree scrollwise seasonabliest seawards secus seldom seldomer seldomest selfward sempre seriatim shelfward shieldwise shipward shipwards shirtwise shopward shopwards shorewards shuttlewise sidewise sightwise simpliciter sinkward sizewise skyward sleepward sleepwise slopewise slowlier slowliest smorzando snakewise someday somehow someplace sometimes someway somewhat somewhen somewhere somewhither somewhy soonish sooo soooo soundwise southwards spaceward spadewise spinward spoonwise stageside starwards stationward sternwards storeward straightforth subito sundays sunwards sunwise supra swithe tableward tablewards tablewise talewise tastewise taxwise teamwise tentwise thataway thence thenceforth thenceforward thenceforwards thereabout thereabouts thereafter thereagainst therearound thereat thereatop therebefore therebetween therebeyond thereby therefor therefore therefrom therein thereinafter thereinbefore thereinunder thereof thereon thereover therethrough therethroughout theretofore thereunder thereupon therewith therewithal thighward thisaway thither tho thor though thrice thur thursdays thuswise timewise tomorn too townwards toyear trafficwise transitionary treeward truthwards ttr tuesdays tunicwise tuskwise twelvefold twice unawares unbeknownst underseas unoften unwares upcourt upriver upsection upward upwards valleywards varry verrry vicibus videlicet visionwise viz waterward waterwards weatherwise wedgewise wednesdays weightwise westwards whar whatsay whence whenceforth whencever whenever whensoever whereabout whereafter whereby wherefor wherein whereinto wheresoever whereunto wherever whitherever whithersoever whitherward whyever whysoever widdershins widelier wideliest withal withershins withinside yance yeah yeap yeppers yer yestereve yestermonth yfere yis youthward yowzah yuppers yus zillionfold 16377 V abacinate abacinates abalienate abalienates abands abase abases abash abashes abastard abastardize abastardizes abastards abbreviates abdicate abdicates abduce abduces abduct abducts abear abears aberrate aberrates aberrs aberuncates abet abets abhor abhors abide abides abies abirritate abirritates abite abjoint abjudge abjudges abjudicate abjudicates abjugates abjure abjures ablactate ablactates ablaqueate ablaqueates ablate ablates ables abligates abludes ablute ablutes abnegate abnegates abnormalise abnormalises abnormalize abnormalizes abolish abolishes abolitionize abolitionizes abominate abominates abomines abought abound abounds abrade abrades abraids abrases abray abreact abreacts abrenounces abridge abridges abroaches abrogate abrogates abrook abrooks abscind abscinds abscise abscises abscisses abscond absconds absents absinthiate absinthiates absists absolue absolutise absolutises absolutize absolutizes absolve absolves absorb absorbs absquatulate absquatulates abstain abstains absterge absterges absterse absterses abstractifies abstractify abstrict abstricts abstringe abstringes abstrude abstrudes absumes abut abuts abuy abvolate abvolates aby abye abyes academicize academicizes academize academizes accede accedes accelerates accend accends accentuate accentuates accept accepts accesses accessorise accessorises accessorize accessorizes accinges accites acclamate acclimate acclimates acclimatise acclimatises acclimatize acclimatizes accloy accloys accoasts accoil accoils accolls accommodate accommodates accompanies accompany accompanying accomplish accomplishes accorporates accosts accouche accouches accouple accouples accourages accourts accouter accouters accoutre accoutres accoys accredit accredits accresce accresces accretes accriminate accriminates accroach accroaches accrue accrues acculturate acculturates accumbers accumulates accurize accurse accurses accuse accuses accustom accustomize accustoms acerbates acervates acetifies acetify acetize acetizes acetylate acetylates achieve achieves achieving achromatise achromatises achromatize achromatizes acidifies acidify acidize acidizes acidulate acidulates acierate acknew acknow acknowledge acknowledges acknown acknows acquaint acquaints acquiesce acquiesces acquiets acquire acquires acquit acquits acronymize acronymized acronymizes acting activate activates actualise actualises actualize actualizes actuate actuates acuates acuminates acupunctuate acutes acylate acylates adapts addeem addeems addooms adduce adduces addulce addulces adeem adeems adempt adempts adenylates adhere adheres adhibit adhibits adjectivize adjoin adjoins adjourn adjourns adjudge adjudges adjudicate adjudicates adjure adjures adjust adjusts adjutes admeasure admeasures administer administers administrate administrates admire admires admit admits admix admixes admixt admonish admonishes adnominalize adnominalizes adolesce adolesces adonize adonizes adopt adopts adore adores adorest adorn adorns adrenalectomize adrenalectomizes adrenalise adrenalises adrenalize adrenalizes adsorb adsorbs adsorp adsorps adulate adulates adulterates adulters adultize adultizes adumbrate adumbrates advect advects advene advenes adverbialise adverbialises adverbialize adverbializes advertise advertises advertizes adviews advise advises advoke advokes aerate aerates aerifies aerify aerobicize aerobicizes aerosolise aerosolises aerosolize aerosolizes aesteems aestheticise aestheticises aestheticize aestheticizes aestivate aestivates afears affamishes affears affectest affectionates affeers affiance affiances affies affirm affirms afflict afflicts affoards affoords afforce afford affords afforest afforests affors affranchise affranchises affranchize affranchizes afoords africanise africanises africanize africanizes aftersee afterthink againbuy againsay againstand agatize agatizes aggerate aggerates agglomerates agglutinates aggrace aggraces aggrade aggrades aggrandise aggrandises aggrandize aggrandizes aggravate aggravates aggrege aggreges aggresses aggrieve aggrieves aggroes aggroups agist agists agitate agitates agnises agnizes agnominate agnominates agoes agone agonise agonises agonize agonizes agree agrees agriculturalize agriculturalizes agriculturize agrises agues aguises airdash airdashes airfreights airmails airt airts ajaxifies ajaxify akens akes akether aks albuminize alchemise alchemises alchemize alchemizes alcoholise alcoholises alcoholize alcoholizes algorithmize algorithmizes alibies alienates alights align aligns aline alines alit alkalifies alkalify alkalinise alkalinises alkalinize alkalinizes alkalize alkalizes alkylate alkylates allay allays allege alleges allegorise allegorises allegorize allegorizes alleviate alleviates allide allides alliterate alliterates allocate allocates allocute allocutes allot allots allow allows allude alludes allures alphabetise alphabetises alphabetize alphabetizes alter altercate altercates alters aluminise aluminises aluminize aluminizes aluminumize amalgamate amalgamates amass amasses amay amazes ambiguate ambiguates ambulate ambulates ameliorate ameliorates amend amerce amerces americanise americanises americanize americanizes ameses aminate aminates ammoniates ammonifies ammonify amortise amortises amortize amortizes amoves amplifies amplify amputate amputates amscray amuse amuses anaesthetise anaesthetises anaesthetize anaesthetized anaesthetizes anagrammatise anagrammatises anagrammatize anagrammatizes analogise analogises analogize analogizes analyse analyze analyzes anathematise anathematises anathematize anathematizes anatomise anatomises anatomize anatomizes anears aneles anesthetize anesthetizes angers anglicise anglicises anglicize anglicizes angsts angulates animadvert animadverts animalize animalizes animates ankylose ankyloses anneal anneals annihilate annihilates annoint annoints annotate annotates announce announces annualise annualises annualize annualizes annul annuls annunciate annunciates anodise anodises anodize anodizes anoint anoints anonymise anonymises anonymize anonymizes antagonise antagonises antagonize antagonizes antecede antecedes antecipate antecipates antedate antedates antes anthologise anthologises anthologize anthologizes anthropize anthropizes anthropomorphise anthropomorphises anthropomorphize anthropomorphizes antialias antialiases anticipate anticipates anticorrelate antioxidize antioxidizes antiquate antiquates antisepticise antisepticises antisepticize antisepticizes antithesize antithesizes aphorise aphorises aphorize aphorizes apocopates apodize apodizes apologise apologises apologize apologizes apostatise apostatize apostatizes apostemate apostrophise apostrophises apostrophize apostrophizes apotheosise apotheosises apotheosize apotheosizes appal appall appalls appals apparate apparels appeaches appear appears appease appeases apperceive apperceives appertain appertains appetise appetises appetize appetizes applaud applies applying appoint appoints apportion apportions appose apposes appraise appraises appreciate appreciates apprehend apprehends appress appretiate apprise apprises apprize apprizes approbate appropinquate appropriates approprinquates approve approves approximates aquacises arabise arabises arabize arabizes araises arbitrate arbitrates arborise arborises arborize arborizes archaize archaizes arcweld arcwelds argue argues argufies argufy arise arises arising arizes armors armours aroints aromatise aromatises aromatize aromatizes arose arouse arouses aroze arpeggiate arpeggiates arraign arraigns arrange arranges arrive arriven arrives arrogate arrogates arrove arterialize articulates artificialize artificializes artuate artuates ascend ascends ascerbates ascertain ascertains ascribe ascribes asearches asexualise asexualises asexualize asexualizes ashame ashames asks aslake aslakes asperates asperse asperses asphalts asphyxiate asphyxiates aspire aspires asplode asplodes assail assails assains assassinate assassinates assemble assembles asserts assess assesses asseverate asseverates assibilate assiege assimilate assimilates assoil assoils assoilzie assonate assonates assort assorts assoyle assoyles assran assrape assrun assruns assuage assuages assubjugates assume assumes assure assures asswages ast astonies astonish astonishes astound astounds astrict astricts astringe astringes astrogate astrogates astroturfs ate atheise atheises atheize atheizes athetize athetizes atomise atomises atomize atomizes atone atones atrede atren attach attaches attain attains attaints attask attemper attempers attend attends attenuates attest attests attires attitudinise attitudinises attitudinize attitudinizes attorn attorns attract attracts attrit attrites attrits attuite attuites attune attunes atwite augle augments aurifies aurify auscult auscultate auscultates auspicates austemper austempers austenitize austenitizes australianise australianises australianize australianizes australize australizes auth authenticate authenticates authorise authorises authorize authorizes auths autoactivate autoactivates autoamputate autoamputates autoboot autoboots autocatalyse autocatalyses autocatalyze autocomplete autocompletes autoconfigure autoconfigures autodelete autodeletes autodestructs autodetect autodetects autofocuses autofocusses autoformat autoformats autogenerate autogenerates autohid autohide autohides autoinhibit autoinhibits autoionize autoionizes autoload autoloads autolyse autolyses autolyze autolyzes automate automates automatised automatize automatizes automize automount automounts autophosphorylate autophosphorylates autoreact autoregulate autoregulates autosaves autoselect autoselects autostart autostarts autotune autotunes autoxidise autoxidises autoxidize autoxidizes avale avel avels aventres averruncate averruncates avers averses avert averts aviate aviates aviles avises avocates avoid avoids avouch avouches avow avows avulse await awaiteth awaken awakens awakes awarn awarns awent awes awhape awhapes awoke awroth axiomatise axiomatises axiomatize axiomatizes ayield azotise azotises azotizes azures babbles babelize babelizes babifies babify babysat babysit babysits bachs backbit backcasts backcheck backchecks backcomb backcombs backdate backdates backfoot backgammons backhauls backlists backload backloads backpedal backpedals backport backports backpropagate backpropagates backreact backread backreads backscratch backscratched backscratches backslap backslapped backslaps backslid backslide backslides backspun backstab backstabs backtalks backtest backtests backtracks backwound bacterize bacterizes bade badmouth badmouths baggs bagses bagsie bagsy bails bakes balkanise balkanises balkanize balkanizes balks ballasts bamboozle bamboozles bamfoozle bamfoozles banalise banalises banalize banalizes bandies bangalore bangalores banhammers banish banishes banjaxes bankrupts banninate banters baptise baptises baptize baptizes barbarize barbarizes bares barfs barhop barhops barnstorm barnstorms bartend bartends bask basks bastardise bastardises bastardize bastardizes baste bastes bastonade bates bathes bauf bawl bawls bbq bearing beath beatifies beatify beautifies beautify bebleed beblot beblubber beblur bebops bebother bebothers becall becalm becalms became bechances beckon beckons beclothes becloud beclouds become becomes becover becripple becue bedabble bedabbles bedare bedark bedarken bedarkens bedash bedaub bedaubs bedaze bedazes bedazzle bedazzles bedeck bedecks bedelve bedevil bedevils bedew bedews bediaper bedim bedims bedinner bedizens bedo bedoubt bedraggle bedraggles bedrops bedusts bedwet beeswaxes befalls befang befeather befeathers befell befie befight befile befind befit befits befitteth beflake beflatter beflay beflea beflee beflow befly befoam befog befogs befold befools befoul befouls befriend befriends befuddle befuddles began beganst begaud begay begem beget begets begink begins begird begirdle begirdles begirds beglooms begot begown begrave begrime begrimes begrudge begrudges beguile beguiles beguilty behap behappen behat behate behave behaves behead beheads behear beheart behell behelm behew behight behold beholds behoney behoove behooves behorn behove behoves behowl bejewel bejewels bejumble beken bekiss beknave beknight beknit beknow belabor belabors belabour belabours beladle belap belate belates belaud belave belaves belawgive belead beleaguer beleaguers beletter belick belie belies believe believes belifans belight belime belittle belittles belives bellycrawl bellyflop bellyflops belock belongs belord belout belove bemad bemask bemaze beme bemean bemerd bemerds bemete bemingle bemire bemires bemist bemoan bemoans bemourn bemud bemuds bemuse bemuses benames benegro benempt benet benight benights benote bentsh bentshes benumb benumbs bepaint bepaints bepat bepearl bepelt bepelts bepinch bepinches bepiss bepisses bepities beplaster beplasters bepommel bepommels bepowder bepowders bepraise bepraises beprose bepurple bepurples bequeath bequeaths bequiver bequivers berate berates beray berays bereave bereaves berhyme berhymes beribbon beribbons berime berimes bes bescatter bescreen besee beseech beseeches beseek beseems beset besets beshine beshrew beshrews beshroud beshut besiege besieges besit beskirts beslabber beslabbers beslave beslaver beslavers beslaves beslime beslimes beslobber beslobbers besmear besmears besmirch besmirches besmoke besmooth besmut besmutch besnow besnowball besnowballs besnows besnuff besoil besot besots besoul besouls besour bespangle bespangles bespatter bespatters bespawls bespeaks bespeckle bespeckles bespell bespells bespend bespit bespittle bespoil bespoils bespot bespread besprenges besprent besprinkles bestain bestand bestead besteads besteals bestialize bestializes bestick bestill bestir bestirs bestole bestood bestorm bestow bestows bestraddle bestreak bestrew bestrews bestride bestrides bestrode bestud beswaddle beswike beswinge beswink betag betail betake betakes betalk betallow betaught beteach betear beteem betell betells bethink bethinks bethought betide betine betoken betokens betold betook betray betrays betroth betroths bewail bewails bewake beware bewash beweep beweeps bewent bewept bewet bewets bewhisper bewhore bewield bewilder bewilders bewimple bewinter bewitch bewitches bework bewray bewrays bewreak bewreck bewrite bewrites bewrote bibble bibblebabbles bibbles bibulate bicker bickers bide bides bield bifurcates biggen bilk bilks bilocate bilocates binarise binarize bioaccumulate bioaccumulates bioactivate biodegrade biodegrades biographise biographises biographize biographizes biomagnifies biomagnify biomineralize biomineralizes bioremediate biosynthesise biosynthesises biosynthesize biosynthesizes birdsat birdsit birdsits birle bist bitbuckets bituminise bituminises bituminize bituminizes bivouacks blabs blacken blackens blackmails blackmark blackmarks blacktops blags blames blameshift blameshifts blanches blandifies blandify blandish blandishes blarneys blathers blats blatters blears bleats blech bleches bleeds blench blenches blenderize blenderizes bless blesses blet blets blew blights blithers blooden bloodens bloodies bloop bloops bloviate bloviates blub blubbers blubs bludges bluejack bluejacks blunge blunges blunk blurt blurts boak boaks bobars bobbars bobbitt bobbitts bodges bodyslams bodysurf bodysurfs boffs boggle boggles boink bolden boldens bolds bolix bolixes bolk bollixes bollockses bombinate bombinates bonjour boobytrap boobytraps boohoo boohoos bookcross bookcrosses bookkeep bootlick bootlicks boozes borks bornin bornt bose bosonise bosonises bosonize bosonizes botanise botanises botanize botanizes botrytize bought bouse bouses bowdlerise bowdlerises bowdlerize bowdlerizes bowge bowk bowkin bowks bowse bowses brachiates brags brainwashes brandishes brandwash brang brattle brattles brawns braze brazens brazes breadthen breadthens breastfeed breastfeeds breathalyse breathalyses breathalyze breathalyzes breathe breathes brenned brens brian brighten brightens brilliantines brines brings brivet brivets broaden broadens broddle broddles brode broiders brominate brominates brought browbeat browbeats browses browzes bruit bruits brumate brutalise brutalises brutalize brutalizes brux bruxes budge budges budnamed buffets bulbectomize bulbectomizes bulldoze bulldozered bulldozes bulletinize bulletinizes bulletproofs bullshat bullshits bullyrag bullyrags bumbazes bumfuzzle bumfuzzles bunds burbles bureaucratize bureaucratizes burgeon burglarise burglarises burglarize burglarizes burgle burgles buries burnish burnishes burnt bushbash bushwack bushwacks bushwhack bushwhacks busies busticate busticates buttle buttles buttonholes butylate butylates bycaught byheart cachinnate cacks cacumate cadgin caffeinate caffeinates cahoot cajole cajoles calcifies calcify calcinate calcine calcines calculate calculates calefy calendarize calendarizes calibrate calibrates calligraph calumnate calumniate calumniates calve cambers camcord camcords cameth canadianise canadianize canadianizes canalise canalises canalize canalizes cancans cancerate cannibalise cannibalises cannibalize cannibalizes cannulate cannulates canonicalize canonicalizes canonise canonises canonize canonizes canoodle canoodles cantillate capacitate capacitates capitalise capitalises capitalize capitalizes capitulate capitulates caponize caponizes capsize capsizes capsulize capsulizes captivate captivates carabine carabines caramelise caramelises caramelize caramelizes carboard carboards carbonatise carbonatises carbonatize carbonatizes carbonify carbonise carbonize carbonizes carbonylate carburet carburets carburize carburizes carcade carcades cardinalize cardiovert cardioverts careen careens carefront caress caretake caretakes caretook carjack carjacks carmelize carmelizes carnalize carnalizes carouse carouses carshare carshares cartelize cartelizes carve carves casefies casefy caseharden casehardens cashes castellate castigate castigates castrate castrates casualise casualises casualize casualizes catabolize catabolizes catalanize catalyse catalysize catalyze catalyzes catastrophize catastrophizes catechise catechises catechize catechizes categorifies categorify categorise categorises categorize categorizes catenate catenates cater catermaul catermauls caterwauls cathect catheterise catheterises catheterize catheterizes catsit catsits caulks cauponize cauterise cauterises cauterize cauterizes cavils cavitate cavitates cavort cavorts cease ceases cede cedes ceils celebrate celebrates celestialize cense censures centesimate centralise centralises centralize centralizes cerebralise cerebralises cerebralize cerebralizes cerebrate certifies certify chack chacks chafes chaffers chaffs chagrins chalks champs channelize channelizes channelled chaptalize characterise characterises characterize characterizes charbroil charbroils chargrill chargrills charlies chasten chastens chastise chastises chasts chatters chaulks chavel cheapen cheapens cheerlead cheerleads chelp chemisorb chemisorbs chemosorb chemosorbs cherish cherishes cherrypick cherrypicks chiack chiacks chide chides childmind childminds childproofs chillax chillaxes chillaxin chirally chitter chitters chlorinate chlorinates chlorinise chlorinises chlorinize chlorinizes chloroforms choose chooses chope chor choreograph choreographs chorrin chors chose chouse christen christens christianise christianises christianize christianizes chromes chronologise chronologize chugalugs chumble chumbles chunders chunter chunters chupse churr churrs chuses cicatrise cicatrize cimmerianize cimmerianizes cinched cinematise cinematises ciphers circularise circularises circularize circularizes circulate circulates circumambulate circumambulates circumcise circumcises circumcizes circumflect circumfuse circumfuses circumgyrate circumlocute circummure circummures circumnavigate circumnavigates circumnutate circumrotate circumscribe circumscribes circumstantiate circumstantiates circumundulate circumvallate circumvallates circumvent circumvents circumvolute circumvolve circumvolves cite citifies citify civilianize civilianizes civilise civilises civilize civilizes clabbers clad clads clags clamber clambers clarifies clarify classicalize classicise classicises classicize classicizes classifies classify clavers cleanse cleanses clears cleaves clenches clepes clicket clickjack cliffhang cliffhangs cliffhung climbs clinches clintonize clipt clitoridectomize closen closens closes clothe cloverleafs cloy cloys clubhaul clubhauls clucks cludged clumb clumps clutters cnawvshawl coact coacts coadsorb coagulates coalesce coalesces coalises coalizes coapplies coapply coarsen coarsens coarticulate coarticulates coassemble coassembles coasts coaxes cobrand cobrands cockneyfies cockneyfy cocreate cocreates cocrystallize coddle coddles codenature codesign codesigns codetermine codge codges codifies codify codisplay codiverge coedit coedits coeducate coeducates coelute coelutes coenrich coenriches coerce coerces coevolve coevolves coexert coexist coexists coexpose coexposes coexpress coexpresses coextend coextends cofire cofires cofound cofounds cogenerate cogenerates cogitate cogitates cognise cognises cognize cognizes cohabit cohabitate cohabitates cohabits cohaere cohaeres cohere coheres cohobate coiffe coimmunoprecipitate coimmunoprecipitates coincide coincides coinhabit coinhabits coinsure coinsures coldcock coldcocks coll collaborate collaborates collate collateralise collateralises collateralize collateralizes collates collectivise collectivises collectivize collectivizes collide collides colligate colligates collimate collimates collineate colliquate collocates colloquialize colloquializes colloquize colls collude colludes collusitate colocalised colocalize colocalizes colocate colocates colonise colonises colonize colonizes colorate colorize colorizes colourise colourises colourize colourizes colport colports columbaries columnize columnizes comarket comarkets combusts comes comigrate comigrates comixes commandeer commandeers commemorate commemorates commence commences commend commends commentate commentates commerces commercialise commercialises commercialize commercializes comminate comminates commingle commingles comminute comminutes commiserate commiserates commits commix commixes commodifies commodify commoditise commoditises commoditize commoditizes commonise commonises commonize commonizes commove commoves communalise communalize communicate communicates communifake communise communises communize communizes commute commutes comove comoves compactifies compactify compare compares compart compartmentalise compartmentalises compartmentalize compartmentalizes comparts compel compels compenetrate compensate compensates compete competes compilates compiles complain complains compleats complect complects completes complexifies complexify complicates complies comply componentize componentizes comport comports compose composes composts comprehend comprehends comprendo comprise comprises comprising compute computerise computerises computerize computerizes computes concatenate concatenates conceal conceals concede concedes conceive conceives concelebrate concenter concenters concentre conceptualise conceptualises conceptualize conceptualizes concertize concertizes concerts conciliate conciliates conclude concludes concluding concoct concocts concomitate concomitates concretes concretise concretises concretize concretizes concur concurs concuss concusses condemn condemns condense condenses condescend condescends conditionalize conditionalizes condole condoles condone condones conduce conduces confabulate confabulates confect confer conferruminate confers confess confesses confessionalise confessionalises confessionalize confide confides configure configures confirm confirms confiscate confiscates conflagrate conflagrates conflate conflates conform conforms confound confounds confront confronts confuddle confuscate confuse confuses confusticate confusticates confutes confuzzles congeal congeals congest congests conglobates conglobe conglobes conglobulate conglutinate conglutinates congratulate congratulates congregates conjects conjoin conjoins conjugating conjures conn connect connects connive connives connotate connotates connote connotes conns conquer conquers consecrate consecrates conservate conservates consider considering considers consign consigns consisting consists consolidate consolidates conspire conspires constate constellate consternate consternates consters constipate constipates constitute constitutes constitutionalise constitutionalises constitutionalize constitutionalizes constrain constrains constrict constricts constringe construes consume consumerize consumerizes consumes consummates contain containerise containerises containerize containerizes containing contains contaminate contaminates contemn contemns contemplate contemplates contemporize contend contends contextualise contextualised contextualises contextualize contextualizes continues contort contorts contracept contradict contradicts contradistinguish contradistinguishes contraindicate contraindicates contrasts contravene contravenes contribute contributes contrist contrists contrive contrives controvert controverts contuse contuses convalesce convalesces convect convects convene convenes conventionalise conventionalises conventionalize conventionalized conventionalizes converge converges conversate conversates converses convexify convey conveyorise conveyorize conveyorizes conveys convince convinces convoke convokes convolutes convolve convolved convolves convulse convulses cooccur cooccurs cools cooperate cooperates coopt coopts coos coown coowns copaid copolymerize copperfasten coprecipitate coprecipitates copresents coproduce copromote copromotes copublish copublishes copulate copulates copurifies copurify copyedit copyedits copylefts copyread copyreads copywrite copywrites copywrote coralise coralises coralize coralizes cornifies cornify cornute cornutes coronate coronates corotate corotates corporatise corporatises corporatize corporatizes corrade corrades corrects correspond corresponding corresponds corrivals corroborate corroborates corrode corrodes corrugate corrugates corrupts corruscate corruscates coruscate coruscates cosediment cosediments cosegregate cosegregates cosher coshers cosign cosigns cosleep cosleeps coslept cosplays costain cosupervise cosupervises cotransfect cotransfects couldest couldst counteract counteracts counterargue counterargues counterassert counterasserts counterattract counterattracts counterchange counterdraws counterdrew counterilluminate counterilluminates countermands countermine counterpose counterposes counterprogram counterprograms countersang countersank countersings counterstruck countersue countersues countervail countervails countifies countify countrifies countrify countryfies countryfy covariantize covariantizes covaries covary coventrate coventrates covet covets cowardize cower cowers cowrite cowrites cowritten cowrote cozens craigslist craigslists crapflood crapfloods crave craves crazes creaseproofs create creates credences creeds creepifies creepify cremate cremates crenelate crenelates crenellate crenellates creolise creolises creolize creolizes crepitate crept cretinise cretinises cretinize cretinizes cribble criminalise criminalises criminalize criminalizes criminate criminates crispen crispens criticise criticises criticizes croon croons croquets crossmatch crossreact crucifies crucify crunkle cryofocus cryofocuses cryopreserve cryopreserves cryoprotect cryoprotects crystalise crystalises crystalize crystalizes crystallise crystallises crystallize crystallizes cubiclize cubiclizes culminate culminates cultivate cultivates cumber cumbers cums cumulates curdle curdles curiousest curr curtail curtails curvet curvets cuss cusses customise customises customize customizes cutifies cutify cyberattacks cyberise cyberises cyberize cyberizes cybers cyberstalk cyberstalks cyclised cyclize cyclizes cyclodimerize cycloisomerize cyclomerize cyclotetramerize cyclotrimerize cytoreduce cytoreduces dabble dabbles daddle daddles daemonize daemonizes daintify damnifies damnify dampen dampens dampne dampproofs damps dandifies dandify dandle dandles dangles dangs daresay darken darkens darkle darns darraigns darrains dast daunt daunts daven davens dawdle dawdles dawt daydreamt daylit daysail daysails dazzle dazzles deacetylate deacetylates deacidifies deacidify deactivate deactivates deaden deadens deadenylate deadenylates deadpans deads deadsticks deaerate deaerates deafen deafens deafferents deagglomerate deagglomerates dealign dealigns dealkylate dealkylates deallocate deallocates dealt dealuminate dealuminates deamidate deamidates deaminate deaminates dearomatise dearomatises dearomatize dearomatizes dearrest dearrests deauthorise deauthorises deauthorize deauthorizes deaverage deaverages debag debags deballast deballasts debar debark debarks debarrass debarrasses debars debase debases debeak debeaks debeard debilitate debilitates deblend deblends debloat deblock deblocks deblur deblurs deboard deboards debond debonds debone debones deboss debosses debouche debounce debounces debranch debranches debride debrides debrief debriefs debrine debrines debruise debug debugs debulk debulks debunk debunks deburr deburrs decaffeinate decaffeinates decalcifies decalcify decalibrate decalibrates decamp decamps decant decants decapacitate decapacitates decapitalize decapitalizes decapitate decapitates decapsulate decarbonate decarbonates decarbonise decarbonises decarbonize decarbonizes decarbonylate decarbonylates decarboxylate decarboxylates decarburize decays deceases deceive deceives decelerate decelerates decellularise decellularize decellularizes decenter decenters decentralise decentralises decentralize decentralizes decentre decentres decertifies decertify dechlorinate dechlorinates dechristianize decide decides decimalise decimalises decimalize decimalizes decimate decimates decipher deciphers decivilise decivilises decivilize decivilizes declaim declaims declare declares declass declassifies declassify declaw declaws declimb decloak decloaks declolorise declutch declutter declutters decocainize decoct decocts decode decodes decohere decoheres decollate decollates decolonise decolonises decolonize decolonizes decolorise decolorises decolorize decolorizes decolourise decolourize decommission decommissions decommodifies decommodify decompactifies decompactify decompartmentalise decompartmentalises decompartmentalize decompartmentalizes decompensate decompile decompiles decompose decomposes decompress decompresses deconceptualise deconceptualises deconceptualize deconceptualizes decondition deconditions deconfine deconflict deconflicts decongest decongests deconsecrate deconsecrates deconstruct deconstructs decontaminate decontaminates decontextualise decontextualises decontextualize decontextualizes deconvolute deconvolutes deconvolve deconvolves decorate decorates decorrelate decorrelates decorticate decorticates decoupages decouple decouples decrements decreolize decreolizes decrepitate decries decriminalise decriminalises decriminalize decriminalizes decry decrypt decrypts deculturize deculturizes decumulate decunt decunts decussates dedicate dedicates dedifferentiate dedifferentiates dedisperse deduce deduces deduct deducts deduplicate deduplicates deein deek deekin deeks deeky deekyin deemphasise deemphasises deemphasize deemphasizes deems deepen deepens deepthroat deepthroats deescalate deescalated deescalates deexcite deface defaces defaecate defaecates defalcate defalcates defalks defame defames defamiliarise defamiliarises defamiliarization defamiliarize defamiliarizes defang defangs defat defatigate defats defecate defecates defeminise defeminises defeminize defeminizes defend defends defenestrate defenestrates defer defers defibrate defibrates defibrillate defibrillates defibrinate defibrinates defilades define defines defining definitize definitizes deflagrate deflagrates deflate deflates deflect deflects deflocculate deflocculates deflower deflowers defocus defocuses defog defoggers defogs defoliate defoliates deforest deforests deform deformalize deformalizes deforms defrag defragment defragments defrags defraud defrauds defray defrays defriend defriends defrizz defrizzes defrock defrocks defrost defrosts defund defunds defuse defuses defuzes degas degasses degauss degausses degazette degerm degerms deghettoize deghettoizes deglaciate deglaciates deglamorize deglamorizes deglaze deglazes deglobalise deglobalises deglobalize deglobalizes deglottalize deglottalizes deglove deglycosylate deglycosylates degrade degrades degranulate degranulates degrease degreases degum degums degunk degunks degust degustate degustates dehire dehires dehisce dehisces dehistoricize dehistoricizes dehook dehorn dehorns dehort dehorts dehull dehulls dehumanise dehumanises dehumanize dehumanizes dehumidifies dehumidify dehydrate dehydrates dehydrogenate dehydrogenise dehydrogenises dehydrogenize dehydrogenizes dehypnotise dehypnotises dehypnotize dehypnotizes deice deices deifies deify deign deigns dein deindex deindexes deindustrialise deindustrialises deindustrialize deindustrializes deinitialize deinitializes deink deinks deinstall deinstitutionalise deinstitutionalises deinstitutionalize deinstitutionalizes deinterlace deinterlaces deionise deionises deionize deionizes deject dejects dejunk dejunks delabialize delabializes delaminate delaminates delegalize delegalizes delegitimate delegitimates delegitimatise delegitimatises delegitimatize delegitimatizes delegitimise delegitimises delegitimize delegitimizes delevel delevels deleverage deleverages deliberates delicense delimb delimbs deliminate delimit delimitate delimitates delimits delineate delineates delink delinks delint delints deliquesce deliquesces delist delists deliver delivers delocalize delocalizes deloft delofts delouse delouses delude deludes deluster delustre delves demagnetise demagnetises demagnetize demagnetizes demanufactures demarcate demarcates demark demarket demarkets demarks demassify demast dematerialise dematerialises dematerialize dematerializes demaunds demeans demerge demerges demetallize demetallizes demethylate demethylates demilitarise demilitarises demilitarize demilitarizes demine demineralise demineralises demineralize demines demist demists demit demits demix demixes demob demobilise demobilises demobilize demobilizes demobs democratise democratises democratize democratizes demodulate demodulates demolish demolishes demonetise demonetises demonetize demonetizes demonise demonises demonize demonizes demonopolize demonstrate demonstrates demoralise demoralises demoralize demoralizes demosaic demosaiced demosaics demoss demosses demote demotes demotivate demotivates demulsifies demulsify demultiplex demultiplexes demutualise demutualises demyelinate demyelinates demystifies demystify demythologise demythologize demythologizes denasalize denasalizes denationalise denationalises denationalize denationalizes denaturalise denaturalize denaturalizes denature denatures denaturize denervate denib denibs denies denigrate denigrates denitrified denitrifies denitrify denitrogenate denitrogenates denominate denominates denormalise denormalises denormalize denormalizes denote denotes denounce denounces densifies densify denuclearise denuclearises denuclearize denuclearizes denude denudes deny deodorise deodorises deodorize deodorizes deodourise deodourises deoil deoils deop deops deoptimize deoptimizes deorbit deorbits deoxidise deoxidises deoxidize deoxidizes deoxygenate deoxygenates depacketize depacketizes depaint depaints depalletize depalletizes depanelize depanelizes depants depantses depart departmentalise departmentalises departmentalize departmentalizes departs depasture depastures depatriarchalize depatriarchalizes depauperates depave depaves depend depending depends depersonalise depersonalises depersonalize depersonalizes depetal depetals dephase dephases dephlogisticate dephlogisticates dephosphorylate dephosphorylates dephysicalize dephysicalizes depict depicts depigment depigments depilate depilates deplane deplanes deplete depletes deplore deplores deploy deploys depolarise depolarises depolarize depolarizes depolish depolishes depoliticalize depoliticise depoliticises depoliticize depoliticizes depolymerised depolymerize depolymerizes depone depopulate depopulates deport deports depose deposes deprave deprecate deprecates depreciate depreciates depredate depredates depress depresses depressure depressures depressurise depressurises depressurize depressurizes deprioritise deprioritises deprioritize deprioritizes deprivatize deprivatizes deprive deprives deprogram deprogramme deprograms deproject deprojects deprotect deprotects deproteinize deproteinizes deprotonate deprotonates depublish depucelates depurate depurates depute deputes deputise deputises deputize deputizes dequantize deracemize deracemizes deracinate deracinates deradicalise deradicalises deradicalize deradicalizes deraign deraigns derails derains derandomise derandomises derandomize derandomizes derange deranges derat derate derates derats derecognise derecognises derecognize derecognizes dereference dereferences deregister deregisters deregulate deregulates dereligionise dereligionises dereligionize dereligionizes derepress derepresses derequisition derequisitions deres derestrict derez derezz derezzes deride derides derivatize derive derives derogate derogates derograte derogrates deromanticise deromanticises deromanticize deromanticizes desacralize desacralizes desalinate desalinates desalinize desalinizes desalivate desalt desalts desand desands desat desats desaturate desaturates descale descales descend descends deschool descope descopes descramble descreen descreens describe describes describing descries descry deseasonalize deseasonalizes desecrate desecrates deseed deseeds desegregate desegregates deselect deselects desensationalize desensationalizes desensitise desensitises desensitize desensitizes deserialise deserialises deserialize deserializes desertify deserve deserves desex desexes desexualise desexualises desexualize desexualizes deshuffle deshuffles desiccate desiccates desiderate desiderates desilver desilvers desilylate desist desists deskew deskews deskill deskills desocialise desocialises desocialize desocializes desolates desolder desorb desorbs desoul despairs desparple desparples despeckle despeckles despise despises despoil despoils despond desponds desponsate desponsates desport desports desquamate desquamates dessay destabilise destabilises destabilize destabilizes destandardize destandardizes destem destems destigmatise destigmatises destigmatize destigmatizes destimulate destimulates destine destines destock destress destroy destroys destruct destructs destructure destructures desugar desugars desulfur desulfurise desulfurises desulfurize desulfurizes desulfurs desulphur desulphurise desulphurize desulphurizes desymmetrize desynchronize desynchronizes detach detaches detain detains detangle detangles detartrate detartrates detassel detassels detect detects deter deterge deteriorate deteriorates determine determines determinize determinizes deters detest detests detext dethatch dethatches dethaw dethaws dethrone dethrones detin detins detonate detonates detort detorts detoxifies detoxify detract detracts detraditionalise detraditionalize detraditionalizes detrain detrains detrend detrends detribalize detumesce detune detunes deubiquitinate deubiquitinates deubiquitylate deunionise deunionises deuterate devalorize devalorizes devaluate devaluates devalue devalues devastate devastates devein deveins develop developes develops deverbalise deverbalises deverbalize deverbalizes deviled devilize devilizes devitalize devitalizes devitrifies devitrify devive devives devoice devoices devolve devolves devote devotes devour devours dewater dewaters dewax dewet dewets dewikifies dewikify dewire dewires deworm deworms diabolizes diagnose diagonalise diagonalises diagonalize diagonalizes dialyse dialyze dialyzes diarise diarises diarize diarizes diazotise diazotises diazotize diazotizes dib dichotomise dichotomises dichotomize dichotomizes did didder diddles diecast diecasts dieselise dieselize differ differentiate differentiates differs diffract diffracts diffuses digitalise digitalises digitalize digitalizes digitise digitises digitize digitizes dignifies dignify digress digresses dilacerate dilacerates dilapidate dilapidates dilatates dilate dillydallies dillydally dilutes dimensionalise dimensionalises dimensionalize dimensionalizes dimerise dimerises dimerize dimerizes diminish diminishes dims dine dines diphthongise diphthongises diphthongize diphthongizes directs dirempt dirempts dirties disable disables disabuse disabuses disaccustom disacknowledge disacknowledges disaffect disaffects disaffiliate disaffiliates disaffirm disafforest disafforests disaggregates disagree disagrees disallow disallows disambiguate disambiguates disannex disannexes disannul disannuls disapparate disapparates disappear disappears disapply disappoint disappoints disappropriate disappropriates disapprove disapproves disarm disarms disarrange disarranges disarticulate disassemble disassembles disassociate disassociates disavail disavails disavow disavows disband disbands disbar disbars disbelieve disbelieves disbowel disbowels disbud disbuds disburden disburdens disburse disburses discern discerns discides disclaim disclaims disclose discloses disclude discludes discolor discolors discolour discolours discombobulate discombobulates discomfit discomfits discommend discommends discommode discommodes discompose discomposes disconcert disconcerts disconfirm disconfirms discontinue discontinues discountenance discountenances discounts discourage discourages discover discovers discredit discredits discretise discretises discretize discretizes discriminate discriminates discrown discrowns discuss discusses disdains disembark disembarks disembarrass disembodies disembody disembogue disembogues disembowel disembowels disembroil disembroils disemburden disemburdens disemploy disemploys disempower disempowers disemvowel disemvowels disenchant disenchants disencumber disencumbers disenfranchise disenfranchises disennoble disennobles disenrol disenroll disenrolls disenrols disentangle disentangles disenthral disenthrall disenthralls disenthrals disenthrone disenthrones disentitle disentomb disentombs disentrance disentrances disequalize disestablish disestablishes disesteem disesteems disfellowship disfellowshiped disfellowships disfigure disfigures disforest disfranchise disfranchises disfrock disfrocks disgorge disgorges disgruntle disgruntles disgusts dishabituate dishabituates disharmonize disharmonizes dishearten disheartens dishevel dishevels dishonorest dishonoreth dishonors dishonours disillusionise disillusionises disillusionize disillusionizes disimprove disincarcerates disincarnates disincentivise disincentivize disincline disinclines disincorporate disincorporates disinfect disinfects disinfest disinfests disinform disinforms disinherit disinherits disinhibit disinhibits disintegrate disintegrates disinter disinterests disintermediate disintermediates disinters disinthral disinthrals disinvent disinvest disinvests disinvite disinvites disjoin disjoins disjoints disleaf disleafs disleave disleaves dislimb dislimbs dislocate dislocates dislodge dislodges dismantle dismantles dismask dismasks dismast dismasts dismays dismember dismembers dismiss dismisses disneyfies disneyfy disobey disobeys disoblige disobliges disordain disorganise disorganises disorganize disorganizes disorient disorientate disorientates disorients disown disowns disparages disparks dispart dispel dispels dispends dispense dispenses dispeople dispeoples disperse disperses dispirit dispirits dispises displace displaces displant displants displease displeases displume displumes dispone disport disports dispose disposes dispossess dispossesses dispraise dispraises dispreads disprefer disproportionates disprove disproves disqualifies disqualify disquantities disquiets disrate disrates disrecommend disrecommends disregards disrelishes disremember disrespects disrobe disrobes disrupt disrupting disrupts dissatisfies dissatisfy dissave dissaves dissect dissects dissemble dissembles disseminate disseminates disserve disserves dissever dissevers dissimilate dissimilates dissimulate dissimulates dissipate dissipates dissociate dissociates dissonate dissonates disspirit disspirits dissuade dissuades distain distantiate distastes distempers distend distends disthronizes distil distill distills distils distinguish distinguishes distort distorts distract distracts distrain distrains distresses distribute distributes distrusts disturb disturbs disunifies disunify disunite disunites dither dithers divagate divaricate divaricates divellicate diverge diverges diversifies diversify divert diverts divest divests divides divines divinise divinize divisionalize divulge divulges diys diz dizzies dmca dobs dodders doesna doesnae doff doffs dogfought dogmatize dognap dogsit dogsits dolbyize doles domiciliate domiciliates dominates domineer domineers donate donates dook doomsaid doomsay doomsays doot dorkifies dorkify dorsiflex dosses doublecheck doublechecks doubletrack doubletracks douse douses dout douts dow dowdifies dowdify downcasts downclimb downclimbs downcycle downcycles downface downlist downlists downmodulate downplay downplays downpress downpresses downrate downrates downregulate downregulates downscales downselect downselects downshift downshifts downsize downsizes downstroy downstroys downvotes downzone downzones dows doxes draggle drait dramatise dramatises dramatize dramatizes drank drat drate drats dreamt dreap dreaps dreep drees drenches dret dreve drew drf drite drites drivels droops drown drownd drowns drowses drub drubs druv drycleaners drycleans dryfire dryfires drygulch drygulches dryte drytt drywalls dualise dualises dualize dualizes duckwalk duckwalks duffs dulcify dulls dumbfound dumbfounds dumbs dumbsize dumfound dumfounds dunches dunchin dunsh dunshes dunshin dup dutchifies dutchify dwells dwelt dwindle dwindles dwine dynamise dynamises dynamites dynamize dynamizes dysphemize dysphemizes dysregulate dysregulates ean earmarks earn earns earnt earths eases easternise easternises easternize easternizes eat ebay ebays ebonize ebonizes eccentricate eche eches echolocate echolocates echoplex eclecticise eclecticises eclose economise economises economize economizes ecycle ecycles edifies edify editionalise editionalises editorialise editorialises editorialize editorializes educamate educamates educate educates educationalize educationalizes educe educes edulcorate edulcorates edumacate edumacates edutain edutains eff efface effaces effectuate effectuates effeminates effervesce effervesces effloresce effloresces effs effulge effuses egest egests egosurf egosurfs egresses ejaculates ejects ekes elaborates elapse elapses elasticate elasticates elasticise elasticises elasticize elasticizes elates eld eldens electioneer electioneers electrifies electrify electrocauterize electrocauterizes electrocute electrocutes electrolyse electrolyses electrolyze electrolyzes electrophorese electroshocks elects elegise elegize elegizes elevate elevates elicit elicits elide elides eliminate eliminates elix ellipt eloign eloigns elongates elope elopes elucidate elucidates elucubrate elucubrates elude eludes elute elutes elutriate emaciate emaciates emanate emanates emancipates emasculates embalm embalms embank embanks embark embarks embarrass embarrasses embattle embattles embay embays embed embeds embellish embellishes embetter embezzle embezzles embiggen embiggens embillow embitter embitters emblaze emblazes emblazon emblazons emblematize emblematizes embloom emblossom embodies embody embogues embolden emboldens embosom embosoms emboss embosses embowel embower embowers embrangle embrangles embraves embrighten embrightens embrittle embrittles embroider embroiders embroil embroils embrothel embrown embrowns embrue embrues embugger embuggers embus embuss embusy emend emends emerge emerges emigrate emigrates emit emits emote emotes emotionalise emotionalises emotionalize emotionalizes empanel empanels empathise empathises empathize empathizes emphasise emphasises emphasize emphasizes emphasizing empierce empierces emplace emplaces emplane emplores employs empoisons empolder empoverishes empower empowers emprises empurple empurples emulate emulates emulsified emulsifies emulsify emvowel emvowels enable enables enact enacts enamor enamors enamour enamours enantioenrich enblow encage encages encamp encamps encapsulate encapsulates encapture encaptures encase encases encash encashes encave encaves enchain enchains enchant enchants enchase enchases enchasten enchastens encipher enciphers encircle encircles enclasp enclasps enclines enclose encloses enclothe encode encodes encoffin encoffins encolden encoldens encompass encompasses encourage encourages encreases encrimson encrimsons encroaches encrust encrusts encrypt encrypts enculturate enculturates encumber encumbers encunt encunts encyst encysts endamages endanger endangers endarken endarkens endarks endear endears endocytose endocytoses endogenise endogenises endogenize endogenizes endolour endorse endorses endow endue enduers endues endure endures energise energises energize energizes enervates enfasten enfastens enfeeble enfeebles enfeoff enfeoffs enfever enfevers enflame enflames enfold enfolds enforce enforces enfranchise enfranchises engage engages engaol engaols engender engenders engird engirdle engirdles engladden engladdens englobe engloom englooms englut engluts engolden engoldens engorge engorges engrafts engrain engrains engrave engravens engraves engreatens engrieves engross engrosses engulf engulfs enhalo enhalos enhance enhances enharden enhardens enhearten enheartens enisle enjail enjails enjoin enjoins enjoy enjoys enkindle enkindles enlace enlaces enlarge enlargen enlarges enleague enlengthen enlengthens enlessens enlighten enlightens enlist enlists enliven enlivens enlock enmesh enmeshes enmildens ennoble ennobles enounce enounces enplane enplanes enqueue enqueues enquicken enquickens enquire enrage enrages enrapture enraptures enravish enravishes enregister enregisters enrich enrichen enrichens enriches enridge enridges enrings enripens enrobe enrobes enrol enroll enrolls enrols enroot enroots ensanguine ensanguines enscale enscales ensconce ensconces enseals enseams ensepulcher ensepulchers ensheath ensheathe ensheathes enshields enshrine enshrines enshroud enshrouds ensile enskies ensky enslave enslaves ensmallen ensmallens ensnare ensnares ensnarl ensnarls ensonify ensorcel ensorcell ensorcells ensorcels ensoul ensouls enstraiten enstraitens enstrengthens ensue ensues ensure ensures enswathe enswathes ensweeten ensweetens entangle entangles entering enterprises enters entertain entertains enthral enthrall enthralls enthrals enthrone enthrones enthronise enthuse enthuses entice entices entitize entitizes entitle entitles entituled entomb entombs entrain entrains entrammel entrammels entrap entraps entrench entrenches entres entrust entrusts enturbulate enturbulates entwine entwines entwist enumerate enumerates enunciate enunciates enure enures envelop envelops envenom envenomate envenomates envenoms envigorate envigorates environ envisage envisages envision envisions enwheel enwiden enwidens enwisen enwisens enwomb enwrap enwraps enwreathe enwreathes enwrite enzone enzones epilate epilates epimerize epithelialize epitomise epitomises epitomize epitomizes eponymize epoxidize equalise equalises equalize equalizes equate equates equidistribute equidistributes equilibrate equilibrates equip equipoises equiponderate equiponderates equips equivalate equivalates equivalise equivocate equivocates eradicate eradicates erase erases erects erize erme erode erodes eroticise eroticises eroticize eroticizes erotise erotises erotize erotizes err errs ers eruct eructs erupt erupts escalate escalates eschew eschews espies espouse espouses espy essentialize essentializes establish establishes esteems esterifies esterify estheticise estheticises estheticize estheticizes estivate estivates estop estops estrange estranges etch etches eternize etherealise etherealises etherealize etherealizes etherifies etherify etherise etherises ethifies ethify ethylate ethylates etiolate etiolates etymologise etymologises etymologize etymologizes euhemerize euhemerizes eulogise eulogises eulogize eulogizes euphemise euphemises euphemize euphemizes euroize europeanize europeanized europeanizes euthanase euthanasiate euthanatise euthanatises euthanatize euthanatizes euthanaze euthanise euthanised euthanises euthanize euthanizes eutrophicate evacuate evacuates evade evades evaginate evaluate evaluates evanesce evanesces evangelise evangelises evangelize evangelizes evaporate evaporates eventifies eventify eventuate eventuates evert everts evict evicts evince evinces evirate evirates eviscerate eviscerates evite evocate evoke evokes evolve evolves exacerbate exacerbates exacts exaggerate exaggerates exalts examine examines exasperate exasperates excarnates excavate excavates excede excedes exceed exceeds excel excels excepts excite excites exclaim exclude excludes excogitate excoriate excoriates excrete excretes excruciate excruciates exculpate exculpates excur excuss execrate execrates execute executes exeleutherostomize exemplifies exemplify exenterate exenterates exert exerts exeunts exfoliate exfoliates exhalate exhale exhales exhilarate exhilarates exhort exhorts exhume exhumes exiles exist exists exoculate exoculates exocytose exonerate exonerates exorcise exorcises exorcize exorcizes exoticise exoticises exoticize exoticizes expand expands expatiate expatiates expect expectorate expectorates expects expediate expediates expedite expedites expel expels expend expends expertize expiate expiates expire expires explain explains explicate explicates explode explodes explore explores exponentiate exponentiates exports exposit exposits expostulate expostulates expound expounds exprobates exprobrate exprobrates expropriate expropriates expugns expulse expunge expunges expurgate expurgates exsanguinate exsanguinates exscind exscinds exsiccate exsiccates exsolve exsolves extemporise extemporises extemporize extemporizes extend extends extenuate extenuates exteriorize exteriorizes exterminate exterminates externalise externalises externalize externalizes extinguish extinguishes extirpate extirpates extol extoll extolls extols extort extorts extradite extrapolate extrapolates extravasates extricate extricates extrude extrudes extubate exude exudes exult exults exuviate exuviates fabricate fabricates facepalms facilitate facilitates facks factifies factify factionalise factionalize factionalizes factorise factorises factorize factorizes faff faffs fails fainaigue fainaigues fains fak falsifies falsify falters familiarise familiarises familiarize familiarizes famish famishes fanaticise fanaticises fanaticize fanaticizes fand fangles fankle fantasise fantasises fantasize fantasizes faps fark farks farnesylate farnesylates farsee farspeaks farspoke fasciate fasciates fascinate fascinates fashin fasten fastens fatten fattens faze fazes feague feagues feal feaze februate februates feceate fecundate fecundates federalise federalises federalize federalizes federates fedex fedexes feebles feign feigns felch felches felicitate felicitates fellate fellates fellowfeel felts femininize femininizes feminise feminises feminize feminizes fends fenowed fergit fermionize fertilise fertilises fertilize fertilizes fester festers festinates fetched fetches fetishise fetishises fetishize fetishizes feudalise feudalises feudalize feudalizes fianchettos fiberize fiberizes fibrillate fibrillated fibrillates fictionalise fictionalises fictionalize fictionalizes fictionise fictionises fictionize fiddlefart fiddlefarts fiddlefuck fidges fieldstrip fieldstrips filch filches filks filmize filmizes filtrates finagle finagles finalise finalises finalize finalizes financialise financialises find finds finesses finetune finetunes finick finna finnicise finnicises finnicize finnicizes fireform fireproofs firtle fishifies fishify fisk fistfought fixate fixates fiz fizzles flabagast flabagasts flabaghasts flabbergasters flabberghasts flabergasts flabrigast flabrigasts flacker flagellates flameproofs flanks flappergast flappergasts flatlines flatten flattens flatulate flatulates flaunt flaunts flavors flay flays fledge fledges flee fleeces fleech fleeches fleer fleers flees flehm flehms flense flenses fleshes flew fley fleys flicks flighten flinches flitter flitters flobbergrast flobbergrasts flobs floccinaucinihilipilificate floccinaucinihilipilificates flocculate flocculates flog flogs floodproofs flote flounces flounders flours flout flouts floxes flubs fluctuate fluctuates fluidifies fluidify fluidize fluidizes flummox flummoxes flunk flunks fluoresce fluoresces fluoridate fluoridates fluorinate fluorinates fluster flusters fluxes flypost flyposts flyte foams focalise focalises focalize focalizes focusses foils foins foists folden foliates foller follers follow follows foment foments fondle fondles fook fooks fooster footles foots forbad forbade forbar forbid forbids forbise forbite forbodes forbore forbroke forbuy forclose forcloses forcover forcut fordid fordoes fordrive forebode forebodes forebore forecall forecheck forechecks forechoose foreclose forecloses foreconceive foredeclare foredeem foredesign foredestine foredetermine foredid foredo foredoes foredooms forefeel forefend forefends foregather foregathers forego foregoes foregoing foreheard forehears forehew foreignise foreignize foreignizes forejudges foreknew foreknow foreknows forelay forelifts foreordain foreordains foreran forerun foresaw foresee foresees foreshadow foreshadows foreshame foreshorten foreshortens foreshow foreshown foreslack forespend forestall forestalls forestals foreswear foreswears foreswore foresworn foretake foretaught foreteach foretell foretells forethink forethinks forewarn forewarns forewaste foreweigh forewent forewish forfare forfend forfends forgather forgathers forgave forget forgets forgit forgive forgives forgo forgoes forgot forgrow forhale forhold forhow forirk forlat forlay forleet forlend forlese forleses forlet forlets forlie forlighten forlive forlore formalise formalises formalize formalizes formates formicate formicates formularise formularize formulate formulates formylate forncast fornicates fornim forpamper forpass forpine forsaid forsake forsakes forsay forsays forsee forset forshake forshame forshape forshorten forshrink forslack forslip forslow forslowth forslug forsook forspare forspeak forspend forsta forstand forswallow forswear forswears forswelt forswink forswore fortake fortatter fortax forthcome forthdraw forthglide forthgo forthink forthlead forthlook forthnim forthpass forthspeak fortifies fortify fortravel fortread forwake forwalk forwander forwaste forwean forwear forweary forwelk forwent forwither forwound forwrap foryield fossick fossicks fossilate fossilates fossilifies fossilify fossilise fossilize fossilizes fotch fought found founds frack fractalize fractalizes fractionalize fractionalizes fractionate fractionated fractionates frain frains fraise fraist frak frap fraternalise fraternalises fraternalize fraternalizes fraternise fraternises fraternize fraternizes fraughts frazzle frazzles freeball freefallen freefalls freefell freeload freeloads freep freeps freestyles freet freezeproofs freights frenches frenchifies frenchify frequents freshen freshens fress fresses fretten friggle frighten frightens frisks frizzes frizzle frizzles frore froshes frostbit frosts froths frots froust frousts frover froze fructifies fructify frush frushes frustrates ftps fub fuckest fucketh fuddles fuggedaboudit fuggedaboutit fugued fuhgeddaboud fulfil fulfill fulfills fulfils fulgurate fulgurates fulls fumigate fumigates funambulate funambulates functionalize functionalizes fundraise fundraises funeralize funeralizes fungate funs furbish furbishes furcates furl furls furnishes furthers fustigate fustigates futter futters futureproofs futurise futurises futurize futurizes futzes fuzzes fuzzifies fuzzify gabble gabbles gack gacks gafiate gafiates gaincope gaingive gainsaid gainsay gainsays gainstand gainstands gainstood gallicise gallicises gallicize gallicizes gallivant gallivants galls galumph galumphs galvanise galvanises galvanize galvanizes gamahauchs gan gangle gangles gangst gank ganks gannin gans gapes garbages garble garbles gart gasface gasifies gasify gastrulate gastrulates gasts gatecrash gatecrashes gatekeeps gatekept gaup gauppin gaups gavages gave gawks gawp gawps gazinta gazump gazumps gedges geg gelatinise gelatinises gelatinize gelatinizes geminates genderize genderizes generalise generalises generalize generalizes generate generates genericise genericises genericize genericizes genlocks gentles gentrifies gentrify genuflect genuflects geocode geocodes geologize geologizes geometrize geometrizes geotag geotags germanize germanizes germinate germinated germinates gestate gestates gesticulate gesticulates get gets gezumph ghettoise ghettoises ghettoize ghettoizes ghostwrite ghostwrites ghostwrote gibbers gibes gild gilds girlcott girlcotts girlifies girlify girn girns gittin give gives giving glaciate glaciates gladden gladdens gladhand glamorise glamorises glamorize glamorizes glark glarks glassify glean gleans glid glidden glides glistens glitters globalise globalises globalize globalizes globetrot glom glomps gloms glope gloppen glore glorifies glorify glottalise glottalises glottalize glottalizes glowers glows gluck gmail gmails gnash gnashes gnaw gnaws gnosticise gnosticises goaltend goaltends gobble gobbles goffer goffers goin golfs gongoozle gongoozles gonno goofs googlebomb googlebombs gorgonize gorgonizes gormandize gormandizes gospelize gothicise gothicises gothicize gothicizes gots gourmandise gourmandize gourmandizes gove govern governing governmentalize governmentalizes governs gowls grabble grabbles gradate gradates graffitis grafts grammaticalise grammaticalises grammaticalize grammaticalizes grangerise grangerises grangerize grangerizes grants granularise granularises granularize granularizes granulate granulates graphitize grasscycle graticulate gratifies gratify gratinate gratinates graunch graunches gravels gravitate gravitates greaseproofs greases greatens greenify greenlight greenlights greenlit greenwashes greet gregarize grep greps grew gride grides grimes grok groks groundfishes grouts grovel grovels grow growes grows groze grozes grues grypes guddle guffs guiles guilts gunges guttle guttles gutturalize guzzles gwine gyrates gzip gzips haad habilitate habilitates habituate habituates hadna hadnae hadronise hadronises hadronize haesitates haet haets hafta haggle haggles hagride hagrides hagrode hails hakes hales hallucinate hallucinates halogenate halogenates halve hamshackle handfasts handpick handpicked handpicks handsels handsomes handwaved handwaves handwrite handwrites handwrote hangs hanker hankers happen happens happifies happify happroach haptenization haptenize haptenizes harass harasses harbors hardcode harden hardens hardwire hardwires hark harken harkens harks harmonise harmonize harmonizes harrass harries harry harshen harshes hasten hastens hastes hauls havens havocs headbang headbangs headdesk headdesks headhunt headhunts headquarter heal heals hear heard hearken hearkens hears hearten heartens heatproofs heats hebraize hebraizes heckle heckles hector hectors hedgehop hedgehops heerd heeze hegemonise hegemonises hegemonize hegemonizes heighten heightens held helicopt heliski heliskis hellenise hellenises hellenize hellenizes hemorrhages henches henpeck henpecks heparinise heparinises heparinize heparinizes hepps herborize herborizes hermitize hermitizes herniate herniates heroised heroize heroizes herry hesitate hesitates heterodimerize heterodimerizes heterodynes heteronormalize heteronormalizes hew hews hez hibernate hibernates hibernicize hibernicizes hid hidate hierarchize hierarchizes hies higgles highlit hightail hightails hinders hires hirple hirples hispanicize hispanicizes historicize historicizes hitchhike hitchhikes hivernate hivernates hmm hmms hoarsen hoarsens hobday hobnobs hochnehmen hockles hocklin hocus hogtie hogties hoick hoicks hoid hoida hoise holds holla hollers hollywoodize hollywoodizes homeschools homodimerize homodimerizes homodynes homogenise homogenises homogenize homogenizes homologate homologates homologize homologizes homopolymerize homosexualise homosexualises homosexualize homosexualizes homotope homotopes hondel hoodwink hoodwinks hopscotches horizontalize horizontalizes hork horks hornifies hornify hornswoggle hornswoggles horrifies horrify horseplays horsetrade hospitalise hospitalises hospitalize hospitalizes hotpress hotpresses hotwire hotwires housebreak housebreaks housebroke houseclean housecleans housekeep housekeeps housekept housel housesat housesit housesits housetrain housetrains hove hoved hoven hover hovers hoyin humanifies humanify humanise humanises humanize humanized humanizes humbles humectates humidify humify humiliate humiliates humorise humorises humorize humorizes humors humourise humourises humourize humourizes hunchs hurkle hurls hurray hurrays hurtles hurts hushes hybridise hybridises hybridize hybridizes hydrocrack hydrocracks hydrodesulfurize hydrodesulfurizes hydroentangle hydrogenate hydrogenates hydrogenise hydrogenises hydrogenize hydrogenizes hydroisomerize hydroisomerizes hydrolyse hydrolyze hydrolyzes hydrotreat hydrotreats hydroxylate hydroxylates hyperacetylate hyperbolize hyperbolizes hypercompute hypercorrects hyperextend hyperextends hypermutate hypermutates hyperpolarise hyperpolarises hyperpolarize hyperpolarizes hyperregulate hyperregulates hypersexualise hypersexualises hypersexualize hypersexualizes hyperstimulate hyperstimulates hypertextualize hypertextualizes hyperventilate hyperventilates hyphenates hypnotise hypnotises hypnotize hypnotizes hypostatize hypothecate hypothecates hypothesise hypothesises hypothesize hypothesizes iconifies iconify iconize iconizes idealise idealises idealize idealizes ideate ideates identifies identify ideologise ideologises idles idolise idolises idolize idolizes igg iggies iggy ignite ignites ignore ignores illegalise illegalises illegalize illegalizes illtreat illtreats illude illumes illumine illumines illustrate illustrates imagine imbed imbeds imbibe imbibes imbitter imbosks imbosom imbosoms imbreathe imbreed imbrews imbricates imbrue imbrues imbrute imbue imbues imitate imitates immanentise immanentises immanentize immanentizes immerse immerses immesh immeshes immew immigrate immigrates immiserate immiserates immix immobilise immobilises immobilize immobilizes immolate immolates immortalise immortalises immortalize immortalizes immunise immunises immunize immunizes immunolabel immunolabels immunolocalize immunolocalizes immure immures impair impairs impale impales impanel impanels impark impart imparts impassion impawn impawns impeach impeaches impede impedes impel impels impend impends imperialize imperializes imperil imperilled imperils impermeabilize impersonalize impersonalizes impersonate impersonates impetrate impetrates impinge impinges impleach implead impleads implicate implicates implies implode implodes implore implores imploys imply impolder importune importunes impose imposes impound impounds impoverish impoverishes imprecate imprecates impregnate impregnates imprison imprisons impropriate impropriates improve improves improvise improvises impugn impugns impures impurifies impurify impurple impurples impute imputes inactivate inactivates inaugurate inaugurates inbind inbland inbreaks inbreathe inbreed inbreeds inburn incage incages incandesce incandesces incant incants incapacitate incapacitates incarcerate incarcerates incardinate incardinates incarn incarnadines incarnates incases incenses incent incentivise incentivises incentivize incentivizes incents incept incepts incinerate incinerates incise incises incite incites inclose incloses include includes incommode incommodes incoop incorporate incorporates incrassate incriminate incriminated incriminates incrust incrusts incubate incubates inculcate inculcates inculpates incur incurs incurve indagate indelve indemnifies indemnify independentize indevours indianise indianises indianize indianizes indicate indicates indicating indict indicts indigenize indigitates indites individualise individualises individualize individualizes individuate individuates indoctrinate indoctrinates indorse indorses induce induces induct inducts indue indues indulge indulges indurates industrialise industrialises industrialize industrializes indwell indwells inearth infantilise infantilises infantilize infantilizes infantize infantizes infatuate infatuates infect infects infefts infer infers infest infests infeudate infeudates infibulate infiltrate infiltrates infirms inflame inflames inflate inflates inflect inflects inflict inflicts infold infolds inforces inform informalize informalizes informs infract infringe infringes infulminate infuriate infuriates infuse infuses ingather ingeminates ingenders ingest ingests ingirts ingraft ingrafts ingrain ingrains ingratiate ingratiates ingrow ingulfs ingurgitate ingurgitates inhabit inhabits inhale inhales inheld inhere inheres inherit inherits inhibit inhibits inhold inhoop inhume inhumes init initialise initialised initialises initialize initialized initializes inits inject injects injunct injuncts injure injures inlarges inleague inlighten inlines inlive inlock inmesh inmew innates innerduce innerduces innervate innervates innoculate innovate innovates inoculate inoculates inorganize inorganizes inquinate inquire inquires inrages inregisters insconce inscribe inscribes insee inseminate inseminates insend insinuate insinuates insist insists insnare insnares insonate insonicate insonify insource inspan inspect inspects inspire inspires inspirit inspirits inspissate inspissates installs instanciate instanciates instantiate instantiates instate instates insteep instigate instigates instil instill instills instils institutionalise institutionalises institutionalize institutionalizes instop instrew instruct instrumentalise instrumentalises instrumentalize instrumentalizes insufflate insufflates insulate insulates insure insures integrate integrates intellectualise intellectualises intellectualize intellectualizes intend intends intenerate intensifies intensify inter interacts interbed interbeds interbreed interbreeds intercalate intercalates intercede intercedes intercoil intercoils intercommunicate intercommunicates intercompare intercompares interconnect interconnects interconvert interconverts intercorrelate intercorrelates interculturalize interculturalizes intercut intercuts interdigitate interdigitates interdine interdines interesses interesterifies interesterify interfere interferes interfile interfiles interfuse intergrade intergrades interiorize interiorizes interject interjects interknot interknots interlaces interlard interlards interlay interleafs interleave interleaves interlinks interlope interloped interlopes intermarries intermarry intermeddle intermeddles intermesh intermeshes intermingle intermingles intermit intermits internalise internalises internalize internalizes internationalise internationalises internationalize internationalizes interoffices interoperate interoperates interpel interpellate interpellates interpenetrate interpenetrates interplants interpolate interpolates interpolating interpose interposes interpret interprets interrail interreact interreacts interrelate interrelates interrogate interrogates inters intersect intersects intersperse intersperses intersubstitute intertwine intertwines intertwingle intertwingles intertwist intertwists intervene intervenes intervise intervises intervolve intervolves interweave interweaves interwork interwove intices intimidate intimidates intitle intitles intonate intonates intone intones intoxicate intoxicates intreasure intreasures intreat intreats intricates introduce introduces introgress introgresses introject introjects introspect introspects intrude intrudes intrust intrusts intubate intubates intuit intuits intumesce intwines inundate inundates inure inures inurn inurns invacuate invacuates invade invades invaginate invaginates invalidate invalidates inveigh inveighs inveigle inveigles inveil inveils invent inventorize inventorizes invents investigate investigates invests inveterates invigilate invigilates invigorate invigorates invoke invokes involve involves involving inwone inwrap inwreathe inwreathes inwrit inwrite iodinate iodinates iodise iodises iodize iodizes ionise ionises ionize ionizes iotize iotizes ipsatize ipsatizes ircs ires iridesce iridesces irk irks ironise ironises ironize ironizes irradiates irrigate irrigates irritate irritates irrumate irrumates irrupt irrupts islamize islamizes isomerise isomerize isomerizes isotropize italianise italianises italianize italianizes italicise italicises italicize italicizes itemise itemises itemize itemizes itinerate itinerates jabbers jackknifes jaculate jaculates jailbroke jalouse jalouses jamp jampack jampacks jangled jangles japanise japanize japanizes japans jark jarp jarps jasperize jasperizes jaunce jaundices jawblock jaywalk jaywalks jazzifies jazzify jee jees jeff jellifies jellify jeopard jeopardise jeopardises jeopardize jeopardizes jeopards jerrybuild jest jetwash jews jigget jiggles jills jits jizzes jobe jobes jodel jodels joggle joggles joists jooks joshes jounces journalize jousts joyrode jubilate jubilates judicialize judicializes jugulate jugulates jumboize jumboizes justifies justify justle justles juvenilize juxtapose juxtaposes kanoodle kanoodles kaolinise kaolinises kaolinize kaolinizes keak keelhaul keelhauls kent kept keratinize keratinizes kerblam kibbitz kibbitzes kibitz kibitzes kiboze kibozes kickban kickbans kidnaps kife kindle kitesurf kitesurfs kittles kleptoparasitize kleptoparasitizes kline kludged knaa knaps knaw knaws knawvshawl knawvshawls knead kneads kneel kneels knelt knew knit knits knobbed knows konk kosherize kosherizes koshers krige kumbayah kvell kvells kyanise kyanize labefies labialize lacerate lacerates lade lades ladyfies ladyfy laevigates laicise laicises laicize laicizes laid lallygags lambast lambaste lambastes lambasts laminarize lampworks lanches lancinate lancinated lancinates languish languishes lankens lanks lants lapidate lapidates lards larks larn larnin larns larnt larrups lase lases lateralize lateralizes lathers latinise latinises latinize latinizes lavishes layn lazarus lazaruses laze lazed lazes leans leant leapt learn learns leases leaving leches legalise legalises legalize legalizes legislate legislates legitimates legitimatize legitimatizes legitimise legitimises legitimize legitimizes leint leints lemmatise lemmatises lemmatize lemmatizes lemme lemonize lemonizes lend lends lengthen lengthens lenite lenites lent lesbianize lesbianizes lessen lessens lettest leverages levigate levitate levitates lex lexes lexicalise lexicalises lexicalize lexicalizes liaise liaises liberalise liberalises liberalize liberalizes liberate liberates librate lifelog lig ligate ligates lighten lightens lignify likee liken likens limehouse limn limns linearise linearize linearizes linger lingers linish linishes linkifies linkify lionise lionises lionize lionizes liposuck liposucks lippen lipread lipreads lipsynch liquefies liquefy liquidate liquidates liquidise liquidises liquidize liquidizes liquifies liquify listen listens literalize literalizes lithifies lithify litigate litigates lits liven livens lixiviate lixiviates ljbf loathe loathes lobotomize lobotomizes localise localises localize localizes locate locates lockpicked locomote locomotes logarithmize logroll loiter loiters lojbanize lojbanizes lol loll lollop lollops lolls lollygags lols londonize looky loosen loosens looses loots loppers lose loses louk loun lour lowercasifies lowercasify lowers loyalize loyalizes lubes lubricate lubricates lucks lucubrate lucubrates lumbers luminesce luminesces lurks lusts luteinize luteinizes luvd luxate luxates luxuriate luxuriates lynch lynches lyophilise lyophilises lyophilize lyophilizes lyse lyses maa mabble macadamize macadamizes macarize macarizes macgyver macgyvers machicolate machicolates machinate machinates macromanage macromanages mactate mactates maculates madden maddens made madefies madefy maderize maderizes mads maffick mafficks maffle magics magnetify magnetise magnetises magnetize magnetizes magnificate magnifies magnify mahoganize mahoganizes maim maims mainlines mainstreams maintain maintains majestifies majestify mak make makes maks malax malaxate malaxates malaxes maledicts maligns malinger malingers malinvest malinvests malleate maltreat maltreats malveuille malveuilles mamaguy mamaguys mammer mammonize manages manhandle manhandles manipulate manipulates manualize manualizes manumises manumit manumits manures manuscribes maraud marauds marbelize marbelizes marbleize marbleizes mard mards marginalise marginalises marginalize marginalizes marinate marinates marketise marketises marketize marketizes marls marmalise marmalises marmalize marmalizes marries marry mars martemper martempers martialize martializes martinize martyrize masculinise masculinises masculinize masculinizes mase mashes massifies massify masticate masticates mastuprate masturbate masturbates matchmade matchmake matchmakes materialise materialises materialize materializes maternalise maternalises maternalize maternalizes mathematicise mathematicises mathematicize mathematicizes mathematise mathematises mathematize mathematizes matriculate matriculates mattify maturate maturates matures maunder maunders maxes maximalize maximalizes maximise maximises maximize maximizes mayest mayst mcdonaldize mcdonaldizes meaning meant mechanise mechanised mechanises mechanize mechanizes meddle meddles mediates mediatise mediatises mediatize mediatizes medicalise medicalises medicalize medicalizes medicate medicates medievalize meditate meditates mediterraneanise mediterraneanises mediterraneanize mediterraneanizes meeken meekens meeks meep mekin melds meliorate meliorates mell mellify mellows mells melodise melodises melodize melodizes melodramatise melodramatises melodramatize melodramatizes melts memoise memoises memoize memoizes memorialise memorialises memorialize memorializes memorise memorises memorize memorizes mendelize meng menstruate menstruates mensurate mensurates mentalize mentalizes mentioning mentions mercerise mercerises mercerize mercerized mercerizes merchandises merchandizes mesmerise mesmerised mesmerises mesmerize mesmerizes metabolise metabolises metabolize metabolizes metalise metalises metalize metalizes metallicize metallise metallises metallize metallizes metamorphize metamorphizes metamorphose metamorphosise metamorphosises metamorphosize metamorphosizes metaphorise metaphorize metastasise metastasises metastasize metastasizes metastisizes metathesize metathesizes methodize metricate metricates metricize metricizes mewl mewls microchunk microchunks microencapsulate microencapsulates microfabricate microfabricates microinject microinjects micromanage micromanages microminiaturize microminiaturizes micronise micronises micronize micronizes microprogrammed microsoftifies microsoftify microtitrate micturate micturates midwifes mighta migrate migrates milden mildens mildews militarise militarises militarize militarizes militate militates militation militations millesimate mindwipes mineralize mineralizes mingle mingles mings miniaturise miniaturises miniaturize miniaturizes minifies minify minimalise minimalize minimise minimises minimize minimizes minishes minoritise minoritises minoritize minoritizes minse miranda mirandas mirandize mirandizes mires mirv misaddress misaddresses misadvise misadvises misaim misaims misalign misaligns misallocate misallocates misally misanalyze misanalyzes misapplies misapply misapprehend misapprehends misappropriate misappropriates misassociate misassociates misattribute misattributes misbecame misbecome misbecomes misbefall misbefallen misbefalls misbefell misbehave misbehaves misbelieve misbelieves misbind misbinds misbound misbrand misbrands miscalculate miscalculates miscalibrate miscalibrates miscall miscalls miscapitalise miscapitalises miscapitalize miscapitalizes miscarries miscarry miscasts miscategorise miscategorises miscategorize miscategorizes miscegenate miscegenates mischaracterise mischaracterises mischaracterize mischaracterizes mischarge mischarges mischieve misclassifies misclassify miscommunicate miscommunicates miscomprehend miscomprehends misconceive misconceives misconfigure misconfigures misconstrue misconstrues miscorrect miscorrects miscount miscounts miscreate miscreates miscued misdates misdealt misdeem misdeems misdescribe misdescribes misdiagnose misdial misdials misdid misdirect misdirects misdo misdoes misdoom misdoubt misdoubts miseducate miseducates misemploy misemploys misencode misencodes misevaluate misevaluates misexpress misexpresses misfeed misfeeds misfile misfiled misfiles misfold misfolds misformat misformats misfunction misfunctions misgauge misgauges misgave misgive misgives misgo misgoes misgovern misgoverned misgoverns misgrade misgrades misguess misguesses misguide misguides mishandle mishandled mishandles mishappen mishear misheard mishears misidentifies misidentify misimplement misimplements misinform misinforms misinterpret misinterprets misjudge misjudges miskeep miskeeps misken miskey mislabel mislabels mislaid mislay mislays mislead misleads mislike mislikes mislink mislinks mislocalize mislocalizes mislocate mislocates mismanage mismanaged mismanages mismap mismaps mismark mismarks mismeasure mismeasures misname misnamed misnames misogynise misoperate misoperates mispaint mispaints mispair mispairs misparaphrase misparaphrases misparses misperceive misperceives misphrase misphrases misplace misplaces misplay misplayed misplays misportray misportrays mispredict mispredicts misprescribe misprescribes misprice misprices misprise misprize misprizes misprocess misprocesses misproduces mispronounce mispronounces misquote misquoted misquotes misread misreads misreckon misreckons misrecognize misrecognizes misrecollect misrecollects misremember misremembers misreport misreported misreports misrepresent misrepresents misroute misroutes missaw missee missees missend missends missent misshape misshaped misshapes misshelve misshelves missionise missionises missionize missionizes missold missound missounds misspeak misspeaks misspell misspells misspelt misspend misspends misspoke misspoken misstate misstated misstates missteps mistag mistags mistaught misteach misteaches misthrew mistifies mistify mistime mistimes mistitle mistitles mistold mistook mistranscribe mistranscribes mistranslate mistranslated mistranslates mistransliterate mistransliterates mistreat mistreats mistrusts mistype mistyped mistypes misunderestimate misunderestimates misunderstand misunderstands misunderstood misvalue misvalues misvote miswant miswants miswent misword miswords miswrite miswrites miswrote mitch mitches miters mithridatize mitigate mitigates mizzles mobilise mobilises mobilize mobilizes moble mobles modalise modalises modernise modernises modernize modernizes modifies modify modularise modularises modularize modularizes modulate modulates mohammedanize moider moiders moisten moistens moistureproofs moisturise moisturises moisturize moisturizes moither moithers molest molests mollifies mollify monarchize monarchizes mondayize monetise monetises monetize monetizes mongrelise mongrelises mongrelize mongrelizes monochromatize monochromatizes monodisperses monologise monologises monologize monologizes monomerize monophthongise monophthongises monophthongize monophthongizes monopolise monopolises monopolize monopolizes monospaces monoubiquitinate monoubiquitylate monoubiquitylates monumentalize monumentalizes mooches moodle moodles moonlights mopes mopies moralise moralises moralize moralized moralizes morcellate morcels mormonise mormonises mormonize mormonizes mortifies mortify mosey moseys mosh moshes mosies moslemise moslemize mosy mothproofs motivate motivates motorise motorises motorize motorizes mottles mought moulders moults mourns moves mrb muckle muckles muckrake muckraked muckrakes mucks muddies mudpuddle muggled muleses multiplies multipost multiposts multitask multitasks mummifies mummify mump mun munge munges municipalize murks murl muscularize muscularizes musicalise musicalises musicalize musicalizes muslimise muslimize muslimizes musses mussitate mussitates mutagenize mutate mutates mutilate mutilates mutualise mutualises mutualize mutualizes myek myekin myeks myelinates mysticise mysticises mysticize mysticizes mystifies mystify myther mythicize mythicizes mythologise mythologises mythologize mythologizes naa naai nab nabbed nabs nack nacks nake namecheck namechecks namedrop namedrops nanofabricate nantle napalms narcoticize narcoticizes narcotise narcotize narcotizes narrate narrates narrativise narrativises narrativize narrativizes nasalise nasalised nasalises nasalize nasalizes nationalise nationalises nationalize nationalizes naturalise naturalises naturalize naturalizes nauseate nauseates navigate naysay nazifies nazify nears neaten neatens nebulise nebulises nebulize nebulizes necessitate necessitates necropost necroposts necrose necrotise necrotises necrotize necrotizes neg negate negates negativize negativizes neglects negotiate negotiates negs nemmine neologise neologize neologizes neoterise neoterize nephrectomize nerf nerfs nestle nestles neutralise neutralises neutralize neutralizes newcreate newgroup newgroups newmodel nicen nicens nickers nictate nictates nictitate nictitates nidificate nidificates nidify nifong nifongs niggerize niggerizes nihilate nihilates nill nipponize nipponizes nitpick nitpicks nitrify nitrogenate nitrogenates nitrogenise nitrogenize nitrosate nitrosylate nitrosylates nixes nobble nobbles nocks nods nodulate nodulates nominalize nominalizes nominate nominates nonpluses nonplusses nonsensify normalise normalises normalize normalizes nostalgize nostalgizes nostrificate nostrificates nostrifies nostrify nota notarise notarises notarize notarizes notate notates noticing notifies notify noting nourish novate novates novelise novelises novelize novelizes nuclearise nuclearises nuclearize nuclearizes nudges nullifies nullify numbs numerates numericize numericizes nuncupate nursle nutate nutshot nutshots nuzzle nuzzles nymshift obambulate obelise obelize obelizes obey obeys obfuscate obfuscates objectifies objectify objectivize objurgate objurgates obligates oblige obliges obliterate obliterates obliviate obliviates obrogate obrogates obscures obsecrate obsecrates observe observes obsess obsesses obsolesce obsolesces obsoletes obstipate obstruct obstructs obtain obtains obtest obtests obtrude obtrudes obtund obtunds obvert obviate obviates occasionate occasionates occlude occludes occults occupies occupy occur occurring occurs ocr octaviate odorise odorises odorize odorizes oestruate oestruates offbear offcap offend offends offhold officialise officialize officializes officiate officiates offs offsaddle offshores offstood oldens oligomerize oligomerizes omit omits onforward onomatopoeias onpass onsell onsells onsend onsold ooh oohs oompahs opacifies opacify opalise opalises opalize opalizes opaques operate operates operationalise operationalises operationalize operationalizes opes opine opines opinionate opinionates opinionize opinionizes oppilate oppilates oppose opposes oppress oppresses oppugn oppugns opsonise opsonises opsonize opsonizes opt optimise optimised optimises optimize optimizes opts orate orates orchestrate orchestrates ordain ordains organise organises organize organizes orient orientate orientates orients originate originates ork orthonormalize orthorectifies orthorectify oscillate oscillates osculate osculates osmoregulate osmoregulates osmose osseointegrate osseointegrates ossifies ossify ostracise ostracises ostracize ostracizes ouse ouses oust ousts outact outargue outask outate outbalance outbalances outbattle outbattles outbear outbid outbids outboast outboasts outbought outboxed outboxes outbrave outbreathe outbreed outbreeds outbuild outbuilds outbuilt outburn outburp outbuy outbuys outcampaign outcheer outclass outclasses outclimb outclimbs outcoach outcoaches outcompete outcompetes outcouple outcreep outdance outdances outdare outdares outdates outdazzle outdazzles outdid outdistance outdistances outdo outdoes outdrank outdraw outdraws outdress outdresses outdrew outdrink outdrive outdrives outdrove outduel outduels outdwell outearn outearns outeat outeaten outeats outens outexecute outexecutes outface outfaces outfart outfence outfences outfight outfights outfinesse outfinesses outfires outfish outflank outflanks outflew outflies outfly outfool outfools outfought outfox outfoxes outfrown outfrowns outfuck outgain outgains outgallop outgallops outgas outgases outgeneral outgenerals outglow outglows outgoes outgone outgreen outgreens outgrew outgross outgrosses outgrow outgrows outguess outguesses outgun outguns outhandle outhandles outheld outhit outhits outhold outholds outhustle outhustles outjest outjests outjump outjumps outken outkick outkicks outlaid outlast outlasts outlaugh outlaughs outlays outlead outleads outleaps outleapt outlick outlie outlies outlift outlitigate outlitigates outlive outlives outman outmanage outmanages outmaneuver outmaneuvers outmanoeuvre outmanoeuvres outmans outmatch outmatches outmeasure outmuscle outmuscles outnice outnim outnumber outnumbers outorganize outorganizes outpace outpaces outpass outpasses outperform outperforms outpiss outpitch outpitches outplace outplaces outplay outplays outpoint outpoints outpoll outpolls outpray outproduce outproduces outpsych outpunch outpunches outputt outputts outrace outraces outraise outraises outran outrange outranges outrank outranks outrate outrates outreachs outrebound outrebounds outreport outrights outrival outrivals outroar outroars outrode outrun outruns outrush outrushes outsail outsails outsang outsave outsaves outscold outscolds outscore outscored outscores outscorn outseek outsell outsells outserve outserves outshine outshines outshone outshoot outshoots outshop outshot outshout outshouts outsings outskate outskates outskip outsleep outsleeps outslept outslug outslugs outsmart outsmarts outsold outsound outsounds outsource outsources outspeak outspeaks outspeed outspell outspells outspend outspends outspent outspin outspoke outsprang outsprings outsprint outsprints outsprung outstable outstables outstand outstare outstares outstay outstays outstep outstrategize outstretch outstretches outstrip outstrips outswear outswears outswore outtalk outtalks outthink outthinks outthought outtrade outtrades outvalue outvie outvies outvote outvotes outwait outwaits outwalk outwalks outwatch outwear outwears outweep outweeps outweigh outweighs outwent outwept outwinter outwinters outwit outwits outwoo outwore outwrest outwrestle outwrestles outwrite outwrites outwrote outyell outyells ovariectomize ovariectomizes overaccommodate overaccommodates overachieve overachieves overact overacts overadvertise overadvertises overamplifies overamplify overanalyse overanalyses overanalyze overanalyzes overanesthetize overapplies overapply overapproximate overapproximates overarch overarched overarches overate overattribute overattributes overawe overawes overbake overbakes overbalance overbalances overbear overbears overbeat overbeats overbide overbids overbill overbills overbind overbinds overblew overblow overblows overboil overboils overbook overbooks overborne overborrow overborrows overbrand overbreed overbreeds overbrowse overbrowses overbubble overbubbles overbuild overbuilds overbuy overbuys overcalculate overcalculates overcame overcanopies overcanopy overcapitalize overcapitalizes overcark overcarve overcategorize overcategorizes overcharge overcharged overcharges overchill overchoreograph overclean overcleans overclock overclocks overcloud overclouds overcoach overcoaches overcoddle overcoddles overcollateralize overcollateralizes overcome overcomes overcommercialize overcommercializes overcommits overcompensate overcompensates overcomplicate overcomplicates overconstrain overconsume overconsumes overcontrol overcontrols overcook overcooks overcorrect overcorrects overcount overcounts overcover overcovers overcriticize overcriticizes overcrop overcrops overcrowd overcrowds overdamp overdamps overdecorate overdecorates overdesigns overdetermine overdetermines overdevelop overdevelops overdiagnose overdiagnoses overdid overdilute overdilutes overdo overdoes overdramatise overdramatises overdramatize overdramatizes overdrank overdraws overdreep overdress overdresses overdrew overdribble overdribbles overdrink overdrinks overdrunk overdye overdyes overeat overeats overegg overeggs overembellish overembellishes overemote overemotes overemphasise overemphasises overemphasize overemphasizes overengineer overengineers overenjoy overenjoys overequip overestimate overestimates overexaggerate overexaggerates overexcite overexcites overexercise overexercises overexert overexerts overexpand overexplain overexplains overexploit overexploits overexpose overexposes overexpress overexpresses overextend overextends overeye overfallen overfeed overfeeds overfell overfertilize overfills overfinance overfinances overfish overfishes overfit overflew overflies overfly overfuck overfulfil overfulfill overfund overfunds overgang overgeneralize overgeneralizes overgenerate overget overgild overgive overgoes overgraze overgrazes overgrew overgroom overgrooms overgrow overgrows overhandle overhandles overharvest overharvests overhear overheard overhears overheat overheats overheave overheld overheles overhend overhip overhire overhires overhit overhits overhung overhype overhypes overidealize overidealizes overidentifies overidentify overindulge overindulges overinflate overinflates overinsure overinsures overintellectualise overintellectualises overintellectualize overintellectualizes overinterpret overinvest overinvests overjoy overjoys overjustifies overjustify overkills overlaid overleap overleaps overleapt overlearn overlearns overlearnt overlegislate overlegislates overleverages overlie overlies overlight overlights overlined overlit overlive overlives overlook overlooks overlubricate overlubricates overmanipulate overmanipulates overmans overmarket overmarkets overmast overmaster overmasters overmasts overmedicalize overmedicalizes overmedicate overmedicates overmike overmilitarizes overmilk overmilks overmix overmixes overmodulate overmodulates overpack overpackage overpackages overpacks overpaid overpaint overpaints overparameterize overparameterizes overpay overpays overpedal overpedals overperform overperforms overpersuade overpersuades overpitch overpitches overplay overplays overplough overploughs overplow overplows overpluck overplucks overpopulate overpopulates overpour overpours overpower overpowers overpraise overpraises overpredict overpredicts overprepare overprepares overprescribe overprescribes overpressurize overpressurizes overprice overprices overprime overprocess overprocesses overproduce overproduces overpromise overpromises overpronate overpronates overproportion overproportions overprotect overprotects overpsychologize overpsychologizes overpunch overpunches overpursue overpursues overquantify overran overrate overrates overreact overreacts overread overreads overrefine overrefines overregulate overregulates overreport overreports overrepresent overrepresents overrestore overripen overripens overroast overroasts overrode overromanticize overromanticizes overrule overrules overruns oversalt oversalts oversang oversaturate oversaturates oversauce oversauces oversaw overschedule overschedules overscreen overscreens overseason overseasons oversedate oversedates oversee overseed overseeds oversees oversell oversells oversend overserve overserves overservice overservices overset oversets oversew oversexualize oversexualizes overshade overshadow overshadows overshare overshares overshoots overshop overshops overshorten overshortens oversimplifies oversimplify oversings overskate overskates oversleep oversleeps overslept oversoften oversoftens overspecialise overspecialises overspecialize overspecializes overspecifies overspecify overspend overspends overspent overspread overspreads oversprinkle overstaff overstaffs overstate overstates overstay overstays overstep oversteps overstimulate overstimulates overstrain overstrains overstress overstresses overstretch overstretches overstride overstrides overstrode overstudy overstuff overstuffs oversubscribe oversubscribes oversung oversway oversweeten oversweetens overswung oversystematise oversystematises oversystematize oversystematizes overtake overtakes overtan overtans overtask overtasks overtaught overtax overtaxes overteach overteaches overtest overtests overtheorize overtheorizes overthink overthinks overthought overthrew overtip overtips overtire overtires overtook overtop overtops overtout overtouts overtrain overtrains overtreat overtreats overtrump overtrumps overturn overturns overtwist overtypes overuses overutilize overutilizes overvalue overvalues overwash overwashes overwatches overwaters overwears overweights overwent overwet overwets overwhelm overwhelms overwhip overwind overwinds overwinter overwinters overworks overwrite overwrites overwrote oviposit oviposits ovulate ovulates owe owes owns oxidise oxidises oxidize oxidizes oxygenate oxygenates oxygenise oxygenises oxygenize oxygenizes ozonise ozonises ozonize ozonizes pabble paceth pacifies pacify packetize packetizes packup packups paganise paganises paganize paganizes paginate paginates paid palatalise palatalises palatalize palatalizes palavers palettise palettize palettizes palletise palletises palletize palletizes palliate palliates palmitoylate palmitoylates palpates palpitate palpitates palter palters pamper pampers pandiculate pandiculates panegyrise panegyrises panegyrize panegyrizes pantheonise pantheonises pantheonize pantheonizes pantses paraglide paraglides paralleled parallelize parallelizes paralyse paralyze paralyzes parameterise parameterises parameterize parameterizes parametrise parametrises parametrize parametrizes parasitise parasitises parasitize parasitizes parbake parbakes parboil parboils parcellate parcellates parch parches pare parenthesise parenthesises parenthesize parenthesizes pares parleyvoos parquets parses partake partakes participate participates particularise particularises particularize particularizes partook passivate passivates passivise passivises passivize passivizes pasteurise pasteurize pasteurizes paternalise paternalises paternalize paternalizes pathologise pathologises pathologize pathologizes patinates patine patines patriate patriates patronise patronises patronize patronizes paunchs pauperise pauperises pauperize pauperizes paves pavilions pays peacifies peacify peculate peculates peddle peddles pedestrianise pedestrianised pedestrianises pedestrianize pedestrianizes pedgill pedgills peek peeks peercast pegylate pegylates pejorate pelletize pelletizes pelts penalise penalises penalize penalizes pends penectomize penetrate penetrates peninsulate peninsulates perambulate perambulates perceive perceives perceptualize perceptualizes perchlorinate perchlorinates percuss percusses perdeuterate perdure peregrinates perempt perempts perendinate perennate perennialize perennializes perfects perflate perflates perforates perform performs perfuse perfuses periclitates perish perishes perjure perjures perlustrate perlustrates permanentize permanentizes permeabilize permeabilizes permeablise permeablises permeate permeates permutate permute permutes perorate perorates peroxidise peroxidises peroxidize peroxidizes perpetrate perpetrates perpetuate perpetuates perplex perplexes perscopates persecute persecutes perservere perseverate perseverates persevere perseveres persist persists personalise personalises personalize personalizes personate personates personifies personify perspire perspires perstringe persuade persuades pertain pertains perturb perturbate perturbates perturbs peruses pervade pervades pervaporate pervaporates pester pesters petrifies petrify petsit pettifog pettifogs pfaff pfaffs phagocytise phagocytises phagocytize phagocytizes phagocytose phantasize phantasizes pharyngealize pharyngealizes philosophate philosophates philosophise philosophises philosophize philosophized philosophizes phlebotomize phlegmatize phlegmatizes phonemicize phonemicizes phonologize phosphatize phosphatizes phosphorate phosphoresce phosphoresces phosphorise phosphorize phosphorizes phosphorylate phosphorylates phot photobleach photocleave photocleaves photocompose photocomposes photoconvert photoconverts photodisintegrate photodissociate photodissociates photodope photoengrave photoengraves photoexcite photoexcites photoinject photoionize photoionizes photoisomerize photoisomerizes photoluminesce photolyse photolyze photosensitise photosensitises photosensitize photosensitizes photoshop photoshops photostabilize photosynthesise photosynthesises photosynthesize photosynthesizes phots phrensied phrensies physicalize physicalizes piecen pieface pierce pierces piffles pigged piggybacks pigmentate pigmentates pilfer pilfers pillages pillarize pinocytose pinocytoses pipelay pisses pitchpole pitchpoles piths pities pittles pixelate pixelates pixellate pixellates placate placates placifies placify plagiarise plagiarises plagiarize plagiarizes planarize planarizes planish planished planishes plantarflex plantarflexes plapper plappers plashed plashes plasmolyse plasticise plasticises plasticize plasticizes plateaus platinise platinises platinize platinizes platted playact playacts playfought plays playtest playtests pleach plead pleads pleases plenish plenishes plims plodge plodges plodgin plods ploidize plotz plotzes ploughs plounce plounces plucks plumps plunders plunges plunk plunks pluralise pluralises pluralize pluralizes pluto plutos pmses poach poaches podzolize podzolizes poeticise poeticises poeticize poeticizes poetize poetizes pointing poises polari polarise polarises polarize polarizes polemicize polemicizes polices politicise politicised politicises politicize politicizes politick pollenize pollenizes pollicates pollinates pollutes polonise polonises polonize polonizes polycondense polycondenses polygamise polygamises polygamize polygamizes polygonize polygonizes polymerise polymerises polymerize polymerizes polyubiquitinate polyubiquitinates polyubiquitinylate polyubiquitinylates polyubiquitylate polyubiquitylates ponced ponder ponders pontifies pontify poopoo poopoos poormouth poormouths popularise popularises popularize popularizes populate populates porks porrects portend portends portray portrays possess possesses postdate postdates posterise posterises posterize posterizes postmodernise postmodernises postmodernize postmodernizes postmodify postpone postpones postpose potch potchky pote potentialize potentiate potentiates pounces pours powerbock powerbocks practise practises praecedes praedicts praefers praepares praescribes praescribeth praesenteth praesumes praetends pratfallen pratfell prattles praught praunces prays preach preaches preachify preallocate preambulate preambulates preannounce preannounces preapprove preapproves prearrange prearranges preassemble preassembles preassociate preassociates prebakes prebatch preboard preboards prebook prebooks prebought prebuffer prebuffers prebuild prebuilds prebuy prebuys precache precaches precalculate precalculates precede precedes precertifies precertify precess precesses prechew prechews precises preclude precludes precoat precompile precompiles precompress precompresses precompute precomputes preconceive preconceives preconfigure preconfigures preconize precook precooks precool precools precounsel precurse precurses precut precuts precycle precycles predefine predefines predesignate predesignates predestine predestines predetermine predetermines predict predicts predigest predigests predispose predisposes predominates predoom predoses preempt preempts preen preens preexist preexists prefabricate prefabricates prefer prefers prefetch prefetches prefigure prefigures prefill prefork preforks preformat preformats pregelatinize pregelatinizes pregrease pregreases pregrill pregrind pregrinds preharden prehardens preheat preheats prehydrate prehydrates preinstall preinstalls preionize prejudge prejudges prelight prelights prelit preload preloads preludes premade premake premakes premaster premeditate premeditates premodify premultiply prenasalize prenasalizes prenominate prentices preoccupies preoccupy preoptimize preoptimizes preordain preordains prepackage prepackages prepaint prepaints prepare prepares preparse preparses prepay prepays prepend prepends prepenses preplan preponderate prepone prepones prepopulate prepopulates prepose preposes prepossess prepossesses preprepare preprocess preprocesses preprogram preprograms preprovide prequalifies prerecord prerecords preregister preregisters prerender prerenders prerequire preresolve prescan prescans preschedule preschedules prescind prescore prescores prescreen prescreens prescribe prescribes preselect preselects presell presells presets preshows preshrank preshrink preshrinks preside presides presift presold presort presorts presses pressurise pressurises pressurize pressurizes prestidigitate prestidigitates prestress prestresses prestretch presume presumes presuppose presupposes pretape pretapes pretend pretends pretermit pretermits pretreat pretreats prettifies prettify prevail prevails prevalidate prevalidates prevaricate prevaricates prevent prevents previse preweight preweights prewire prewrites prewrote preys pries primp primps prinks prioritise prioritises prioritize prioritizes prise privatise privatised privatises privatize privatizes proact proacts problematize problematizes proceed proclaim proclaims procrastinate procrastinates procreate procreates procure procures produces productize productizes profanes profer profers profess professes professionalise professionalises professionalize professionalizes profounds prognosticate prognosticates programed progresses prohibit prohibits proletarianise proletarianize proliferate proliferates prolong prolongate prolongs promogulate promogulates promote promotes promulgate promulgates pronate pronates pronks pronounce pronounces pronounciate proofread proofreads proove prooves propagandize propagandizes propagate propagates propel propels propend prophecise prophecises prophecize prophecizes prophesies prophesize prophesizes prophesy prophetize prophetizes propitiate propitiates propone proport proportionates propose proposes propound propounds prorate prorates prorogue prorogues proscribe proscribes prosecute prosecutes proselytise proselytises proselytize proselytizes prosper prospers prostrates protect protects proteolyze proteolyzes protists protocolize protocolizes protonate protonates protract protracts protrude protrudes protuberate prove proves provide provides provincialise provincialises provincialize provincializes provoke provokes prowl prowls psych psychoanalyse psychoanalyses psychoanalyze psychoanalyzes psychologize psychologizes psychs ptyalize publicate publicise publicises publicize publicizes publish publishes publishing puffs puggles pulchrifies pulchrify pullulate pullulates pulsate pulsates pultrude pulverise pulverises pulverize pulverizes pumices pummel pummels pumpjacks punctuate punctuates punctulates pungle pungles punish punishes pupate pupates pupu purifies purify purloin purloins purports pursue pursues purvey purveys pussifies pussify pussyfoot pussyfoots pussywhip pussywhips putrefies putrefy putrifies putrify puts pwnd pwns pwnt pyramidalize pyritize pyrolyse pyrolysize pyrolyze pyrolyzes pyrosequence pyrosequences pythagorize pythagorizes quackle quadfurcate quadrates quadrisect quadrisects quadruples quaestions qualifies qualify quantifies quantify quantise quantises quantitate quantitates quantize quantizes quartersaw quartersaws quash quashes quat quave queem quenches quetch quethes quickens quicksilvers quicksteps quiddle quiddles quiesce quiesces quieten quietens quininizes quisle quit quitclaims quob quobs quonks quop quopped quops rabbitts racemize racemizes racewalk racewalks racialise racialises racialize racializes radars radgin radiates radicalise radicalises radicalize radicalizes radioactivate radioactivates radiosensitise radiosensitize ragequit ragequits raim rainproofs raises ralph ralphs rame ramifies ramify rampages ran rancidifies rancidify randomise randomises randomize randomizes rang ranging rankle rankles ransack ransacks ransoms rarefies rarefy rares rarifies rarify rassle rassles rasterise rasterises rasterize rasterizes rathel ratifies ratify ratiocinate ratiocinates rationalise rationalises rationalize rationalizes rattoon rattoons ravel ravels ravish ravishes rax raxes raxle raze razes razzes razzle razzles reabsorb reabsorbs reaccelerate reaccelerates reaccentuate reaccentuates reaccept reaccepts reacclimate reacclimates reaccumulate reaccustom reaccustoms reacidifies reacidify reacknowledge reacknowledges reacquaint reacquaints reacquire reacquires react reactivate reactivated reactivates reacts readapt readapts readd readdress readdresses readds readjust readjusts readminister readministers readmit readmits readopt readopts reads readvertise readvertises reaffirm reaffirms reaffix reaffixes reafforest reafforests realign realigns realise realises realize realizes reallocate reallocated reallocates reallot reallow reallows reamplify reanalyse reanalyze reanalyzed reanalyzes reanimates reanneal reanneals reannex reannexes reannotate reannotates reannounce reannounces reanoint reanoints reanswer reanswers reappear reappears reapplied reapplies reapply reappoint reappoints reapportion reapportions reappraise reappraised reappraises reapproach reapproaches reappropriate reappropriates reapprove reapproves reaps rearchitect rearchitects reargue reargues rearm rearms rearomatize rearomatizes rearrange rearranges rearrest rearrests rearticulate rearticulates reascend reascends reassault reassemble reassembled reassembles reassert reasserts reassess reassesses reassign reassigns reassociate reassociates reassume reassumes reassure reassures reattach reattachs reattain reattains reattract reattracts reattributes reaudition reauditions reauthorise reauthorize reauthorizes reaves reawake reawaken reawakens reawakes reawoke rebadge rebadges rebag rebags rebakes rebalance rebalances rebandage rebandages rebaptize rebaptizes rebase rebaseline rebaselines rebear rebears rebegan rebegin rebegins rebelieve rebelieves rebend rebends rebent rebid rebids rebill rebills rebind rebinds rebleeds reblock reblocks reblog reblogs rebloom reblooms reblossom reblossoms reboard reboards reboil reboils rebond rebonds rebook rebooks rebore rebores reborrow reborrows rebottle rebottles rebought rebreathe rebribe rebribes rebrick rebricks rebroadcast rebroadcasts rebuilds rebuilt rebulb rebulbs reburied reburies rebury rebut rebuts recache recaches recalculate recalculated recalculates recalibrate recalibrates recalk recalks recan recanalise recanalises recanalize recanalizes recans recant recants recapitalise recapitalised recapitalises recapitalize recapitalizes recapitulate recapitulates recaptions recarve recarves recatch recatches recategorise recategorises recategorize recategorizes recaught recaulk recaulks recede recedes receive receives recenter recenters recentralize recentralizes recentre recentres recertifies recertify rechalk rechalks rechallenges rechange rechanges rechannel rechannels recharacterize recharacterizes recharges rechart rechew rechews rechill rechills rechime rechoose rechooses rechoreograph rechoreographs rechose rechristen rechristens recidivate recidivates reciprocate reciprocates recircuit recircuits recirculate recirculates recite recites reck reckon reckons recks reclad reclads reclaims reclassifies reclassify reclean recleans reclimb reclimbs recline reclines recloak recloaks reclog reclogs reclone reclones reclose recloses reclothe reclothes reclude recludes recluster reclusters recock recocks recode recodes recognise recognises recognize recognizes recohere recoheres recoin recollapse recollapses recollar recollect recollects recollide recollides recolonises recolonize recolonizes recolor recolors recolour recolours recombine recombines recomfort recomforts recommence recommences recommend recommends recommission recommissions recommit recommits recommitted recompenses recompete recompile recompiles recomplicate recomplicates recompose recomposes recompress recompresses recompute recomputed recomputes reconceives reconceptualise reconceptualises reconceptualize reconceptualizes reconcile reconciles recondense recondenses recondition reconditions reconductor reconductors reconfigure reconfigures reconfirm reconfirms recongregate recongregates reconjure reconjures reconnect reconnects reconnoitres reconquer reconquers reconsecrate reconsecrated reconsecrates reconsider reconsign reconsigned reconsigns reconsolidate reconsolidates reconstitute reconstitutes reconstrict reconstricts reconstruct reconstructs reconsult reconsults recontact recontacted recontacts recontaminate recontaminated recontaminates recontextualise recontextualises recontextualize recontextualizes recontour recontours reconvene reconvenes reconverge reconverges reconvert reconverts reconvict recook recooks recool recooper recopied recopies recopy recopyright recopyrights recork recorks recorrect recorrects recoup recouple recouples recoups recovers recraft recrafts recreate recreates recriminate recriminates recrown recrowns recrudesce recrumple recrystallise recrystallises recrystallize recrystallizes rectifies rectify recultivate recultivates recuperate recuperates recur recurs recurse recurses recurve recurves recuse recuses recut recuts recycle recycles recyclize recyclizes redact redacts redaguerreotype redargue redargues redate redates redbaits redden reddens reddles redeal redeals redealt redecide redecides redeck redeconvolve redecorate redecorates rededicate rededicated rededicates redeem redeems redefine redefines redelete redeliver redelivers redemand redemands redemonstrate redemonstrates redenominate redenominates redeploy redeploys redeposit redeposits rederive rederives redescribe redescribes redesignate redesignates redetect redetects redetermine redetermines redevelop redevelops rediagonalize rediagonalizes redials redid redifferentiate redifferentiates redigest redigests redimension redimensions rediscover rediscovers rediscuss rediscusses redisplay redisplays redispose redissolve redissolved redissolves redistill redistills redistribute redistributes redistrict redistricted redistricts redivert redivide redivides redoes redouble redoubles redound redounds redownload redownloads redraws redrew redries redrill redrills redry redshirts redubbed reduce reduces reduplicates redye redyes reeducate reeducates reeks reelect reelects reembark reembarks reembodied reembodies reembody reemerge reemerges reemit reemits reemphasise reemphasises reemphasize reemphasized reemphasizes reemploy reemploys reenable reenables reenact reenacts reencode reencodes reencountered reenergize reenergizes reenforce reengage reengages reengineer reengineers reenlist reenlists reenter reenters reenvision reenvisions reequip reequips reestablish reestablishes reesterify reevaluate reevaluates reevaporate reevolve reexamine reexamines reexplain reexport reexports reexpose reexposes reexpress reexpresses reextend reextends refabricate refabricates reface refaces refactor refactors refall refalls refamiliarise refamiliarises refamiliarize refamiliarizes refashion refashions refasten refastens refatten refattens refax refaxes refeed refeeds refell refelt refelts refer referment referments refers refight refights refigure refile refiles refinance refinances refind refinds refine refines refinish refinishes refix refixes reflag reflags reflash reflashes reflate reflates reflect reflectorize reflectorizes reflects reflip reflips refloat refloats reflood refloods refloor reflow reflower reflowers reflows refly refocillates refocus refocuses refocusses refold refolds refool refools reforest reforests reforge reforged reforges reformat reformats reformulate reformulated reformulates refortified refortifies refortify reforward reforwards refought refound refounds refract refracts reframe reframes refreeze refreezes refreshes refries refrigerate refrigerates refroze refry reft refuck refudiate refudiates refuel refuels refunnel refurbish refurbishes refurl refurls refurnish refurnished refurnishes refuses refute refutes regain regains regales regases regasifies regasify regasses regather regathers regave regelate regender regenders regenerate regenerates regentrify regild regilds regionalise regionalises regionalize regionalizes regive regives reglaze reglazes regloss reglosses reglucosylate reglucosylates regorge regorges regrade regraded regrades regraze regrazes regrease regreases regreen regreens regresses regrew regrind regrinds regrip regrips regroove regrooves reground regroup regroups regrout regrouts regrow regrows regularise regularises regularize regularized regularizes regulate regulates regurgitate regurgitates rehabilitate rehabilitates rehammer rehammers rehang rehangs rehappen rehappens reharmonize reharmonizes rehat rehats reheal reheals rehear rehears rehearse rehearses reheel rehid rehide rehides rehinge rehinges rehire rehired rehires rehome rehomed rehomes rehone rehones rehospitalise rehospitalises rehospitalize rehospitalizes rehouse rehoused rehouses rehumanize rehumanizes rehung rehydrate rehydrates rehyphenate rehyphenates rehypnotize rehypnotizes reidentifies reidentify reifies reify reignite reignited reignites reilluminate reilluminates reillumine reillumines reimage reimages reimagine reimagines reimburse reimburses reimmerse reimmerses reimplant reimplants reimplement reimplements reimpose reimposed reimposes reimpress reimpresses reimprison reimprisons reinaugurate reinaugurates reincarcerate reincarcerates reincarnate reincarnates reinclude reincludes reincorporate reincorporates reindict reindicts reinduce reinduces reindustrialise reindustrialises reindustrialize reindustrializes reinfect reinfects reinfiltrate reinfiltrates reinflame reinflames reinflate reinflates reinforce reinforces reinform reinforms reinhabit reinhabits reinitialise reinitialises reinitialize reinitializes reinitiate reinitiates reinject reinjects reinjure reinjures reinnervate reinnervates reinoculate reinoculated reinoculates reinput reinscribe reinscribes reinsert reinserts reinspect reinspects reinspire reinstall reinstalls reinstate reinstates reinstigate reinstigates reinstill reinstills reinstitute reinstitutes reinstitutionalise reinstitutionalises reinstitutionalize reinstitutionalizes reinstruct reinstructs reinsulate reinsulates reinsure reinsures reintegrate reintegrates reinter reinterest reinterests reinterpret reinterprets reinters reinterview reinterviews reintroduce reintroduces reinvade reinvades reinvent reinvents reinvest reinvestigate reinvestigates reinvests reinvigorate reinvigorates reinvoice reinvolve reinvolves reionise reionises reionize reionizes reisolate reisolates reiterates reives rejail rejails rejig rejigger rejiggers rejiggle rejigs rejoice rejoices rejoin rejoins rejoint rejoyces rejudge rejudged rejudges rejustifies rejustify rejuvenate rejuvenates rekey rekeyboard rekeyboards rekeys rekindle rekindles reknit reknits relabel relabels relace relaces relaid relaminarize relaminarizes relapses relate relates relating relativise relativises relativize relativizes relaunches relax relaxes relead releads relearn relearns relearnt relegates relevate relevel relevels relexify relicense relicenses relies relieve relieves religate relight relights reline relines relink relinks relinquish relinquishes reliquefies reliquefy reliquifies reliquify relist relisten relistens relists relit relitigate relitigates relive relives reload reloads relocalize relocalizes relocate relocates relock relocks relubricate relubricates reluct relucts relume relumes rely remade remagnetize remagnetizes remains reman remands remanufacture remanufactures remap remaps remarket remarkets remarking remarries remarry remaster remasters remate rematerialize rematerializes remeasure remeasures remediates remeet remeets remelt remelts remember remembers rememorate rememorates remerchandise remerchandises remercy remet remethylate remigrate remigrated remigrates remilitarize remilitarizes remind reminds remineralise remineralises remineralize remineralizes reminisce reminisces remint remints remixed remixes remobilise remobilises remobilize remobilizes remodel remodels remodify remold remolds remonetize remonetizes remonstrate remonstrates remotivate remotivates remould remoulds remound remuddle remuddles remunerate remunerates remunerations remystifies remystify renail renails rename renames renationalise renationalises renationalize renationalizes renature renatures rend rendezvouses rends renege reneges renegotiate renegotiated renegotiates renest renests renew renews renig renominate renominated renominates renormalise renormalises renormalize renormalizes renourish renourishes renovate renovates renumber renumbers renumerates reobtain reobtains reoccupies reoccupy reoccur reoccurs reoffend reoffends reop reopen reopens reops reoptimize reoptimizes reorchestrate reordain reordains reorder reorders reorganises reorganize reorganizes reorient reorients reoxidize reoxidizes reoxygenate reoxygenates repack repackage repackages repacketize repacketizes repacks repaginate repaginates repaid repaints repalletize repalletizes repaper repapers reparates reparse reparses repass repaste repatch repatches repatriates repave repaved repaves repay repays repeddle repel repels repent repents repeople repeoples reperceive reperceives reperform reperforms rephase rephases rephotograph rephotographs rephrase rephrases repin repine repines repins repitch repitches repivot repivots replace replaces replait replaits replan replant replants replaster replasters replate replates replenish replenishes replevy replicate replicates replot replots replough reploughs replow replows replug replugs repoint repoints repolarise repolarize repolarizes repolish repolishes repopularise repopularises repopularize repopularizes repopulate repopulated repopulates reposition repositions repossess repossesses repost reposts repot repots repour reprehend reprehends reprepare represent representing represents represses repressure repressures repressurise repressurises repressurize repressurizes reprice repriced reprices reprioritise reprioritises reprioritize reprioritizes repristinate repristinates reprivatise reprivatize reprivatizes repro reprobe reprocess reprocessed reprocesses reproduce reproduces reprofessionalize reprofessionalizes reprofile reprofiles reprogram reprogramme reprograms reproliferate reproliferates repromote repromotes repropagate repropagates reprove republish republishes repudiate repudiates repugns repunctuate repunctuates repunish repunishes repurchases repurify repurpose repurposes reputes repyne requalifies requalify requeen requeens requestion requestions require requires requite requites requote requotes reradiate reradiates reran rerandomize rerandomizes rerape rerapes rerate rerates rerattle reread rereads rerecords rerefer rerefers reregister reregisters reregulate reregulates rerender rerenders rerent rerents rereport rereports rerig rerigs reroll rerolls reroof reroofs reroute reroutes resacralize resacralizes resaddle resaid resail resalute resample resamples resand resands resanitize resat resave resaw resaws resay resays rescale rescales rescan rescans rescatter rescatters reschedule reschedules rescind rescinds rescope rescopes rescore rescores rescramble rescrambles rescreen rescreens resculpt resculpts resculpture resculptures reseal reseals reseason reseat reseats resect resects resecure resecures resediment reseed reseeds resegregate resegregates resegregrate resegregrates reseize reseizes reselect resell resells resemble resembles resend resends resensitize resent resentence resentences resents resequence resettle resettled resettles resew resews reshake reshakes reshape reshapes resharpen resharpens reshave resheath resheathe resheathed resheathes resheaths reshelve reshelves reshim reshims reshingle reshingles reship reships reshook reshot reshow reshows reside resides resift resifts resight resights resign resignal resigns resile resiles resinate resinates resinified resinifies resinify resituate resituates resize resizes reskill reskills reskin reskins resmelt resmelts resod resods resold resolder resolders resole resoles resolidifies resolidify resolves resonate resonates resorb resorbs resound resounds resow resowed resows respawn respawns respec respecifies respecify respecs respect respectabilize respectabilizes respell respells respelt respend respent respider respiders respin respirate respire resplend resplends respot respots resprout resprouts restabilise restabilises restabilize restabilizes restack restacks restaff restaffs restage restages restain restains restaple restaples restate restates restation restations resterilize resterilizes restick resticks restimulate restimulates restitch restitched restitches restitute restitutes restock restocks restone restopper restore restores restrain restrains restrengthen restrengthens restretch restretches restrict restricts restrings restripe restripes restructure restructured restuck restudied restudies restudy restump restyle restyles resubject resubmerge resubmerges resubmit resubmits resubscribe resubscribed resubscribes resulting results resummon resummons resupplies resurface resurfaces resurge resurges resurrect resurrects resurvey resurveys resuscitate resuscitates resuspend resuspends reswear reswears reswore resyllabifies resyllabify resynchronize resynthesize ret retag retags retailor retails retain retains retaliate retaliates retally retape retapes retarget retargets retaught retch retches reteach reteaches reteam reteams retear retears retee retees retelecast retelecasts retell retells retender retexture retextures rethatch rethatched rethatches rethaw retheme rethemes rethink rethinks rethought rethread rethreads rethrew rethrow rethrows reticket retickets reticulates retie reties retighten retightens retile retiles retime retimes retires retitle retitles retold retook retool retools retore retoss retraces retract retracts retrain retrains retranslate retranslates retransliterate retransliterates retransmit retransmits retransplant retransplants retraumatize retraumatizes retravel retravels retrench retrenches retrieves retrig retrigger retriggers retrigs retrocede retrodict retrodicts retrodisplace retroflect retroflects retrogreen retrogress retrogresses retromod retromoderate retromoderates retrotranspose retrotransposes retube retubes retune retunes returf returfs returns retweet retweets retwist retwists retype retypes reunified reunifies reunify reunite reunites reupholster reupholsters reupload reuploads reutilise reutilises reutilize reutilizes revaccinate revaccinates revalidate revalidates revalorise revalorize revaluate revalue revalued revalues revamp revamps revarnish revarnishes reveals revegetate reverberate reverberates reverences reveres revest revests revet revictual revictuals revile reviles revindicate revindicates revitalise revitalises revitalize revitalizes revive revives revivifies revivify revoice revoices revolutes revolutionalise revolutionalised revolutionalises revolutionise revolutionises revolutionize revolutionizes revolve revolves rewalk rewalks rewarehouse rewarm rewarms rewashed rewashes rewatch rewatches rewater rewax rewaxes reweave reweaves rewed reweds reweigh reweighs reweight reweights rewicker rewild rewilds rewinded rewire rewires reword rewords reworks rewound rewove rewrap rewraps rewrote rezone rezoned rezones rhapsodise rhapsodises rhapsodize rhapsodizes rhotacise rhotacises rhotacize rhotacizes ribosylate ribosylates richen richens rickroll rickrolls ridicules rids righten rightens rightsize rightsized rightsizes rigidifies rigidify rigorize rigorized rigorizes rike rile riles ringbark ringbarks ringfence ringfences ripen ripens rises risp risps ritualise ritualises ritualize ritualizes rivel rivetted riz rize roam roams roaves rob robotise robotize robotizes robs robustify roger rogers roil roils roister roisters roleplays rolf rolfs rollick rollicks romanise romanises romanize romanizes romanticise romanticises romanticize romanticizes rootle rootles rotate rotates rotavate rotoscopes rototill rototills rotovate rotovates rotproofs roughen roughens roughhouses roust rousts routinise routinises routinize routinizes rove roves rox royalize royalizes roysters rsvp rubberise rubberises rubberize rubberizes rubbernecks rubberstamp rubberstamps rubbishes rubifies rubify rubricate ruckle ruckles rucks ruddles ruggedise ruggedize ruggedizes ruinate ruinates ruminate rummages rumors rumours rumple rumples ruralise ruralises ruralize ruralizes russifies russify rusticate rusticates rustproofs rusts sab sabbatize sabotages saccharify sacerdotalize sacralize sacralizes sacramentize sacredize sacredizes sadden saddens sadducize sagaciate sagaciates saginates sailboards sain sains salicylize salify salinate salinise salinised salinises salinize salinizes salivate salivates salutes sanctifies sanctify sanctuarize sanctuarizes sandblast sandblasts sang sanitate sanitates sanitise sanitises sanitize sanitizes sank santer santers saponifies saponify sarcase sasses satanize satiates satirise satirises satirize satirizes satisfice satisfices satisfies satisfy satisfying saturate saturates saute sautes savvies says scabbed scabble scaffolds scagged scalarize scalarizes scald scalds scampers scandalise scandalises scandalize scandalizes scanlate scarifies scarify scarper scarpers scathes scats scatted scatter scatters scavenge scavenges schappe schematize schematizes schlepps scintillate scintillates sclerose sclerotise sclerotises sclerotize sclerotizes scold scooch scooches scootch scootches scorify scorns scour scrabble scrabbles scraight scrams scrapbooked screak screaks screenscrape screenscrapes screwtape screwtapes scries scriggle scrimple scrimshanders scrimshank scrimshanks scrimshaws scritch scritches scrooch scrooches scroop scroops scrootch scrootches scrouges scrump scrumple scrumples scrumps scrunched scrunches scrutinise scrutinises scrutinize scrutinizes scruze scry scuffs sculk sculpt sculpts scumbles scurries scurry sears secede secedes secern seclude secludes secrete secretes secuers secularise secularises secularize secularizes secures securitise securitises securitize securitizes sedates sedentarise sedentarises sedentarize sedentarizes seduce seduces seek seeks seels seem seems seesaws seethe seethes segregates segued seise seises seize seizes semiautomate semiautomates semiforces send sends senesce senesces sensationalise sensationalises sensationalize sensationalizes sensitise sensitises sensitize sensitizes sentimentalise sentimentalises sentimentalize sentimentalizes seponate septembrise septembrises septembrize septembrizes septuples sepulchers sequester sequesters sequestrates serialise serialises serialize serializes sermonise sermonises sermonize sermonized sermonizes seroconvert serpentinize sesquioxidize sesquioxidizes settles sever severs sew sews sexifies sexify sexile sexiles sexualise sexualises sexualize sexualizes sez shaddup shamble shames shanghais shapen shapeshift shapeshifts sharecrop sharecrops sharpen sharpens sharpshoot shat shatter shatters sheathe sheathes shebop sheens sheetrocks shent shet shew shid shimmied shimmies shines shink shinnies shirks shirr shirrs shivved shmooze shmoozes shockproofs shoegazes shone shoo shood shoogle shoos shopgrift shopgrifts shoplift shoplifts shorn shortchange shortchanged shortchanges shorten shortens shortlist shortlists shortsheet shortsheets shoulda shouldest shouldna shouldst showing showrun shows shright shrills shrimps shrinkwraps shrive shrivel shrivels shrives shrove shrunk shtums shtup shtups shud shuddup shun shunpike shunpikes shuns shush shushes shuttles shutup sibilate sicken sickens sickled sicks sics siddown sidefoot sidefoots sidetracks sidewind sier sift sifts sightread sightsaw sightsee sightsees signalise signalises signalize signalizes signifies signify silanate silanates silicify siliconise siliconize siliconizes silts silylate simmered simmers simonise simonises simonize simonizes simplicate simplifies simplify simulate simulates sinicise sinicize sinicizes sinuates sissifies sissify situates skalls skedaddle skedaddles skeets skeeve skeletonise skeletonises skeletonize skeletonizes skelps sken skens skews skijor skijors skimps skims skinch skinnydip skirl skirls skitch skitches skite skites skitters skrikes skronk skud skudded skuddin skuds skulks skullfuck skyjack skyjacks skype skypes skyrockets skywatch skywatches slacken slackens slake slakes slaloms slambangs slams slangs slashdot slashdots slaughters slay slays sleeks sleepswalk sleepswalks sleeptalk sleeptalks sleepwalk sleepwalks sleets slenderize slept sleptwalk slews slicken slickens slid slidder slims slingshoot slingshoots slink slinks slite slites slither slithers slobbers slocken slockens sloom slooms sloshes slove slows sluff sluffs slung sluther sluthers smallcap smarten smartens smartmouth smartmouths smatter smatters smears smirch smite smites smogs smokum smolder smolders smoodge smoosh smooshes smoothe smoothen smoothens smote smoulder smoulders smuggle smuggles smushes snarf snarfle snarfles snarfs snavel sneap sneaps sneb sneers snerk snerks snew snews snig sniggers sniggle snirts snivels snoozle snoozled snoozles snopes snortle snortles snowplows snowproofs snoze snozen snuck snuffles snuffs sobers soccers socialise socialises socialize socializes sociologize sociologizes soddens sodomise sodomises sodomize sodomizes soften softens sog solarise solarises solarize solarizes sold solemnifies solemnify solemnise solemnises solemnize solemnizes solicit solicits solidifies solidify soliloquize soliloquizes soloes solubilise solubilises solubilize solubilizes solve solves somatise somatize somatizes somnabulate somnabulates somnambulate somnambulates sonicate sonicates sonorize sonorizes soodle soogees soothe soothes sophonsify sophronize sorcerise sorcerises sorcerize sorcerizes sorn sorns soughs sought soundproofs souses sowth spackles spae spamvertise spamvertises spamvertize spanghew spanghews sparble sparge sparges sparsify spatialize spatializes spatter spatters spatulates spawns spays speaks specialise specialises specialize specializes speciate speciates specifies specify spectate spectates speculate speculates speechifies speechify speedcube speedcubes speedran spellbind spellbinds spelunk spelunks spews spherize spherizes spifflicate spifflicates spiflicate spiflicates spirantize spirantizes spiritualize spiritualizes spirts spites splain splains splendish splenectomize splenectomizes splodged splosh splurt splurts splutter splutters spoliate spoliates spoonfeed spoonfeeds spoors sportfish sporulate sporulates spose sposes spotlit sprang sprawls spraypaint spraypaints spreadeagle spreadeagles sproings spruik spruiks spuddles spumes spun spunks spurlges sputters squander squanders squeaks squinny squirms squoosh squooshed squooshes squoze sqush squshes stabilise stabilises stabilitate stabilize stabilizes stablishes stagnate stagnates stanch stanches standardise standardises standardize standardizes stang starbursts stargaze stargazes starks starve starves stating staunches steadies steamroll steamrolls steams steepen steepens steeps steeves steg stellenbosch stellify stenographs stereomutate sterilise sterilises sterilize sterilizes sternutate sternutates stets steups stevened stickhandle stickhandles stickle stickles stiffen stiffens stigmatise stigmatises stigmatize stigmatizes stimulate stimulates stipples stipulates stob stog stokes stonifies stonify stood stots stott stottin stotts stow stows straddled straggle straggles straighten straightens straiten straitens strangle strangles strangulate strangulates strategise strategises strategize strategizes stratifies stratify straught stravaig stravaige stravaiges stravaigs strengthen strengthens strew strews striates striddle stridulate stridulates strikesthrough strikingthrough strim stringifies stringify strinkle strive strives strobilate strobilates strongarms strove struck struckthrough structuralise structuralises structuralize structuralizes structurize strums strung studies stuffs stultifies stultify stun stung stuns stupefies stupefy stylise stylised stylises stylize stylizes subcategorise subcategorises subcategorize subcategorizes subclassifies subclassify subcontract subcontracts subdivide subdivides subduct subducts subdue subdues subedit subedits subitise subitises subitize subitizes subjectivize subjectivizes subjoin subjoins subjugate subjugates sublate sublates sublimate sublimates submerge submerges submerse submerses subministers submit submits submodify suborn suborns subrogate subrogates subscribe subscribes subserve subserves subserviate subside subsides subsidise subsidises subsidize subsidizes subsist subsists subspecialise subspecialize subspecializes substantialize substantializes substantiate substantiates substantivise substantivises substantivize substantivizes substract substracts subsume subsumes subtend subtends subtilise subtilises subtilize subtilizes subtract subtracts suburbanize suburbanizes subvene subvent subvents subvocalize succeed succeeds succors succours succumb succumbs succuss succusses suckle suckles suctions sudate sue sues suffer suffice suffices sufflaminates sufflates suffocate suffocates suffonsify suffumigate suffumigates suffuse suffuses sugarcoat sugarcoats suggest suggests sulfurate sulfuret sulfurise sulfurises sulfurize sulfurizes sull sullies sulls sully sulphurate sulphurise sulphurize summarise summarises summarize summarizes summon sumoylate sumoylates sunbake sunbakes sunbathe sunbathes sunders sunscalds superabound superabounds superadd superadds superannuate superannuates superate supercalenders supercedes supercharge supercharges supercompress supercompresses superconduct superconducts supercool supercools supererogate supererogates superficialise superficialises superficialize superficializes superheat superheats superhumanise superhumanize superhumanizes superimpose superimposes superinduce superinduces superinfect superinfects superintend superintends superlie superlies supernaturalise supernaturalises supernaturalize supernaturalizes superovulate superovulates superpose superposes superpraise supersample supersamples supersaturate supersaturates superscribe superscribes supersedes supersize supersizes supervene supervenes supervise supervises supinate supinates supplant supplants supplicate supplicates suppose supposes suppress suppresses suppurate suppurates supremes surceases surcharges surfcast surfs surmount surmounts surpass surpasses surrejoin surveil surveils survive survives suspend suspends suspire susurrate swaddle swaddles swam swanks swarts swashes swattle sweal swedge sweeten sweetens swelt swelts swept swerve swerves swiftboat swiftboats swiggle swipes swither swithers swives swonk swoons swore swung swyve swyves syllabicate syllabicates syllabificate syllabifies syllabify syllabize syllabizes syllogize symbolise symbolises symbolize symbolizes symmetrize symmetrizes sympathise sympathises sympathize sympathizes symptomatize symptomatizes symptomize symptomizes synchronise synchronises synchronize synchronizes syncopate syncopates syncretise syncretize syncronises syncronize syncronizes synergise synergises synergize synergizes synopsize synopsizes synthesise synthesises synthesize synthesizes synthetize synthetizes syntonize systematise systematises systematize systematizes systemize tabloidize tabloidizes tabulate tabulates tacet takes talebear talibanize tallage tallages tames tamp tampers tamps tantalise tantalises tantalize tantalizes targetted tarnishes tase tattles taught taughtens tauten tautens tautomerize tautomerizes tawk tawks taxidermize taxonomise taxonomize taxonomizes teach teaches teargasses teaze teem teems teends teeter teeters teethe teethes teld telecommunicate telecommunicates telecommute telecommutes telefrag telefrags telegraphs telemarket telemarkets teleoperate teleoperates telepathise telepathises telepathize telepathizes teleport teleports televise televises teleworks tells telnets telt templatize templatizes temporise temporises temporize temporizes tempt tempts tend tenderise tenderises tenderize tenderizes tends tepefy tergiversate tergiversates terminates terraform terraforms terrifies terrify terrorise terrorises terrorize terrorizes tertiate tertiates tesselate tesselates tessellate tessellates testfire testfires testifies testify textualise textualises textualize textualizes texturise texturises texturize texturizes thaifies thaify thank thanks thatcherise thatcherises thatcherize thatcherizes thawt thay theatricalise theatricalises theatricalize theatricalizes thees thematise thematises thematize thematizes theologise theologises theologize theorise theorises theorize theorizes therapize therapizes thermalise thermalises thermalize thermalizes thermoform thermoforms thermoregulate thicken thickens thieve thirl thizzin thoil thoriate thoriates thoroughgo thous thrang thrashes threaten threatens thresh threshes threw thrive thrives thrombose throve thumbshots thunders thwock thwocks tidies tidivate tidivates tighten tightens timeses timonise timonises timonize timonizes tink tinks tinsels tintinnabulate tintinnabulates tiptoes titillate titillates titivate titivates titrate titrates tittivate tittivates titubate titubates tivo tlk toat toats tobrest toburst tocleave toddle toddles todraw tokenise tokenises tokenize tokenizes tolash told tolerate tolerates tolerize tonitruate tonitruates took tooken tootle tootles topdress topdresses topes topicalise topicalises topicalize topicalizes topple topples toquake toquash torace torat toreave torend torfel torit torive torob torques torrefies torrefy toruffle tose toshiver toslive tosliver tosunder toswap toswink totalize totalizes totorve totread toughen toughens tould touristifies touristify tousle tousles touzle touzles towind toxicate traduce traduces traffick trafficks traffics tragedize tragedizes tranch tranduce tranquilise tranquilises tranquilize tranquilizes tranquillize tranquillizes transact transactivate transactivates transacts transaminate transaminates transceive transceives transcend transcendentalize transcendentalizes transcends transclude transcludes transcode transcodes transcreate transcreates transcribe transcribes transdifferentiate transdifferentiates transduce transduces transesterifies transesterify transfect transfects transfenestrate transfenestrates transfigurate transfigurates transfigure transfigures transfreights transfrete transfund transfunds transfuse transfuses transgress transgresses transhape transhapes tranship tranships transhumanize transilluminate transistorize transistorizes transliterate transliterates translocate translocates transmetallate transmetallates transmigrate transmigrates transmit transmits transmogrifies transmogrify transmute transmutes transpierce transpierces transpire transpires transplace transshape transship transships transubstantiate transubstantiates transude transudes transumes transvalue transvest trant trants trape trashes traumatise traumatises traumatize traumatizes trawls treeifies treeify trendify triages triangulate triangulates triculate trifurcates trimerise trimerises trimerize trimerizes trimethylate trimethylates trinkle triphthongize triphthongizes trisect trisects triturate triturates trivialise trivialises trivialize trivializes troak troaks trod trods tromp tromps tropicalize tropicalizes trosh troubleshoot troubleshoots troubleshot trounce trounces trudges trues truncates trypsinise trypsinises trypsinize trypsinizes tsk tsks tsktsk tsktsks tszuj tszujes tubthump tubthumps tumbles tumefies tumefy tupe turbanize turbocharge turbocharges tutoy tutoyer tutoyers tuts twattles tweedle tweeze tweezes twiddle twiddles twifallow twocs tyek tyeken tyekin tyeks typecast typecasts typesets typewrite typewrites typifies typify tyrannise tyrannises tyrannize tyrannizes ubiquitinate ubiquitinates ubiquitinylate ubiquitinylates ubiquitylate ubiquitylates uglifies uglify ukrainianize ulcerates ultrasimplifies ultrasimplify ululate ululates umbecast umbedraw umbego umbelap umbethink umbrages umbraid umount umounts unaffiliate unaffiliates unalter unanchor unanchors unarchive unarchives unarm unarms unassemble unassembles unbag unbags unbalance unbalances unban unbandage unbandages unbans unbar unbars unbefool unbelt unbelts unbend unbends unbeseems unbewitch unbewitches unbind unbinds unbless unblesses unblind unblindfold unblindfolds unblinds unblock unblocks unblouse unblouses unblur unblurs unbolt unbolts unbook unbooks unbore unbosoms unbottle unbottles unbox unboxes unbrace unbraces unbraid unbraids unbreak unbreaks unbrick unbricks unbridle unbridles unbroke unbuckle unbuckles unbuild unbuilds unbundle unbundles unbung unburden unburdens unburies unburthens unbury unbutton unbuttons uncage uncages uncap uncape uncapes uncaps unchain unchains unchamber unchambers uncheck unchecks unchilds unchoke unchokes unchurch unchurches unciphers unclasp unclasps unclench unclenches unclip unclips uncloak uncloaks unclog unclogged unclogs unclose uncloses unclothe unclothes unclutter unclutters uncock uncocks uncoil uncoils uncollar uncollars uncomment uncomments uncomplicate uncomplicates uncompress uncompresses unconfigure unconfigures uncook uncooks uncoop uncoops uncork uncorks uncouple uncouples uncover uncovers uncrate uncrates uncreate uncreates uncrinkle uncrinkles uncrook uncrooks uncross uncrosses uncrown uncrumple uncrumpled uncrumples uncrunch uncrunches uncrystallize uncrystallizes unct uncts uncuff uncuffs uncunt uncunts uncurl uncurls uncurse uncurses undam undams undeceive undeceives undeclare undeclares undefine undelete undeletes undemocratise undemocratises undemocratize undemocratizes underachieve underachieves underact underacts underapplies underapply underappreciate underappreciates underapproximate underapproximates underbake underbakes underbear underbids underbill underbills underbind underboil underboils underbook underbought underbuild underbuilt underburn underburns underburnt underbuy underbuys undercalculate undercalculates undercapitalize undercharge undercharged undercharges underclaim underclaims underclock underclocks undercome undercook undercooks undercool undercount undercounts undercrank undercranks undercreep undercry underdeliver underdelivers underdelve underdetermine underdevelop underdevelops underdid underdo underdoes underdope underdopes underdraw underdraws underdress underdresses underdrew underearn undereat undereats underemphasize underemphasizes underexaggerate underexaggerates underexplain underexplains underexpose underexposes underfang underfeed underfeeds underfinance underfinances underfit underfund underfunds underget undergird undergirds undergo undergoes underguess underguesses underheat underheats underhole underinflate underinflates underinsulate underinsulates underinsure underinsures underinvest underinvests underlaid underlet underlets underlie underlies underlooks undermaintain undermaintains undermine undermines undernim undernourish undernourishes underpay underpays underperform underperforms underpin underpins underplants underplays underpower underpowers underpraise underpraises underpredict underpredicts underprescribe underprescribes underprice underprices underprocess underprocesses underproduce underpromise underpromises underquote underquotes underrates underreach underreaches underrecognize underrecognizes underrecruit underrecruits underregulate underregulates underreport underreports underrepresent underrepresents underrotate underrotates undersalt undersample undersamples undersave undersaves undersee undersell undersells underserve underserves undershoot undershoots undersign undersigns undersleep undersleeps underslept undersow underspecifies underspecify underspends underspent understaff understaffs understand understands understate understates understimulate understimulates undersupplies undersupply undersupport undersupports undertake undertakes underthink underthrew underthrow underthrows underthrust underthrusts undertip undertips undertook undertreat undertreats undertrump undertrumps underturn underuses underutilize underutilizes undervalue undervalues underween underweights underwent underwhelm underwhelms underworks underwrite underwrites underwrote undid undignify undislocate undislocates undo undock undocks undoes undraw undraws undream undreamed undreams undresses undrew undulates unearth unearths unelect unembed unencode unencodes unencumber unencumbers unentangle unentangles unequip unequips unerase unerases unescape unescapes unexecute unfang unfangs unfasten unfastens unfetter unfetters unfills unfist unfists unfits unfix unfixes unflag unflags unfocus unfocuses unfold unfolds unfollow unfollows unfool unformat unfreeze unfreezes unfriends unfrock unfrocks unfroze unfuck unfurl unfurls ungag ungags ungarble ungarbles unglue unglues ungod ungods ungrease ungreases ungrounds unhair unhand unhandcuff unhandcuffs unhands unhang unhappen unhappens unharness unharnesses unhem unhems unhid unhidden unhide unhides unhills unhinge unhinges unhitch unhitches unhobble unhobbles unhold unholds unholster unholsters unhood unhoods unhook unhooks unhorse unhorses unhouse unhouses unhug unhusk unhusks unhyphenate unhyphenates unifies uniformise uniformises uniformize uniformizes unify unimagine unimagines unimpale unimpales unindent unindents uninstall uninstalls uninvite uninvites unionise unionises unionize unionizes uniquifies uniquify unite unites unitise unitize unitizes universalise universalises universalize universalizes unjam unjams unjinx unjoin unjoins unjoint unkennel unkennels unkill unkink unkinks unkisses unknew unknit unknits unknow unknows unlace unlaces unlade unladed unlades unlash unlashes unlatch unlatches unlay unleaf unleafs unlearn unlearns unleash unleashes unleave unleaves unlikes unlimber unlink unlinks unlist unlists unlive unlives unload unloads unlock unlocks unloop unloops unloose unloosen unloosens unlooses unlove unloves unmake unmakes unman unmanacle unmanacles unmans unmarries unmarry unmarshal unmarshals unmask unmasks unmast unmatch unmatches unmerge unmerges unmix unmixes unmold unmolds unmoor unmoors unmortgage unmortgages unmount unmounts unmute unmutes unmuzzle unmuzzled unmuzzles unnatures unnerstand unnerstands unnerstood unnerve unnerves unown unowns unpack unpacks unpadlock unpadlocks unpaint unpaints unpark unparks unpaunch unpause unpauses unpeel unpeels unpeg unpegs unpick unpickle unpickles unpicks unpiece unpin unpins unplait unplaits unplug unplugs unpot unpots unprofessionalise unprofessionalize unprotect unprotects unpunctuate unpunctuates unpurse unpurses unpuzzle unpuzzles unquench unquenches unrar unrars unrate unrates unravel unravels unrecognize unrecognizes unrecommend unrecord unrecords unreel unreels unregister unregisters unretire unretires unriddle unriddles unrig unrings unrip unrips unrobe unrobes unroll unrolls unroof unroofs unroot unroots unrope unropes unruffle unruffles unrung unsaddle unsaddles unsanctifies unsanctify unsaw unsay unsays unscramble unscrambles unscrew unscrews unscroll unseal unseals unseam unseams unseat unseats unsee unsees unselect unselects unsell unsells unserialize unserializes unsets unsettle unsettles unsex unsexes unshackle unshackles unshape unshare unshares unsheath unsheathe unsheathed unsheathes unsheaths unshift unshifts unship unships unshoe unshoes unshut unshuts unslings unslung unsnag unsnags unsnap unsnaps unsnarl unsnarls unsolder unsolders unsolve unsolves unspeak unspeaks unsphere unspheres unspoil unspoke unspool unspools unsqueeze unsqueezes unstack unstacks unstaple unstar unstars unsteadies unstep unsteps unstick unsticks unstitch unstitches unstop unstops unstrap unstraps unstrings unstrung unstuck unstuff unstuffs unsubscribe unsubscribes unsullies unsully unswaddle unswaddles unswathe unswathes unsweeten unsweetens unswirl unswizzle unswizzles untack untacks untangle untangles untar untars unteach unteaches untether untethers unthaw unthaws unthink unthinks unthought unthread unthreads unthrone unthrones untick unticks untie unties untighten untightens untrain untrains untrammel untrammels untreasure untreasures untruss untrusses untuck untucks untwine untwist untwists unvails unveil unveils unvessel unvessels unvicar unvicars unvisards unvizard unvizards unwads unwatch unwatches unweave unweaves unweight unweights unwind unwinds unwire unwires unwish unwound unwove unwrap unwraps unwriggle unwrinkle unwrinkles unwrite unwrites unwrote unyoke unyokes unzip unzipped unzipper unzippers unzips upbar upbear upbears upbind upblow upbore upbraid upbraids upbreaks upbreed upbreeds upbroke upbroken upbrought upbuild upbuilds upbuilt upcheer upcheers upchucks upcoil upcoils upcurl upcurls upcycle upcycles updive updraw updraws updrew upend upends upfills upflow upflows upgathers upgave upgive upgives upgrew upgrows uphang uphaul upheap upheave upheaves upheld uphelm uphilt uphilts uphoard uphoards uphold upholds upholster upholsters uphurl upkeeps uplay uplead uplean upleap upleaps uppluck upraises uprear upregulate upregulates uprisen uprises uproll uproot uproots uprose uprouse uprun upscales upseek upsell upsells upsize upsizes upskill upskills upsnatch upsold upsolve upsot upsprang upsprung upstages upstare upstartle upstarts upstay upsway uptalk uptear uptears upthrew upthrows uptie upties uptore upvotes upwell upwells upzone upzones urbanise urbanises urbanize urbanizes urgings urinate urinates urticate urticates ush ushes usurp usurps utfse utilise utilises utilize utilizes utilizing utters uuencode uuencodes vacate vacates vaccinate vaccinates vacillate vacillates vacuate vail vajazzle validate validates validifies validify valorise valorises valorize valorizes valuate valuates vamoose vamooses vandalise vandalize vandalizes vanish vanishes vanitize vanitizes vanquish vanquishes vant vaporise vaporises vaporize vaporizes vapourises vapulates variegates varies vary vascularize vascularizes vasectomize vasectomizes vasodilate vasodilates vaticinate vectorise vectorises vectorize vectorizes veels vegetate vegetates vegetize velarize velarizes velcros vellicate vellicates vend vends venerate venerates ventilate ventilates ventralize ventralizes ventriloquize ventriloquizes verbalise verbalises verbalize verbalizes verbifies verbify verbize verifies verify verlanize vermiculates verminate verminates vernalize vernalizes versifies versify verticalize verticalizes vesicate vex vexes vibrates victimise victimises victimize victimizes vide videoes vides videte vie vies vilifies vilify vilipend vilipends villainise villainize villainizes vindicate vindicates vinify violate violates virialise virialises virialize virializes virilize virilizes virtualise virtualises virtualize virtualizes visualise visualises visualize visualizes vitalise vitalises vitalize vitalizes vitaminize vitaminizes vitamise vitiate vitiates vitrifies vitrify vittle vituperate vituperates vivifies vivify vivisect vivisects vocalises vocalize vocalizes vociferate vociferates volatilize volatilizes volcanize volumise volumises volumize volumizes voluntell vomits voodoos vouchsafe vouchsafes vould voxelate voxelates vroom vrooms vulcanise vulcanises vulcanize vulcanizes vulgarise vulgarises vulgarize vulgarizes vulnerate vum vurps wabble wabbles wackyparse wackyparses wafts waitasec waive waken wakens wantonize wants wanze wanzes warchalk warchalks wardriven wardrove warishes warms warn warns warps warsh waterbomb waterbombs waterlog waterlogs waterproofs waul waulk waulks wauls wawl wawls wayfare wayfares waylaid waylay waylays wayments weaken weakens weans weaponise weaponises weaponize weaponizes wearies weatherise weatherises weatherize weatherizes weatherproofs weathers webifies webify wed weele ween weens weep weeps wees weets weigh weighs welk welshes wench wept westernise westernises westernize westernizes whang whangs wheech wheedle wheedles whelm whelms whet whets whiles whirls whitelists whiten whitens whittles whomp whomps whoomp whoomps whopped whup whups wibbles widdles widen widens wield wields wikifies wikify windsurf windsurfs winge winges winsorize winsorizes winterfeeds winterise winterises winterize winterizes winterproofs wintle wiredraw wiredraws wisen wisens wishes wist wists wite wites withdraw withdraws withdrew wither withgo withhold withholds withsafe withsaid withsay withsays withset withsit withspeak withspeaks withspoke withstand withstands withstood witter witters wive wizens woebetide woke wolfs wolve womanise womanises womanize womanizes wons wonts woo woobiefies woodchop woodchops woofs woolgather woolgathers worsen worsens worsts worths wos wot wots wouldest wouldst wove wows woz wrassle wrassles wrays wreak wreaks wreathe wreathes wrest wrests wries wrings write writes writh wrixle wrongfoot wrongfoots wrote wrung wtfpwn wtfpwns wunt wuther wuthers wuvd wuvs wuvz wuz wytes xeroxes xxxs yabber yabbers yammers yark yarks yarr yawns ycladd ycleped yean yeans yearn yearns yelloch yellochs yerks yesk yete yex yexes yoink yoinks yoohoo york yorks yot youngs youthen youthens yuk yuppifies yuppify zams zay zerg zergs zeroise zeroises zeroize zeroizes zhooshed zhooshes zincifies zincify zincs zombifies zombify zonks zooms zots zouks zoutch 635 a able above acad acm acm_siam acs acta addit adhes adsorpt adv agric aij akad alamos alche algor all allg am amer ames an angew anlagen ann annu anorg another antibiot antimicrob any anybody anyone anything anytime anywhere aoac app appita appl april aquat are aromat artif arzneim asoc assoc astm astron astrophys atmos august aust autom aux available axs bacteriol be because been before behav being belg bij bioact biocatal biochem biochim biodegrad biodeterior bioelectrochem bioelectron bioenerg bioeng biogeochem biol biolumin biomater biomed biometrika biomol bioorg bioph biopharm biophys biorem bioresour biosci biosens biotechnol biotransform bmc both brennst buenos calorim calphad can can't cannot carbohydr carcinog cardiovasc catal cellul ceram charact chem chemilumin chemischen chemom chemother chern chil chim chimica chromatogr cienc ciencia cient cients cij cimento clin cm_1 comm commun compat compd compos compr comput concr condens contam contrib convers coord corros cosmochim could cryog cryst crystallog crystallogr cytochem de december degrad della delle delos departamento der des diffr dipartimento discov dispos dm_3 do does doesn't doing dokl don't done dosim e_mail each ecol econ ecotoxicol educ eine either electroact electroanal electroceram electrochem electrochim elem embo en endocrinol energ eng engl enzym enzymol epidemiol eq eqs equilib erdgas erdol essent ethnopharmacol eur europ europhys eval every evol exch explor extr f'unct facil facultad faseb fax february febs ferroelectr fett filtr fluoresc foly forsch fract francisco fresenius funct fundam g_1 galvanotechnik gazz gefahrstoffe geochem geochim geofiz geol geomicrobiol geophys geosyst gf gmbh go goes going h_1 had handb has have haven't having he heiv her here's heteroat heterocycl heterogen his histochem holz hoppe how hydrob hydroch hydrol hypertens i'd i'll i2 ieee if iff immunol immunopharmacol important inc indica indus informatica inhib inorg inst instrum int'l integr intell intermed ionics is isbn isij isot it it's its itself j_1 january jersey jmaa jsme jth july june kautsch kg_1 khim khoz kinet kohle kolloidn kong koord kovove kraft kristallogr kth kunstst l_1 la las le left_hand leipzig les let's lett liebigs lim liminf limsup los ltd lubr luft lumin macromol magn magnetobiol magy makromol manuf many march materialwiss math mathematiques may me meas med membr mendeleev metab metailkd metall metalloved microanal microb microbiol microchem microcolumn microelectromech microelectron microsc microstruct might mikrochim min_1 ministerio minx modell mol_1 monatsh monit monogr must my myself nachr nanopart nanostruct nat natl nato naturforsch nauk naunyn neft neither neorg neuroanat neurochem neurosci new nondestr nothing novel november nucl numer nuovo obrab obshch october ocul ofa ofatoms ofs ofsciences ofthe ofthis ofx oncol oper opin organomet other ought our ourselves oxid pathol pept perkin perspect pestic petrochem pharmacal pharmacol pharmacool philos photobiol photochem photopolym photosensit photosynth phycol phys physica physiol phytochem phytorem plast pnas pollut polym polytech prakt prepr prikl prob proc proced procesowa prof progr propag propul prot przem publ purif quimica radiat radioact radioanal radiochim radiopharm rapra recl recognit recycl ref refs regul reinf reinhalt relat reprod resolut reson resour respir rev rheol right_hand rome roum russ s_1 same sampe san santa santos scand schmiedeberg sci scripta see semicond sens september seyler shall she should siam silic silik simul soc softw solut some something sonochem spect spectro spectrochim spectrom spectros spectrosc spektrosk stat struct studi substitues such supercond supercrit supp supramol symp synop syst tappi tech technol terre that that's the their theirs them themselves then theochem theor ther thermochim thermodyn thermophys thermoplast these they this thorough those thus tion toxicol trac trav tsvetn two's ultrason und univ unserer us using usual v_1 van various verfahren virol vol von warme warsaw was we we'll were werkst werkstofftech what when where whereas whether which while who whom whose why wij will wish won't would xl you you'll you're your yours yourself zeit zool zur zvesti α11 α12 α_1 α_invex α_level α_limit β_iii γpnas δ11 δ22 δij εij θij μm_1 π00�����������������������������������������������������������������cb2bib-1.4.9/data/regexps.txt�����������������������������������������������������������������������0000644�0001750�0001750�00000010336�12045517740�015735� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# cb2Bib 0.6.0 Pattern: American Chemical Society Publications article journal volume number pages year title author abstract ^(.+), (\d+) \(([\d|\-|\s]+)\), ([\d|\-|\s]+), (\d\d\d\d)\..+<NewLine3>(.+)<NewLine4>(.+)<NewLine5>.+Abstract:<NewLine\d+>(.+)$ # cb2Bib 0.6.0 Pattern: PNAS Table of Contents Alert article title author journal year volume pages ^(.+)<Tab1>(.+)(PNAS) (\d\d\d\d)\;(\d+) ([\d|\-|\s]+).+$ # cb2Bib 0.6.0 Pattern: Wiley InterScience Journal Abstracts article journal volume pages year title author keywords abstract ^(.+)<NewLine1>Volume (\d+), Issue.+, Pages ([\d|\-|\s]+)<NewLine2>Published Online:.+(\d\d\d\d)<NewLine3>.+<NewLine11>(.+)<NewLine12>(.+)<NewLine13>.+KEYWORDS(.+)ABSTRACT(.+)$ # cb2Bib 0.6.0 Pattern: ISI Web of Knowledge Table of Contents Alert article title author journal volume pages year abstract ^Title:(.+)Authors:(.+)Source:(.+), (\d+) \(.+\): ([\d|\-|\s]+); .+ (\d\d\d\d)<NewLine6>Abstract:(.+)$ # cb2Bib 0.6.0 Pattern: DBLP Article article author title journal volume pages year ^([^:]+): ([^\.]+)\. (.+) (\d+)\(.+\): ([\d|\-|\s]+) \((\d\d\d\d)\)$ # cb2Bib 0.6.0 Pattern: Nature from Fisrt Paragraph article journal volume pages year title author abstract ^(Nature) (\d+), ([\d|\-|\s]+) \(.+ (\d\d\d\d)\).+ <NewLine1>(.+)<NewLine2>(.+)<NewLine3>.+<NewLine\d+> <NewLine\d+>.+<NewLine\d+> <NewLine\d+>(.+)$ # cb2Bib 0.6.0 Pattern: ScienceDirect article journal volume number year pages title author abstract keywords ^(.+)<NewLine1> Volume (\d+), Issues* ([\d|\-|\s]+), .+ (\d\d\d\d), Pages ([\d|\-|\s]+) <NewLine2>.+Copyright .+ Elsevier [^<]+<NewLine\d+>([^<]+)<NewLine\d+> <NewLine\d+>([^<]+)<NewLine\d+>.+Abstract<NewLine\d+>(.+)<NewLine\d+>Author Keywords:(.+)$ # cb2Bib 0.6.0 Pattern: ScienceDirect (Keywords: instead of Author Keywords:) article journal volume number year pages title author abstract keywords ^(.+)<NewLine1> Volume (\d+), Issues* ([\d|\-|\s]+), .+ (\d\d\d\d), Pages ([\d|\-|\s]+) <NewLine2>.+Copyright .+ Elsevier [^<]+<NewLine\d+>([^<]+)<NewLine\d+> <NewLine\d+>([^<]+)<NewLine\d+>.+Abstract<NewLine\d+>(.+)<NewLine\d+>Keywords:(.+)$ # cb2Bib 0.6.0 Pattern: ScienceDirect (No Author Keywords) article journal volume number year pages title author abstract ^(.+)<NewLine1> Volume (\d+), Issues* ([\d|\-|\s]+), .+ (\d\d\d\d), Pages ([\d|\-|\s]+) <NewLine2>.+Copyright .+ Elsevier [^<]+<NewLine\d+>([^<]+)<NewLine\d+> <NewLine\d+>([^<]+)<NewLine\d+>.+Abstract<NewLine\d+>(.+)$ # cb2Bib 0.6.0 Pattern: IOP Electronic Journals article year journal volume pages title author abstract ^.+ (\d\d\d\d) (.+) (\d+) ([\d|\-|\s]+)<NewLine1>(.+)<NewLine2>(.+)<NewLine3>.+Abstract\. (.+)$ # cb2Bib 0.6.0 Pattern: PubMed Search article journal year volume pages ^(.+) (\d\d\d\d).*;(\d+).*:([\w\d|\-|\s]+)\..*$ # cb2Bib 0.6.0 Pattern: JSTOR article title author journal volume number month year pages abstract ^(.+)<NewLine1>(.+)<NewLine\d>(.+)[,>]\s*Vol\.\s*(\d+),\s*No\.\s*(\d+).+\((.+),\s*(\d\d\d\d)\),\s*p{1,2}\.([\d|\-|\s]+)\.{0,1}.+Abstract(.+)$ # cb2Bib 0.6.0 Pattern: JSTOR (No Abstract) article title author journal volume number month year pages ^(.+)<NewLine1>(.+)<NewLine\d>(.+)[,>]\s*Vol\.\s*(\d+),\s*No\.\s*(\d+).+\((.+),\s*(\d\d\d\d)\),\s*p{1,2}\.([\d|\-|\s]+)\.{0,1}$ # cb2Bib 0.8.1 Pattern: PDF Import Example article journal volume pages year title author abstract ^(Ars Magna), (\d+), ([\d|\-|\s]+), (\d\d\d\d)<NewLine1><NewLine2>(.+)<NewLine3>(.+)<NewLine4><NewLine5>I\.<NewLine6><NewLine7>SUMMARY<NewLine8><NewLine9>(.+)<NewLine10>.+$ # cb2Bib 0.8.1 Pattern: Example with Multiple Author Sets article journal volume pages year title author author abstract ^(Journal Name), (\d+), ([\d|\-|\s]+), (\d\d\d\d) <NewLine1><NewLine2> <NewLine3>(.+)<NewLine4><NewLine5> <NewLine6>(.+)<NewLine7>.+<NewLine10>(.+)<NewLine11>.+Abstract:(.+)$ # cb2Bib 1.0.1 Pattern: JCP article title journal volume pages year author abstract ^(.+)<NewLine1>(.+) (\d+), ([\d\-–\s]+) \((\d\d\d\d)\);.+<NewLine10>(.+)<NewLine11>.+<NewLine1\d>(.+)©.+$ # cb2Bib 1.2.0 Pattern: PROLA article journal volume number pages year title author abstract ^APS » PROLA »(.+)» Volume([\s\d]+)» Issue([\s\d]+)<NewLine1>.+([\d\-–\s]+)\((\d\d\d\d)\)<NewLine3>(.+)<NewLine4>.+<NewLine10>(.+)<NewLine11>.+<NewLine13>(.+)<NewLine\d+><NewLine\d+>.+$ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/data/contributed_re.txt����������������������������������������������������������������0000644�0001750�0001750�00000017531�12045517740�017274� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-------------------------------------- cb2Bib Contributed Regular Expressions -------------------------------------- cb2Bib usefulness increases when having a set of reliable regular expressions. It can therefore be interesting to share one's favorite regexps among cb2Bib users. If you have a working -which does not mean perfect- regexp that could benefit other users, please take a moment and fill out the RegExp Submission Form. These regexp will be included into the cb2Bib distribution, as received, without any additional editing. Interested users could then copy/paste needed cb2Bib regexps into their own regexp file. In this way, no much of anybody's time and effort should be needed. To use any of the following regular expressions: - Launch cb2Bib - Edit your Regular Expressions file, Alt+E - Copy and paste the desired regular expressions - Save the Regular Expressions file ===================================================================================================== NOTES: browser [[pdftotxt]] comments [[Regular expession to extract from PDF articles]] Submitted [[L. A. C. Silva]] ----------------------------------------------------------------------------------------------------- # cb2Bib 0.9.2 Pattern: GJI (Preprint) [Geophysical Journal International] article year journal doi title author abstract keywords ^.+, (\d\d\d\d)<NewLine1><NewLine2>.+<NewLine3><NewLine4>(Geophysical Journal International)<NewLine5><NewLine6>.*<NewLine7><NewLine8>.*<NewLine9><NewLine10>doi: (.+)<NewLine11><NewLine12>(.+)<NewLine13>(.+)<NewLine14>.*<NewLine19><NewLine20>SUMMARY (.+)Key words: (.+)<NewLine21>.*$ # cb2Bib 0.9.2 Pattern: GJI [Geophysical Journal International] article journal year volume pages doi title author abstract keywords ^(.*) .(\d\d\d\d). (\d{1,3}), (\d{1,3}.\d{0,3})<NewLine1><NewLine2>doi: (.+)<NewLine3><NewLine4>(.+)<NewLine5>(.+)<NewLine6>.*SUMMARY (.+)Key words: (.+)<NewLine1.>.*$ # cb2Bib 0.6.0 Pattern: PEPI Old [Physics of The Earth and Planetary Interiors] article journal volume year pages title author abstract keywords ^(.+) (\d{1,3}) .(\d\d\d\d). (\d{1,3}.\d{0,3}).*<NewLine1><NewLine2>(.+)<NewLine3>(.+)<NewLine4>.+<NewLine6>Abstract (.+) . \d\d\d\d Elsevier .+<NewLine7>Keywords: (.+)<NewLine8>.*$ # cb2Bib 0.6.0 Pattern: PEPI New [Physics of The Earth and Planetary Interiors] article journal volume year pages title author abstract keywords ^.*<NewLine1><NewLine2>(.+) (\d{1,3}) .(\d\d\d\d). (\d{1,3}.\d{0,3})<NewLine3><NewLine4>(.+)<NewLine5>(.+)<NewLine6>.*Abstract (.+) . \d\d\d\d Elsevier.+<NewLine11>Keywords: (.+)<NewLine12>.*$ # cb2Bib 0.6.0 Pattern: EPSL [Earth and Planetary Science Letters] article journal volume year pages title author abstract keywords ^.*<NewLine3>(.+) (\d{1,4}) .(\d\d\d\d). (\d{1,3}.\d{0,3}).*<NewLine4><NewLine5>(.+)<NewLine6>(.+)<NewLine7>.*<NewLine13>Abstract (.+) . \d\d\d\d Elsevier Science B.V. All rights reserved.<NewLine..>Keywords: (.+)<NewLine15>.*$ To use any of the following regular expressions: - Launch cb2Bib - Check 'View Tagged Clipboard Data' at the context menu - Go to 'Insert Regular Expressions', Alt+I, at the context menu - Copy the 3 lines of/to the 'Search RegExp Pattern' - Enter 'Search Pattern Name' - 'Add RegExp' - Copy the line 'Test example from cb2Bib clipboard panel' for testing ===================================================================================================== NOTES: browser [[Mozilla]] description [[Physical Review archive - PROLA]] comments [[Bibtex code is available for _new_ Physical Review articles (publish.aps.org) but not for the PROLA archive (prola.aps.org). This is for PROLA...]] Submitted [[martint on a server called phys.au.dk]] ----------------------------------------------------------------------------------------------------- 'Search RegExp Name' Physical Review (PROLA) 'Search RegExp Pattern' article journal volume pages year number title author abstract publisher url doi ^(.+)\s+(\d+),\s*([^\s]+)\s*\((\d\d\d\d)\)\s*<NewLine1>.*Issue\s*(\d+).*<NewLine2>.+<NewLine3>.+<NewLine4>\s*(.+)\s*<NewLine5>\s*(.+)\s*<NewLine6>.*Received.*<NewLine\d+>\s*(.+)\s*<NewLine\d+>\s*.\d\d\d\d\s*(.+)<NewLine\d+>\s*URL.\s*(.+)\s*<NewLine\d+>\s*[Dd][Oo][Ii].\s*([^\s]+)\s*<NewLine\d+>\s*.*$ 'Test example from cb2Bib clipboard panel' Phys. Rev. C 49, R1737–R1741 (1994)<NewLine1>[Issue 4 – April 1994 ]<NewLine2>[ Previous article | Next article | Issue 4 contents ]<NewLine3>Add to article collection View Page Images, PDF (882 kB), or Buy this Article<NewLine4>Excitation energy deposition in central collisions of 40A MeV 40Ar with 232Th<NewLine5> D. Utley, R. Wada, K. Hagel, J. Li, X. Bin, M. Gui, Y. Lou, R. Tezkratt, J. B. Natowitz, and M. Gonin<NewLine6> Cyclotron Institute, Texas A&M University, College Station, Texas 77843<NewLine7>Received 8 December 1993<NewLine8>Excitation energy depositions in the reactions of 40A MeV 40Ar with 232Th have been determined from measurements of neutron multiplicities in coincidence with mass identified heavy reaction products. For the most central collisions the derived excitation energies of 880 MeV are 200–300 MeV above previous estimates and in excellent agreement with momentum transfer systematics. Heavy evaporation residues are observed for these collisions indicating apparent dynamic delays in the fission channel of (1–5)×10-20 s. While a massive-transfer simulation incorporating preequilibrium emission is in generally good agreement with the experimental results evidence is also found for strongly damped collisions.<NewLine9>©1994 The American Physical Society<NewLine10>URL: http://link.aps.org/abstract/PRC/v49/pR1737<NewLine11>DOI: 10.1103/PhysRevC.49.R1737<NewLine12>PACS: 25.70.Jj, 25.70.Lm, 25.85.Ge ===================================================================================================== NOTES: browser [[Konqueror]] description [[Siam Journals Online]] comments [[Thanks for this great tool! I am using it since a year, and it works great. The example above is from http://epubs.siam.org/SISC/volume-24/art_38257.html, and in addition I have the following entry in abbreviations.txt: SISC|SIAM J. Sci. Comp.|SIAM Journal on Scientific Computing]] Submitted [[gb at ithe.rwth]] ----------------------------------------------------------------------------------------------------- 'Search RegExp Name' Siam Journals Online 'Search RegExp Pattern' article journal volume number pages year publisher title author abstract keywords doi ^(.+),\s*Volume\s*(\d+)\s*Issue\s*(\d+)\s*<NewLine1>pages.*([^\s,]+),\s*.\s*(\d\d\d\d)\s+(.+)<NewLine2>\s*(.+)\s*<NewLine3>\s*(.+)\s*<NewLine4>Abstract\.\s*(.+)\s*<NewLine5>Key words\.\s*(.+)\s*<NewLine6>.+<NewLine7>DOI\.\s*(10.[\d\.]+/\S+)$ 'Test example from cb2Bib clipboard panel' SISC, Volume 24 Issue 1<NewLine1>pages 312–334, © 2002 Society for Industrial and Applied Mathematics<NewLine2>An Inverse Free Preconditioned Krylov Subspace Method for Symmetric Generalized Eigenvalue Problems<NewLine3> Gene H. Golub, Qiang Ye <NewLine4>Abstract. In this paper, we present an inverse free Krylov subspace method for finding some extreme eigenvalues of the symmetric definite generalized eigenvalue problem $Ax = \lambda B x$. The basic method takes a form of inner-outer iterations and involves no inversion of B or any shift-and-invert matrix $A-\lambda_0 B$. A convergence analysis is presented that leads to a preconditioning scheme for accelerating convergence through some equivalent transformations of the eigenvalue problem. Numerical examples are given to illustrate the convergence properties and to demonstrate the competitiveness of the method. <NewLine5>Key words. Krylov subspace, preconditioning, eigenvalue problems <NewLine6>AMS Subject Classifications. 65F15 <NewLine7>DOI. 10.1137/S1064827500382579 ===================================================================================================== �����������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/testPDFImport/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045517740�015307� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/testPDFImport/nomeaning2.pdf�����������������������������������������������������������0000644�0001750�0001750�00000074253�12045517740�020052� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.2 7 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] >> endobj 10 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R /BaseFont/TKGDPV+CMR10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 13 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R /BaseFont/AWUTTI+CMBX10 /FirstChar 33 /LastChar 196 /Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 575] >> endobj 16 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F3 /FontDescriptor 15 0 R /BaseFont/QADBYN+CMBX12 /FirstChar 33 /LastChar 196 /Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] >> endobj 19 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F4 /FontDescriptor 18 0 R /BaseFont/SBJCEJ+CMBX9 /FirstChar 33 /LastChar 196 /Widths[360.2 617.6 986.1 591.7 986.1 920.4 328.7 460.2 460.2 591.7 920.4 328.7 394.4 328.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 328.7 328.7 360.2 920.4 558.8 558.8 920.4 892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2 657.4 624.5 854.6 624.5 624.5 525.9 591.7 1183.3 591.7 591.7 591.7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 710.8 986.1 920.4 827.2 788.9 924.4 854.6 920.4 854.6 920.4 0 0 854.6 690.3 657.4 657.4 986.1 986.1 328.7 361.6 591.7 591.7 591.7 591.7 591.7 892.9 525.9 616.8 854.6 920.4 591.7 1071 1202.5 920.4 328.7 591.7] >> endobj 21 0 obj << /Filter[/FlateDecode] /Length 1581 >> stream x}WKs6Wh&I6qӉiz$HF*@I}E�o_"Mt_rx-)wŪN<~aRJw^G"OTH5YUT*d%Zeʹd Ȳ)P$+D*&+F;}^VTInn*Tus̟/ɳ,O"y(x,WYVKğOoYUE=ERݽEL\Z͟k&+Y.2 n%HhbE&I^eU0#ƣ\'9/A.d:1IIDEJ=RɄ3`"J_]c4٤ǡ Γ,F)q_ΣWV"FOo:lFpHS[f~#E&mM8'Y˼@VG�*r EřxNUe#v]fYUF95IQd=�0ƣ  vw85AAMw.څ'18 tKzЫ IՕ^-į=)k`|8,1vcRǣRi0l,k<, Tڍ`9LgO2UvBS@-o#bl%\&S RS/6\qxc 1>j:js1-at+]�LMBьp~"u43f6  [%~&F06JI 4 (pӍPma&bF#?'>k$5 IyqI#6i@ $Lǫsz8J*FڝVRP̚{M|Է�j} XophzCFqK]Gz$`9rP5~v[b,Ԭpcx^{l2%nxձBwjFЃ+P jďCヌN:a=ȇaE5޷'m&>Xx%++(ʱņ+*C<m�v*@{&]tud*vCj U&~<y$Vs?*JdHhKDΞp@,-u:n n(`q6}|œ&9 @e</`hDw]"q|.p!mlРZo&#.< e)FsӛAl{䔅)ģP8)pu.*|G,dUu�3FBYʏ=`)u? ;h[Tk㭱Oҗn?vJǜ er9 CQi!"D ;˲ %顚P1>Eaq @,*KńyrW�t�6hfu4R�s|9DKx3�33#"I#Z>s%zuOJ7URWOJ`/쎍ypb~ku.~* endstream endobj 23 0 obj << /F1 10 0 R /F2 13 0 R /F3 16 0 R /F4 19 0 R >> endobj 6 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 23 0 R >> endobj 9 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-251 -250 1009 969] /FontName/TKGDPV+CMR10 /ItalicAngle 0 /StemV 69 /FontFile 8 0 R /Flags 4 >> endobj 8 0 obj << /Filter[/FlateDecode] /Length1 720 /Length2 11503 /Length3 533 /Length 12060 >> stream xePᶦq,n%Cp8۸;A[pw'{p9gso=zUS*1ٛ�A`FV&V>*+ E R h I|�V^^6ɆH wphiLA�c%-@ `�Dmmx t:͘YYfV`  s{�f.Yr:9d0#2+R.vG[\@' R-fV.v^ 62Y,JY9KY͔�sc[g?@ٿC?%5YUT6=Ƭ3'+w.=soILͬ@�51JL݋wXXx\>Rd*daaeg sVMThNiVY ˩h^4mW췤^kA|h4<xa L89y$Qs񚅤h@ojNaBy!e)ф7+Q`)/Wj[VtyI^DB&ut55kucoͬ{n!2T)kNcEO{ bcY+J B_G>#W4oSONft3So},8ot?UX.)<h$ =? R5Wѕ$22GȒ .qZNj~Cqm>i~g)ElxPxTZ((*}O2omkOo!5:C<=`Z N&d^ MDBiCd8cLa:^ @<-Wcɚ|}Ψd(N `DZAw f0He*5Sd==a[+wIY ziڟ7fj)@�SvRdN2ÇxB1Q%+_yu-.!f;(XL܎HUVM/dm� ßu63DA7_Iy&夺(Zlov0u&9p<@}zQo$}.?)ۃQ~,ՏYjϪ"H㪡E]^iy#^7^/;,% èAtڃFX K`\h'(ǼOO#.Z~4U{ 'I`b&(O&%-6 s je zeN{<2#JUݻw t�BFph 0̄OfO:{Os:PRN-OVGH[5=EY?LEHᦻ/FTz7H1OgI#H+OJDoY cZأ,x` Zv# FAImf*c@Z9()ɶۼyWޕ auU)RjU]^+TA34VK$={ތ+ns/ EzUis|�KD36c^_ɑ1J=lO4S!j^@fOڕ^P|g;6CƝT9eo:@'Rk@BNu RQp~c}* fFœ~T'lztYDQuM{ א/:b7hdhMV<Yf"bFz' r;6Y$8n*Kpѻ-qnΣ)k`Hi_PEAuJKƠwpqtG=JS?6F/,קv Kkq*,%[ZsWn*jtK(t0?_oY T?LB`"[a򴛆A5p]<NO@m j\t~eH8|OS < rcܤy#ӿD`@/lJ0{ WOZhgF!c(زw9MU7ᅢ t!"ý td0xbXh|;bpMbL<_� 2kAՁe[?;,H9PLs3D/0w{ۛw VUD|nH[A^;5dx1P`;|,aO&Nt+IU3P똺%} #ö07v&#HDo%؋$Qܐ *COB,dLzp-=7 lXE\qbܒW.-+8sW:n;k:NjM.'#:.qgZB o;6dw;-;r@\z(a jxQ^"9f gjv1Eve^F@q0HMkVRjtz31յdyj6-vtu*(lS ۖT9#k=s3 7=8lҙ; #ar`t4]AW B8TfjUlV!yI<f1vljZR\_-'Җm(vLj2uM8x |#w:;Q0ΒrCL|-cD6T~2:zsv$5\lDx^G%B껖MW;WXb[t1)2yȋ(..e"0 lyjct9{NMy'E@#Xx n0~ׁ1Yܱl(9LW~'l'Zu%D~]̃( 佒޸舟/|Z vد0Aҡ9c6OPHg.wg".q;[BArn+UOwxDUiqor ^"mv5$a޻lST ur Oߦc`f KA8 l!_wk\MI "''sMSH.?|W'Dďʓ!JchUOx?W 8a2uGd׌ͬ"0ڌew{UFr 0#PMOQιY�qPdNv.2&5/[믶$lr(age Ú`j\:c$E}t7ed2x o”s$*%x &g)O *8ARthpIdLFjheuKtbRmZ<*{8lAdsxjD"7Q@5hr>y)9ym3#% J@T}S-LISsmn3"--uEX~T"+q+gV](zngImE U haP,3s(_beR4phr ]$O$-%4b ^=,Y}U<^>Wpqӧ_\?噦]Mו yn D)ݟݞZM!]cAe.m*8kULΌ#w+ O%b&S{lo<RV*Z ̖)]SRHQ;֚fú՚ᆉ!O!u W[n emR_L_ dtDK}ZcGB!{7y|O ";ˇPql "7e0ΩUKMhhVD2X"0k!L38 gD&Z#s7>U~>@[ هI q%H^}Mg[~�kmo…oGg d{ý`ibēF:+^4Б1sjja΢|;d*VB5T`+75ѐʽO(|C &KN ݑ-! OGy=˖\<v~eW~#Ǘ`--uSB@vg[I* Oү\sA1IxspY"j c ck c~Gρ'7ݞ<\ƺ3I3P`eL]s$YёNs=MX+ݝfNZ1D'<:7„Ի+i|F֡ ͘d_J؍&{o*vb- :.+,nSVbV?ػB9=Yb|[*CW|*8SD&S1 u/(]+:{Eް4v.4\]%2 : }B"\^s `86vOJA{tk`�1tK^Tu1Y7Y] RIe(* @tu0Tʃ.C%* bZ2\t6 dzUV^ԛKaxx5gh,i٘č;tX2^ú/6{sM;^q;UWۣt :2rowYK8Om.4 ( A6 𝐸ir7(_+I7 K5JESKK*47ZU 2oCJ-%:Uro*8Xi 0CY ph Pc>z2J=RU\uŵ z KPMiA!+pז5@1kA!AG,?6�9.$3XUزxLUuE6,)7ħմY8ұu+v<yFq(i94 Dp@ OGO %_[%ljnu?0hucw'ջnA]z&$oTt^ q]: pXIfߥ7ۥîLzH'OstK] [FkDR \CE.ݳԪ,rw/�|iXùn;rfL@ZX{(!>zrfSck$>-S>&Ld�IapyX1ls4uyptm! <9.V;]-%~s@ vL>"lcNkZMmsd{y\|Kl[UBڷy2MU~BZrǟ~!ON=cZ'RwStް8"Z̞-^IcN>og@BD+$~V{͑k}N.ث bmF?2#1J!H3.JS-ʀ?F| ޾xW_,S_ۖl837ܝ.HԻ"#6 [u44)09o+S<F ׁ ;7f%df̾Hpw,Ys-ۀ|7Kv5`Cox"&̓?MR#S#$O('#X!c_i$͜Di\w*ն g g hb?ٙ'<If88;;[%,;1AOR7Ftܧ +&794+]D4C}ͥ[rDm$EFqBXXm$DMD�DL9e2Q/Lu#[Ur SWMJΔ ArF ze+b6V K 6MOs5Ha<_n~ocp%q=ӵn%@}<'{GC|.~F<kfh3`}>#_W0 qQP5K"[7-Д 33>5y>rpbq~<ZꟉ`B,/ ]".ᲁ(YXֆE> vrlm0s& S$|z>uQky|QymLJ/g+=s!]Q > &NJB䇁Qs70.6H (hj�Eա�%U'+u?dh84 N*GdGLB Rj&*VDzYb k8 ~ÁOL8Xb3FJG!$$OYOkV2mv h 2aq1]ÄK!,(.;YK)F\C]B3\HNDFmԶ`;8 zYUEǚORW|yϚ dYOa*/dģYpFruOzd2{^Q7hꡥO'hR ZǽcGu~^"?Syĩ) Q/d0r2Q;U,j  8IE+M H}8ӟ ,]8A!*DϿE9LFSKQOCe̟k#a.|~<VD̏[د63r}ىKh߂t.#\X4rD͈T FJ ԥ؃! 'p)'obP窿Bi)m^µكݩǁ5cºk6˸\AMeZ"4RBif-Q ꮕs5. ݌.H>$-*_" )'- O^kQxt{cl_ RM]ed3Ogs20zw5x:VK0-Sw  c7~.M 2_%š\1A֟.St�iD~KGr!uU<ܘًGT)klB 3s}uƢ> MUak鼚&a!$/=( 1_#|YKF;rYW%Ї7ݙ.sѧ{%o yT vA0Ec[QkyrCv8)VD( otb1IoDت҈웡;;Ã)4Ǔs4{d9Bleu~Y FAG拰 90153yGlɈRsU NH{(eM0,.?_,3+ցGy>5 )pt gw=D`[mZz[Ue%"NI Ic}egwg-F�54 8>@5VrݬJ�#uMr%ݖ~bk켁9|uD:xll)"[zK:GY-st/V֫oe=1 W,ϕ0xk̛M{N?]z^F2c;oS '4[/&({p3nk;ifqw l1 OV#Q=H^Nx1I YRy&WPr|"�#3"^(\pd L7`(|=\ea9#Qb>6uVpjf[3M;`EoWi!hLҬWEyX wV1zD1Sx(2|,kl>Dҥho{Q s1-Dd�iMNrq.8#1<hy=- ,][ӳCcxKmv4 [D<htOFK]ߙb$B8/%%dXW0|ԕia{mp"k?C<v޻ -oJE8$|_Y0 T3{x0{bɚTy1Hr/(pZ@@"/uZĘ6' Ԝf_:yH"BQP˄))=V1Qz.օZ$}1?B= g=Qo">:ȴE�Rg$~K&[5SHn%x`R/6@%QSR�etƽL.;% AAقRk{ʴpmQ2"D'ԧqH*R>FAs5Wk˕C?$ w<ꂣ֓1FH)@"@K#M e< "+?r}H183о,ցbҹ #BR72.,w1z%!^J G>Ryt@k>gl}&~䒂=W1hdދYه_]BErrB6QnCǯLETs$;LV\b.1`Q{@O!ZP7o_h8[B9mi:jy0 EW1YSvSKQ@w_t bX41_Mh*~YGgo>8N90;U̕X�?h>V,ݴRg@4oKp#@>We;2 l Yfz}!~U|[a\U tjz@8N[-~nQ6Hi|h+l$v$!*rDCg5-{ސ}n#N̲~J=D=ިa !5tX{86Sґ5XjddnlG:+<jni^7dܠ{G6gn7߀Â<AjL<x er۳N_=$EL} :,2AgTqk<3Tyx$D)ֶǼO""dَ-h?)Xqp4nzIuRUIú~hR+.j Ȅ /[:wvBL|=Ig BEȯL s^Ǣ+Yf*c\ yA?*K<w~qxQS,eH>y1l='0z+~Jd7U=L)xw҆RgTt䬮E&|aeΘvz]DCXT o6C-R#73,Yu0Ցx$iF'cN\q[ҼZĐ{ɮã "ջa!#U-\>AQ1rÅ,SJ)F7"o FM"x\}Ts<?]iR ޔWբ`&t\)tY;vĽrs.?l崎WN0@s'vYK5&L)JM!52*iߡbѮv e=ypn2ߤi>U.rJ-tKvͶ +2+C|@_LO*C휥2ķ2&UߓIxj9\7g>~͐*/KOU'O#iGq"<OFT< qq{i7 v;*"64M/*m[-}}FaG72o|K1}g`c.\쏾{>WP $3nn`<cx)Y:̡XypL kiD`"T?iw_dP>mpEy)-3NQYuSA`$%{LAmD)&g5 {Yy1JRC.\&ђGP$^bL ;?MO3 5H]g%4VymT3|7 5 r0.mFO\gP qO$!(acqBд|%LJjl~Ev˗(,[!ELK'U٨+i%HT찱6/9T+i +Fb0S9b3 ).0J%/PõËj]wǭ&�bF߭;(ag5y R37շu!0 ǪlPvdbAP&MG[9}{0@Nzw'?@[%=?~q!~wUаu4c_nQ8:ؐlץfz"У#T"Er5>H?rL4#2B>6!9^U;AytDdG'Bzi<6ˎ̧in$X[a d-^U+ �r 7m z%`rps}o0Ot@�{0,}I'V/(R@�M7FhN4{KMz):v`Go LO$mI? džCpOzrvNtR:N(Գt@-(37>u缯:}�N7M3<g&ݘɸNXgfE!6*eZmYG@.�Sr6m:3~{l/=6 L QY s !ۣ&2tC2:+. )n iٚU]˴{nOSG4O )qT wopD;LT}_[62Ń> I3hה0Ma,׏X+4j,YYyԹ ?4M0`TzNUm'�)B3G~ ^_=z'w23]-:]o[]GĊ܂.o5eOgjq=iWz8Ópqtn-Ծ`k%P%Y}}|]Q܇?t"*tΔNH͵2ٵS?w)D?,>:r6T.y4l#pAB9ߥ^ҧ7Ƅ޻RoȘq+j^Т#G5rUXVc{+_X@r@"MU"X"֦$SʊL]{I DnQ}�" #eo-@; ctֳ^\ܡR'* @Rw60/ѺPzž}x@dh�/{LK=y׹*3&W%.r)O(Qf|u!q$g[`ޑsT_ ECrn̶^~ބ-:=nq,#pQ)&9#FX43څr)%2J&>)kma�ŠeZ{S>EDM \e=a6l2^'fAG'#[F1 atJQ3+&ᆮh@bέS�V"k>jj=YhY5l.=fpAs9bJ7$duz۸̊U$ "D={.dV󑶭3j1a~7F"CHZ\4f l:FJjVUZcH\Ed 9}n*Lf?\Hg{RIʵ4N>ق"IIcB-Z߇KC,≸d%9x._I{:<̿uelGBbGǓUS+Blܘ>;jmy'(5c7[!se;䤍83'/JiOd%b0'c|VGa$ [k&q3%P!HǴ$?=qb3^IBD'ΗfywKa2^nzrxp_ ġFZ%C5>蜛.XB[ QJX/o- logda� endstream endobj 12 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-301 -250 1164 946] /FontName/AWUTTI+CMBX10 /ItalicAngle 0 /StemV 114 /FontFile 11 0 R /Flags 4 >> endobj 11 0 obj << /Filter[/FlateDecode] /Length1 721 /Length2 2664 /Length3 533 /Length 3205 >> stream xy<%#H[ceȘy0Ec4QB,ɖ,eɞl99yu2vz8hD&Q puB 0>DFƀbx2C8�@ާS@d�oM?Tj`z=,�ؑx��z`?) NK<@/<  E$jq@�I* q$B=!~ olnO Xb?/u O]A&SA `AƁҟNopd_ڠG"�T7!? gPsrG~U1x>??c?P/{+?u;C’qx`GŐp R/+#T\U@*^W D*0LM,֟BIԟ7aoĞ` X@0syǡ[ij;SƂN4 >l>;7jzZ>"-,jĨ-:rZ(-)otx*:t5ъ\ߝ/;Q6[PZ{]= 6oj[wiQ>kS8$~ASZ6S6z|L8R$`vgj$wPcΖ0)?A'*-EW{R$y,䳙,Qf[ �V?BX9/^rfl̘wEygw}Yg~Y2aו0ј{}l{*M խjݾg jW-\'钵^3sR$G` Ql=91'q-Y.9z"s YZfFቛO$O@ycW>Wx13ȑgWO*1ДV娓t.֬} A8ou!}/_ ]]6M)]<1(tz6OldW,lPJ?BʲZĦCB4ьsv3{U]ڔ0@//(vP E]%w[HXlx(\b3GOnԿ$th]?L87Lt"ڧf&o[XmXq@zy 4iqC|b@tyyX9 yD5jJV~*G |rh`O�bx˵f72^xnpikuX71GwtIe(sz3&$KUJ~Sg6-v,?~2QitX|,,ݬoBf+YQjf+CR(!q3of771z*ZY 6=P(jIF;G<ͽcT&X0BpKo#p*ρ;Ka_FK 7U"]cn l+!ox|J[+ߪb~>V͛ͯ:6Y&D1b+gf5]8U wH=<@%V=x]͹\ɪ8|%sFcK쌡ٰJ^Z:akn9]7_toi>s$ :ye?~EݵβS|jzk_| ߈l'&)B1AZh:6(l>m1V(+YxA-r`w[*x6dMizXIN<|#ꓻ1.“9KuR4؉/"w6`LvT;؋%ʷ&"KnUGl;О)R-ģ* #\3-r4l/ʣ4_4pm#YX#$V'L? Jgٮh= }w?fYyƮV0_nI]�yS|%dGgsK,qE$<~P.g^EgE#>ȯ~2]Oqᄩ[Zރ}&cP/tT({h^ا.8b+@AO5soX{VAeQ-oxv\1OAsޗKɬWpB‡+2Wp8ի2e鸚3%Chs_Mn(V h&K,FEhT3.ț /njZ;*p$$Ay1s MNKRΨ2rN}g1Tɼ b4~GЧtVou.67f4=oť&xJ{p.W3dIihJ]Žү^YO\,HFj*N SWW߱>lҫmң3М@Vu] E?T)ggJ9�{;K;s&sSI6>2Rd7,`!n[;<wN:](cۣ3;;(3]nM b#*#m)s\LQ@)vSx.5kgLshoYX68 ;0L@WgȩWX~Ect9Ok(}gt>T?j;e.PC7U)QLaQpH$r,uԻӱB-;1`mwϼ}QՎO*)( $_**j \Z%W?_P5qEP4, H\A^L�;=GL=4*iN2Pt}p<u_C\Tgm^Xu!2:ѹJ3ɛ?QCV5KjKy J04ͳ.Kidv/譠[BuxSL.mC>3ujЇ)3SvoK؏ocCĭbtD 2)h|BAJfNH's\>LDn0]-p UҒpe6eЇ 㝾+zWtȋiRZj 62; ,Pd"C endstream endobj 15 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-53 -251 1139 750] /FontName/QADBYN+CMBX12 /ItalicAngle 0 /StemV 109 /FontFile 14 0 R /Flags 4 >> endobj 14 0 obj << /Filter[/FlateDecode] /Length1 716 /Length2 2094 /Length3 533 /Length 2627 >> stream x{8T]"F[ܶ0CQ&ߊИY̘.ƶPD"˶crO%亱rT}>w?w-C0S$005;Zp9 dC  �L�83=l< �d JjO.}4�`!X p&c �D" pi 5iA #`/G A?AYd@ |mT. v)qd@<Dێ; e շAD&SE : :Hl8J~3#6ƚ!$?"H%!9X�!:H}�ڎhSv~/] DwaPd\#YﮇJ<Zp8b׸{}f KH~3CaSC`H]�D�. GѕD �> *$?ov )NєX;Ы^�͟OC|Ѳ$@zCTY~9 5 Gֽ Ck< a\ `2d7\RtHVoWue^$,^!*(=c0rӉkŧ'M-yv6~4I8Lds5([x΀\9ԊiTcVVRt^We89ҟdN[)>aJiR7 *寳ZP| *ZZڊ&.NJtOIF(eI/!mn%^�NۋI=:7YP5/D~h( M}g<U̮vm+mt)O/A|Xb$T*s^G~P6"z8i|2=ڒ=(Ly~, /NVlP ~#8:8ZnmhDΎ<1&&Gy%0S嚍L-gOUcH~#]2.)BZrx ԡ&q |#Sˇo>sՌknMl6H7s&U.\-L-)hT84mԤ{xJ-/QG?&*Rˤ<N#M-Ry/g�n]`z gX0j& %s%2j,}zrN T&o[c؄lfk=KGƸ/imeGqZ=ɘXRP2#_t2*=E\ ¶ܻ^yO?YF&{\~[b8nG^b\ظY`C䨆P[=7faiMy먉UQYٵ" 3A.MTM|%GnannVx6K'fu6TK/]WeB+d%P#2a,w;sb`NxڳV-_%sܾ*s.yfvO3iI<#]~=d+QQ;w|)ɡ|uza8.} bE`C~^<1MАͱZ] ﭤ4U<V<r;|OZg*J$`$lWMr+cB;;;4Eoh=Ej <u⎳f%_& e\u2jμ4]}<=Nkx,@Ў9?yo ~z4Hxr6|hֽ .fӂ˔ٞ87joxxd}j2Sv.[of,pv+z Pw}Y]C} W2]%unJӜB&яt5k޹:[GW.΢!'#n 3nE 75z>>C 2iYeRirF~v#Y6eS#:\ADΟ/~ج?SwC(P!!QN.ЧҠ%"Cci9i>1 w\qgT#,oN\ u�* B?~?%¼kh4N.69ntkZt]WϪ~|;|{٥,~f]٣٬䴶&DBt쀭<@c_b:]\Ri qz22QL$z*g7Z2}dӆnhЈ^xP.Hyxմ1ig}( i; Om}[QNPN5ؗyӰd JLbP`HQq lNXdR'o_|Ei tNw_Cwm/ڈMbAժضz^+1;,TR[CYpD ;vsXI䚌Ht; dLܐ[!}ܷu׆Tˈ//'DC0Գ?�M endstream endobj 18 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-58 -250 1195 750] /FontName/SBJCEJ+CMBX9 /ItalicAngle 0 /StemV 117 /FontFile 17 0 R /Flags 4 >> endobj 17 0 obj << /Filter[/FlateDecode] /Length1 713 /Length2 3449 /Length3 533 /Length 3993 >> stream xy<ǭAvH샱2fgfӌX&I4V!ɨd %%J(&d)KY⧞<u\sJm P+h$R�i!@@BBD#HABkA APY RRQR�@LxyҐ\@4D70mH DV� p8Wh41R��@ $0x/&(ޓ�TSF D҇灇(GО�E+4!뿡{I�gkOh#|08>$4hI@[p%!p *)aM0hCBz=8oGpkm f?pO%;w p9DL0YIAI th<zr0c<ཀ6$ -А"�+H T+WJJJjUd�Ɠ~F#Y0rͯ:3[45v›ёX8<Cډ[nmdp;AzMs'&Ŧt|s, Fm!&T Tlcxŧع:-k dl#~ʉ$L/'B%rn]_.lKOl*u9s?V>ܳ$XjC ӹF``R5a|ӥ,1fʹB֞cs\d//\PG ~4 =T[JTT;ta/ qΔ}Nkڲ>OOAqS[S8̩jUׯ}pNvzq?&MO)Rt)eK9HC Fj*#I7m;C*H[wxZ>!xCJo(P w P܈p) UCƗhVnwڪ!X$m)duc@;*Ǧ>~/#_T|b.l媝v* =$[/?iS\2F6>VmmI5Qtşm'XhmGTa YK}͆l+8uH Ɯكy~)G(m2ZVbA &,R40jW'g3d}^lFj8'~*3Jci_!܄;do9uVoU_CleQILUOOfUJ>\hW;}jSpږ$?;\@o%FkTz*�a tG&>>;JƇ-?g{ʆ+"[r+φqԺꘀL,%h:z '+-G/X9H@nwP_CMG'_)yJ j_r׍nn飲W.Y<~3e=[ p 3wp;.KF)ȇ?S։0n#i8~JV�'1c20sُM 9*4Bk-:OX Y3Lh=y/uzXi,]Do gZwγǗ\JrC&C<D2F?gHMH՛܈,ˇ*|R[݉eB͔Cܴ,!bM;@,7ޚ,6.&p+N FD ]  k1}{]cM* 쇹y `~ ^竉IEWK; 2{<4Z4"di1W灥9BykHGzWv×JL$[9Ba;kGd$Goz}~0.Iwf%9@k$UepqUVulJҴߺ+ UdA}X$}oﱈm?MfG4~|Kv e1_skQЍtx{γ|]18ģn)kKy*PLj8SN2곱|'Tqw}T!p_4GB⯵8INĮ#NwHLT /uTKs:qζΙB0ZmF^B`2qʭP K_Eujv<W@= HᆲR;#ԛ>V98L;% vDwo2Nѳq׌ 8c]IdLy7<OD8IlKYJ3)'Fl!jn@xɓc[FF6;a1\XcOª*yO @sI6Il_̳-P{]R&:bZEț|-F'V(vV `;|FC iM# PݜiS}9h̆ M)V߮ .})y<-qZc3}M5+F.Wt*e+Ty Gَk:u~e rvWSv;>FcX>![A%?K92vf0γ:y>!yfGڕn̞<Q!(yfw8p& /RA8%CKl 0c%vdfK`tU~iE ۧ=+峂TtXZF6gl&Wެ-  M2t|lܙkif$t9q FoHMQ\Xࠉ׮y /;ⴰTekm񠌯;e!:2.md弲9c7M`2>@roVTbV8iՓo!q:cccu>W3ikTݛ쪞LF߆hwsn>m/4d(A^#/6lEVa.hV*/_C%ԙe~)7޵1,U(SΑfE>HM:!=lc4|엎y8|4Qxd @*E/ri;jKHAf"#I}QmeȒ(kr)Շ~q7 oL NـS85{wIhM$7&"9Z0+ &ځ3eɫ,'`\4[DϬD$|[<΁J gn80C$٨Lx RƖXhZ!B /gI`K9ԭ$#^)]6^{yaVx%%Of}ǑⶅY!cƛ bZ/$kU gX|>SrrhmVL#na(1:<SX~wJ-.<360G@*[-s$J> ¢f8~Luzxrz%Z5)? p;�ʻ5lM:/d>fgÉ8caw %+=`x,XCO^,\t`~뇯=x,ܼ/ bg*苙=8_B6 }$d= )ZsQH%a eyѶnw C=ժ}DǠ9^ގc,IBiSceX<'2|0Ș^?/63HجW}%3ѻu>F<"RwOx1rv n|WTB.J&ar#^;7UJ vIp >F͗O)*blF%;mWjWYi֎�g$YƯNpiZRsjiڨXT RTJ2fHh#җkuIICuvdF#(8'-AS3Ud-lj{]ゑsː�$ >"� endstream endobj 1 0 obj << /Creator( TeX output 2004.10.19:1439) /Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate(D:20041019143940+01'00') >> endobj 5 0 obj << /Type/Page /Resources 6 0 R /Contents[20 0 R 4 0 R 21 0 R 22 0 R] /Parent 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 1 /Kids[5 0 R] /MediaBox[0 0 595 842] >> endobj 20 0 obj << /Length 1 >> stream endstream endobj 22 0 obj << /Length 1 >> stream endstream endobj 4 0 obj << /Length 33 >> stream 1.00028 0 0 1.00028 72 769.82 cm endstream endobj 24 0 obj << >> endobj 25 0 obj null endobj 26 0 obj << >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R /Outlines 24 0 R /Threads 25 0 R /Names 26 0 R >> endobj xref 0 27 0000000000 65535 f 0000029587 00000 n 0000030177 00000 n 0000029852 00000 n 0000030030 00000 n 0000029751 00000 n 0000006431 00000 n 0000000009 00000 n 0000006678 00000 n 0000006492 00000 n 0000000913 00000 n 0000019043 00000 n 0000018853 00000 n 0000001829 00000 n 0000022551 00000 n 0000022362 00000 n 0000002765 00000 n 0000025480 00000 n 0000025292 00000 n 0000003711 00000 n 0000029930 00000 n 0000004710 00000 n 0000029980 00000 n 0000006365 00000 n 0000030112 00000 n 0000030134 00000 n 0000030155 00000 n trailer << /Size 27 /Root 2 0 R /Info 1 0 R >> startxref 30272 %%EOF �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/testPDFImport/nomeaning3.pdf�����������������������������������������������������������0000644�0001750�0001750�00000075542�12045517740�020055� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.2 7 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] >> endobj 10 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R /BaseFont/DBSFOS+CMR10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 13 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R /BaseFont/TXSURH+CMBX10 /FirstChar 33 /LastChar 196 /Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 575] >> endobj 16 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F3 /FontDescriptor 15 0 R /BaseFont/TNADRM+CMBX12 /FirstChar 33 /LastChar 196 /Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] >> endobj 19 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F4 /FontDescriptor 18 0 R /BaseFont/GUFCLH+CMBX9 /FirstChar 33 /LastChar 196 /Widths[360.2 617.6 986.1 591.7 986.1 920.4 328.7 460.2 460.2 591.7 920.4 328.7 394.4 328.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 328.7 328.7 360.2 920.4 558.8 558.8 920.4 892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2 657.4 624.5 854.6 624.5 624.5 525.9 591.7 1183.3 591.7 591.7 591.7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 710.8 986.1 920.4 827.2 788.9 924.4 854.6 920.4 854.6 920.4 0 0 854.6 690.3 657.4 657.4 986.1 986.1 328.7 361.6 591.7 591.7 591.7 591.7 591.7 892.9 525.9 616.8 854.6 920.4 591.7 1071 1202.5 920.4 328.7 591.7] >> endobj 21 0 obj << /Filter[/FlateDecode] /Length 1601 >> stream x}WKs6WhƤI$6Iөiz$HF*@I}J"~Ye݂׋WMzq]$M?ŕDJ)n˿~|U2"#R)>>*U7LVjR,(yIYZ54#KT%:M2-")d}_&U_fv/ R6$72?\.[%xzK4{f{ fy!xBzU\ˤhf o%?2|nr')BC FeE{!FƣR1j@d@|S/ e` epMfW|< xs01 RXyG$yS7o_^ZQ@͂$a=U!UC;7f"#9I~ x~,zYBmU('F(* g9(+Vlu˦ōtW++ʛŻ%T<(Ġnn &h>h>؅ը]x=0z/Q'S){k_+o!q aYUB37S"1-B9Q-BipXxXZ8k`[ L˴x$j$JUdk?Y M>[,ňQdp*NfO6\qE<Davi,S\|euji2mXgRIsLvq^ކBaKpȔճajQSdu B"t#7^ω{O3;_Hg^PGNHx?L�'>)20,Њ 4+Q`Q< c.pPm&>[LY0eCN(8&fa>!R鸥5]Dq(!p%ptcYbԬpwSxN{lEFf#IPӦe ݩqLB®B/?W 2j<up0zCXQvw뙨-a;<7^`u4菕cC Txrة�jP"F*ir@Ĕ*]Fc~4ݞZfM@7;[a |,\"q=-z{fm2V3HP!Vz$㬇 ͙'M)�# ` :W04;UDy8L|Et64֛Ȗxqqc "e8?YdɖG΢h쀌qIY4tW0;ƢP^PUW 0c hčl>X0[hwcW$Хn29I%J*Kr9DoH!gm,>{ȣtgF ; %!ۘP1:@3v_t'epC�l�lLu0s3|9DKx3�33#Qi¿*#8}JK JJp/ ggcOz ׸rg~cu:%./ռ endstream endobj 23 0 obj << /F1 10 0 R /F2 13 0 R /F3 16 0 R /F4 19 0 R >> endobj 6 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 23 0 R >> endobj 9 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-251 -250 1009 969] /FontName/DBSFOS+CMR10 /ItalicAngle 0 /StemV 69 /FontFile 8 0 R /Flags 4 >> endobj 8 0 obj << /Filter[/FlateDecode] /Length1 720 /Length2 11820 /Length3 533 /Length 12377 >> stream xUP%qww6 lܡqƥ;4n[#C9sĜ;/61UkW+WDR}Sa634ubdDY,@ff**QɄ 01;rr" PD,̝�tPqmL,@�y_#5@�[[#@00rY"0J\LrhIJilgk061E`R_c ׿K8[[+laZ4l읝L�v&.0Ϳg@F¶f&�,%,LY8LA֎&;ILDEBQ_7C9-;so[ؚT@  w(;7OFV>cfp_j?M�\<l9;8:M-WEIvG(ϟ_Z`~sҶW5ZFm縏 7xOՎ@+uD!Gtە D�zTz`B6S'ʓOR tVZ&EJoKB$-EUFJ"=b6kc+ki nrVɐ+HdΖ0^ކ=0;o|z?"_}lM;l)VGY@zn^~&3Q*:X^MG3=~@=wGhnF8E:5bP0&S|-:%s# u~w9OTᏮ(#0aOw|S׳y\sp/cӧ|KjB^ׂN#ZіFlMd+Q )862{(*iIԗ}p04 <X42)QW_Me? 'ٱ͊pjo9HbFaI8c !?ض6GeBEη >rw+z !}-;d&É>,Uk44"(%x&7WEa3#?ar_MY̢N:G?bK2 &gx[gzI5*ݛ<c(${"K0 AZЇwNKhPOdn1ʣ2@*T94Wg/ItQ퍷3DUD"0;[Rpbl|l"D'^01.ǵ*tTMcg ga=y OĠwq=la޺m- E~d_bW IQɸ',[ ׅW` do7FJcrdeuK3A�U20.b~ z$%`1)Nug]$Y[CIgfn'ãqdO\e ,Ȧ1QSaxnFa^!Ng3& #r2l7+Lvϊ cdZ-*lc=])-ReRLۗjΤ,{5 W_`કr.ܠ{Y&HzN~IzcXiHlonʒė21~װ@sVc^pT~(<g5Z) tO&^;VCuV໶ 3i EM;v]TيLt 0!!rq J=Y7[V:5c<(&ڭ@sH ;$$oE$|=CXLĀNdbAvzG*cTou7|v"Fqj̎z)l[msJ9n%$dأ" >ai`_c9#[ZIT#\1{e T!N, u'8ͲS=ݯO~w%cymK4 6~jǧ  Nyn 3pQ#M�lt>ep\A)yTA1.đST HԥזMQeR[-Ẫ)mLD},y[VvrgɪЁ>X#$]R\GKsD$+壎ci±mA}0 Q1l# t l-Ԝ^~7n8!2Eԇ<t#6m罼؎+Ƚ \,к.Bs0Cj%pr8a-AE.^n1BByb!!6Q;ZԣT:iJ)Sghi3iB:i O:{xM }ˆv1:YDcSLR;z4a//(vʔosE}*1K,BwHoNr41^N<FI6j#vR'Ya1q դ&`Ƞ ^Jx6R2`JrAաUSF0ƉF !:[g3vR2<*z*%翎;h:r]RL,`i&p=D�DNjb m?y:rJsp:A'P3( `Sp }IOJUD;z|Iv+Mh]֎dvq F4zu=ekc*7. TX.><Hz۽aP|(КWy]mx؊GJ[of}lݔTmנyC/H+1}{ߵ 5@V(IC&J9{^v_#ɽ )vrj>U,>F@41J4|@)gO ̺㖸V So6b HgFt^e#|'֥VQWQ=#9<ZU^NYNJrJ\)tyhË"6U0q.6xJs ZGH `7\?Od^ұ_s%@YAޑ/ (7o4laMJ.3nq{<K7EZ86?V-S`hud K)2U2 wo >K"wzbv],Pƕ"-<W`obP~z'a}SFTyǘcejl37Y%)ׂP_WBfj =$R'J~_r }_ZgvB{b'Jɥ^rpkUضNǘEd#cyi5]ЏM [ 8,W֕ LV[ z$P:qa�մ"DVLDk٫ ݆n\r~›9> s0m,SDͷO(: <h/;)q;+YAo 馐M]km4[X4fCc&G=oO\3HM 7l:H\`+;n~ .U&،DYziE:7L[r9}|zU@hrH>OVQ R}8v;9wc+*_aP_[d`抹\B#AHGv}UV}n|^l+<eK!hTx5_Hiw 40q$ڒX,aОQH)5۫l7s9+Ӳ�ja7d6Ղ;NK &*wsJzg$0\1( –I)kTj\|_X6# Mgh\]j2M?_3a ]gzD12! I ReޑEB;+>㈙uN$m2Ʃ۹W ,n&ՐAPd[h|,"�p7%&CIDPIzh]ֺty]7WH8]w'C`OΕWS필`>$ݛ;Vz!.Vן *Xhv>׏ 'Sb}CK05r扩\7* yxBiy6+Dɂ8s%܄S,eS,sPR6%Dt|;|?8{_.>vqL=//t}M&a\ <~j`ԉ}+@(z:1ےbZgٶF"o>@IxKv�-ɛ(F7gz㶨pD_YOY fA�P2k-vmח=1z6[O?cK7CaG/;Ov9{gsqzؑ=\)ɷJ+Iv)%(z9DT7|s1�?/6cЙ'[RsH#zZ$&%I4(\‡@w@[0[=3ZdO4F\-<T{J2N$v]7m}h#$̗`6 3R0�;CUyf}F*\Ε{%h"]jZs? J!V1} z1GSE @f4D7ȸo# /H%TV MZؓ6ɼ#[Q5]mNrO5s&]Õ! |@/ˑQZ!!+QİY8wig]x5z9;d[&B ꣊;ABwbLEΗBE[ϕ3!B?M5FaPCLMx$m.Ų@Q%F5w߉ՖC֦}$ 0Ƶ|R.4!g"oc8HiUldEY?Bͣ:fih|*вQK5:B:5atOzո C>1t07ME{BJ0sq{wd]D$Z&$@Tz( ih+MRKB;4B )R?jO=o`a MU+旽T9$c$2s/2UZyf1S,39&wsP)f$62,6ݻ{H;9=eqxЀEO-T=4.iZg;, l\ *(}+SJs0DX_.]kϷ{x0_]PM Jw,0bŚx4Q JZCjI[g"_;\8 P]e{CozDj_d  nI?3(PayRBIP<D5�N"V6!dݾo;V:14{r8;RwrS7|])wb{w K]d%h7b @L0gQMGDz_bNym̳!Ȱ-$Y7Qjfd@Mv&9zՑ)g, Ok n$(\jG7TQǪ(?:#)-ͩ^MY7'lq8{"ngOcH k`pz㰺N>laI3Ngf.dp.Ñ`gX3Q?\!~XP0ͮ61}<;HʪHk-Ă#ycw- ֔En=iv`ZJwE =smi:HRR/[t DV8itpnR8jW(e ;7F2/H0"h-B4!}%Gw*#V!_L!'ʱ:C/ņ\�PЩTݼ<FL(z^eaJ BAWloVbkzϲ5r C ?ەyO-=])x,64/Df) �!/GT2ʕp:ٰ驲r oE,mKIwm_q;O.hlu;:"`dfˊW1EXkg2 V%Aݭ&9"ާHQm5 AdlZ'C.9 DSA6<&NB+wt>Zk{Si kHy5=9-sMrÇ630:?8> R"㕧bb\ۻ1d2R2Ji/fI6d_ڑSrFĥ2KX9[߄ZA`40:h5i>n|PJڬz;ﴸ=BC.4:$ jY5y%@4ŝfrrL^_;%?֭%S'v([]p mE[G.Mh|"yf]bQxݐvmA2dW' ?\:)A1f6EP$]k hy] il vVO âTMn 97=7Z&}"h;H+5=l` RucϭZ2QMϮ) Rt'X4_Lړ7d 6NrO13v?bhR 5[W~ߺ'G>ڲQ.zmo;~cHF׍՘qX4gS%@䆓:qLdԓ  b{I}(y'4hΤBý7Mě%Tֿg.~h\h|"o ̤�u/$4t# #e\ZDT[~ $LPQ.%= n Ȋ p̵DN`(Lm$x 20Ee ׄ.;02nDoM%cC]YH( Q4 ſ%`z5&_:ʬ&5GQʛj҇qfHřsPO(% 9,=v3Pj{*A.le-rMRPi", 'N;8-Ƀ<YW;UXFi sR&ѬmG:ДSqvIͼ}�('oF}S]0k+.מJbǓaMHGssl:g XpS dK}.Cf3;HvU0é%ȳ'`SOj@j7q1)m꒗T߀,k OG=5=/m_ID䙄w2s|`V7ӗH2CLMD6x>ߥm~}2¯~V߃EKo̢0�pR<5=81<occ/rt#NnU%$ l; !yh8sQ{]xT,QM,rip_N<j1.ܱmki 3~$dw"e%A>S(}?fpyXRv[BIwC89ȪkԬ o?9Yt/7{Q^Zm'$-=V J6犷SPw*xtN| pK֞RFr& &OV0җ~ ;|]҇l r_jC}u0sPZ#B0G WA#rǃ?LN|ǜmEb.An/>(?pzD>h/a{&Lћ}K<^m[I$XLD_1b0UayK)ML.,ߙΝjR(v3ioWT9Y vS9Lo33U $1,h+ᐫy63c.~,_I0&xso!#P KÔ�7 `reMoGP!JT 3m[HTy3y@eaHԫIt~3^l/g$V=Rf^hMin1:IoңnzDXryǒ:q9XLUGVA=ݫmEg$W;s&GFc7򳾚*rB=\mb:I~d~?gP�cXoz݈N-F(WWzX-w*vA'xAX=›f�ڤ*r5N$E t̶^_Cϓ΃s hBMJ|4.8 %T,9WH˔OTe+dZ;y2SraoP~^2"8ʜ'T9jþKg'38bOP >?bu ߔuAJݩ| iC7NYjb,kM ӒUogaF*c@r1#)#>.+YdkB?$˿6GPHd񔁋:-X!<21s>%Z6L&PK6gЁkǟ/P>"ՙ f}ika?Wݪ Go\X]pb AH)vl}`AgZ o/.:mOĈOfUhtPȖ{h #[&>:]ɾ{ϝ+CpT [O{Y)l[ 3zQLXã#S|/mlS޴^ʂ.٫Tǡ^i\Q@4&4u="FPp*Tl@,"҅vm6]w뼅n( u[" } \p=O)rvXEG5d3)ן)vkM1lXp&xz*gQZ-UʞX;[4?ly;Ey H" E($8u@`O2U4I=*uF[Rlsp-G`emӝQxfܖdWIS.!SuvR?޶s5*̓z*S%gwf %R35e~tهD)K"^Gm~&4cwmH&jkOT xkoT.(>yuʄ9`ܭtaJӎς @Gl2+*Vb1D+K7 Ӓyz*.%π[OzqդisGD(mTN`g5lY/Nql 'T(,"cU? +pB^5%Sr_kD l>�ݥLUvgk줙wQagw˟/Ht '#Ԉ{Ky lÌ(<Gk׍;PV^Y*ĜF͓>M¥;wNK ZrŤP }!C@}?;_p!cT?3!J)(328Jwh9jXbDAӻW?װ a=FMAٳj=3-tEЙ(Gy g͹:'";U"Ɓ["{| Ԁ\?l%+r9=tu]|x30ewgݰK{Fj=3ivBi:؃- W`hVknHP¢Ď XsQM-Sd h3ihЊRՐ&op_]4[Ї"8e2MAU-(*2 RpdI*w}[igiÿS亠7'gNi$e|;X !n]g"?WއΈ6tS+BVT?;PR7o͐c9]S7ӏ.eG4-hT4LXAlqi*%H>L+۝[gֽ~QhP)ynQ&4l"L7щ*-~˟=ь_lYɉB8<1#*=6"T,@A%I@+ dX"=Y�7uM܍ӍPt?^ gaoJ,;pw|+" + s]eEm{rKh6d,LKЊ?% PП?[#_a/>V+)܏9Uy2m6d}y/>I$^lkX2*3*Bsuv~fcW~G}f _^uH'd{RdwVKGorTt(_ ):P t4B" T:7_ 5|z SvG-zXG)o!^%I dOnzi|ruVY46Yqf!J|I=S:buzkq[ۂRAWNxaQ>I,b`Le@)0Lt˓9.K\ ΋H:2Z⥠aD>L2M#fp~ټ;tĝW?%$ZhFOnuv%zC_ǍO./ v_ƽRGDt ZVի{]y<"b7:>gݗ(L\TKlt,%aąKL"4 @#.pjK?Ct^Jp( } >tMbo41"CfX\ L3)lbqz| =MpE�<0vdGxĢeYpշ뒆c@Ͳlrfx+n(&L-;w�'3z]:wR+mL`E/aU}&/LbIea틶:{O~_YaeY>Gp><w*_%D?%<9^rR[;>o^zU>;howudc]-vUy٫_ )x")WC C)IEe&\bKib9}QxI͜͟=& I("P9DJ M`ɱdԓ)tR+{X]:ǐ "<kܲm ځ c}W^H+)1\hVjk*qۋS;daHn S~ {LY7vJ'%I.Ԙv?e8jvj3n$,XҺ\;{T-R[J > = ݮ1< Dwk(Ǹo&Δ6,~èF3Oi)_ CNX|<F\1^E7hBUSDX P1-㹣;** /_yIDn1~2^8C[_}s޼XI)&ɣ9x$o2կ]6I-n!ޙ?VM~�u(ŵo<q܌^lSԉ;3qyL8ޭkC =Bpfp9폰>:47Oi?q¶w,G!Ⱦ(-u"J lV~(K=8B I;ҥӟ*н?�W[HC;~r#WAXfbrI%8"cwA|wbugG̟Tux 2^#ī4W{Rڐ9Nt҃_Q A_pX> rRK]]r}ʫ")Pi .JcY 3 2OH/A`R_W,_A1 GqLsTI#ZdB,v=<XE~ԙhpYA))i[l밴?uݭ$z*NQOU,T1%O�9ů^8^DRz/AJAƵZ߯۠5TaI@Pn%g?<37܄JPXx=^rH_ঢ়<u(Dn4mYl4W2/a//o `% L endstream endobj 12 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-301 -250 1164 946] /FontName/TXSURH+CMBX10 /ItalicAngle 0 /StemV 114 /FontFile 11 0 R /Flags 4 >> endobj 11 0 obj << /Filter[/FlateDecode] /Length1 721 /Length2 2808 /Length3 533 /Length 3352 >> stream xgXSa HU)H IE@BrH 14)�J&H.RTFiR*"R.:3>}o{?ko1!k[i44$Ir2rBu!bbzDIH ȩ�Chq**B 1@O\$z?Tʀ$bPH<`$y# P/�:X,`~ Z pbX&x{g$q?I%#N4РD֒p<?/\57b-?: }I  A"Rw8]omLHH,)! 1$'? Whkgc,DZ^FbK!;>C.C+w$<z\E@cW[FJJW@)-d$ S<grJ ҭc&" UV3%A<M8h@ HQ [)+EC)!vXѻkSouhUyA9o?|hzQ:$u\-݉aXgֶaW(IS{lS_ou ɀY*)5Vڂu(xphwKu>nX!%̒ls1 !k|~1׀/^g-]mɆMn̊2z֠5Mdj+H甃t/]ec)S&:?IpEvl|} s L*Nn/hp ں7ۣtT5{`gu͑vhι5wr9b݈SI[bXm\n5"k2ĿG^R{oKR6A ^AY 4tkR+WGR[LtWNo{BødWv A1V Ȭ`sك#D/p,=}@GUVyi j2zUέ:<9 ߋ"7Mӑ257 R{'y..I1~)&!'s;Bm>f}l48)s kjkmmgAԷ0,$QU. v\Iش~VAYevQ a4ޜ4yI|w+sU2\wX(;L9l3FmKDwZpN,~<SYwlI2|m|ޛdX< hxX'7D<UFah|B{e"3CH®bVmۂ3|Z{:9S &Y3•;_O&ȳ8j6&x&2<(C3S\Hr :tHu $#e<{}]56̏J'n>*ʷ%WKfйKJ+lDCN/ jyx9-GbJ3jz½ ¸Zwy`se4H X/kf|Qϥ4}Wmu6rfGF-_DS W(SSn.J>fSNg/H)\y_<03x]œsIKʓ:W#aE6ܝdԀ0z; L1oT ©rӋBct_>M6Nq/vgJ#䩌Xd 6 i;5ewjCGEFᔅT/AX#ĊԋMXY>+u͛ WyβN5H_mH ~ k!|]7cuWk6f.M ʸ$LntM!ojH&ѳei33 ڞe4eBͱRpǹJsٯ0=c_8l<7Zʹu%g<-h^wC5.8RHiO0/0A^Y&\$v= /*)rd{q&H -GEc>6gvIܪ9sdt^#oX\4\fk-:B)evSE-DwP:y"UaP{R烙K~S3[bwЎXTڳŎiUo<>sJ�d4]Jvvp7']B5/^0mX YAui3ڵoj,Tp/'{KlFq%4'N%(kf~[P3qL}k1_JPma)>gŨTJ;5W<&?tNMq cE0fUMfI+RU^ yꄣ3Rakcn$lEǐTjȁIW_@F;V5X a#=5lMMM|A;VrlBݧA$Q CI o5` Sxd̀g_b!N|AȥZnm1*Li#*76ve7Tߟ+Ӗ[q40eւrP15lA!ײxi}(uo<(#NdHzX;luOY69wSǐ�~Z"ugkvGOa׏ wso/F}"ݏp0G-`q W4C"IAea$Jk݀ ֥jR- Jxd2nEh.w#E JΧRɋBQ)~]b ?d)OjU9Oy&-^~=;[ث+o1J! (w+ek2c?Ff ڂFTD9w{+׮enqK,JEyԄ|1%%u*'t4 s}R*ކ>1q֊ȩ+#R>2^S$Tv+[;zrD7!plX#nFrdI7 3Oښ}}>&أA``&?v`=밊ΔͷbzLjsUe4ҥ0yXv72>VNfg0uZ ڶ|@lVb'L<Q.{{6e*+_hZPs,yh-Z'_zu:&5@(,$8$ 'FV endstream endobj 15 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-53 -251 1139 750] /FontName/TNADRM+CMBX12 /ItalicAngle 0 /StemV 109 /FontFile 14 0 R /Flags 4 >> endobj 14 0 obj << /Filter[/FlateDecode] /Length1 716 /Length2 2297 /Length3 533 /Length 2838 >> stream xy8TǭLT ɱu̐uPL5L3g1Pd+d_dKq-,%/]ze, s=9sN(2h5P>`fkkp( dl*&A}�@'G@�33Ebf*_]�dQID:`Kd{>!$" pb ; �( pz� @pL%S' Sw��mN`̠ӂ�2Hh1,1ֿ1ŸF#|>TZӟ �[dL4* E�Dd,M(DM @ h+t ?rڿaQ< Wn?L3d*pbd"T:ڀõ,_'T_t`0Q7bt`)` HdfIPeV<[] c!tVs>XI㇎. acSהeѕm [V AARR'Wf5j\y4zw|ZYȹlf69ڍMOɷ]՚:G.O7p铆X'eV]Uh\Ԏ:dq"tlHJsϲ3GsqI"բFޝ#_dz̭K2g8dgg* K\R:)_JrKO/Κ+<l W{%;-JbP_S:˦/LK<t5T=`V'>vxu;Whh0vO{Bgm _B:*O_4[y]x2m~&Vr&NE?姧"خz<q-�ueQփ(8B%Hׅ=v ]˔o.O @xNICcңm"Id;ڍQFkS3^_(6s](KFޱx;;S p}sW/)B:^7zs}FZ<4IB܊t3Hp)Λgذu-RM*]ǵUVn֨MM !n(ү ^^ORhzte>o8}ZPfIJ喧Ê} lSآ{L&' ..i hԊa|ޟ`4PҞNj*F+T`gNNh0CfaЍ(ns_r3ee/M$j(#_R >Yux10F OYuSxdKP-2uq$Fךl6 ??߫*PhboG ۜs) z}V<#34{Īשl:0Ͳh-'\=/%q9Q7ZРR.ህ!`3כyxM[ )+<Åp~vˆC.ˁ!`L/TW;X~j <pNs~żY D"k9.nW]!DnV9V;s빻SzCyǦ:"/L>Agq,=!.Pa͔2l6& ^AϾ: h̉,XESH[7{gR{/j1mh{|8Q,v0{ 8 A ėJxͻαöw#K*,4Uӊ^iݪF2'pª! 24OY^"'R ZUITJ_9- ~^ 7_ Z lqBcX#2~Ku>}^ӭR*'2qH|ne7^d}tVHO3iS{ܝ]'n{پjQk~貂ϝj|Sd"n85oTd^H|ͺoRGxtwd?eLL_;k.P|:%ŶuMn_~�N#cL ^zsqK5zqV$q<);gNe\*4LƼn uJXdeڹfR]>~~ m?RhOhc.{N˷{qcPN)v=O[ O͊ mtnM%ug`uc~"Dji3)&_$rZ.jdAa+D늣bz 'ckk©mzCig=%Y#'#so?~ܨGM>x}ᓲܢ>|^˯f>}NPF݆#wՔ7*ޟەrXȯ6m{>}7<tPſ1ěǽ<rVom) ӵ ZS"iY`˖Ԡ\+W905V;\<M4"wdGzkҁJRb̫[&9qkٶuWۿGP!wPJۥ]eUhU ioaʌV�4$r_@8UFMIY|T~msnه0/QւrG'wxDy~S"89!7ƴ Oт.)CG +Kg> Uc,x_jQKz"Y~!_Oh fYVV endstream endobj 18 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-58 -250 1195 750] /FontName/GUFCLH+CMBX9 /ItalicAngle 0 /StemV 117 /FontFile 17 0 R /Flags 4 >> endobj 17 0 obj << /Filter[/FlateDecode] /Length1 713 /Length2 3449 /Length3 533 /Length 3993 >> stream xy<ǭAvH샱2dɞ}L c, }I2*YCdɾfɾ" Y%~9w^?\Z6 bk DD 4D  %5%5y0� =I(˥ @0Hh =C,Ġ$ PzhF|(��0H"&b\@?e_-_4 (~yxL$ 5OC`_6%CD&x'.)P"A\hܟ�F1DF8@Pg$rAY/Ɂ_OCQ+МԿB*@iy`ja|P= XNNNYI!8Cp.h$ 1IJPryqQ8.g% CXg2ʼc[Ǥu4D=qDZD/+]k7VKzmK'۰v+&7Pg6!AB[α5䈾QdN \/euT"vh-m<TnNn(pX:ص,nSdƑZy;񰎞=ф` ~t333GɗF'B_g-O H<ryc?rՋ <=l^.se .rOf5'h n{ڜxz^QvKs ׍-Y7axN'H$NOgjU˶Zhגh5Z#? ob[FyF}yiaRn{ﯭFg/ҥ9i@o^1b% 8XnTΏ} "RnJk`Ɇ<\6g6ښ=i/\BYKï3*d?ڛn(;Dv]qk.Կ"EvYOqI]TIRL óuP/|sOuL{2;ذԗw<2 ]Y F Q 09z"f ,$=]'?la�Cͻfi9.)czkdoq硒х Q*(rC)kZ*%K`"ثrz"A\Үw4lJsǚ> z K.y-Bx83|t\^J XC۝7.xgHLO7b%_Ek呈"Wl5Us6ڙXn[۠6Ktxi)iMȢDek͈VTߥeǮ&b^&=l #E߽NuA"Xa>%=OҔY]L hir0B3_ٺJ9}xD̈|*_XS'NOZM.,JI^ LJw<޽-mofi>^~2~ĺ٦Ϛ\eb-lM�R/0NM ٴa/LiT⇵DKrDR|e攌9]Q3G5GH'(6CÀeXs69Ѓ -0͕?Ţ)~H@t)sߍO:>H<g*դb6 M�,#K[ S:2㴬DOU-ch 22̳?/^=$a"!TqKÐ` [z Go $o$paEFǷ[5cLr/ ~<iJ_ Uw]/? fi6rJeo@{%3vRo;6hF[?WJмGXyhP6˶ &LLՉ}羀(%<Ւf*8>:?n. {Wk>ޡMh-i-cyYЬ'D:|9SJv#T#2~ޅX|0Z}Zno<y⽦@[2xǔ5Ϫs\ mG: ■qU1%_:!Mם<R?H{Etn]O2wUg4a^Ff$ 9A.gBmNVEvEMi䈩aVgS!J!@xы:}OMC=C0(a>hԴMO 91/pcX_ja<BHxo9F!&%('1 !4+.a&z /~FMփ4eK\?B & qP<yCmyኙ-[WM7j:,-z>&r^e%~D^Eu*JJvy%MLu619;) m#0 /zVK^O|&is9r?ҥ2Ů!qjsŃQP G8Yl;)_SavGym>32ru04ob;ifXKt(dq<=<"U|Qz<N)9H6KEuBn@~2 c[5\cY|{b'd׾YzCK.~iUhn0rQQK&W0ϩa$qbs; >͝ ]݉O]*FPGbd:k.4^cxG )**J#y(i- M"Kf6jME=ˬB1DyEe{y3_y%BۤwROxe!+Ahu@3\ 8U9cꃓ BN\40rYZб9룦 Nm+X@fZEHNڞtApCRKT.X!wǹ:\ /Q1+]aSʹ"R TO@/vhHp&!]m& ʐ#�'L{z^T.xWC5K5ёN@J3X&t0#ٗ UΜ`YyW.7֭lŭ{�kzȺ S(B0.+I*P y̚|?)3*T1ɽ5he;]ūݔ5+o042DzIY=җ7vqK1ު4g+2B7"ݹX].H3H)w G[|IKF;^ye1\aA0F4O$upnA`A9)vVJb^W>/AW4_Q}ȐCо=3R@}=Hy3|Dep^ȾXjM?八>zϛxpbQ(ꉜ=;yX1E |Cg6+*XuUDuڥi:+xÓ- ۝ۤ.)/8wX*{ B`ݢmp?$ēͦFKqH,"&օ_'G߬-Ve*F"xZ@s@obvT0@%%/f~OC2 D+a$[B#<g sTm oWUu⁖C_A\NIeyS+j\`oz>־cccJyBEHfS Y 0O)e9 ١^HZ<E{xP[='޶+zvMKr 'X4@{ ��$ endstream endobj 1 0 obj << /Creator( TeX output 2004.10.19:1439) /Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate(D:20041019143933+01'00') >> endobj 5 0 obj << /Type/Page /Resources 6 0 R /Contents[20 0 R 4 0 R 21 0 R 22 0 R] /Parent 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 1 /Kids[5 0 R] /MediaBox[0 0 595 842] >> endobj 20 0 obj << /Length 1 >> stream endstream endobj 22 0 obj << /Length 1 >> stream endstream endobj 4 0 obj << /Length 33 >> stream 1.00028 0 0 1.00028 72 769.82 cm endstream endobj 24 0 obj << >> endobj 25 0 obj null endobj 26 0 obj << >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R /Outlines 24 0 R /Threads 25 0 R /Names 26 0 R >> endobj xref 0 27 0000000000 65535 f 0000030282 00000 n 0000030872 00000 n 0000030547 00000 n 0000030725 00000 n 0000030446 00000 n 0000006451 00000 n 0000000009 00000 n 0000006698 00000 n 0000006512 00000 n 0000000913 00000 n 0000019380 00000 n 0000019190 00000 n 0000001829 00000 n 0000023035 00000 n 0000022846 00000 n 0000002765 00000 n 0000026175 00000 n 0000025987 00000 n 0000003711 00000 n 0000030625 00000 n 0000004710 00000 n 0000030675 00000 n 0000006385 00000 n 0000030807 00000 n 0000030829 00000 n 0000030850 00000 n trailer << /Size 27 /Root 2 0 R /Info 1 0 R >> startxref 30967 %%EOF ��������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/testPDFImport/nomeaning1.pdf�����������������������������������������������������������0000644�0001750�0001750�00000075763�12045517740�020060� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.2 7 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] >> endobj 10 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R /BaseFont/SRPUXN+CMR10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 13 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R /BaseFont/XHPQKW+CMBX10 /FirstChar 33 /LastChar 196 /Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 575] >> endobj 16 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F3 /FontDescriptor 15 0 R /BaseFont/CYZVRG+CMBX12 /FirstChar 33 /LastChar 196 /Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] >> endobj 19 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F4 /FontDescriptor 18 0 R /BaseFont/NWSIIM+CMBX9 /FirstChar 33 /LastChar 196 /Widths[360.2 617.6 986.1 591.7 986.1 920.4 328.7 460.2 460.2 591.7 920.4 328.7 394.4 328.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 328.7 328.7 360.2 920.4 558.8 558.8 920.4 892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2 657.4 624.5 854.6 624.5 624.5 525.9 591.7 1183.3 591.7 591.7 591.7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 710.8 986.1 920.4 827.2 788.9 924.4 854.6 920.4 854.6 920.4 0 0 854.6 690.3 657.4 657.4 986.1 986.1 328.7 361.6 591.7 591.7 591.7 591.7 591.7 892.9 525.9 616.8 854.6 920.4 591.7 1071 1202.5 920.4 328.7 591.7] >> endobj 21 0 obj << /Filter[/FlateDecode] /Length 1647 >> stream x}WYs6~[ș& &n:qqv:m n_=@Q/XU&iZnǫY$M<nNR~#vC !;ǟB&" Rb$.,?}b\~w]5MA&2*ijޚp"zMD>G" E!2M\$MFTwQ\) 2g2RA7%Qeu~tww5U* .ER'Fʢ y-CşU~cVLGq^gl {72AUj_gl4 1#'d@s XExDJh;r Cue.Ư^LI=Svb>VX- #WX cSb�'W'Ke>E <'X$,3d<_*LE8O2_<go>\2ʊ9_԰¥pɠXZ156z;tϼ,#Y!40BDžBQqM*p(R.7U+g?:p5>TubF;ݨTQGTI8_ESW<ƃYJQ<MJ, 1kA¥a_?;s{̸Wn4WzG[![_ zN*C{v vK:/ 2 _ƪU�L̗ϓhEYL0ind׭u0H4lDz z&F)&(p$I#8ujnd_-h9z}ýQg嘝H'/A@;&`_;CIH@ zOy(pO)+FZ5^%õ=I2`<ƐXg`ͯ>Ljxg*֖ {gڙ;>^CԱ`R M]Q!f:AedR < nϓ)2Ol$N#7 /;*$_P*$O- Mi< !ʬJaA>z@̶ww뙨.v8m,#jb3JOڹ %_",Xc5-%tQuvPefMp ONVֿ8JDH\hW:sa4ij*5*]06e>Hs?>)&@08(ywх~Aӆ!S-̠Pf#.Eo[8?a!7/v:-;y!(e (gw�yozpOew"{AU]`+ɡ݂|M@nqBw3Iۖ?k̿8@nA\LSXn1 M)9DŇN9y 8!R 5;mPb mYS-Kniu$,�<3 Τ"4*֊#ś�C.J"aOh~7*OX&)􈏏:>/쎍:]O׸j~cTһ*7eZ endstream endobj 23 0 obj << /F1 10 0 R /F2 13 0 R /F3 16 0 R /F4 19 0 R >> endobj 6 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 23 0 R >> endobj 9 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-251 -250 1009 969] /FontName/SRPUXN+CMR10 /ItalicAngle 0 /StemV 69 /FontFile 8 0 R /Flags 4 >> endobj 8 0 obj << /Filter[/FlateDecode] /Length1 720 /Length2 11638 /Length3 533 /Length 12196 >> stream xct&c۶ƶmolul۶t:ݱts;kΝ/۬U{jJRe5FsGS#  /* �sY;:yIXxxXI$/^v^V88J1G'/kK+71HD.f&$ &nV@&f&v$jf@7/&;;<J tx�͙XXH̭HLpqp$W?K@׿\$4$%i`EbcVt;/1%Ma^8;]H́..MhnnU7;k3K; _)kWIkO+yC?T5YUT6vpSr/o{\=I�WϑM&`hn`If`nb_%*Bw�<$<<~R(#N��x5swq:s%}-(Мl`jh+"5>63}Ƅ6[l|)9Zվ}Mr3gM',lL&z_k +>7ޭg+v̶k %2"=kkE*7D)Q`* u$.U4dLߜZ U}_G uu7Xa;y3cֻsMU5:ȦOE؉_Ǹy!P#?΄|4w, Γˢ۹-/{3W"6@!ѳWRo8T?G||aEz^0xNn№YZIvU#NV)Tc!^+]F`| 5wK5WwZ;gzXGkwR+6^A-d>L1>{$02E0a.!E $ǵrcNze̢S1Vrʲ"-h ۶ՕӒI,:˟\k6mDtoOpO]Zgff�4x W’K!?f0h ZMcVKK JOEQGR}J^a…ͥ=�LERM?lsv H뱐9|">dzôT2erF]%q0?}&TXn}I(o$Z>Dl?[ )q3^"uטS2=.@K T12Kxut ݞGj4PJL\Lxg"g_V^&5*6)<sf:ҥiҢOCL,:+$ľͤ<c@i-o~~ L6wxgz<7'T HN<wt v"Qv@ ͥ_ɯE/4.63:ܺ`y"rTac|c4FEj+Y"9)a6Z's,ηY1u>6!/vE)C;wN[k�U_1|@,8z S5qte~QgoFMnMjJ+z(̍ɃdI8fC0siD[ 95 Nk?Uv}Ukr8?[t(UՉ cz 2RS  Y0\ 7a \<ŁҘI UA.녔8$KE7yKZՖTl ,%1|:eSbP(' C׳x]':ѳOgLl)hEb;O\\ԘV܁m0ߴ+J8^+̻8 xߓJ T[4o&"MJ1&])Α*F Y%Lu_ -膀s|ͤt=!@en"75U$3:r2w{h^P5kf/2~Us%}cc4]faFmr^%n4s13M5i!*͚k e~(lwsifQęQNX8A[ПIUb;f 8]̨yC,#%D!}\`/W b9j']rD„R]hy.'FLhJ:8| o="BD5Ǽ3Jpv|}NWnH�\,w’6PcU40ZXa;?=|=~ EN,J'I 3)cth&>PWP^s~& ܘ0z?jǦ=t3P([G=0ןVGqlR^R[IZ)d%Cxw%Om[cp*cQ?!}T¸H <�w˰" 7z/:>v* -nnt٠.1l<=[Kդ~.9|4,'Q ZeEIuTO1cG4mV2lH23rN)g1NL*N5[hd+U_Ɛy3AzQ88+R$dJfj_'7y b? Ӹ(Yմ%9rѷ~*dٙSs3H7yaB*Nv=XvD=ď@vK.dǫ>un9>GhK Ϸh?G~Yez&>'!wmhxax~b>4Tä[^+*3nhOK%EКsrDv�?8+.7db1F5xrOxNY~H]ȏajMT.} 1 z5Xwy)9̚3Pl?#ȉmzKg>$7T2f<xrPKɞ%S:3XWM&I3kU0p%V/_59Y! aE ]0 s[吗ƱicKe -5iġ,]O^R8D\Vv5@xΤE\k>Ep[;Gv6}d9Fc7n!f{yyUHɇ2`D8k<C8SPB AȂvxAӕ瀃N.!>}2[ Q@O+ g7jI<ۢ_^? =xW4vB7b"1e>){9Nf徥j2VP㟍Z?biuYVQװk$AǾWrb{Yw=ZN՛k/HΤGt;ө\_jq3vpb#Tn6͉9L(9pDŽ +)z1cAy<A6?8೮kd OB \+6dg#+^ OX65A \;F*=ggμ1-K[cwqÚ"Kב5MN?TrZaX6 c?l!* -O%rZ D#(;ޏ0mR33+//&\(@$* !rڞK` A؈:j 8AU:-97gx8w!ބ>T,3?6I՞]MuPw妾ueoDYEٗBt9K=`ʠ]pѠ@4m.u+i _'_WI6ʛ:#z_2XbA5fjOt-ToMO^ ^P;73ZkhpZ;37Bhg1i)+(wӽMgjݶ^X*鲜aÒgަ(ZG>Ju^2n`ZӲ`. X=s_~<3aЅC>wiu5ٺ a˒L`"]x߻(ǥIQ`ClY{xqQ 9'c=;s[3nH#MGFQZm}}IϦWyl@&0\0zNĭQ=0|ϪVs5I&&hr"hl \w"lǨՑɉ*mrZι:"8*zF4#]8LBgž%ƿ~4 p|6t}ϯ6fIpXhҎZ $ƛN (_2xέ vOʷB%4Nj[6f~`P uptd&5O�Ԧ=V5PIHErcBp`, .eݭtM!bnE -:mHtI'ָ~gn^=60 @ےn}'{ڜZMQ|PfoF\`"a8[G^O<Y@߰#%A99;̑>D 70\ ީı8>Vqٷkg7lք [} #\w U[Iܢ,yFs.X+c\v86Izp)b|jW< %td j8]U "E []&A|%8f-'[X_"ncʉX{̱kht'O\kf7#n0c1vF_bfd5a4%sP qwnf:,F�pfH<xI GU/A'{VI@ T1&zQkx'UKh;ӟ["gj4Qu9.!((lJWA"/MD7&tw YF t}j0DU(^*Ixpa#3 ѐ_"1vQ=8roWI`Tj3+iWK+ |JՀc\.V~\>//O=MVĈX+.D1lX'%k<d IؾEUM8rP\zr>_>SY8&ֆS$tzDPMME.#GQ3>U5Smk\V*S8E~@4lGc'ק5vQsl̷$oܡ/H`}$>�JsMOJY]@}M^kW`ewסGP4GK5se*)brT >ڱ,;]h7Ql4VQjp|ymIyN%J4e( ӜZ+ =27~e& bx* x#Wz]NޗS]Shdt=挴̫"4oKI*~!F˯ǡΖADl?P9;Y%[k8;u&/^4]N]ӪdP[ P />:TcAJ!3ƏyynFklޔs(0Yw^?yaXYT^*LHE{ c' n&K'҇k+\ȫI^#*TY$!*s }Acjn$H8,zQ8MxkX#.RDVW K@u3,e)gt$e"+7;$D/`ků EyX)o^=B�WzkaOIp03e5$*.ӺiJ9Y'1J,4tOa&Cm ^jrN H H8Rڧ'\-?UX~Wϰ}!&M Y}ZF ڂom٧Y# yo22up v,k o'$A'_mLDOt7sda IK,u ĻbQ㍥7L߿ǏvwTX?Dt17�εÈ&&3]=tNl$(_ko4^7N9*VR?pxP~>{-Pb_)9pqQ(?\ ޼e ,?ňK(nγ3NnO}f`[P.[E zZMk{aLJl{ aBPrMo^,}/˩搗b"K$('2o-WMb}hYˌdRTsP2dg[+e0abHw6(5)D]CZ~3T[ pmB~X6/p6 m4Wkz#zR] ZHe͐KͻPz<3Qhy'0qJN*+ CQkRx0N6~gF?HjC`{"J{Pys@N(E'(F*[ ՜v0)-X>me@XKŚzZXԣuAW�;j 1)"dW^]Cj�]/#ਣK[ 6+t _nu0 *X-)|t�`gL~' NI :]Y6x!JRuڮz'vT+eu �beQ+y15b'Yqf$~2L8+s_0n;O\Sߒ~�$0<_lY`cfA?\vU̲CǫR֍I.jiK RΊ-fWsqZ~dP3ʢ $P-&E\#Λ$FwI񲡺z be!C sM! YF5W./$zr50L/$p۲�GRŽ!MG#hR\[vԮd\W'iK^b8ʬT_w.}a Rb7EOTE"u8\om,n\8"iP 9izPIriM@fa`[Grs'KY֟&;aaP Zf_$ct2[67RSގ2Q~riO.-A$vX hӺ C~9A l٭i69oV3HyYұZ!}ӱ�q3.uDʸ''Uf<zmu�eR\ `F!)߼(P&PRU{W/ 1m̠hW%NwjOc>W#ON>^VaJ6Y&[gcRJiՊ U$²$T:jBdزL,k�D3;HGoNH'BTeozVg'kiĦG8:oP6B ۲A ˽lZS :~AP/T1kY!z6lT?؉ˤcԘ%$\ӱ�jnɮ/SJc"C5ߴO~lG`]PyEkW+~ vtN 7գ V$"UCl^.u#!8ZN_t�߱^;vwCe|-1,= ƚ(\h#Fڒ 59['neg}|ޒOIw|9~t9C"aHw tW1nŖ(AYb=vDQ9S;0 vLkOT"2ڭѹ::jZãG9d٨IDee&YQI<1&k7_z `6Μk[kٌ0T&hM"=X)TmZTC1nv1Β1Vݛ:nfmy yN�6]U=~n$˧9;q|$Lqa{S\%*(2raXHl;4oXknĥ|sǙDFXTnuX7,ٱθǦ.g 8 ʧ{LbL)\b!.i7绗�B̙У[b\sUs$Ggou}K}L׺7)]nH qO1s"?Mp>,vuDul.7Dz xuFDvrbSl>䷑An_Nx/'pW?G,1vDT"P<OtK$(^Dv*$4H(.Z,c,5>?l.RJ!LI?ɠ(]J�5f? N?F|roWvJ.KZRڃcZʻs?`oomBtk8#RbPEǩoy&ErT._uBk1F,c2"" onJѪPȿ�h8B?c:>6GPR6+'QHǜ`;Ev)o@ NȴL<*ʙOZFȸ /}^E-/ClOd}nլpRH1gA3&F7ƕg;HeEFn%.u3%*cqicy,D{Da@"0z%@cY3oGYU%0>'YZHUn˕,2 uK"91`~8*إ8|e֌Lu2. "oQ~q-"`b|Ƀohq\zlo͆FⶥfV;V<C]DjݧȼW'.4q1or۞%}zBeꬱI$"B:^xh~fOWCЕax&[26ݟ]VQ _ԮfzKO,$SJ+Bӱ0*Awe5,x6mA"6{o4q.,\6 ~L} k/İ3cX'L%CW =<=:; seJ[CPH2^V P(nu0wU$R- 0J襡Q wBfCŐl]IM: >Cl[DJ,::@bl;3j|%8V0&B8\Cw:n`@,{QIeb[ڱss<6a Q hD.2kI!z7ɑw3k\m}OǹsBI\Y% @OΏe뜕+-` l0׹i\4DV:ێ3|P0WiJAI\~yWl}Zk4џ6*7р儃}OggfL؎7Uc# %} 5 Q䏌7ICsg^q; oc70 D6雧xY*{֛Z�R^Z͜ pe y(%#ѮPPhv渻S ^TQdz~,TNyF!y1қP}ajbQm"іG]k+e2OKKf6KKv(PO?]]fuEh6n{LqY5L"ʽ ؗ2%@tƖɡ(8tYQ~@-6RD &Nf6+\1}jEzgH3>;uzq5gx){s[} ^l)Cp8u>]:Bx[7!,Ib!r!j]G<n3,Y.\!�-zL833X}: XaAHYk__ԟa,v O‎f%Mq &gb! \1 .Qew] s]wOny 0D|B3Li^P $(�=;Dec�cܵD�)"iH!)Ւ�G17$~MV"|Qz+)bHTn6lٍkC<RüuCipY%+dS@1R_#Fe,q,pbp=~poiŕ+ͩQy7AB"+*B+JiDG9|q1e+ўJi6ff#uG-x%)Ý#2Y5Yr2@ӭ B'�d=7R, Zʗ3b)L=[v r׈ks0v9d>jni;N0MboEp#@53ٕ{i$z&x? 3cv6 F�^[Iح^A& <xk焜gx o;h!S_c9Y6j%%+7ѐK~qVa< 8$Ћ~szHSzRH{+@&($1ccDp9nsd0޺J܅v.ɜ a3wGi \RqU}/m ~eC@wTnb)/*x^#> @mKSjs.v!Z/ Ғ tqPcsO*϶-vG#UٸW]^%k:9b` u\P{ǞhH=6 Ի10<W*G=1KiÎ2?fr H ~ 8^b^L6L xT_fCvQ$5;h@(t'Vul =,>�W F=+;=o&X)o/{QM ;yD]ց>Fc7ؽxtXNy{rŘHڹo(~0 Ny ΝH +lU>vt'ɥg�w]>u嚔>(=i;$3=J7j,qPTPh|cBЉdĬg}fU<+Qă/nM'5HzYދ SSYuՍi 3YoW tri,0 |Mhh=T[hceỏ<^ґƇDZ?t Q/ cE %lmЕ\ތC>,*m� ~+ͦ:jl 6,AC_v C BI&Ly^1'0OƢq?�{t;S¿Z]!I#޿;H]uKFҞldf/я<ԭ'R]ha!vfqd轐o )TFl#8 ! ^^L28 b٨`7\Þ3}³$P$|7�Y­hJi g@K<3J1SR;l)@ g6I0c;[|PI<"F252M~P`<J޽C#8QDFX[,T%J)vAHz=\ _oP}a& \q12,&1Š p CCAH9MT +5B\ 2T>Qd#$gӇAAHA~ YtZlv2eO)L ?vAxD='õpM<2XŢw>ƫtb*MC6q3Sm(x9|[1t{kJ>d_~U7S_p 3;-�:I/ endstream endobj 12 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-301 -250 1164 946] /FontName/XHPQKW+CMBX10 /ItalicAngle 0 /StemV 114 /FontFile 11 0 R /Flags 4 >> endobj 11 0 obj << /Filter[/FlateDecode] /Length1 721 /Length2 2808 /Length3 533 /Length 3353 >> stream xgXSa H"x(Q*EABrH 1HT4A ERiR*"R.:3>}o{?ko.$i995@BQ`z(T"I�I�9UUyt;Z}jJj0e O /C@"H';2A!-I2�6?~l@e 99�A�72�h_?K~ I*q x?!~/k9Ց8 K :kcBBb1(]`0>2ƐP;̃x_@n DZ^FbK!;>C.Î+w$<z\9E<=�[FJJO@)pd$-ttUE[Si\M �% |gK$xϛp?cwр@ Ap %Q³!{y ;轏Sڴ* =%ʫEM/HvX0}ՙ5{fv͑TŽ̖�{Mo=U;)V![ҝtyK^8JzXG&n`3O lzm{3=vH ${\H9>rc>Jk—]顼KgV䧉V7gŋ?Kj>n{%Udj#HԇAюұHΜWz&ڕ*Í?IpEm|}-jT kN&ݨ]:Su>oGif*SIn{;_Dw9gr9b݈SIGbX}\^/%"tQwߘj ߭ Q3ѻ%~)Q[Ly,L5+)Nõ<&#;؉/W׭fhalqCf *`ك"Ķ/p,=}@{SW xjf ;/j2zM9 ߫W<SiH[Rz&y/,J0}/}'K;*m>3f~x?h(sR6voeaO/6w2D5 &D|J3*봋\oͯqN{o%vO_ʿÚfVJ&o`S1Rk\,츆sb vffK_tYD敲|cZdcr5a/kJG'8!<ᇡ2F ŗ %Ƿ# J)OQ. o qph勹fOy+ fΈT(Ul|y0yc<dDl LݢbDPl~ȭѦgDb,$؈e 0g|4\ulFIBB;_Rm9Dųn:7Iji4`%y}M^rHSr$v+`4ϭƋ[ J!`-:3`n.-S~o~@zYs6B}.5[ȵ7빶|mϐx@HsȕO/vvVY6zt[>\2FJQZA\oDݽ/HmRY* S,*w$1k9Nxnڈ9|y\n|oսѹ *;Y˪7h /8F5nس$dk^|qjBz4B(UM2`, 8iڼQU _yN+tp_4`NY8pLNp|5ZQdbϪXlMlt~KuIu`*ܲ�眰ַB/j3Xw;ecpO+-|1AHbA^܉*`~lID/Y6#}FttZ۳ƶLb6[:n8W=i.桇ܣv gG 6Vޤ% K I470tфkZ?}R-aCE"iJY^% >2T4_M`0v}]ϱMn)q`(p`X­(1ON~OFWMM9@ӁetEw[@;W2}n(`efJ#Od5+.?jO_r0c/x|*}fKd:}gE5 zL٬4miA[y':T׵{i<.>Pf!5jץ͸׾U4SWcýI}xqix?gJOJUalJnbڿ:vG^U+ۋQ)9w.ƹeL~b' a\<.AgWLfJ((QkWzg<s2t0דpcH*fk+Ȁh[ ﻖr.cZHwR1[SlC==f5U+1Pki!Q<#hRQU0E]"ئ|?8kp<"z)IV2f@D3jkNmmIW6To妴~;qj-x8Yns &&bD8_Ǝse LԮ{ޖzE'3d_4;Ք.nFs+eEԜڼtX͹M>x键_fu d|zFm8{[{!{?|A#a</|l4{cK3$T&(QT!(h PQ)ټTQ =D1~6M2mw&0DƭO#CU@0yQ8*yo^C ڜ>@k [* W>פɫo?Qےw{evvW9EJڝ뷠wJeYZ*Oꨙ8:Ŗ oU1er}As7;\l6KhFU!_ wIkdGj*Cx =x͋"9?)moFK\юȩ'#Z>"N]4Tv+S'zrD7!plX3vFrx7 3Oܚk)/ԭAp`*?v)=㰊ΐ˳bzLJcee4ҹ qXv72>FNfk?uJ ڶx:+^SSH&(�W=]ŲxJŕ[\7}i^/Z-2iWopne].{ΰ "$I@ klK endstream endobj 15 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-53 -251 1139 750] /FontName/CYZVRG+CMBX12 /ItalicAngle 0 /StemV 109 /FontFile 14 0 R /Flags 4 >> endobj 14 0 obj << /Filter[/FlateDecode] /Length1 716 /Length2 2582 /Length3 533 /Length 3117 >> stream xy<C%Cvc+kp,e<c&3sN"KeCCD([(ZSBٗ,%Hs_s}~~ϣm6T C7,=�\QUJAa�74�@! UJcӉfՅ, P� �BBA[�,H$` ,�e�`�~�ch@zũlQxԑ5 b Տ6LCmQcDwLc2@:@ŁtʏVw;%1v @�]"C@%�x )܏[k�:{ C0i~C'�^0 eܺxa5K) Ca?RYZRCNi#�m]}8�# >]) &ha07ˤA ox~@0B8RD_-9%Ozu^_yAC Nvsg.)Eq0Nx͖fkxɨ҄vD'/n׫L)"q7=Mgj_xj>+f\f.ѕ8M>hu6p"AcO3=J?uG |-1T&mgޣYY^GUz\U4.޸hW-;Az^qO6 T]nn6HUBGijskѨ[tP.M7%@n%|Cu� ƨ7|SM=:pL}nP nHzձVlBt-3SΣ73$n[##=3nA#G򴀰B0 tbScA,Czl1%i1{:*Hd\}[DMѦqjAեx:kJoS0Voܓfm=NTYmocgԌ=;e$ËTAo>f2:m\pl5G ,ϏjJ9ufIT&w!X62"*i&8868'AI{ ZVtJl</A2& �\&(QfĽ=Vp KZbA7GRRc>'ϖU7e!ɵa( Ϛt6W݀dAnZ[>x~]PP8?M¿\LIB3$gJWzI@rѣr{̊6;%tVK1@iGtk25}sQ w̵83ԜTb lWrƳ6~$pwn)+5bD 3ȟx>hlzN `[؋vTդ'14Ji4ՖP)6WKxe`P,T}Yq<~w{є#zPv\!,=YhL]-+ҲP5S}.8e9?onXˁ7ϠTpb@.)/E9؜{i)>#&ÃץYE G.%Ȗi*JG8=_̋MA[_DFi#[7?&e*jZlordMHs)n!LSD}'mg'fـI"gע)ؖYFt!9[ i蜌ݫU;\OUpbɝ=I!]NL{~LWRP=ǬuaJoJfLFY pX&x>.^)=Xss߈{=,;{cKk{+I$^3ԵD_tר0ÅVtr<#^4]tdg_K{&/Oph~|7eTVABHWr K<^~y@镤D%T:p>~{ZHL(W>mē竏NTtsEmhbv{KE;YB[atØ Q}3c ~W˄u%JI'j_cG :_/(2nmK[RѾ0˟+Ҵtccwb_v,~$zJO* {”Wp-/ vU`WsȘfiFC)[2<S߳׈%~XC 5tZP8fZ8r5TgJ L'u.p"k$d:nI~Qb?~VYj|3_ul}Ry)㶉Ugk{Js]TNTME?SMeg޸>,axަ2PSȪ rjb桐hasK"#/¡(%iI)şxC‰$|zjB%M<YY"t7ϵl:PN\ I]~+0{o$@0|z O/oE5WgLM$m}箴=^MNŊ, 4DFJ/H,Ks)x/,}r햓/{Aظo$KLjY_dߕǬmO6K&n|h(7g%=s;T�+qY̑dn|fJT7EQ/8/ǰc%CVv k+�ɣ#񡡎e̝yY^ 2xm^-%jkqgx2#'. 2{hѱ:[W5F#,yp=oX$Dm\ \<4% ,Ϟ<s(U?"qCJrB=gY;-7P1AQ91-n{ok頗b_Ylc  <9.Ҽ1}/n[Z{f5a('M4 _\$ÏqUvI//'$CgPz SJ_ endstream endobj 18 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-58 -250 1195 750] /FontName/NWSIIM+CMBX9 /ItalicAngle 0 /StemV 117 /FontFile 17 0 R /Flags 4 >> endobj 17 0 obj << /Filter[/FlateDecode] /Length1 713 /Length2 3449 /Length3 533 /Length 3993 >> stream xgTS{Ʃ*h)$DJ"]zLĄB(�Ҕ^D$H H^H/  4)‹޹יּw̚o/g?9}p ( !OɂԁS=[5 HV * !$  Ձ 55PARVWTVW��@LĸK\*h"M$wQZ4, ^^D_4J��( vrxWPOWM>Jq^QxBGG,c>8W=a xxD)&nAɦGc an84PO mGyh<G[ gfcJCl<ɒ_5?1@{yYyyБo H wZxO(== X(�>:@ 50P,_Vx˫(V>D"O}>s4d<;K Iml4\y3 ,|}k8fw7#°1%xL:JL5Zd|ݵE4Wv r +jg2)*8wYMboMP8Nss\ :r8A*y>C.QU ;Zו *786_ϯ9v-ۖ&sqk>cd};v8!c`|@,õ QF'оW,Å)aI/ClkQ)Hj[T/!. X;ba;qшg29yYoUgh'͉l+k׾D�ع`ݸuFg)ZqJn$~Lզla5[x;{ã~2S}MVې"t;]u #G!!͙#xHzC,4bdP:76(a0@kJ+ꁕ�'AV7Ds+BHNuXW}'Oz4OZ ~u!%T7tC1$K[Խ%} E 榩aw;x22A- \>ֱ nªS_ao{d@*Y;rT6gͺcLb|a~!Jd,zwdHx S`Lutoe>sK[ 0i\aԇ^h}39qί),7FvO__VU,YY^iB=vaOTc>dib/$+.F杳8,ӝJZ!G*-cowNF\۹"yΝv$⃗Bz_<YߍMb|۫vcA?WlsW2;XV{s=Lī~m'ӱȝ7AmVȹqҸ2֑E3OI~K61ZM=,Ճed7ǴW0/[g0owܵ܏vvR>L٣=I2q]HtMhK7Z2)1'ϛL̷3MPц%JӽVZ?_kzu܌^@LC[FQV&yCM6~m 'ulm/I{<¬;73e;�>7KJR֙/ōMl"ꆚ)8>D?E,7Z" ߍQ+.aǚx"쇱q$8~rjڤqtI7X HP#oisA85ӻUˇ0:RJFݛƶWIKUyԒ1`D sj=b3:Rpӛ΍1 y jrߗĝ ~y@0uw/? g6rIg~3Jc2rjՊNyuƹY68bʟmIy+jCN坘4sYJ0}#sή*dx˺Üj)6,C14$;j\ƳY$˄$Q Ƈ<5멦hgMDub`|{"[óĻM)I7Ye3k $hUk~1u&& {S2.kFxSl;7uJoܸ0a ʩcԫU,tvqZj"Ir\Oڞ̉J)˓RìOYBםBu'z6aQ\U-MѨiۈsbbq#s"Ő,r3BLKP↚;iB.M)Wj5轌bi*V:ǹϽ/@LY(y㠚9sFb簃3R6ص;r\Zl]k&dU)#J,]*u+li [km4 n~c:"u}0}CdX)Ix58vݧ{c|ke}BY{ZG{}!~pyFgw&RF.E,m 0cyVdz٥k`tYĢwܨ̗Q:yez0dYDĂx ,9-Z1Sr@.mԐp_&^h86:fjif(h1v FFO[ͳQj >>[XҠ\tuVoD_7ݒ=.McW.42_՝fqyRTo~ M~(?+$NыO{J5wJs+ْ4<W L-VT;J *Sdy1rݻw\mb^zIP݆4^oX y:Ќ*WCU.,b=>RWc}pLAcrL+ܖ+tl:k΅iدmZ,kSizn1W7ycI~EUN7N8w[ttEo95<:,%xZS$C@FTx1bA#| I{"`DUqEo㕽8ʅhei"91H Ut ߠ3ݚ.y fL^e:P,i^!(&Nnύu乧1[{a.&(&f3ȒzʀR!%,qJeRqd7O*#MVjf'VzvW'wAMJܛC [q^2kxO׽eLl\fSA7k,Nk!&#gwn_. F/ <R{bʱ!hmTKdTKnu^6,Y2[sXk~+Ljcɩvg[VІ[YP>�]bqnЬG~E!C0?CvmNGK� o}p7~ Y! !]6>ez"f` Hi?_�Nûx'rzA< }N 8r5}^Pc Oc.;.t*nvhɮ2`ɇgTQ3'4 ͂uu|l@jH6-?~އE>pKy5{XͪyvE6餠֨]moRvT0`Ee/;~OA#2 -ӍDk$$(g \Iǃp>[- 5^?U|}iø@rkVԀ t:-4f\C}bnjǔ/ֆË͝Ƨ"f6@a5ٔff`irs;Te9#%o v/vvڴO qhD@��B endstream endobj 1 0 obj << /Creator( TeX output 2004.10.19:1439) /Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate(D:20041019143951+01'00') >> endobj 5 0 obj << /Type/Page /Resources 6 0 R /Contents[20 0 R 4 0 R 21 0 R 22 0 R] /Parent 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 1 /Kids[5 0 R] /MediaBox[0 0 595 842] >> endobj 20 0 obj << /Length 1 >> stream endstream endobj 22 0 obj << /Length 1 >> stream endstream endobj 4 0 obj << /Length 33 >> stream 1.00028 0 0 1.00028 72 769.82 cm endstream endobj 24 0 obj << >> endobj 25 0 obj null endobj 26 0 obj << >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R /Outlines 24 0 R /Threads 25 0 R /Names 26 0 R >> endobj xref 0 27 0000000000 65535 f 0000030427 00000 n 0000031017 00000 n 0000030692 00000 n 0000030870 00000 n 0000030591 00000 n 0000006497 00000 n 0000000009 00000 n 0000006744 00000 n 0000006558 00000 n 0000000913 00000 n 0000019245 00000 n 0000019055 00000 n 0000001829 00000 n 0000022901 00000 n 0000022712 00000 n 0000002765 00000 n 0000026320 00000 n 0000026132 00000 n 0000003711 00000 n 0000030770 00000 n 0000004710 00000 n 0000030820 00000 n 0000006431 00000 n 0000030952 00000 n 0000030974 00000 n 0000030995 00000 n trailer << /Size 27 /Root 2 0 R /Info 1 0 R >> startxref 31112 %%EOF �������������cb2bib-1.4.9/testPDFImport/metadata_bibtex.pdf������������������������������������������������������0000644�0001750�0001750�00000106520�12045517740�021123� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.2 7 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] >> endobj 10 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R /BaseFont/SRPUXN+CMR10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 13 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R /BaseFont/XHPQKW+CMBX10 /FirstChar 33 /LastChar 196 /Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 575] >> endobj 16 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F3 /FontDescriptor 15 0 R /BaseFont/CYZVRG+CMBX12 /FirstChar 33 /LastChar 196 /Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] >> endobj 19 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F4 /FontDescriptor 18 0 R /BaseFont/NWSIIM+CMBX9 /FirstChar 33 /LastChar 196 /Widths[360.2 617.6 986.1 591.7 986.1 920.4 328.7 460.2 460.2 591.7 920.4 328.7 394.4 328.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 328.7 328.7 360.2 920.4 558.8 558.8 920.4 892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2 657.4 624.5 854.6 624.5 624.5 525.9 591.7 1183.3 591.7 591.7 591.7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 710.8 986.1 920.4 827.2 788.9 924.4 854.6 920.4 854.6 920.4 0 0 854.6 690.3 657.4 657.4 986.1 986.1 328.7 361.6 591.7 591.7 591.7 591.7 591.7 892.9 525.9 616.8 854.6 920.4 591.7 1071 1202.5 920.4 328.7 591.7] >> endobj 21 0 obj << /Filter[/FlateDecode] /Length 1647 >> stream x}WYs6~[ș& &n:qqv:m n_=@Q/XU&iZnǫY$M<nNR~#vC !;ǟB&" Rb$.,?}b\~w]5MA&2*ijޚp"zMD>G" E!2M\$MFTwQ\) 2g2RA7%Qeu~tww5U* .ER'Fʢ y-CşU~cVLGq^gl {72AUj_gl4 1#'d@s XExDJh;r Cue.Ư^LI=Svb>VX- #WX cSb�'W'Ke>E <'X$,3d<_*LE8O2_<go>\2ʊ9_԰¥pɠXZ156z;tϼ,#Y!40BDžBQqM*p(R.7U+g?:p5>TubF;ݨTQGTI8_ESW<ƃYJQ<MJ, 1kA¥a_?;s{̸Wn4WzG[![_ zN*C{v vK:/ 2 _ƪU�L̗ϓhEYL0ind׭u0H4lDz z&F)&(p$I#8ujnd_-h9z}ýQg嘝H'/A@;&`_;CIH@ zOy(pO)+FZ5^%õ=I2`<ƐXg`ͯ>Ljxg*֖ {gڙ;>^CԱ`R M]Q!f:AedR < nϓ)2Ol$N#7 /;*$_P*$O- Mi< !ʬJaA>z@̶ww뙨.v8m,#jb3JOڹ %_",Xc5-%tQuvPefMp ONVֿ8JDH\hW:sa4ij*5*]06e>Hs?>)&@08(ywх~Aӆ!S-̠Pf#.Eo[8?a!7/v:-;y!(e (gw�yozpOew"{AU]`+ɡ݂|M@nqBw3Iۖ?k̿8@nA\LSXn1 M)9DŇN9y 8!R 5;mPb mYS-Kniu$,�<3 Τ"4*֊#ś�C.J"aOh~7*OX&)􈏏:>/쎍:]O׸j~cTһ*7eZ endstream endobj 23 0 obj << /F1 10 0 R /F2 13 0 R /F3 16 0 R /F4 19 0 R >> endobj 6 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 23 0 R >> endobj 9 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-251 -250 1009 969] /FontName/SRPUXN+CMR10 /ItalicAngle 0 /StemV 69 /FontFile 8 0 R /Flags 4 >> endobj 8 0 obj << /Filter[/FlateDecode] /Length1 720 /Length2 11638 /Length3 533 /Length 12196 >> stream xct&c۶ƶmolul۶t:ݱts;kΝ/۬U{jJRe5FsGS#  /* �sY;:yIXxxXI$/^v^V88J1G'/kK+71HD.f&$ &nV@&f&v$jf@7/&;;<J tx�͙XXH̭HLpqp$W?K@׿\$4$%i`EbcVt;/1%Ma^8;]H́..MhnnU7;k3K; _)kWIkO+yC?T5YUT6vpSr/o{\=I�WϑM&`hn`If`nb_%*Bw�<$<<~R(#N��x5swq:s%}-(Мl`jh+"5>63}Ƅ6[l|)9Zվ}Mr3gM',lL&z_k +>7ޭg+v̶k %2"=kkE*7D)Q`* u$.U4dLߜZ U}_G uu7Xa;y3cֻsMU5:ȦOE؉_Ǹy!P#?΄|4w, Γˢ۹-/{3W"6@!ѳWRo8T?G||aEz^0xNn№YZIvU#NV)Tc!^+]F`| 5wK5WwZ;gzXGkwR+6^A-d>L1>{$02E0a.!E $ǵrcNze̢S1Vrʲ"-h ۶ՕӒI,:˟\k6mDtoOpO]Zgff�4x W’K!?f0h ZMcVKK JOEQGR}J^a…ͥ=�LERM?lsv H뱐9|">dzôT2erF]%q0?}&TXn}I(o$Z>Dl?[ )q3^"uטS2=.@K T12Kxut ݞGj4PJL\Lxg"g_V^&5*6)<sf:ҥiҢOCL,:+$ľͤ<c@i-o~~ L6wxgz<7'T HN<wt v"Qv@ ͥ_ɯE/4.63:ܺ`y"rTac|c4FEj+Y"9)a6Z's,ηY1u>6!/vE)C;wN[k�U_1|@,8z S5qte~QgoFMnMjJ+z(̍ɃdI8fC0siD[ 95 Nk?Uv}Ukr8?[t(UՉ cz 2RS  Y0\ 7a \<ŁҘI UA.녔8$KE7yKZՖTl ,%1|:eSbP(' C׳x]':ѳOgLl)hEb;O\\ԘV܁m0ߴ+J8^+̻8 xߓJ T[4o&"MJ1&])Α*F Y%Lu_ -膀s|ͤt=!@en"75U$3:r2w{h^P5kf/2~Us%}cc4]faFmr^%n4s13M5i!*͚k e~(lwsifQęQNX8A[ПIUb;f 8]̨yC,#%D!}\`/W b9j']rD„R]hy.'FLhJ:8| o="BD5Ǽ3Jpv|}NWnH�\,w’6PcU40ZXa;?=|=~ EN,J'I 3)cth&>PWP^s~& ܘ0z?jǦ=t3P([G=0ןVGqlR^R[IZ)d%Cxw%Om[cp*cQ?!}T¸H <�w˰" 7z/:>v* -nnt٠.1l<=[Kդ~.9|4,'Q ZeEIuTO1cG4mV2lH23rN)g1NL*N5[hd+U_Ɛy3AzQ88+R$dJfj_'7y b? Ӹ(Yմ%9rѷ~*dٙSs3H7yaB*Nv=XvD=ď@vK.dǫ>un9>GhK Ϸh?G~Yez&>'!wmhxax~b>4Tä[^+*3nhOK%EКsrDv�?8+.7db1F5xrOxNY~H]ȏajMT.} 1 z5Xwy)9̚3Pl?#ȉmzKg>$7T2f<xrPKɞ%S:3XWM&I3kU0p%V/_59Y! aE ]0 s[吗ƱicKe -5iġ,]O^R8D\Vv5@xΤE\k>Ep[;Gv6}d9Fc7n!f{yyUHɇ2`D8k<C8SPB AȂvxAӕ瀃N.!>}2[ Q@O+ g7jI<ۢ_^? =xW4vB7b"1e>){9Nf徥j2VP㟍Z?biuYVQװk$AǾWrb{Yw=ZN՛k/HΤGt;ө\_jq3vpb#Tn6͉9L(9pDŽ +)z1cAy<A6?8೮kd OB \+6dg#+^ OX65A \;F*=ggμ1-K[cwqÚ"Kב5MN?TrZaX6 c?l!* -O%rZ D#(;ޏ0mR33+//&\(@$* !rڞK` A؈:j 8AU:-97gx8w!ބ>T,3?6I՞]MuPw妾ueoDYEٗBt9K=`ʠ]pѠ@4m.u+i _'_WI6ʛ:#z_2XbA5fjOt-ToMO^ ^P;73ZkhpZ;37Bhg1i)+(wӽMgjݶ^X*鲜aÒgަ(ZG>Ju^2n`ZӲ`. X=s_~<3aЅC>wiu5ٺ a˒L`"]x߻(ǥIQ`ClY{xqQ 9'c=;s[3nH#MGFQZm}}IϦWyl@&0\0zNĭQ=0|ϪVs5I&&hr"hl \w"lǨՑɉ*mrZι:"8*zF4#]8LBgž%ƿ~4 p|6t}ϯ6fIpXhҎZ $ƛN (_2xέ vOʷB%4Nj[6f~`P uptd&5O�Ԧ=V5PIHErcBp`, .eݭtM!bnE -:mHtI'ָ~gn^=60 @ےn}'{ڜZMQ|PfoF\`"a8[G^O<Y@߰#%A99;̑>D 70\ ީı8>Vqٷkg7lք [} #\w U[Iܢ,yFs.X+c\v86Izp)b|jW< %td j8]U "E []&A|%8f-'[X_"ncʉX{̱kht'O\kf7#n0c1vF_bfd5a4%sP qwnf:,F�pfH<xI GU/A'{VI@ T1&zQkx'UKh;ӟ["gj4Qu9.!((lJWA"/MD7&tw YF t}j0DU(^*Ixpa#3 ѐ_"1vQ=8roWI`Tj3+iWK+ |JՀc\.V~\>//O=MVĈX+.D1lX'%k<d IؾEUM8rP\zr>_>SY8&ֆS$tzDPMME.#GQ3>U5Smk\V*S8E~@4lGc'ק5vQsl̷$oܡ/H`}$>�JsMOJY]@}M^kW`ewסGP4GK5se*)brT >ڱ,;]h7Ql4VQjp|ymIyN%J4e( ӜZ+ =27~e& bx* x#Wz]NޗS]Shdt=挴̫"4oKI*~!F˯ǡΖADl?P9;Y%[k8;u&/^4]N]ӪdP[ P />:TcAJ!3ƏyynFklޔs(0Yw^?yaXYT^*LHE{ c' n&K'҇k+\ȫI^#*TY$!*s }Acjn$H8,zQ8MxkX#.RDVW K@u3,e)gt$e"+7;$D/`ků EyX)o^=B�WzkaOIp03e5$*.ӺiJ9Y'1J,4tOa&Cm ^jrN H H8Rڧ'\-?UX~Wϰ}!&M Y}ZF ڂom٧Y# yo22up v,k o'$A'_mLDOt7sda IK,u ĻbQ㍥7L߿ǏvwTX?Dt17�εÈ&&3]=tNl$(_ko4^7N9*VR?pxP~>{-Pb_)9pqQ(?\ ޼e ,?ňK(nγ3NnO}f`[P.[E zZMk{aLJl{ aBPrMo^,}/˩搗b"K$('2o-WMb}hYˌdRTsP2dg[+e0abHw6(5)D]CZ~3T[ pmB~X6/p6 m4Wkz#zR] ZHe͐KͻPz<3Qhy'0qJN*+ CQkRx0N6~gF?HjC`{"J{Pys@N(E'(F*[ ՜v0)-X>me@XKŚzZXԣuAW�;j 1)"dW^]Cj�]/#ਣK[ 6+t _nu0 *X-)|t�`gL~' NI :]Y6x!JRuڮz'vT+eu �beQ+y15b'Yqf$~2L8+s_0n;O\Sߒ~�$0<_lY`cfA?\vU̲CǫR֍I.jiK RΊ-fWsqZ~dP3ʢ $P-&E\#Λ$FwI񲡺z be!C sM! YF5W./$zr50L/$p۲�GRŽ!MG#hR\[vԮd\W'iK^b8ʬT_w.}a Rb7EOTE"u8\om,n\8"iP 9izPIriM@fa`[Grs'KY֟&;aaP Zf_$ct2[67RSގ2Q~riO.-A$vX hӺ C~9A l٭i69oV3HyYұZ!}ӱ�q3.uDʸ''Uf<zmu�eR\ `F!)߼(P&PRU{W/ 1m̠hW%NwjOc>W#ON>^VaJ6Y&[gcRJiՊ U$²$T:jBdزL,k�D3;HGoNH'BTeozVg'kiĦG8:oP6B ۲A ˽lZS :~AP/T1kY!z6lT?؉ˤcԘ%$\ӱ�jnɮ/SJc"C5ߴO~lG`]PyEkW+~ vtN 7գ V$"UCl^.u#!8ZN_t�߱^;vwCe|-1,= ƚ(\h#Fڒ 59['neg}|ޒOIw|9~t9C"aHw tW1nŖ(AYb=vDQ9S;0 vLkOT"2ڭѹ::jZãG9d٨IDee&YQI<1&k7_z `6Μk[kٌ0T&hM"=X)TmZTC1nv1Β1Vݛ:nfmy yN�6]U=~n$˧9;q|$Lqa{S\%*(2raXHl;4oXknĥ|sǙDFXTnuX7,ٱθǦ.g 8 ʧ{LbL)\b!.i7绗�B̙У[b\sUs$Ggou}K}L׺7)]nH qO1s"?Mp>,vuDul.7Dz xuFDvrbSl>䷑An_Nx/'pW?G,1vDT"P<OtK$(^Dv*$4H(.Z,c,5>?l.RJ!LI?ɠ(]J�5f? N?F|roWvJ.KZRڃcZʻs?`oomBtk8#RbPEǩoy&ErT._uBk1F,c2"" onJѪPȿ�h8B?c:>6GPR6+'QHǜ`;Ev)o@ NȴL<*ʙOZFȸ /}^E-/ClOd}nլpRH1gA3&F7ƕg;HeEFn%.u3%*cqicy,D{Da@"0z%@cY3oGYU%0>'YZHUn˕,2 uK"91`~8*إ8|e֌Lu2. "oQ~q-"`b|Ƀohq\zlo͆FⶥfV;V<C]DjݧȼW'.4q1or۞%}zBeꬱI$"B:^xh~fOWCЕax&[26ݟ]VQ _ԮfzKO,$SJ+Bӱ0*Awe5,x6mA"6{o4q.,\6 ~L} k/İ3cX'L%CW =<=:; seJ[CPH2^V P(nu0wU$R- 0J襡Q wBfCŐl]IM: >Cl[DJ,::@bl;3j|%8V0&B8\Cw:n`@,{QIeb[ڱss<6a Q hD.2kI!z7ɑw3k\m}OǹsBI\Y% @OΏe뜕+-` l0׹i\4DV:ێ3|P0WiJAI\~yWl}Zk4џ6*7р儃}OggfL؎7Uc# %} 5 Q䏌7ICsg^q; oc70 D6雧xY*{֛Z�R^Z͜ pe y(%#ѮPPhv渻S ^TQdz~,TNyF!y1қP}ajbQm"іG]k+e2OKKf6KKv(PO?]]fuEh6n{LqY5L"ʽ ؗ2%@tƖɡ(8tYQ~@-6RD &Nf6+\1}jEzgH3>;uzq5gx){s[} ^l)Cp8u>]:Bx[7!,Ib!r!j]G<n3,Y.\!�-zL833X}: XaAHYk__ԟa,v O‎f%Mq &gb! \1 .Qew] s]wOny 0D|B3Li^P $(�=;Dec�cܵD�)"iH!)Ւ�G17$~MV"|Qz+)bHTn6lٍkC<RüuCipY%+dS@1R_#Fe,q,pbp=~poiŕ+ͩQy7AB"+*B+JiDG9|q1e+ўJi6ff#uG-x%)Ý#2Y5Yr2@ӭ B'�d=7R, Zʗ3b)L=[v r׈ks0v9d>jni;N0MboEp#@53ٕ{i$z&x? 3cv6 F�^[Iح^A& <xk焜gx o;h!S_c9Y6j%%+7ѐK~qVa< 8$Ћ~szHSzRH{+@&($1ccDp9nsd0޺J܅v.ɜ a3wGi \RqU}/m ~eC@wTnb)/*x^#> @mKSjs.v!Z/ Ғ tqPcsO*϶-vG#UٸW]^%k:9b` u\P{ǞhH=6 Ի10<W*G=1KiÎ2?fr H ~ 8^b^L6L xT_fCvQ$5;h@(t'Vul =,>�W F=+;=o&X)o/{QM ;yD]ց>Fc7ؽxtXNy{rŘHڹo(~0 Ny ΝH +lU>vt'ɥg�w]>u嚔>(=i;$3=J7j,qPTPh|cBЉdĬg}fU<+Qă/nM'5HzYދ SSYuՍi 3YoW tri,0 |Mhh=T[hceỏ<^ґƇDZ?t Q/ cE %lmЕ\ތC>,*m� ~+ͦ:jl 6,AC_v C BI&Ly^1'0OƢq?�{t;S¿Z]!I#޿;H]uKFҞldf/я<ԭ'R]ha!vfqd轐o )TFl#8 ! ^^L28 b٨`7\Þ3}³$P$|7�Y­hJi g@K<3J1SR;l)@ g6I0c;[|PI<"F252M~P`<J޽C#8QDFX[,T%J)vAHz=\ _oP}a& \q12,&1Š p CCAH9MT +5B\ 2T>Qd#$gӇAAHA~ YtZlv2eO)L ?vAxD='õpM<2XŢw>ƫtb*MC6q3Sm(x9|[1t{kJ>d_~U7S_p 3;-�:I/ endstream endobj 12 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-301 -250 1164 946] /FontName/XHPQKW+CMBX10 /ItalicAngle 0 /StemV 114 /FontFile 11 0 R /Flags 4 >> endobj 11 0 obj << /Filter[/FlateDecode] /Length1 721 /Length2 2808 /Length3 533 /Length 3353 >> stream xgXSa H"x(Q*EABrH 1HT4A ERiR*"R.:3>}o{?ko.$i995@BQ`z(T"I�I�9UUyt;Z}jJj0e O /C@"H';2A!-I2�6?~l@e 99�A�72�h_?K~ I*q x?!~/k9Ց8 K :kcBBb1(]`0>2ƐP;̃x_@n DZ^FbK!;>C.Î+w$<z\9E<=�[FJJO@)pd$-ttUE[Si\M �% |gK$xϛp?cwр@ Ap %Q³!{y ;轏Sڴ* =%ʫEM/HvX0}ՙ5{fv͑TŽ̖�{Mo=U;)V![ҝtyK^8JzXG&n`3O lzm{3=vH ${\H9>rc>Jk—]顼KgV䧉V7gŋ?Kj>n{%Udj#HԇAюұHΜWz&ڕ*Í?IpEm|}-jT kN&ݨ]:Su>oGif*SIn{;_Dw9gr9b݈SIGbX}\^/%"tQwߘj ߭ Q3ѻ%~)Q[Ly,L5+)Nõ<&#;؉/W׭fhalqCf *`ك"Ķ/p,=}@{SW xjf ;/j2zM9 ߫W<SiH[Rz&y/,J0}/}'K;*m>3f~x?h(sR6voeaO/6w2D5 &D|J3*봋\oͯqN{o%vO_ʿÚfVJ&o`S1Rk\,츆sb vffK_tYD敲|cZdcr5a/kJG'8!<ᇡ2F ŗ %Ƿ# J)OQ. o qph勹fOy+ fΈT(Ul|y0yc<dDl LݢbDPl~ȭѦgDb,$؈e 0g|4\ulFIBB;_Rm9Dųn:7Iji4`%y}M^rHSr$v+`4ϭƋ[ J!`-:3`n.-S~o~@zYs6B}.5[ȵ7빶|mϐx@HsȕO/vvVY6zt[>\2FJQZA\oDݽ/HmRY* S,*w$1k9Nxnڈ9|y\n|oսѹ *;Y˪7h /8F5nس$dk^|qjBz4B(UM2`, 8iڼQU _yN+tp_4`NY8pLNp|5ZQdbϪXlMlt~KuIu`*ܲ�眰ַB/j3Xw;ecpO+-|1AHbA^܉*`~lID/Y6#}FttZ۳ƶLb6[:n8W=i.桇ܣv gG 6Vޤ% K I470tфkZ?}R-aCE"iJY^% >2T4_M`0v}]ϱMn)q`(p`X­(1ON~OFWMM9@ӁetEw[@;W2}n(`efJ#Od5+.?jO_r0c/x|*}fKd:}gE5 zL٬4miA[y':T׵{i<.>Pf!5jץ͸׾U4SWcýI}xqix?gJOJUalJnbڿ:vG^U+ۋQ)9w.ƹeL~b' a\<.AgWLfJ((QkWzg<s2t0דpcH*fk+Ȁh[ ﻖr.cZHwR1[SlC==f5U+1Pki!Q<#hRQU0E]"ئ|?8kp<"z)IV2f@D3jkNmmIW6To妴~;qj-x8Yns &&bD8_Ǝse LԮ{ޖzE'3d_4;Ք.nFs+eEԜڼtX͹M>x键_fu d|zFm8{[{!{?|A#a</|l4{cK3$T&(QT!(h PQ)ټTQ =D1~6M2mw&0DƭO#CU@0yQ8*yo^C ڜ>@k [* W>פɫo?Qےw{evvW9EJڝ뷠wJeYZ*Oꨙ8:Ŗ oU1er}As7;\l6KhFU!_ wIkdGj*Cx =x͋"9?)moFK\юȩ'#Z>"N]4Tv+S'zrD7!plX3vFrx7 3Oܚk)/ԭAp`*?v)=㰊ΐ˳bzLJcee4ҹ qXv72>FNfk?uJ ڶx:+^SSH&(�W=]ŲxJŕ[\7}i^/Z-2iWopne].{ΰ "$I@ klK endstream endobj 15 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-53 -251 1139 750] /FontName/CYZVRG+CMBX12 /ItalicAngle 0 /StemV 109 /FontFile 14 0 R /Flags 4 >> endobj 14 0 obj << /Filter[/FlateDecode] /Length1 716 /Length2 2582 /Length3 533 /Length 3117 >> stream xy<C%Cvc+kp,e<c&3sN"KeCCD([(ZSBٗ,%Hs_s}~~ϣm6T C7,=�\QUJAa�74�@! UJcӉfՅ, P� �BBA[�,H$` ,�e�`�~�ch@zũlQxԑ5 b Տ6LCmQcDwLc2@:@ŁtʏVw;%1v @�]"C@%�x )܏[k�:{ C0i~C'�^0 eܺxa5K) Ca?RYZRCNi#�m]}8�# >]) &ha07ˤA ox~@0B8RD_-9%Ozu^_yAC Nvsg.)Eq0Nx͖fkxɨ҄vD'/n׫L)"q7=Mgj_xj>+f\f.ѕ8M>hu6p"AcO3=J?uG |-1T&mgޣYY^GUz\U4.޸hW-;Az^qO6 T]nn6HUBGijskѨ[tP.M7%@n%|Cu� ƨ7|SM=:pL}nP nHzձVlBt-3SΣ73$n[##=3nA#G򴀰B0 tbScA,Czl1%i1{:*Hd\}[DMѦqjAեx:kJoS0Voܓfm=NTYmocgԌ=;e$ËTAo>f2:m\pl5G ,ϏjJ9ufIT&w!X62"*i&8868'AI{ ZVtJl</A2& �\&(QfĽ=Vp KZbA7GRRc>'ϖU7e!ɵa( Ϛt6W݀dAnZ[>x~]PP8?M¿\LIB3$gJWzI@rѣr{̊6;%tVK1@iGtk25}sQ w̵83ԜTb lWrƳ6~$pwn)+5bD 3ȟx>hlzN `[؋vTդ'14Ji4ՖP)6WKxe`P,T}Yq<~w{є#zPv\!,=YhL]-+ҲP5S}.8e9?onXˁ7ϠTpb@.)/E9؜{i)>#&ÃץYE G.%Ȗi*JG8=_̋MA[_DFi#[7?&e*jZlordMHs)n!LSD}'mg'fـI"gע)ؖYFt!9[ i蜌ݫU;\OUpbɝ=I!]NL{~LWRP=ǬuaJoJfLFY pX&x>.^)=Xss߈{=,;{cKk{+I$^3ԵD_tר0ÅVtr<#^4]tdg_K{&/Oph~|7eTVABHWr K<^~y@镤D%T:p>~{ZHL(W>mē竏NTtsEmhbv{KE;YB[atØ Q}3c ~W˄u%JI'j_cG :_/(2nmK[RѾ0˟+Ҵtccwb_v,~$zJO* {”Wp-/ vU`WsȘfiFC)[2<S߳׈%~XC 5tZP8fZ8r5TgJ L'u.p"k$d:nI~Qb?~VYj|3_ul}Ry)㶉Ugk{Js]TNTME?SMeg޸>,axަ2PSȪ rjb桐hasK"#/¡(%iI)şxC‰$|zjB%M<YY"t7ϵl:PN\ I]~+0{o$@0|z O/oE5WgLM$m}箴=^MNŊ, 4DFJ/H,Ks)x/,}r햓/{Aظo$KLjY_dߕǬmO6K&n|h(7g%=s;T�+qY̑dn|fJT7EQ/8/ǰc%CVv k+�ɣ#񡡎e̝yY^ 2xm^-%jkqgx2#'. 2{hѱ:[W5F#,yp=oX$Dm\ \<4% ,Ϟ<s(U?"qCJrB=gY;-7P1AQ91-n{ok頗b_Ylc  <9.Ҽ1}/n[Z{f5a('M4 _\$ÏqUvI//'$CgPz SJ_ endstream endobj 18 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-58 -250 1195 750] /FontName/NWSIIM+CMBX9 /ItalicAngle 0 /StemV 117 /FontFile 17 0 R /Flags 4 >> endobj 17 0 obj << /Filter[/FlateDecode] /Length1 713 /Length2 3449 /Length3 533 /Length 3993 >> stream xgTS{Ʃ*h)$DJ"]zLĄB(�Ҕ^D$H H^H/  4)‹޹יּw̚o/g?9}p ( !OɂԁS=[5 HV * !$  Ձ 55PARVWTVW��@LĸK\*h"M$wQZ4, ^^D_4J��( vrxWPOWM>Jq^QxBGG,c>8W=a xxD)&nAɦGc an84PO mGyh<G[ gfcJCl<ɒ_5?1@{yYyyБo H wZxO(== X(�>:@ 50P,_Vx˫(V>D"O}>s4d<;K Iml4\y3 ,|}k8fw7#°1%xL:JL5Zd|ݵE4Wv r +jg2)*8wYMboMP8Nss\ :r8A*y>C.QU ;Zו *786_ϯ9v-ۖ&sqk>cd};v8!c`|@,õ QF'оW,Å)aI/ClkQ)Hj[T/!. X;ba;qшg29yYoUgh'͉l+k׾D�ع`ݸuFg)ZqJn$~Lզla5[x;{ã~2S}MVې"t;]u #G!!͙#xHzC,4bdP:76(a0@kJ+ꁕ�'AV7Ds+BHNuXW}'Oz4OZ ~u!%T7tC1$K[Խ%} E 榩aw;x22A- \>ֱ nªS_ao{d@*Y;rT6gͺcLb|a~!Jd,zwdHx S`Lutoe>sK[ 0i\aԇ^h}39qί),7FvO__VU,YY^iB=vaOTc>dib/$+.F杳8,ӝJZ!G*-cowNF\۹"yΝv$⃗Bz_<YߍMb|۫vcA?WlsW2;XV{s=Lī~m'ӱȝ7AmVȹqҸ2֑E3OI~K61ZM=,Ճed7ǴW0/[g0owܵ܏vvR>L٣=I2q]HtMhK7Z2)1'ϛL̷3MPц%JӽVZ?_kzu܌^@LC[FQV&yCM6~m 'ulm/I{<¬;73e;�>7KJR֙/ōMl"ꆚ)8>D?E,7Z" ߍQ+.aǚx"쇱q$8~rjڤqtI7X HP#oisA85ӻUˇ0:RJFݛƶWIKUyԒ1`D sj=b3:Rpӛ΍1 y jrߗĝ ~y@0uw/? g6rIg~3Jc2rjՊNyuƹY68bʟmIy+jCN坘4sYJ0}#sή*dx˺Üj)6,C14$;j\ƳY$˄$Q Ƈ<5멦hgMDub`|{"[óĻM)I7Ye3k $hUk~1u&& {S2.kFxSl;7uJoܸ0a ʩcԫU,tvqZj"Ir\Oڞ̉J)˓RìOYBםBu'z6aQ\U-MѨiۈsbbq#s"Ő,r3BLKP↚;iB.M)Wj5轌bi*V:ǹϽ/@LY(y㠚9sFb簃3R6ص;r\Zl]k&dU)#J,]*u+li [km4 n~c:"u}0}CdX)Ix58vݧ{c|ke}BY{ZG{}!~pyFgw&RF.E,m 0cyVdz٥k`tYĢwܨ̗Q:yez0dYDĂx ,9-Z1Sr@.mԐp_&^h86:fjif(h1v FFO[ͳQj >>[XҠ\tuVoD_7ݒ=.McW.42_՝fqyRTo~ M~(?+$NыO{J5wJs+ْ4<W L-VT;J *Sdy1rݻw\mb^zIP݆4^oX y:Ќ*WCU.,b=>RWc}pLAcrL+ܖ+tl:k΅iدmZ,kSizn1W7ycI~EUN7N8w[ttEo95<:,%xZS$C@FTx1bA#| I{"`DUqEo㕽8ʅhei"91H Ut ߠ3ݚ.y fL^e:P,i^!(&Nnύu乧1[{a.&(&f3ȒzʀR!%,qJeRqd7O*#MVjf'VzvW'wAMJܛC [q^2kxO׽eLl\fSA7k,Nk!&#gwn_. F/ <R{bʱ!hmTKdTKnu^6,Y2[sXk~+Ljcɩvg[VІ[YP>�]bqnЬG~E!C0?CvmNGK� o}p7~ Y! !]6>ez"f` Hi?_�Nûx'rzA< }N 8r5}^Pc Oc.;.t*nvhɮ2`ɇgTQ3'4 ͂uu|l@jH6-?~އE>pKy5{XͪyvE6餠֨]moRvT0`Ee/;~OA#2 -ӍDk$$(g \Iǃp>[- 5^?U|}iø@rkVԀ t:-4f\C}bnjǔ/ֆË͝Ƨ"f6@a5ٔff`irs;Te9#%o v/vvڴO qhD@��B endstream endobj 1 0 obj << /Creator( TeX output 2004.10.19:1439) /Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate(D:20041019143951+01'00') >> endobj 5 0 obj << /Type/Page /Resources 6 0 R /Contents[20 0 R 4 0 R 21 0 R 22 0 R] /Parent 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 1 /Kids[5 0 R] /MediaBox[0 0 595 842] >> endobj 20 0 obj << /Length 1 >> stream endstream endobj 22 0 obj << /Length 1 >> stream endstream endobj 4 0 obj << /Length 33 >> stream 1.00028 0 0 1.00028 72 769.82 cm endstream endobj 24 0 obj << >> endobj 25 0 obj null endobj 26 0 obj << >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R /Outlines 24 0 R /Threads 25 0 R /Names 26 0 R >> endobj xref 0 27 0000000000 65535 f 0000030427 00000 n 0000031017 00000 n 0000030692 00000 n 0000030870 00000 n 0000030591 00000 n 0000006497 00000 n 0000000009 00000 n 0000006744 00000 n 0000006558 00000 n 0000000913 00000 n 0000019245 00000 n 0000019055 00000 n 0000001829 00000 n 0000022901 00000 n 0000022712 00000 n 0000002765 00000 n 0000026320 00000 n 0000026132 00000 n 0000003711 00000 n 0000030770 00000 n 0000004710 00000 n 0000030820 00000 n 0000006431 00000 n 0000030952 00000 n 0000030974 00000 n 0000030995 00000 n trailer << /Size 27 /Root 2 0 R /Info 1 0 R >> startxref 31112 %%EOF %BeginExifToolUpdate 1 0 obj << /Creator ( TeX output 2004.10.19:1439) /Producer (dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate (D:20041019143951+01'00') /Author (R. Llull) /Title (Llibre de les meravelles) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R /Outlines 24 0 R /Threads 25 0 R /Names 26 0 R /Metadata 27 0 R >> endobj 27 0 obj << /Type /Metadata /Subtype /XML /Length 3807 >> stream <?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> <x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.24'> <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> <rdf:Description rdf:about='' xmlns:bibtex='http://www.molspaces.com/cb2bib'> <bibtex:abstract>This is a cb2Bib pdf import example. Llibre de les meravelles A short summary here. Llibre de les meravelles A short summary here. Llibre de les meravelles A short summary here. Llibre de les meravelles A short summary here.</bibtex:abstract> <bibtex:author>R. Llull</bibtex:author> <bibtex:journal>Ars Magna</bibtex:journal> <bibtex:pages>1243 - 1249</bibtex:pages> <bibtex:title>Llibre de les meravelles</bibtex:title> <bibtex:type>article</bibtex:type> <bibtex:url>http://ca.wikipedia.org/wiki/Llull</bibtex:url> <bibtex:volume>74</bibtex:volume> <bibtex:year>1287</bibtex:year> </rdf:Description> <rdf:Description rdf:about='' xmlns:dc='http://purl.org/dc/elements/1.1/'> <dc:title> <rdf:Alt> <rdf:li xml:lang='x-default'>Llibre de les meravelles</rdf:li> </rdf:Alt> </dc:title> <dc:type> <rdf:Bag> <rdf:li>article</rdf:li> </rdf:Bag> </dc:type> </rdf:Description> <rdf:Description rdf:about='' xmlns:pdf='http://ns.adobe.com/pdf/1.3/'> <pdf:Author>R. Llull</pdf:Author> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end='w'?> endstream endobj xref 0 3 0000000000 65535 f 0000031752 00000 n 0000031972 00000 n 27 1 0000032085 00000 n trailer << /Size 28 /Root 2 0 R /Info 1 0 R /Prev 31112 >> startxref 35976 %%EOF %EndExifToolUpdate 31731 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/testPDFImport/nomeaning4.pdf�����������������������������������������������������������0000644�0001750�0001750�00000075520�12045517740�020052� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.2 7 0 obj << /Type/Encoding /Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] >> endobj 10 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F1 /FontDescriptor 9 0 R /BaseFont/NOAEMU+CMR10 /FirstChar 33 /LastChar 196 /Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 500] >> endobj 13 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F2 /FontDescriptor 12 0 R /BaseFont/TCDBMP+CMBX10 /FirstChar 33 /LastChar 196 /Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 575] >> endobj 16 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F3 /FontDescriptor 15 0 R /BaseFont/EWUVHY+CMBX12 /FirstChar 33 /LastChar 196 /Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] >> endobj 19 0 obj << /Encoding 7 0 R /Type/Font /Subtype/Type1 /Name/F4 /FontDescriptor 18 0 R /BaseFont/QGNGHU+CMBX9 /FirstChar 33 /LastChar 196 /Widths[360.2 617.6 986.1 591.7 986.1 920.4 328.7 460.2 460.2 591.7 920.4 328.7 394.4 328.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 591.7 328.7 328.7 360.2 920.4 558.8 558.8 920.4 892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2 657.4 624.5 854.6 624.5 624.5 525.9 591.7 1183.3 591.7 591.7 591.7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 710.8 986.1 920.4 827.2 788.9 924.4 854.6 920.4 854.6 920.4 0 0 854.6 690.3 657.4 657.4 986.1 986.1 328.7 361.6 591.7 591.7 591.7 591.7 591.7 892.9 525.9 616.8 854.6 920.4 591.7 1071 1202.5 920.4 328.7 591.7] >> endobj 21 0 obj << /Filter[/FlateDecode] /Length 1662 >> stream x}WIs6WjƤ zM'n2N` H�&} "o-,}noĢjqH,WqɕTJm/|s*bÃ2e<`!(|G./ Qd]چsv \dc\Ug/v~XJ<+$ژ2k /ӲA_Pf@<"UM&l OWw˶N~&L*uhX7O4o׫ڮx[Elvv΀{(A,R2 TI 4E ЀDp#kEG}J> =H~5OH*qliUyZ\&jJ׊d֊I+^ճW*G~NYhfr+PT&P(#PY5$g"2&o>tkUM\+/:')J�V;7fb+]3icΣkUTumExy=O&�RpY1xWVm򠻥9 M ,@U'Y-h^'5!}# I$څ0zcFNPݣo!V $ig,K*YoqkːUI[iU:7>-ƮOO8Lv*Tyȸ~W 0`7t1BNܰ &S Rs2\%qx}0\i,S\2V$y2-9B?zLfߵah$9z&FH)5&=(pH#8ne^zuõg#{Z-n{oc8# H&DOy(pO9 +Fsz</ nk=jwd x!P1]_0a*DŽL8=CjԱ7i@&.L %f:Ae dR…sNq4(F3<ӦB /(U9TɌ!Du!0zÈw'ޭg>R|Xt /V¹jl+I%'=VL`?0˚\9յJ?L:=ףvQ4mS8tbV^jEҠK$En{{fiH$(t=R۬ ͙J |0xݨy #S9GhhÐ7#63(Ȗ8 q# #g7y`ٲY;Z>2:�NJ.iRːEUu�3v&nt?k?,\"2ͺG:޼3v9m]%㈓TSXn1g Ͱ)9d4i0ItxLCy !N[+lcB8eŁܶk5{cYCz@g�`]1~n&=-g<Z+NG3 0;ӟ=:+࿢,3%?-lu&%,gqѨP{63ow_^ubcoDwC> endstream endobj 23 0 obj << /F1 10 0 R /F2 13 0 R /F3 16 0 R /F4 19 0 R >> endobj 6 0 obj << /ProcSet[/PDF/Text/ImageC] /Font 23 0 R >> endobj 9 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-251 -250 1009 969] /FontName/NOAEMU+CMR10 /ItalicAngle 0 /StemV 69 /FontFile 8 0 R /Flags 4 >> endobj 8 0 obj << /Filter[/FlateDecode] /Length1 720 /Length2 11503 /Length3 533 /Length 12060 >> stream xePᶦq,n%Cp8۸;A[pw'{p9gso=zUS*1ٛ�A`FV&V>*+ E R h I|�V^^6ɆH wphiLA�c%-@ `�Dmmx t:͘YYfV`  s{�f.Yr:9d0#2+R.vG[\@' R-fV.v^ 62Y,JY9KY͔�sc[g?@ٿC?D%4YUT6=Ƭ3'+w.=soILͬ@�51JL݋wXXx\>Rd*daaeg sVMThNiVY ˩h^4mW췤^kA|h4<xa L89y$Qs񚅤h@ojNaBy!e)ф7+Q`)/Wj[VtyI^DB&ut55kucoͬ{n!2T)kNcEO{ bcY+J B_G>#W4oSONft3So},8ot?UX.)<h$ =? R5Wѕ$22GȒ .qZNj~Cqm>i~g)ElxPxTZ((*}O2omkOo!5:C<=`Z N&d^ MDBiCd8cLa:^ @<-Wcɚ|}Ψd(N `DZAw f0He*5Sd==a[+wIY ziڟ7fj)@�SvRdN2ÇxB1Q%+_yu-.!f;(XL܎HUVM/dm� ßu63DA7_Iy&夺(Zlov0u&9p<@}zQo$}.?)ۃQ~,ՏYjϪ"H㪡E]^iy#^7^/;,% èAtڃFX K`\h'(ǼOO#.Z~4U{ 'I`b&(O&%-6 s je zeN{<2#JUݻw t�BFph 0̄OfO:{Os:PRN-OVGH[5=EY?LEHᦻ/FTz7H1OgI#H+OJDoY cZأ,x` Zv# FAImf*c@Z9()ɶۼyWޕ auU)RjU]^+TA34VK$={ތ+ns/ EzUis|�KD36c^_ɑ1J=lO4S!j^@fOڕ^P|g;6CƝT9eo:@'Rk@BNu RQp~c}* fFœ~T'lztYDQuM{ א/:b7hdhMV<Yf"bFz' r;6Y$8n*Kpѻ-qnΣ)k`Hi_PEAuJKƠwpqtG=JS?6F/,קv Kkq*,%[ZsWn*jtK(t0?_oY T?LB`"[a򴛆A5p]<NO@m j\t~eH8|OS < rcܤy#ӿD`@/lJ0{ WOZhgF!c(زw9MU7ᅢ t!"ý td0xbXh|;bpMbL<_� 2kAՁe[?;,H9PLs3D/0w{ۛw VUD|nH[A^;5dx1P`;|,aO&Nt+IU3P똺%} #ö07v&#HDo%؋$Qܐ *COB,dLzp-=7 lXE\qbܒW.-+8sW:n;k:NjM.'#:.qgZB o;6dw;-;r@\z(a jxQ^"9f gjv1Eve^F@q0HMkVRjtz31յdyj6-vtu*(lS ۖT9#k=s3 7=8lҙ; #ar`t4]AW B8TfjUlV!yI<f1vljZR\_-'Җm(vLj2uM8x |#w:;Q0ΒrCL|-cD6T~2:zsv$5\lDx^G%B껖MW;WXb[t1)2yȋ(..e"0 lyjct9{NMy'E@#Xx n0~ׁ1Yܱl(9LW~'l'Zu%D~]̃( 佒޸舟/|Z vد0Aҡ9c6OPHg.wg".q;[BArn+UOwxDUiqor ^"mv5$a޻lST ur Oߦc`f KA8 l!_wk\MI "''sMSH.?|W'Dďʓ!JchUOx?W 8a2uGd׌ͬ"0ڌew{UFr 0#PMOQιY�qPdNv.2&5/[믶$lr(age Ú`j\:c$E}t7ed2x o”s$*%x &g)O *8ARthpIdLFjheuKtbRmZ<*{8lAdsxjD"7Q@5hr>y)9ym3#% J@T}S-LISsmn3"--uEX~T"+q+gV](zngImE U haP,3s(_beR4phr ]$O$-%4b ^=,Y}U<^>Wpqӧ_\?噦]Mו yn D)ݟݞZM!]cAe.m*8kULΌ#w+ O%b&S{lo<RV*Z ̖)]SRHQ;֚fú՚ᆉ!O!u W[n emR_L_ dtDK}ZcGB!{7y|O ";ˇPql "7e0ΩUKMhhVD2X"0k!L38 gD&Z#s7>U~>@[ هI q%H^}Mg[~�kmo…oGg d{ý`ibēF:+^4Б1sjja΢|;d*VB5T`+75ѐʽO(|C &KN ݑ-! OGy=˖\<v~eW~#Ǘ`--uSB@vg[I* Oү\sA1IxspY"j c ck c~Gρ'7ݞ<\ƺ3I3P`eL]s$YёNs=MX+ݝfNZ1D'<:7„Ի+i|F֡ ͘d_J؍&{o*vb- :.+,nSVbV?ػB9=Yb|[*CW|*8SD&S1 u/(]+:{Eް4v.4\]%2 : }B"\^s `86vOJA{tk`�1tK^Tu1Y7Y] RIe(* @tu0Tʃ.C%* bZ2\t6 dzUV^ԛKaxx5gh,i٘č;tX2^ú/6{sM;^q;UWۣt :2rowYK8Om.4 ( A6 𝐸ir7(_+I7 K5JESKK*47ZU 2oCJ-%:Uro*8Xi 0CY ph Pc>z2J=RU\uŵ z KPMiA!+pז5@1kA!AG,?6�9.$3XUزxLUuE6,)7ħմY8ұu+v<yFq(i94 Dp@ OGO %_[%ljnu?0hucw'ջnA]z&$oTt^ q]: pXIfߥ7ۥîLzH'OstK] [FkDR \CE.ݳԪ,rw/�|iXùn;rfL@ZX{(!>zrfSck$>-S>&Ld�IapyX1ls4uyptm! <9.V;]-%~s@ vL>"lcNkZMmsd{y\|Kl[UBڷy2MU~BZrǟ~!ON=cZ'RwStް8"Z̞-^IcN>og@BD+$~V{͑k}N.ث bmF?2#1J!H3.JS-ʀ?F| ޾xW_,S_ۖl837ܝ.HԻ"#6 [u44)09o+S<F ׁ ;7f%df̾Hpw,Ys-ۀ|7Kv5`Cox"&̓?MR#S#$O('#X!c_i$͜Di\w*ն g g hb?ٙ'<If88;;[%,;1AOR7Ftܧ +&794+]D4C}ͥ[rDm$EFqBXXm$DMD�DL9e2Q/Lu#[Ur SWMJΔ ArF ze+b6V K 6MOs5Ha<_n~ocp%q=ӵn%@}<'{GC|.~F<kfh3`}>#_W0 qQP5K"[7-Д 33>5y>rpbq~<ZꟉ`B,/ ]".ᲁ(YXֆE> vrlm0s& S$|z>uQky|QymLJ/g+=s!]Q > &NJB䇁Qs70.6H (hj�Eա�%U'+u?dh84 N*GdGLB Rj&*VDzYb k8 ~ÁOL8Xb3FJG!$$OYOkV2mv h 2aq1]ÄK!,(.;YK)F\C]B3\HNDFmԶ`;8 zYUEǚORW|yϚ dYOa*/dģYpFruOzd2{^Q7hꡥO'hR ZǽcGu~^"?Syĩ) Q/d0r2Q;U,j  8IE+M H}8ӟ ,]8A!*DϿE9LFSKQOCe̟k#a.|~<VD̏[د63r}ىKh߂t.#\X4rD͈T FJ ԥ؃! 'p)'obP窿Bi)m^µكݩǁ5cºk6˸\AMeZ"4RBif-Q ꮕs5. ݌.H>$-*_" )'- O^kQxt{cl_ RM]ed3Ogs20zw5x:VK0-Sw  c7~.M 2_%š\1A֟.St�iD~KGr!uU<ܘًGT)klB 3s}uƢ> MUak鼚&a!$/=( 1_#|YKF;rYW%Ї7ݙ.sѧ{%o yT vA0Ec[QkyrCv8)VD( otb1IoDت҈웡;;Ã)4Ǔs4{d9Bleu~Y FAG拰 90153yGlɈRsU NH{(eM0,.?_,3+ցGy>5 )pt gw=D`[mZz[Ue%"NI Ic}egwg-F�54 8>@5VrݬJ�#uMr%ݖ~bk켁9|uD:xll)"[zK:GY-st/V֫oe=1 W,ϕ0xk̛M{N?]z^F2c;oS '4[/&({p3nk;ifqw l1 OV#Q=H^Nx1I YRy&WPr|"�#3"^(\pd L7`(|=\ea9#Qb>6uVpjf[3M;`EoWi!hLҬWEyX wV1zD1Sx(2|,kl>Dҥho{Q s1-Dd�iMNrq.8#1<hy=- ,][ӳCcxKmv4 [D<htOFK]ߙb$B8/%%dXW0|ԕia{mp"k?C<v޻ -oJE8$|_Y0 T3{x0{bɚTy1Hr/(pZ@@"/uZĘ6' Ԝf_:yH"BQP˄))=V1Qz.օZ$}1?B= g=Qo">:ȴE�Rg$~K&[5SHn%x`R/6@%QSR�etƽL.;% AAقRk{ʴpmQ2"D'ԧqH*R>FAs5Wk˕C?$ w<ꂣ֓1FH)@"@K#M e< "+?r}H183о,ցbҹ #BR72.,w1z%!^J G>Ryt@k>gl}&~䒂=W1hdދYه_]BErrB6QnCǯLETs$;LV\b.1`Q{@O!ZP7o_h8[B9mi:jy0 EW1YSvSKQ@w_t bX41_Mh*~YGgo>8N90;U̕X�?h>V,ݴRg@4oKp#@>We;2 l Yfz}!~U|[a\U tjz@8N[-~nQ6Hi|h+l$v$!*rDCg5-{ސ}n#N̲~J=D=ިa !5tX{86Sґ5XjddnlG:+<jni^7dܠ{G6gn7߀Â<AjL<x er۳N_=$EL} :,2AgTqk<3Tyx$D)ֶǼO""dَ-h?)Xqp4nzIuRUIú~hR+.j Ȅ /[:wvBL|=Ig BEȯL s^Ǣ+Yf*c\ yA?*K<w~qxQS,eH>y1l='0z+~Jd7U=L)xw҆RgTt䬮E&|aeΘvz]DCXT o6C-R#73,Yu0Ցx$iF'cN\q[ҼZĐ{ɮã "ջa!#U-\>AQ1rÅ,SJ)F7"o FM"x\}Ts<?]iR ޔWբ`&t\)tY;vĽrs.?l崎WN0@s'vYK5&L)JM!52*iߡbѮv e=ypn2ߤi>U.rJ-tKvͶ +2+C|@_LO*C휥2ķ2&UߓIxj9\7g>~͐*/KOU'O#iGq"<OFT< qq{i7 v;*"64M/*m[-}}FaG72o|K1}g`c.\쏾{>WP $3nn`<cx)Y:̡XypL kiD`"T?iw_dP>mpEy)-3NQYuSA`$%{LAmD)&g5 {Yy1JRC.\&ђGP$^bL ;?MO3 5H]g%4VymT3|7 5 r0.mFO\gP qO$!(acqBд|%LJjl~Ev˗(,[!ELK'U٨+i%HT찱6/9T+i +Fb0S9b3 ).0J%/PõËj]wǭ&�bF߭;(ag5y R37շu!0 ǪlPvdbAP&MG[9}{0@Nzw'?@[%=?~q!~wUаu4c_nQ8:ؐlץfz"У#T"Er5>H?rL4#2B>6!9^U;AytDdG'Bzi<6ˎ̧in$X[a d-^U+ �r 7m z%`rps}o0Ot@�{0,}I'V/(R@�M7FhN4{KMz):v`Go LO$mI? džCpOzrvNtR:N(Գt@-(37>u缯:}�N7M3<g&ݘɸNXgfE!6*eZmYG@.�Sr6m:3~{l/=6 L QY s !ۣ&2tC2:+. )n iٚU]˴{nOSG4O )qT wopD;LT}_[62Ń> I3hה0Ma,׏X+4j,YYyԹ ?4M0`TzNUm'�)B3G~ ^_=z'w23]-:]o[]GĊ܂.o5eOgjq=iWz8Ópqtn-Ծ`k%P%Y}}|]Q܇?t"*tΔNH͵2ٵS?w)D?,>:r6T.y4l#pAB9ߥ^ҧ7Ƅ޻RoȘq+j^Т#G5rUXVc{+_X@r@"MU"X"֦$SʊL]{I DnQ}�" #eo-@; ctֳ^\ܡR'* @Rw60/ѺPzž}x@dh�/{LK=y׹*3&W%.r)O(Qf|u!q$g[`ޑsT_ ECrn̶^~ބ-:=nq,#pQ)&9#FX43څr)%2J&>)kma�ŠeZ{S>EDM \e=a6l2^'fAG'#[F1 atJQ3+&ᆮh@bέS�V"k>jj=YhY5l.=fpAs9bJ7$duz۸̊U$ "D={.dV󑶭3j1a~7F"CHZ\4f l:FJjVUZcH\Ed 9}n*Lf?\Hg{RIʵ4N>ق"IIcB-Z߇KC,≸d%9x._I{:<̿uelGBbGǓUS+Blܘ>;jmy'(5c7[!se;䤍83'/JiOd%b0'c|VGa$ [k&q3%P!HǴ$?=qb3^IBD'ΗfywKa2^nzrxp_ ġFZ%C5>蜛.XB[ QJX/o- logd endstream endobj 12 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-301 -250 1164 946] /FontName/TCDBMP+CMBX10 /ItalicAngle 0 /StemV 114 /FontFile 11 0 R /Flags 4 >> endobj 11 0 obj << /Filter[/FlateDecode] /Length1 721 /Length2 2664 /Length3 533 /Length 3205 >> stream xy<%#H6-72fLf$A2(BY[%KY'[bG{|s㾮}ݷ> dy\02p� f�1$(2H0BA �@(ƠbPUрA 2!?%PC*u@hB}A h,HQ��}K�` ��&^�QeF&꿥1@R�I* qb\!Ľ~ olnY?/u ]AA`EĀ$Ÿ.opD_ژQ8,Zo)l16bh_ �A{ hhd`e+VEa dC  M` >EH$Je`@ $g$wj*�BE*  N̢I$@yGhHt: <ٽ0夾"u,J3?H̖*sm#/k͚ |Eg=5t֞�Oeg3]7%A X Mn[n#-`^Of"]$Mv#`k`nlug8IpF2/Z4NT8 -x0~Ù:t1FgKT|A끖|9=cw vƍV}mB߸j3{y\O%_/Xe7m̘oeyWw} Y~Y2eד0՜{}l{*ݠ [͵o߳+˖t@oGXƌH)ũ#T7G_NgIl|K6M8W߫580i6bY/F0I=~C)^ef\\�#G]=HBSv[kNJdѸf_N0q|M|)?vu<P~LPZǨ|y]cDA+Z@3 + fsk N 3p4[z}EkGqOH/'eHZ,1P%BⲽdCqu!?dr7-FȐaBMsS]ʰ(,hV0h)^w]Ļq eRxOʁs=oP9!Bpq]M)OjÞU  @NRLۍf q_J\WL{PS .0qtGw둴~? Ybdj۝Q{cbR s'&_+(D&{%K;)*ʬ&ndo&""?~=Z֡}9{aMU%`EϟdxyUcp; 9ܻ;ƥRΕ#dz^9'h if}Q5R 56>ey؉W7_ZV3ttGRn|m~2aZhU^D7kWTɂ. Cnq"mNV~f2WOplC{14 ;V?[)[k~BQ̴{-|铬 >vn#ШZWK_aw_Y:\+,A:S_ gZ=I1Mr9JoQ#lP"Ŝ[zj6~Q^lfu`w[*t.vv:?IN|3Ng.'wc݄'ss /8fe_r='39QMhb/ޚ,yZEV@zK *\Җ>8,4Iv ϴTSѰq,o⠡s WV}St(MɄ%Z-:fI=X:~EK4w^軻?<;nnv@߆yBtÌ_\:Xn dv ]";-XϿveoǓAIU}TE|-J >E WSpS÷}LcP/|\$wh^ا.Vnk%=Tۅ-߂XwVcS]g]-9bl/ݗ<Uea"(Ccm+SMY2t-J3 )h{.&0D n(YDj:Tj0.[T,niRZ-4U ou BY~i&L'Hdg4sM{g5RAe^l1V\p#׉9:YB|0}7VP2Z38WQfq4SVY^yOwv7< ŰwC &/}v =j; M\N׼pq`2?pPf>$K{dC Dv#6b5e)%_9)YCX3ur=3z#уB~ZF a!r۫2bߖ31k7;\z:&ۛV)͆<t !J 9)T-t:z0`[<9VGubxF8Nz\4sO$ gYDk{@3>L:-4B &bvYvԽ r.T:0I%GG)%KǨBnhW$tZsG14YH4=]jw`oz$Fjn@NѯiǒBEZHL3y1h8{Ӷ!A2ų6_/,:D Mtƚϟ(ۈ%Z|<,Nd<Y~4"'i|nVң]}yҔ,75s[PL^Q0cbfmYǑR qtM%|Ѯˆ̌wuYݕuV<Y*M)diڛY*QKxym}[Zf `wea`e&6Z657Cmh᦬n�Q$2"A aW endstream endobj 15 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-53 -251 1139 750] /FontName/EWUVHY+CMBX12 /ItalicAngle 0 /StemV 109 /FontFile 14 0 R /Flags 4 >> endobj 14 0 obj << /Filter[/FlateDecode] /Length1 716 /Length2 2687 /Length3 533 /Length 3224 >> stream xy<T}eIYX طa23fH%BHKED-F"e˞~^u=<~>sdu"R >`fop3T �L-88(�fTZ$T~�N&)=��J H �0 a� D �dO(k !hA:c PTv)TJp$@IM4pP5",83עLJ#順˜ A:Vw8SjX3d ?Hd9$LB�@3_:H!awm�4]ݬ<UId %ܟ_5�#vOfN!Pd?a)D</TԈ(u]m@]K H@O?rhhtpa/F`I`H_'QV]O~4x!WwHu/Kc 0!>mP`:%gMY8AU}%+w.̪Ůټ`Utp\B#_ELsTFߋS^ꩤ6}Bq  nJKT2BK4:$N;~1uטt蛕%cIYUvQ ͩ=c7 >No'/gw*(?ؿY>WC)E)wez\5sv(J<X)Պ,y !<Δidt. $í{3Y"oΨl-y8eW5M \+:*;`J&J?^'\P nv 2 >-Vfw{]N^ŋr"qh^Aw`$.%M5##U`y }vfxl&QcptmLΎBYÅbiL.X(s7Ƶ@Q,Bs{]AenX;9֫F.SҮȶt%<D_߀s?�sͣ}/8g4l+51ՄTҹRv2G[T .^X1n˩s#Ra%f%sQy\*ye-},+ 2MQZ>ӮĠ?GZSCޏ$JY+^13Y;10 Ʀ=r]zh&K5txaQ\AQԲ `N *de: x^PySz�#E+t_w%YG&ZMj*\\;ɵة2YS]BmD׶0QKܰ첦9uBUHPCx 38*yHd-x9 &nW_`~,|&X Rh<@h-x*&-oz|pe\Y:&8uH6e s)?յI-`ϯ͸y*?d_u1 9o{ZDu*}~}ƆQr^iˠc<#𩒷tP#ei zuX.JE<aW5`0&"a`+FU|?m(uLIQ70f? O=︜Lltly擜i2/1/$֬f%<d% 0x.OWix-}ɶ۸�wzz,tf)Y)9ݴgsf%uÂmERJG9b28xtтzʿD?L|'Cp-ug6Ys"e9^2? a9FnޏQE*rX yԺ&!D+I3#&8"Ԙƻ'2E}) i9GtCI{gQ+DSZX?x57(^;I  [zrZf2swǧ*1sN.%Pu[Q^dr|l-g`q±}3U阏@3} 2h")ʊOZ-\`E:z>7*+i⹄<vI#Z԰OMw  ^~pءv+3']`^Ynس\77htp6P+f zb/k*-ܿ< 35t91뾚yakZI +ol˖7%6%7ɲ1i=#T1CT^ sĦen ݌1O2l2\W9= p)>|az? Q#]&`sZS("66;F5l#?ϕXdWJ/@;* %+ X'< gzm\%|8MZz{xΠ8B]̙z\bě5:XjK1)7]~Bהk62s'uZ*0ݜ31UjĊs*G. Whld֨^9O5:Lx\�CsmR`{s/h[BRe.p,,/'J h/KdZ ilXy :zo;`uvOu켧pS#MlbLr Ol'V;ۑo˹ I:eHQdr_hy( mP%_M@UUɭ_ -^]/aEz\{T_ƅ;RF}3'_xнʨumAڽ҇/2ù%¯P'8:!:/*)1v0j">>迯u`w!oʪ?gr'7/p8F䗊TvIJI7nEQF@D4"]s9$Zze8.U C D EV<xcF@>K%IAf :N%DH܏ɛ<63`JV\RI3 o75O9.%+~ `%8 9*rlFozFunm&u84nC+[GT >.-x�B03!xzoUuK endstream endobj 18 0 obj << /Type/FontDescriptor /CapHeight 850 /Ascent 850 /Descent -200 /FontBBox[-58 -250 1195 750] /FontName/QGNGHU+CMBX9 /ItalicAngle 0 /StemV 117 /FontFile 17 0 R /Flags 4 >> endobj 17 0 obj << /Filter[/FlateDecode] /Length1 713 /Length2 3449 /Length3 533 /Length 3992 >> stream xy< Bj$KL٧d02 Ѡ,e_JYY/aBY⧞<u\sͥuQh<( !&z6@@DB@#< VTUA@]W&�D'qu#!hMD7q4$b@_xh/%�@@IDbp�_LP &xsŏ9/)QxD]�ic1Cp,+מFx`0=<}hBpZdc1JD`1H]+ Sx`(8t :;~^jzRg$rAY/Ɂ_OCQ+МԿB*@iy`ja|+@oC q߇]0AH@ fE#p@mr*x۾ƌep+"9ʺN!~A~Izlöc3_W¥nfK0*ƖN~]dW*I82M(DϺB|Pus4ja}?x bF\euT,vh#m<XfNߪ/p7X2й$fShƑRy3ѣqn}3SdR=gd 7/ ; M<qT;Z˖pey~$r5 HTUxyVZ)`JG\2lJZ4[ :)zNQfksׅ-Y;nxN+X$vw™jz/TK7iWi7#?y~7-%n?>8؁[?먑O@R؃5h7A" Cz[z�osï_l)v�[ҪX,c!dus,W-<ͤc>}˧ WxtbЛyLa%m5<YKN-/3e#.럪03I1P ΝavxśgiOPfVJGL/KaqҨeu}p�2KC%rLa H}W/[0y�F_KIZ~Kʼߘ^+kds硒C Qz*r}):*+`"ȫbj"A\wlҠJS^ W]䞷`? ӕrj*2l/u1uAq?=3@/azȄ-&_e/ۜv,D$9g F[7}ZƎgb)Z-sc%7N?k",YGkF7v0U T|ܑ٪llbMXnw9{7PxO؋{_aB!>%-OҤY, ə8E`f|e;l}ԫ<+=ڏ;xUn-X[3ƧmNO[L.,HJ^ LH?޽-eofi+; ?blcM*a8cwzɾH:-`l&N̆Sc8}s?YX@KaD!y\(A_Y%c}NfWt Q14ҰD0`y(Ɯ_z΃///`/n'/D(_n3Ls5Gȝ=#1e !8lwvqYՇi4S;UUC,%)nsfXmoQS{bxe0z L%IU J1Ƈ*?iN~4,t2.1pK37#M $.nczIg\Nu2VQN_և:M D:+ Nuw`x}NCmFͨ4Jˏl&|Y"֤Z/s%+&O3|i*Og 1Il3}QM%ƶo( }4HO1gJ_Nft]bbvPFM=ܵ߻P#F?O+];ٿH⟜xxY&f�tҨն}KmrgaB\<aR�wծcR<Kg9Drrǚ(T8ֈ͋C"=Ul4,è,5;LiʜȮȚ81%̠y23Di1/|Y/yq{p F!%]cX3i_Q!;%n4?<W%gR=(=Ĥ}$f!j%8hRtTO/)ro}Ą9HU7as*ޔɪU`~Wa[97*s.t'&)T'Ѯo۩JYR?ʰYjx;=�+%CR`8Wl ^",]*\ b/?89'Ne q3͟p"}q<!"^t8*ڮ(>cF^FW/oC{& K}n% 7.B_D/H%ÒRIŇu( h&#vlKӃ9'bl`2)F\kU\z AۅzluCsz*~߅Sf95$֯^ljg|~gW3MB'=W:#уA1ރZڤq.4cx{ )22R#9(i5M"Kf6jIA=ˬB{%~}@(Ӌnfk?(VKquP=*Mt1YtgVQ?@~v NdLi_X V6cؙ/ENq֚?Ŵ6=~s6X4^%kxCqJ|9J_bx:[£R^'4hEW#f^kQLB @d!G�N6)NɋLᮆj#^`SGMu;-iaFU1YnkrQ1W6\N[G}5@' kL)t8 R[hX*@#Mz3kLHUbE+B/,Z4\}wy/&CbD}kyNkií>Is}` x=bgf΍Rw!ϧ@4OL;l8b&B, bh}v+ ?͂a6ZfiF3upn^@A)vKVUJb^ZpK9WLNuo^d!fgh(SOG_< $g:;/XCg,\>1酫:zϛppbQ./~0swLa9<}^ 0|-m~`Uu봋Su';:?Jg^RqűT(fºDZO~ o=5'6'ME?~Y>=x[~l}h9Ny戁=-obVd0QwL]Dk]_|hbT@GD̶f0={!s13QLd}勵9&:' 7ɿ/:_iPۡ/Ys 68в̊ .٠J3^9c_׾>1ܵ!BK3DZɈxLf'$Ò4/LCF$5JvW=4g=Lo~EH,A =w�_5 endstream endobj 1 0 obj << /Creator( TeX output 2004.10.19:1440) /Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) /CreationDate(D:20041019144002+01'00') >> endobj 5 0 obj << /Type/Page /Resources 6 0 R /Contents[20 0 R 4 0 R 21 0 R 22 0 R] /Parent 3 0 R >> endobj 3 0 obj << /Type/Pages /Count 1 /Kids[5 0 R] /MediaBox[0 0 595 842] >> endobj 20 0 obj << /Length 1 >> stream endstream endobj 22 0 obj << /Length 1 >> stream endstream endobj 4 0 obj << /Length 33 >> stream 1.00028 0 0 1.00028 72 769.82 cm endstream endobj 24 0 obj << >> endobj 25 0 obj null endobj 26 0 obj << >> endobj 2 0 obj << /Type/Catalog /Pages 3 0 R /Outlines 24 0 R /Threads 25 0 R /Names 26 0 R >> endobj xref 0 27 0000000000 65535 f 0000030264 00000 n 0000030854 00000 n 0000030529 00000 n 0000030707 00000 n 0000030428 00000 n 0000006512 00000 n 0000000009 00000 n 0000006759 00000 n 0000006573 00000 n 0000000913 00000 n 0000019124 00000 n 0000018934 00000 n 0000001829 00000 n 0000022632 00000 n 0000022443 00000 n 0000002765 00000 n 0000026158 00000 n 0000025970 00000 n 0000003711 00000 n 0000030607 00000 n 0000004710 00000 n 0000030657 00000 n 0000006446 00000 n 0000030789 00000 n 0000030811 00000 n 0000030832 00000 n trailer << /Size 27 /Root 2 0 R /Info 1 0 R >> startxref 30949 %%EOF ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/configure������������������������������������������������������������������������������0000755�0001750�0001750�00000026256�12045517740�014525� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh #------------------------------------------------------------------------------ # cb2Bib configuration script: # - Checks for QTDIR # -- If set, checks for qmake at QTDIR # -- If not set, checks for qmake at PATH and other usual locations # - Manages Installation directory data # - Runs qmake # # Modifications for the cb2Bib Gentoo build descriptions # by Hugo Mildenberger and Andreas K. Huettel # Copyright 2009 Hugo Mildenberger and Andreas K. Huettel # - December 2009: do not use temporary files, fix sed regular # expression, set both enable/disable for options, and add # call to qmake option. # # Modifications for the cb2Bib Debian distribution package # by Filippo Rusconi # Copyright 2009 Filippo Rusconi # - June 2009: replace ' ' with ':' along with use of IFS=: as # word-splitting delimiter for PATH-related tasks (Thanks Lionel # Mamane). # - September 2009: protect all shell variables against spaces. # #------------------------------------------------------------------------------ # ( originally based upon 'shell script to configure doxygen', # http://www.stack.nl/~dimitri/doxygen/ # Copyright (C) 1997-2001 by Dimitri van Heesch ) # # Permission to use, copy, modify, and distribute this software and its # documentation under the terms of the GNU General Public License is hereby # granted. No representations are made about the suitability of this software # for any purpose. It is provided "as is" without express or implied warranty # See the GNU General Public License for more details #------------------------------------------------------------------------------ platform=`uname -s` echo echo "Configuration script for cb2Bib (Unix/Linux/MacOSX)" echo f_prefix=/usr f_bindir=/usr/bin f_datadir=/usr/share/cb2bib f_desktopdatadir=/usr/share/applications f_icondir=/usr/share/pixmaps f_qmake=NO f_make=NO f_disable_cbpoll=NO f_disable_lzo=NO f_disable_qmake_call=NO while test -n "$1"; do case $1 in --prefix | -prefix) shift; f_prefix="$1" ; f_bindir="$1/bin" ; f_datadir="$1/share/cb2bib" ; f_desktopdatadir="$1/share/applications" ; f_icondir="$1/share/pixmaps" ;; --bindir | -bindir) shift; unset f_prefix ; f_bindir="$1" ;; --datadir | -datadir) shift; unset f_prefix ; f_datadir="$1/cb2bib" ;; --desktopdatadir | -desktopdatadir) shift; unset f_prefix ; f_desktopdatadir="$1" ;; --icondir | -icondir) shift; unset f_prefix ; f_icondir="$1" ;; --qmakepath | -qmakepath) shift; unset f_qmake ; f_qmake="$1" ;; -h | --help | -help) f_help=y ;; --enable-cbpoll | -enable-cbpoll) f_disable_cbpoll=NO ;; --disable-cbpoll | -disable-cbpoll) f_disable_cbpoll=y ;; --enable-lzo | -enable-lzo) f_disable_lzo=NO ;; --disable-lzo | -disable-lzo) f_disable_lzo=y ;; --enable-qmake-call | -enable-qmake-call) f_disable_qmake_call=NO ;; --disable-qmake-call | -disable-qmake-call) f_disable_qmake_call=y ;; *) echo "-----------------------------------------------------------------------" echo Error: Unknown argument $1 echo "-----------------------------------------------------------------------" echo "" f_help=y f_error=y ;; esac shift done if test "$f_help" = y; then cat <<EOF Usage: $0 [--help] [--prefix dir] [--bindir dir] [--datadir dir] ... Options: General: --help Print this help --qmakepath dir qmake fullpath name [example: --qmakepath /usr/bin/qmake] --prefix dir Installation prefix directory [default: /usr] --bindir dir Executable installation directory [default: /usr/bin] --datadir dir Data installation directory [default: /usr/share/cb2bib] --enable-lzo Enable linking with lzo library [default] --disable-lzo Disable linking with lzo library --enable-qmake-call Enable configure to call qmake [default] --disable-qmake-call Disable configure to call qmake Unix/Linux only: --desktopdatadir dir Desktop data installation directory [default: /usr/share/applications] --icondir dir Icon installation directory [default: /usr/share/pixmaps] --enable-cbpoll Enable clipboard poll [default] --disable-cbpoll Disable clipboard poll EOF test "$f_error" = y && exit 1 exit 0; fi echo "-----------------------------------------------------------------------" echo "Platform: $platform" echo "-----------------------------------------------------------------------" echo "Setting installation directories..." if test "$f_prefix"; then echo "Setting installation relative to dir: $f_prefix" fi if test "$f_bindir"; then echo "Setting installation executable to dir: $f_bindir" fi if test "$f_datadir"; then echo "Setting installation cb2Bib data files relative to dir: $f_datadir" fi if test "$f_desktopdatadir"; then echo "Setting installation desktop data files to dir: $f_desktopdatadir" fi if test "$f_icondir"; then echo "Setting installation icon file to dir: $f_icondir" fi echo "-----------------------------------------------------------------------" echo echo "-----------------------------------------------------------------------" echo "cb2Bib Info:" echo "-----------------------------------------------------------------------" echo "- This version requires Qt 4.4.0 or later." echo " " echo "- Set the environment variable QTDIR if this script cannot determine" echo " the right Qt qmake." echo "- QTDIR will only be used during configuration; it can later be reset" echo " to its original value." echo " " echo "- Alternatively, set Qt 4.4 qmake's fullpath name with" echo " --qmakepath flag." echo "-----------------------------------------------------------------------" #- check for qt --------------------------------------------------------------- echo echo "Checking for Qt/qmake:" if test "$f_qmake" != NO; then echo -n "Checking for qmake tool... " if test ! -x "$f_qmake"; then echo "Specified $f_qmake could not be found." exit 2 else echo "using $f_qmake." fi elif test -z "$QTDIR"; then echo "Environment variable QTDIR not set, checking elsewhere for qmake..." echo -n "Checking for qmake tool... " if test "$f_qmake" = NO; then qmake_name="qmake" qmake_dirs="/usr/lib64/qt4/bin:/usr/lib/qt4/bin:/usr/bin:/usr/lib/qt/bin:/usr/share/qt/bin:/Developer/Tools/Qt:$PATH" qmake_prog=NO IFS=: for j in $qmake_dirs; do if test -x "$j/$qmake_name"; then qmake_prog="$j/$qmake_name" break 1 fi done unset IFS f_qmake="$qmake_prog" fi if test "$f_qmake" = NO; then echo "not found!" echo echo "Please, check if required Qt/qmake is properly installed." echo "If so, set QTDIR environment variable to your Qt root directory." exit 2 fi echo "using $f_qmake." else echo "Using QTDIR environment variable for Qt directory location." echo "Checking for Qt tools at $QTDIR..." echo -n "Checking for qmake tool... " if test ! -x "$QTDIR/bin/qmake"; then echo "QTDIR is set, but the qmake could not be found in $QTDIR/bin." exit 2 else f_qmake="$QTDIR/bin/qmake" echo "using $QTDIR/bin/qmake." fi fi "$f_qmake" -v #------------------------------------------------------------------------------ # Set directories for binaries search #------------------------------------------------------------------------------ bin_dirs="/usr/bin:/usr/local/bin:/bin:/sbin:$PATH" #------------------------------------------------------------------------------ # - check for make ------------------------------------------------------------ echo echo "Checking for additional tools:" echo -n "Checking for make..." if test "$f_make" = NO; then make_names="gmake:make" make_prog=NO IFS=: for i in $make_names; do for j in $bin_dirs ; do if test -x "$j/$i"; then if test -n "`$j/$i --version 2>/dev/null | grep GNU`"; then make_prog="$j/$i" break 2 fi fi done done unset IFS f_make="$make_prog" fi if test "$f_make" != NO; then echo "using $f_make." else echo "not found." fi #- Setting dirs and start qmake ----------------------------------------------- echo sed -i -e 's%^.*cb2bibdata\.path .*$%cb2bibdata.path = '$f_datadir'%g' \ -e 's%^.*target\.path .*$%target.path = '$f_bindir'%g' \ -e 's%^.*script\.path .*$%script.path = '$f_bindir'%g' \ -e 's%^.*desktop\.path .*$%desktop.path = '$f_desktopdatadir'%g' \ -e 's%^.*icons\.path .*$%icons.path = '$f_icondir'%g' src/src.pro sed -i 's%^const QString C2B_DATA_DIR.*$%const QString C2B_DATA_DIR("'$f_datadir'/");%g' src/c2b/cb2bib_parameters.h f_configs= if test "$f_disable_cbpoll" = y; then echo "Setting clipboardPoll disabled" f_configs="$f_configs -config disable_cbpoll" fi if test "$f_disable_lzo" = y; then echo "Setting lzo disabled" f_configs="$f_configs -config disable_lzo" fi if test "$f_disable_qmake_call" = NO; then if test "$platform" = Darwin; then # Warning: Test for MacOSX/Darwin might be outdated echo "Running $f_qmake -spec macx-g++ $f_configs -o Makefile" "$f_qmake" -spec macx-g++ $f_configs -o Makefile else echo "Running $f_qmake $f_configs -o Makefile" "$f_qmake" $f_configs -o Makefile fi else echo "Writing qmake flags to file 'qmake-additional-args'" echo $f_configs > qmake-additional-args fi echo " " if test "$f_make" = NO; then echo "-----------------------------------------------------------------------" echo "Configuration ended. 'make' not found." echo "Build toolchain might not be completed." echo "-----------------------------------------------------------------------" exit 1 else echo "-----------------------------------------------------------------------" echo "- NOTE: 'make install' will copy the required runtime files to the" echo " specified locations. Besides cb2bib binary, 'make install' will copy" echo " the scripts c2bimport and c2bciter, and will set their executable" echo " permissions. Also, it will set cb2bib, c2bimport, and c2bciter" echo " desktop files." if test "$f_disable_lzo" = NO; then echo "-----------------------------------------------------------------------" echo "- NOTE: cb2Bib requires lzo library. If it were unavailable in your" echo " platform, reconfigure using --disable-lzo." fi echo "-----------------------------------------------------------------------" echo "- NOTE: Type 'make distclean' or, preferably, untar again to set other" echo " configure flags." echo "-----------------------------------------------------------------------" echo " " echo "-----------------------------------------------------------------------" if test "$f_disable_qmake_call" = NO; then echo "Configuration ended. Type 'make' and 'make install'." else echo "Configuration ended. Run qmake, and type 'make' and 'make install'." fi echo "-----------------------------------------------------------------------" fi ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/CHANGELOG������������������������������������������������������������������������������0000644�0001750�0001750�00000104601�12045520050�014003� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2011-11-05 RELEASE OF VERSION 1.4.9 2012-11-04 Minor improvements in keyword extraction 2012-11-03 Code cleanup and micro optimizations through cppcheck 2012-10-23 Assure tmp path is writable when operating remotely (Thanks to A. Norton) 2012-08-02 Disable Open button when Postprocess does not produce a file (Thanks to J. Welford) 2011-05-15 RELEASE OF VERSION 1.4.8 2012-05-13 Fixed gcc 4.7 compilation, Debian bug 667129 (Thanks to M. Klose and F. Rusconi) 2012-02-17 Added a warning whenever external document to text conversion fails while indexing 2012-01-15 Minor improvements in keyword extraction 2011-12-20 RELEASE OF VERSION 1.4.7 2011-12-17 Added keyword excerpt view 2011-12-13 Optimized keyword extraction citer cleanup 2011-12-05 Propagated --conf flags to child processes 2011-11-18 Improved citer navigation 2011-09-18 Added document similarity view 2011-09-18 Added POS tagger and keyword patterns 2011-08-14 Added automatic keyword extraction from documents 2011-08-03 RELEASE OF VERSION 1.4.6 2011-08-02 Set minor improvements in volume, number, page recognition 2011-08-01 Made shortcuts customizable 2011-06-29 Added XCode ./qmake/cb2bib-osx.pro file (Thanks to J. Ralls) 2011-06-29 Updated netqinf.txt for PubMed 2011-03-21 RELEASE OF VERSION 1.4.5 2011-03-21 Fixed build error, set explicit X11 (Thanks to F. Rusconi, J. Corneli, and A. Wintcher) 2011-01-23 RELEASE OF VERSION 1.4.4 2011-01-23 Consider import multi keywords BibTeX entries (Thanks to C. Dri) 2010-12-17 Added Cyrillic to ASCI transliteration (Thanks to V. Koval) 2010-12-06 Updated bookmark's file netqinf.txt 2010-11-24 Documented comma separated value CSV to BibTeX procedure (Thanks to G. Ranger) 2010-11-05 Fixed three bashisms in file c2btools/bib2pdf (Thanks to F. Rusconi) 2010-10-19 Set executable inside cmake build tree (Thanks to F. Rusconi) 2010-10-11 RELEASE OF VERSION 1.4.3 2010-10-11 Fixed two-letter initial, 'Yu. Last' author parsing 2010-10-10 Fixed trimming leading spaces in Annote verbatim sections 2010-10-10 Removed hard-coded monospace font in Annote's CSS file 2010-10-10 Fixed opened files seen as modified in when using Qt 4.7.0 2010-09-11 RELEASE OF VERSION 1.4.2 2010-08-31 Added initial cmake configure/build/install 2010-08-31 Set fixes and testing cmake configure/build on MacOSX (Thanks to D. Swain) 2010-08-30 Set calling external tools path independent on MacOSX (Thanks to C. Szepesvari) 2010-08-22 Minor code cleanup 2010-08-21 Fixed wrong author parsing if ForeName is missing in XML PubMed (Thanks to F. Rusconi) 2010-05-24 RELEASE OF VERSION 1.4.1 2010-05-23 Improved journal recognition 2010-05-22 Updated bookmark's file netqinf.txt 2010-05-22 Skip saving void documents when "Download document if available" is checked 2010-05-22 Check for document existence and mimetype prior to downloading 2010-05-22 Refactored network classes 2010-04-24 RELEASE OF VERSION 1.4.0 2010-04-23 Set c2bCiter to remember display format 2010-04-22 Set clipboard connected mode default in c2bCiter 2010-04-22 Remember last current citation in c2bCiter 2010-04-22 Updated several icons in editor 2010-03-21 Set workaround for cleared line edits showing cursor (QTBUG-7866) 2010-03-21 Postprocess DOI to clear URL formatting 2010-03-21 Added chronological view in c2bCiter 2010-02-22 RELEASE OF VERSION 1.3.7 2010-02-21 Validate author in PubMed XML parser 2010-02-21 Avoid stopping network queries when one fails 2010-02-21 Set minor improvements in year, volume, page recognition 2010-02-21 Updated style sheet for reference browsing 2010-02-20 Fallback title to booktitle to file name in views 2010-02-20 Set --sloppy to accept all files 2010-02-20 Consider shortcut to write/update source document's metadata (Thanks to S. Kreisel) 2010-02-20 Consider c2bCiter's filter to be connected to clipboard (Thanks to H. Seifzadeh) 2010-02-20 Fixed Medline parsing in some cases with uppercased hyphenated words (Thanks to F. Rusconi) 2010-01-05 RELEASE OF VERSION 1.3.6 2010-01-04 Added 'Fore IJ Last' formatted author recognition 2010-01-02 Minor improvements in journal recognition 2009-12-28 Minor improvements in PubMed XML parser for journal pages and year 2009-12-26 Fixed two cases of author capitalization which conflicted with suffixes and two-letter initials 2009-12-21 Minor improvements in abstract and keywords recognition 2009-12-15 Adapted configure script to Gentoo build descriptions (Thanks to H. Mildenberger and A. K. Huettel) 2009-10-26 RELEASE OF VERSION 1.3.5 2009-10-25 Fixed a regression in single word approximate strings not working for documents 2009-10-21 Fixed wrong automatic extraction for DOIs followed by commas (Thanks to X. Helluy) 2009-10-21 Set reference field shortcuts in manual extraction 2009-10-21 Consider setting manual extraction selection keyboard aware (Thanks to H. Seifzadeh) 2009-10-15 Consider fallback journal to booktitle for inproceedings in views (Thanks to H. Seifzadeh) 2009-10-13 RELEASE OF VERSION 1.3.4 2009-10-12 Skip copy/move document on save if BibTeX file is not writable 2009-10-11 Updated bookmark's file netqinf.txt (Thanks to H. Seifzadeh) 2009-10-09 Added minor improvements in author, pages and volume recognition 2009-10-09 Included citeid in check repeated 2009-09-19 Fixed a typo, --tempdir must be --tmpdir, in bib2pdf (Thanks to F. Rusconi) 2009-09-11 Protected all shell variables against spaces in configure (Thanks to F. Rusconi) 2009-09-10 RELEASE OF VERSION 1.3.3 2009-09-06 Added 'fix string: context' search type 2009-08-26 Optimized search in files, and implemented fast matching for approximate strings 2009-08-26 Fixed compiler -Werror=format-security errors in qDebug calls 2009-08-18 Added --sloppy switch for --doc2bib and --txt2bib actions 2009-08-11 Fixed export entries from search browser 2009-08-06 Added relevant Prism metadata recognition 2009-08-03 Fixed possible separator duplication in keywords 2009-08-03 Wrote a more clarifying documentation for automatic extractions 2009-08-01 Fixed a regression not converting '2nd' and '3rd' PubMed author suffixes 2009-07-27 RELEASE OF VERSION 1.3.2 2009-07-27 Do not ask if document should be saved when closing search results browser 2009-07-27 Added <<citeid>> document ID placeholder that keeps both IDs syncronized 2009-07-26 Set not to expand pathless filenames in USB mode permitting to use host PATH tools 2009-07-26 Improved check repeated and added check repeated on save 2009-07-25 Consider <<title>> ID placeholder and set cite and document separate IDs (Thanks to O. Sluciak) 2009-07-23 Fixed wrong file name in missing converter message 2009-07-23 Updated build scrips to not require external tools dependence 2009-07-23 Set calling external tools path independent 2009-07-10 Added <<author_all_abbreviated>> cite ID placeholder (Thanks to D. Huang) 2009-07-05 Improved configure and tool scripts (Thanks to F. Rusconi and L. Mamane) 2009-06-29 RELEASE OF VERSION 1.3.1 2009-06-27 Added Check Repeated functionality for current reference 2009-06-27 Fixed parser not processing last field in inverted comma style BibTeX 2009-06-27 Set netqinf.txt to use internal XML parser for PubMed 2009-06-27 Fixed packaging, double copying scripts and initial external tool setting 2009-06-01 Fixed c2bciter script not passing all arguments (Thanks to F. Rusconi) 2009-06-01 RELEASE OF VERSION 1.3.0 2009-05-30 Updated configure script (Thanks to F. Rusconi) 2009-05-23 Added module c2bCiter and command line action --citer 2009-05-23 Set cb2Bib not to process clipboard updates if main panel is closed 2009-05-23 Set standard shortcuts to conform to user's desktop 2009-05-23 Improved to ASCII conversion and collation algorithm 2009-05-20 Added example query using HTML to text conversion in netqinf.txt 2009-05-20 Added pre-process script med2bib (Thanks to F. Rusconi) 2009-05-20 Pre and post process scripts cleanup (Thanks to F. Rusconi) 2009-05-17 Fixed wrong display of proper names for BibTeX files written in reverse order 2009-05-17 Improved abstract and keywords heuristics (Thanks to J. P. Eckmann) 2009-05-17 Cleanup command line messages, fixed wrong mention on temporary files deletion 2009-05-17 Convenience script dl_cb2bib renamed to c2bimport 2009-05-10 Improved document to text conversions, removal of non-textual symbols 2009-05-10 Fixed set initial references.bib to user's home directory 2009-05-10 Made temporary file names dependent on cb2Bib session 2009-05-10 Fixed a regression on Windows uninstaller not deleting install directories 2009-05-10 Added convenience shell wrapper c2bconsole on Windows 2009-05-07 RELEASE OF VERSION 1.2.3 2009-05-07 Fixed a regression when setting unsupervised processing 2009-05-07 Renamed settings key for metadata writer 2009-05-06 Improved journal name recognition 2009-05-06 Added conversion htm2txt_query and htm2txt_referenceurl actions in netqinf.txt 2009-05-04 Added --configure command line functionality 2009-05-04 Added --txt2bib and --doc2bib command line functionality 2009-04-05 RELEASE OF VERSION 1.2.2 2009-04-05 Set reference list sorting case and diacritic insensitive 2009-04-05 Improved author string parsing 2009-03-31 Consider parsing reverse order and comma separated author strings (Thanks to D. Comtois) 2009-03-27 Added network access through a proxy host (Thanks to T. Deneux) 2009-03-25 RELEASE OF VERSION 1.2.1 2009-03-25 Improved the pattern/regular expression editor 2009-03-24 Fixed a potential crash if expected and actual captures in user's patterns mismatch 2009-03-15 Improved/optimized journal names lookup 2009-03-07 Added line numbers in embedded editor 2009-03-03 RELEASE OF VERSION 1.2.0 2009-03-01 Moved Qt requirement to version 4.4.0 or later 2009-03-01 Use plain text optimized class QPlainTextEdit for text editing 2009-03-01 Updated bookmark's file netqinf.txt 2009-02-27 Improved built-in network capabilities, including redirections and cookies 2009-02-27 Added author to network query excerpts 2009-02-27 Code cleanup through cppcheck 2009-02-22 Updated build dependencies for Debian 5.0 2009-02-05 RELEASE OF VERSION 1.1.1 2009-01-17 Added heuristic recognition for authors (single and multiple blocks, natural order) 2009-01-10 Revert Latin ligatures in document to plain text conversions 2009-01-10 Improved author string processing 2008-12-27 Improved pages, volume and number recognition 2008-12-23 Convert ' & ' to ' and ' in journal before submitting a network query 2008-12-23 Fixed a regression on month, editor and cite ID fields 2008-12-21 Updated to Qt 4.5.0 QRegExp/QString semantic changes 2008-12-21 Fixed spec file for openSuSE 11.1 build (Thanks to M. Hüwe) 2008-12-17 RELEASE OF VERSION 1.1.0 2008-12-07 Added cb2Bib's Annote viewer 2008-12-07 Added --html-annote and --view-annote command line functionality 2008-12-07 Fixed some issues regarding command line filenames and filedialogs in Windows 2008-12-07 Synchronized BibTeX browser panel with reference line editors 2008-11-30 Code cleanup and refactoring 2008-11-30 Removed no longer needed external client for opening files 2008-11-21 Fixed an issue with percent encoding/tag substitution custom bookmarks 2008-11-21 Updated bookmark's file netqinf.txt for new ACS journals and Science URLs 2008-10-22 RELEASE OF VERSION 1.0.4 2008-10-21 Added 'any word/all words' type searches 2008-10-20 Fixed buttons enabled/disabled in search dialog on Qt > 4.4.0 2008-10-20 Fixed 'About panel' bookmarks not displaying dynamic links on Qt > 4.4.0 2008-10-20 Improved pages, volume and number recognition 2008-09-19 RELEASE OF VERSION 1.0.3 2008-09-18 Recognize and process page format '123-3pp' 2008-09-18 Set arXiv ID as BibTeX URL field 2008-09-18 Fixed a bug when scrolling to 'Edit reference' in search if multiple edits were done 2008-09-17 Force USB mode 'cb2Bib --conf' to use relative to BibTeX document filenames 2008-09-17 Improved managing of relative document filenames 2008-09-17 Added 'Export Entries' to export selected citations in BibTeX editor (Thanks to to A. M. Elena) 2008-07-21 RELEASE OF VERSION 1.0.2 2008-07-20 Added 'Edit reference' in search results 2008-07-20 Fixed a regression for LaTeX-Unicode conversion for letters Å and Æ 2008-07-20 Set LyXPipe in Windows 2008-07-20 Updated PNAS Url 2008-07-10 Optimized approximate string when searching linked documents 2008-07-10 Use Qt::AA_NativeWindows to avoid flickering on Qt 4.4.0 2008-06-17 RELEASE OF VERSION 1.0.1 2008-06-17 Fixed a bug that could result in computing negative word stretch in approximate strings 2008-06-15 Fixed a bug sometimes blocking the reference list filter in BibTeX browser 2008-06-15 Arranged BibTeX browser menus, made context and selection sensitive 2008-06-15 Fixed a regression in BibTeX browser actions not properly showing in menus 2008-06-15 Set sub and superscript conversions from HTML alt tags and [sub/p .] tags 2008-06-15 Fixed BibTeX parser failing in some cases with nested braces 2008-06-15 Added 'Update Documents Metadata' in BibTeX editor 2008-06-10 Set BibTeX to Unicode letter conversions for \LaTeX{} syntax 2008-06-10 Fixed a regression in clipboard's panel multiple line syntax highlighting 2008-06-10 Added tag <<title>> for automatic queries, updated netqinf.txt 2008-06-10 Set better flags for calling ExifTool (Thanks to P. Harvey) 2008-06-07 RELEASE OF VERSION 1.0.0.1 2008-06-07 Fixed an error in inserted metadata from PDFImport and multiple files 2008-06-07 Fixed a regression preventing from setting correct djvu extension 2008-06-07 RELEASE OF VERSION 1.0.0 2008-06-07 Updated cb2Bib's license to GPL version 3 2008-06-07 Added metadata writing through ExifTool 2008-06-05 Set double braces to be seen only BibTeX preview and save 2008-06-05 Removed BibTeX separator for author queries 2008-06-05 Updated configuration dialog 2008-06-05 Only set pdf extension in 'file' when none is given 2008-06-05 Set Utf8 as default codec for files on Windows 2008-06-05 Fixed minor bug in suggested regular expression for page 2008-05-31 Added metadata reading and parsing 2008-05-25 Fixed 'Postprocess month' not following settings 2008-05-25 Added Select File in File context menu 2008-05-25 Added clear functionality to combo boxes 2008-05-07 RELEASE OF VERSION 0.9.5 2008-05-07 Set LyX pipe selection for Qt 4.4.0 filedialogs 2008-05-07 Fixed 'Search in files' headers and browser 'Select' icon display for Qt 4.4.0 2008-04-15 Fixed missing HTML special character encoding when searching by field 2008-04-08 Contributed regexps for Earth Planet Sci Lett, 2008-04-08 Phys Earth Planet Inter, Geophys J Int (Thanks to L. A. C. Silva) 2008-04-07 RELEASE OF VERSION 0.9.4 2008-04-07 Updated bookmark netqinf.txt file 2008-04-05 Set optionally file entries relative to current BibTeX file (Thanks to A. M. Elena) 2008-04-03 Added tag <<selection>> to dynamic bookmarks 2008-04-03 Added dynamic bookmarks to cb2Bib context menu 2008-03-31 Moved basic edit actions to 'Edit' context submenu 2008-03-05 Added cb2Bib browser context action 'Open Document Url' 2008-03-05 Set cb2Bib browser link preference to local article file, to URL, and to DOI 2008-03-05 Set PubMed ID as BibTeX URL field in PubMed extractions (Thanks to S. Tabibzadeh) 2008-02-01 RELEASE OF VERSION 0.9.3 2008-01-31 Added bookmark menu in the embedded editor 2008-01-30 Fixed/Improved PubMed IDs extraction (update netqinf.txt) 2008-01-30 Fixed ISBN recognition for cases 'ISBN 0: 0-0000-0000-0' 2008-01-30 Fixed an issue when parsing bib keys formatted by KBibTeX (Thanks to D. Car) 2007-12-07 RELEASE OF VERSION 0.9.2 2007-12-07 Fixes/workarounds for filedialog and Qt<4.3.3. Added exec icon for X11. 2007-12-05 Optimized BibTeX parser, searches and composite searches 2007-12-04 Fixed merging of contiguous search excerpts 2007-12-04 Fixed a bug when deleting search patterns, avoid accepting empty patterns 2007-11-25 RELEASE OF VERSION 0.9.1 2007-11-25 Fixed ISBN recognition for cases 'ISBN-0: 0-0000-0000-0' 2007-11-25 Added filter mode selection to browser/editor reference list 2007-11-25 Set filedialog to remember last size 2007-11-25 Fixed compilation issue on Debian 4.1.1-21 (Thanks to A. Matuszak) 2007-10-31 RELEASE OF VERSION 0.9.0 2007-10-30 Show 'search in files' output in text mode if no hits but search errors 2007-10-30 Consider 'editor' if 'author' is empty for cite IDs 2007-10-30 Customizable page number separator (Thanks to C. Ullrich) 2007-10-30 Consistent update of shortcuts: Use standard ones, and Alt modifier in other cases 2007-10-30 Updated Editor/Browser menu 2007-10-28 Added 'Search In Files' for selected text 2007-10-28 Code refactoring: Added resource class c2b 2007-10-27 Remove patterns '(Editor)', '(Ed)', ..., prior to processing an editors string 2007-10-27 Improved heuristic guess for ISBN 2007-10-27 Improved heuristic guess for abstract, considers tag 'summary' 2007-10-26 Updated message dialogs for better desktop integration 2007-10-26 Fixed shortcut for 'Deletes temporary BibTeX output file' 2007-10-26 Set c2bUtils into namespace, some inlining of utilities 2007-09-17 Fixed wrong renaming of non '.pdf' files when original filename has several '.' 2007-09-05 RELEASE OF VERSION 0.8.4 2007-09-05 Setting relative file paths and temporaries when launched with --conf option 2007-09-05 Minor code cleanup 2007-08-02 Updated netqinf.txt file 2007-08-02 Updated PubMed/Medline parser 2007-07-05 RELEASE OF VERSION 0.8.3.1 2007-07-05 Fixed a regression while parsing command line 2007-07-05 RELEASE OF VERSION 0.8.3 2007-07-04 Fixed memory leak from cb2Bib not freeing c2bSearchInFiles 2007-07-03 Fixed file dialog captions when using Qt 4.3.0 2007-07-03 Do not show cb2Bib's main panel when launched with '--bibedit filename.bib' 2007-07-03 Reorganized settings and updated windows installer 2007-07-03 Considered user configuration files, --conf flag (Thanks to S. Oom) 2007-07-03 Fixed Debian/Ubuntu packaging script (Thanks to L. Eraly) 2007-07-02 Updated configure script 2007-06-07 Fixed some dialogs not showing when using Qt 4.3.0 2007-05-07 RELEASE OF VERSION 0.8.2 2007-05-07 Fixed 'Unknown Error' when copying/moving files from PDFImport on Windows 2007-05-07 Scape < and > symbols in browser 2007-05-01 Fixed regression 'Copy instead of moving non-local files' for external clients 2007-04-23 Added approximate string search 2007-04-08 Added search highlight for abstracts 2007-04-08 Added PDF search excerpts 2007-04-08 Added cache for PDF search 2007-04-08 Remember Browser font size 2007-04-01 RELEASE OF VERSION 0.8.1 2007-04-01 Copy instead of moving non-local files 2007-04-01 Improved/optimized Search in Files functionality for composite patterns 2007-04-01 Syncornized BibTeX Editor and Browser navigation 2007-03-24 Set raw mode view as default, instead of tagged mode view 2007-03-24 Set unique BibTeX parsing. Fixes parsing in Editor and Search in Files 2007-03-24 Improved BibTeX recognition and parsing 2007-03-24 Improved PDFImport functionality (Thanks to E. Gaubitzer) 2007-03-18 Updated netqinf.txt and regexps.txt files 2007-03-18 Added <<excerpt>> tag for queries 2007-03-18 Improved journal and pages recognition 2007-03-18 Cleanup and reorganization of settings management 2007-03-16 Remove from PDFImport file list unsuccessfully converted files 2007-03-16 Remember last directory/file in PDFImport filedialog (Thanks to E. Gaubitzer) 2007-03-13 RELEASE OF VERSION 0.8.0 2007-03-11 Added HTML browser view to BibTeX editor 2007-03-10 Added 'Search references in files' functionality 2007-03-10 Avoided cb2Bib's tags from interfering with heuristic recognition 2007-03-10 Improved heuristic guess for volume, pages, and number 2007-03-10 Added clear functionality to line editors 2007-03-10 Updated all dialogs to make them consistent and desktop aware 2007-03-10 Fixed preparser 2007-03-10 Improved Find in Text dialog 2007-03-09 Fixed Reference List not displaying booktitle 2007-03-06 Fixed a rare wrong passing of optional arguments to external tools 2007-03-06 Fixed history in filedialogs 2007-03-06 Removed wrong slash in filedialog filenames when file did not exist 2007-03-06 Fixed wrong editor exit when document is modified and cancel is pressed 2007-02-18 RELEASE OF VERSION 0.7.3 2007-02-17 Removed duplicated blank lines in external process logs 2007-02-17 Convert HTML character encodings in PubMed reference import 2007-02-17 Fixed URL encoding for opening files through internal desktop service 2007-02-17 Remove braces in <<title>> replacement for Bookmarks 2007-02-17 Fixed <<pages>> replacement for Bookmarks (fixes CR bookmark) 2007-02-17 Remember word un/wrap mode in editors 2007-02-17 Check if DOI is a web address in BibTeX editor before being opened 2007-02-17 Added web search customization in BibTeX editor 2007-02-16 Fixed/improved uppercased 'title' capitalization 2006-12-06 RELEASE OF VERSION 0.7.2 2006-12-06 Added choice to write 'title' in double braces 2006-12-06 Fixed pasting of formatted text to BibTeX editor 2006-12-06 Fixed CR regexp in netqinf.txt to not to read HTML-encoded DOI 2006-12-06 Fixed a subtle bug preventing viewers from updating if text was selected 2006-12-06 Added raw, non-preprocessed clipboard view mode (Thanks to M. Wegmann) 2006-12-05 Updated configure and install doc for MacOSX (Thanks to Konstantin and P. Koshevoy) 2006-12-04 Added "Download Reference to cb2Bib" functionality 2006-12-04 Updated cb2Bib command line syntax 2006-12-03 Added Mac OS X cb2bib.icns icon file (Thanks to Konstantin) 2006-12-03 Added missing mingwm10.dll file on Windows package 2006-10-30 RELEASE OF VERSION 0.7.1 2006-10-30 Set default configure prefix to /usr (Thanks to T. Fischer) 2006-10-30 Fixed configure to use -prefix path 2006-10-30 Fixed LyX pipe not shown at file dialogs 2006-10-30 Revert to internal file management if file copy/move/open client is empty 2006-10-19 Fixed local file open on Windows 2006-10-16 RELEASE OF VERSION 0.7.0 2006-10-16 Fixed a regression when setting line/column in Editor 2006-10-16 Improved BibTeX file selection through combo filename list 2006-10-16 Added Editor's modified flag 2006-10-16 Set KDE consistent 'Save'/'Save As' icons in BibTeX Editor 2006-10-16 BibTeX Editor remembers Reference List position 2006-10-16 Set consistent labeling in file dialogs 2006-10-16 Added file history in file dialogs 2006-10-16 Fixed a regression related to wrong file dialog messages 2006-10-16 Consider integrated desktop service for URL opening 2006-10-16 Use QFontComboBox for font selection 2006-10-04 Fixed a regression when copying/moving files from PDFImport 2006-08-31 Fixed a regression when selecting fields in cb2Bib panel 2006-08-30 RELEASE OF PREVIEW 0.6.91 2006-08-30 Fixed a regression in droped files encoding in PDFImport 2006-08-29 Added queries by DOI (Thanks to T. Geissmann) 2006-08-29 Updated netqinf.txt information file 2006-08-29 Fixed a regression in the network functionality 2006-08-29 Fixed a compilation issue on Mac OS (Thanks to M. Bongard) 2006-08-25 RELEASE OF PREVIEW 0.6.90 2006-08-25 Ported to Qt4 2006-05-15 Updated netqinf.txt for NAR 2006-04-24 RELEASE OF VERSION 0.6.1 2006-04-24 Updated netqinf.txt for PNAS 2006-04-24 Keep 'File' synchronized with 'CITEID' 2006-04-24 Concatenate multiple 'title' in regexps, as 'Title: Subtitle' (Thanks to McKay Euan) 2006-04-23 Added tooltip to 'File' with origen file name 2006-04-23 Cleaned and updated network related classes 2006-04-23 Schedule dropped or PDFImport file copying/moving until Bib item is saved 2006-04-23 PDFImport rewritten, fixed several bugs (Thanks to M. Wegmann) 2006-04-02 RELEASE OF VERSION 0.6.0 2006-04-02 Added highlight for 'author|issue|title|volume' in clipboard 2006-04-02 Added contributed regexp for PROLA (Thanks to Martint) 2006-04-02 Added unified, platform independent new line recognition 2006-04-02 Fixed missing '<<NewLine>>' on OSX (Thanks to McKay Euan) 2006-03-28 Fixed ScienceDirect regexp 2006-03-28 Updated Wiley InterScience Example 2006-03-22 Updated cb2Bib's icon 2006-03-22 Added JTCC journal 2006-03-18 Fixed 'Copy/Rename: Keep .djvu, .dvi, .ps, .ps.gz, .tex, .txt extensions' on Windows 2006-03-18 Fixed RC_FILE (Windows and OSX) 2006-02-21 RELEASE OF VERSION 0.5.3 2006-02-21 Added SISC journal, and added contributed_re.txt (Thanks to G. B. @ RWTH) 2006-02-20 Added 'Insert/Overwrite' flag to editor 2006-02-20 Added 'File Save As' functionality to editor 2006-02-20 Copy/Rename: Keep .djvu, .dvi, .ps, .ps.gz, .tex, .txt extensions 2006-02-20 Added preparser scripts isi2bib and ris2bib 2006-02-20 Added external preparser functionality 2006-01-23 RELEASE OF VERSION 0.5.2 2006-01-22 Fixed BibTeX parser for ending non-bracket cases (eg. 'year = 2000}') 2006-01-22 Added Title and ISBN automatic guess 2006-01-22 Fixed Abstract automatic guess 2006-01-21 Added custom syntax colors 2006-01-20 Fixed referencelist.cpp for icc/64 compiler 2006-01-15 Get default font color from the Window Manager 2005-12-12 RELEASE OF VERSION 0.5.1 2005-12-12 Added 'Set active LyX pipe' in BibTeX edit menu 2005-12-12 Added edit menu in BibTeX editor 2005-12-12 BibTeX parser considers non-bracket cases (eg. 'year = 2000,') 2005-12-11 Fixed syntax highlighter for commented lines 2005-11-17 Added http POST command 2005-11-16 Updated netqinf.txt for CR 2005-11-14 Updated netqinf.txt for ACS 2005-10-26 RELEASE OF VERSION 0.5.0 2005-10-08 Proper capitalization: FIRST MID LAST -> First Mid Last 2005-10-08 Added JSTOR regexp (Thanks to B. Goodrich) 2005-10-08 Added citeID customization (Thanks S. Oom for suggestions) 2005-10-07 Set default path /usr/local/bin/pdftotext on Mac OS X 2005-08-20 RELEASE OF VERSION 0.4.6 2005-08-20 Fixed: Set current file when 'cb2bib --bibedit fn.bib' 2005-08-20 Extended Unicode to LaTeX to all entries 2005-08-20 Added equivalent processing for author and editor strings 2005-08-20 Added 'Full Author and Editor Name' option 2005-08-20 (Thanks to J. Schelp and B. Goodrich for suggestions) 2005-08-12 'cb2bib --bibedit', show main maximized if no files are given 2005-08-12 RELEASE OF VERSION 0.4.5 2005-08-12 Fixed memory leak from c2bEditor 2005-08-11 Added web search also in Editor's Reference List 2005-08-11 Menu improvements 2005-08-11 Unicode <-> LaTeX for infinity symbol 2005-08-11 Fixed viewCb2Bib button behavior in BibTeX editor 2005-08-11 BibTeX editor button functionality: edit/set editor on top 2005-08-11 Allow for multiple BibTeX editors 2005-07-06 RELEASE OF VERSION 0.4.4 2005-07-06 Fixed bookmark and regexp editor: save before execute 2005-07-06 Fixed netqinf.txt for PubMed 2005-07-06 Fixed cb2Bib idle in multiple queries + debug file option 2005-07-06 Alternate Journal Name no longer stored in 'annote' field 2005-07-06 Added 'Journals to Full/Abbreviated Name' in editor 2005-07-06 'configure' adapted to knoppix 3.6 (Thanks to cognite) 2005-07-02 Removed 'install' checking in 'configure' script 2005-07-02 ClipboardPoll disabled as default for Mac OS X 2005-06-16 RELEASE OF VERSION 0.4.3 2005-06-15 Set Postprocess widget to modeless 2005-06-15 Added menu entries 2005-06-15 Added heuristic recognition 2005-06-01 Added line number indicator in editor 2005-06-01 Fixed translating '&' to LaTeX multiple times 2005-05-29 Do not reload current BibEditor if ref added to a different file 2005-05-29 Code rearrangement and cleaning: c2bBibParser 2005-05-11 RELEASE OF VERSION 0.4.2 2005-05-11 Added reference navigation in BibTeX editor 2005-05-09 Improved search capabilities in BibTeX editor 2005-05-09 Added LyX pipe citation procedure: 2005-05-09 adapted from R. Stephenson's Tellico 2005-05-09 Added Reference List in BibTeX editor 2005-05-06 Added desktop file 2005-05-04 Uppercase greeks, also in "PNAS-style" {}, (), or [] delimiters 2005-05-04 Added automatic conversion for "PNAS-style" {middle dot} 2005-04-23 RELEASE OF VERSION 0.4.1 2005-04-23 Added scripts bib2pdf and bib2end.bat 2005-04-23 Added Postprocessing of current BibTeX file 2005-04-23 (Thanks to J. Tan for suggestions) 2005-04-19 Added command line 'cb2bib [[--bibedit] filename.bib]' 2005-04-19 Added 'author' to 'Convert string to LaTeX' config 2005-04-19 Added 'Selection to Unicode' in BibTeX editor 2005-04-19 Added 'Selection to LaTeX' in BibTeX editor 2005-04-18 Fixed Clipboard change notifications 2005-04-18 (Thanks to L. Lunak for help and ClipboardPoll code) 2005-04-07 RELEASE OF VERSION 0.4.0 2005-04-06 Added customizable input preprocessing 2005-04-06 Rearrange main window buttons 2005-04-06 Added Editor Search capability 2005-04-06 Fix Modified Editor and Exit main window 2005-04-04 Initialize 'view BibTeX' Scroll Bar position 2005-04-04 Remember 'About' Scroll Bar position 2005-04-04 Added Contextual Help 2005-04-04 Added convenience BibTeX File editor 2005-03-17 RELEASE OF VERSION 0.3.6 2005-03-16 Added ~ 10 more Unicode <-> LaTeX translations 2005-03-16 Improved 'pages' postprocessing 2005-03-16 Consider inverted commas as BibTeX delimiter 2005-02-17 Remove start and end blank in BibTeX field string 2005-02-09 RELEASE OF VERSION 0.3.5 2005-02-09 Parse whole netqinf.txt if 'No article found' 2005-02-07 Remember Config page 2005-02-07 Rearrange About/View BibTeX buttons behavior 2005-01-21 RELEASE OF VERSION 0.3.4 2005-01-20 Add 'Make Network Query' button 2005-01-20 DOI automatic extraction 2005-01-19 'PubMed Search' import (J.Name. year month;vol(n):pp.) 2005-01-19 Add significative error messages for missing filenames 2005-01-19 RegExp/Bookmarks Editor arrangement 2005-01-19 Added convenience bookmarks 2005-01-18 Consider author suffixes in Medline extraction 2005-01-18 Consider Medline AU if FAU isn't available 2005-01-15 Include DOI in Medline extraction 2005-01-14 RELEASE OF VERSION 0.3.3 2005-01-14 Added 'PubMed - Medline Journal' recognition 2005-01-13 Introduced simple Journal-Volume-Page queries 2005-01-10 (Thanks S. Vega and probono for suggestions) 2005-01-08 Added last name prefix 'vande' 2005-01-07 Added complete ACS journal list 2005-01-04 Arrangement copy/move/open for local/network files 2004-12-29 RELEASE OF VERSION 0.3.2 2004-12-29 Previous add conflicted 'van der Wal, Jan and Lieb, Jely A.' 2004-12-28 RELEASE OF VERSION 0.3.1 2004-12-27 'Abcd, E., F. Ghij, ...' citation style (Thanks P. Magwene) 2004-12-27 Fix slow highlighting 2004-12-21 RELEASE OF VERSION 0.3.0 2004-12-20 Consider interlaced authors-affiliations, removed <<moreauthors>> 2004-12-20 Regexps deposition note (Thanks J. Vertrees) 2004-12-20 Enable/Disable 'Add BibTeX to file' button 2004-12-20 Added convenience RegExp File editor 2004-12-20 Render disabled icons in grayscale 2004-12-14 Valgrind memory leak debugging 2004-12-08 RELEASE OF VERSION 0.2.8 2004-12-08 Fix a wrong enable/disable behavior in PDFImport button 2004-12-07 Convert to lower case titles completely uppercase 2004-12-07 Fix: PDF renaming consistently managed by cb2Bib instead of kfmclient 2004-12-07 Added error description for file related warnings 2004-12-01 Added 'IOP Electronic Journals' import 2004-10-22 Add abstract|introduction|keywords|key words highlight 2004-10-19 RELEASE OF VERSION 0.2.7 2004-10-19 PDFImport via pdftotext (Thanks F. C. Coelho for suggestions) 2004-09-19 RELEASE OF VERSION 0.2.6 2004-09-19 TeX <-> Unicode translations for Greek letters 2004-09-19 Choice for title Unicode -> LaTeX conversion 2004-09-18 Added some few journal abbreviations 2004-09-18 Fix wrong recognition 'First S.P.'(Thanks S. Oom) 2004-09-18 Fix 'Last, DE' - conflicting First and initials with suffixes 2004-09-18 Added author prefix 'da' and suffix 'Jr' 2004-09-08 RELEASE OF VERSION 0.2.5 2004-09-08 Choice for short/long journal names 2004-09-08 'month' postprocessing (Thanks F. Hedman) 2004-09-08 Added 'Alt D' to delete temporary BibTeX output (Thanks S. Oom) 2004-09-07 Added 'Alt R' accelerator to start automatic recognition 2004-09-07 Proper recognition for 'First I Second, ' 2004-09-02 RELEASE OF VERSION 0.2.4 2004-09-02 Previous fix conflicted with 'First I. Second, ' 2004-08-31 Fix message pointing to wrong file (Thanks G. Palfinger) 2004-08-30 RELEASE OF VERSION 0.2.3 2004-08-30 Fix wrong recognition 'First SP, Second WE, '(Thanks S. Oom) 2004-08-30 RELEASE OF VERSION 0.2.2 2004-08-29 Experimental: kfmclient to retrieve pdf files 2004-08-29 Thanks F. Hedman: 2004-08-28 Improved automatic URL recognition 2004-08-28 Added BibTeX fields 'eprint' and 'doi' 2004-08-22 RELEASE OF VERSION 0.2.1 2004-08-22 Workaround for acrobat, mozilla, qt 3.3.3 issues 2004-08-17 Fixed 'file' - 'eprint' duplication in BibTeX output 2004-08-13 Set 'article' as default type 2004-07-30 RELEASE OF VERSION 0.2.0 2004-07-30 Improved visual input/output presentation 2004-07-29 RegExp format changes: Added extra line for reference types 2004-07-29 RegExp format changes: 'authors' -> 'author' 2004-07-29 Extend reference fields list 2004-07-28 Input reference type list 2004-07-12 RELEASE OF VERSION 0.1.4 2004-07-12 Fix "F.-S. Last" author name processing 2004-07-12 Fix to compile against Qt 3.1.0 or later 2004-07-11 RELEASE OF VERSION 0.1.3 2004-07-09 Improved 'ScienceDirect' import 2004-07-09 Improved TeX <-> Unicode translations 2004-07-09 Added 'Nature from Fisrt Paragraph' import 2004-07-08 Added 'DBLP article' import (thanks to P. Woelfel) 2004-07-08 Consider also '&' as a separator in author automatic recognition 2004-07-08 Fixing 'empty-field {}' error in BibTeX recognition 2004-07-07 Improved MakeCiteID for composite names 2004-07-07 Consider composing sufix 'III' 2004-07-07 Added LastName prefix 'dos' and 'del' 2004-07-07 Corrected JCICS extended journal name 2004-07-05 RELEASE OF VERSION 0.1.2 2004-07-05 Added 'ISI Web of Knowledge Table of Contents Alert' import. 2004-07-05 Fixing: 'Last, FST' -> 'F. S. T. Last' (but not 'LAST, FIRST') 2004-07-05 Proper last name capitalization ('LAST-NAME' -> 'Last-Name') 2004-07-04 Escaping math characters '∂' and '−' 2004-07-03 RELEASE OF VERSION 0.1.1 2004-07-01 Escaping accented characters (MakeCiteID and authors and title in MakeBib) 2004-06-29 RELEASE OF VERSION 0.1.0 �������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/CMakeLists.txt�������������������������������������������������������������������������0000644�0001750�0001750�00000015523�12045517740�015351� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # cb2bib cmake build script #------------------------------------------------------------------------------- include(cmake/modules/c2bUtilities.cmake) #------------------------------------------------------------------------------- # cb2bib cmake options and defaults #------------------------------------------------------------------------------- project(cb2bib) if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) if(WIN32) set(CMAKE_INSTALL_PREFIX "C:\Program Files" CACHE PATH "Default install path prefix" FORCE) elseif(APPLE) set(CMAKE_INSTALL_PREFIX "/Applications" CACHE PATH "Default install path prefix" FORCE) else() set(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Default install path prefix" FORCE) endif() endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) if(CMAKE_BUILD_TYPE STREQUAL "") set(CMAKE_BUILD_TYPE Release) endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_definitions(-DC2B_DEBUG) endif() option(C2B_USE_WEBKIT "Link cb2bib against QtWebKit library." ON) option(C2B_USE_LZO "Link cb2bib against lzo2 library." ON) if(UNIX AND NOT APPLE) option(C2B_USE_CBPOLL "Use clipboardPoll." ON) path_option(C2B_INSTALL_BIN_DIR "Executables installation directory [default: CMAKE_INSTALL_PREFIX/bin]." "${CMAKE_INSTALL_PREFIX}/bin") path_option(C2B_INSTALL_DATA_DIR "Data installation directory [default: CMAKE_INSTALL_PREFIX/share/cb2bib]." "${CMAKE_INSTALL_PREFIX}/share/cb2bib") path_option(C2B_INSTALL_DESKTOP_DIR "Desktop file installation directory [default: CMAKE_INSTALL_PREFIX/share/applications]." "${CMAKE_INSTALL_PREFIX}/share/applications") path_option(C2B_INSTALL_ICON_DIR "Icon file directory [default: CMAKE_INSTALL_PREFIX/share/pixmaps]." "${CMAKE_INSTALL_PREFIX}/share/pixmaps") endif(UNIX AND NOT APPLE) if(APPLE) set(C2B_USE_CBPOLL OFF) path_option(C2B_INSTALL_BIN_DIR "Executables installation directory [default: CMAKE_INSTALL_PREFIX/cb2bib.app/Contents/MacOS]." "${CMAKE_INSTALL_PREFIX}/cb2bib.app/Contents/MacOS") path_option(C2B_INSTALL_DATA_DIR "Data installation directory [default: CMAKE_INSTALL_PREFIX/cb2bib.app/Contents/Resources]." "${CMAKE_INSTALL_PREFIX}/cb2bib.app/Contents/Resources") endif(APPLE) if(WIN32) set(C2B_USE_CBPOLL OFF) path_option(C2B_INSTALL_BIN_DIR "Executables installation directory [default: CMAKE_INSTALL_PREFIX\cb2bib]." "${CMAKE_INSTALL_PREFIX}\cb2bib") endif(WIN32) if(C2B_USE_LZO) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") find_package(LZO REQUIRED) include_directories(${LZO_INCLUDE_DIR}) add_definitions(-DC2B_USE_LZO) endif(C2B_USE_LZO) message("-- cb2bib uses QtWebKit library: ${C2B_USE_WEBKIT}") message("-- cb2bib uses lzo2 library: ${C2B_USE_LZO}") message("-- cb2bib executables installation directory: ${C2B_INSTALL_BIN_DIR}") message("-- cb2bib data installation directory: ${C2B_INSTALL_DATA_DIR}") if(UNIX AND NOT APPLE) message("-- cb2bib desktop file installation directory: ${C2B_INSTALL_DESKTOP_DIR}") message("-- cb2bib icon file installation directory: ${C2B_INSTALL_ICON_DIR}") endif(UNIX AND NOT APPLE) message("-- Build type: ${CMAKE_BUILD_TYPE}") configure_file(${CMAKE_SOURCE_DIR}/src/c2b/cb2bib_conf_parameters.h.in ${CMAKE_CURRENT_BINARY_DIR}/cb2bib_conf_parameters.h @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}) #------------------------------------------------------------------------------- # general settings #------------------------------------------------------------------------------- cmake_minimum_required(VERSION 2.6) set(CMAKE_COLOR_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON) set(CB2BIB_MINIMUM_REQUIRED_QT "4.4.0") #------------------------------------------------------------------------------- # build tree structure #------------------------------------------------------------------------------- if(WIN32) subdirs(src/c2b src src/win) else() subdirs(src/c2b src) endif() #------------------------------------------------------------------------------- # installs #------------------------------------------------------------------------------- if(UNIX AND NOT APPLE) install(PROGRAMS c2bscripts/c2bciter DESTINATION ${C2B_INSTALL_BIN_DIR}) install(PROGRAMS c2bscripts/c2bimport DESTINATION ${C2B_INSTALL_BIN_DIR}) install(FILES AUTHORS COPYRIGHT LICENSE CHANGELOG DESTINATION ${C2B_INSTALL_DATA_DIR}) install(DIRECTORY data c2btools testPDFImport DESTINATION ${C2B_INSTALL_DATA_DIR}) install(FILES c2bscripts/cb2bib.desktop c2bscripts/c2bciter.desktop c2bscripts/c2bimport.desktop DESTINATION ${C2B_INSTALL_DESKTOP_DIR}) install(FILES src/icons/cb2bib.png DESTINATION ${C2B_INSTALL_ICON_DIR}) endif(UNIX AND NOT APPLE) if(APPLE) install(PROGRAMS ./c2bscripts/c2bciter DESTINATION ${C2B_INSTALL_BIN_DIR}) install(PROGRAMS ./c2bscripts/c2bimport DESTINATION ${C2B_INSTALL_BIN_DIR}) install(FILES AUTHORS COPYRIGHT LICENSE CHANGELOG DESTINATION ${C2B_INSTALL_DATA_DIR}) install(DIRECTORY data c2btools testPDFImport DESTINATION ${C2B_INSTALL_DATA_DIR}) set(MACOSX_BUNDLE_BUNDLE_NAME cb2bib) set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.MOLspaces.cb2Bib") set(MACOSX_BUNDLE_ICON_FILE src/icons/cb2bib.icns) set(MACOSX_BUNDLE_INFO_STRING "A tool for rapidly extracting unformatted bibliographic references") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.4") set(MACOSX_BUNDLE_LONG_VERSION_STRING "1.4.2") set(MACOSX_BUNDLE_BUNDLE_VERSION "1.4.2") set(MACOSX_BUNDLE_COPYRIGHT "(C) 2004-2012 Pere Constans") ### ?? ### set_source_files_properties(${ProjectName_RESOURCES} ${ProjectName_TRANSLATIONS} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) ## ### According to http://cmake.org/Wiki/CMake:Bundles_And_Frameworks, appl1_aux1 and appl1_aux2 would be c2bciter and c2bimport ###/Applications/ ### appl1.app/ ### Contents/ ### Info.plist ### MacOS/ ### appl1 -> appl1-1 ### appl1-1 ### appl1_aux1 ### appl1_aux2 ### Resources/ ### appl1_res1 ### appl1_res2 ## ## # are they set as executable ? how if orig files were executable already ? are they seen as execs from the gui ? ## set_source_files_properties(c2bscripts/c2bciter c2bscripts/c2bimport PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) ## # is this correct ? how about data c2btools testPDFImport directories ? ## set_source_files_properties(AUTHORS COPYRIGHT LICENSE CHANGELOG PROPERTIES MACOSX_PACKAGE_LOCATION Resources) ## # need this to copy icon ? ## set_source_files_properties(MACOSX_BUNDLE_ICON_FILE PROPERTIES MACOSX_PACKAGE_LOCATION Resources) endif(APPLE) if(WIN32) endif(WIN32) #-------------------------------------------------------------------------------�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/AUTHORS��������������������������������������������������������������������������������0000644�0001750�0001750�00000000016�12045517740�013650� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pere Constans ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cb2bib.rc������������������������������������������������������������������������������0000644�0001750�0001750�00000000107�12045517740�014252� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IDI_ICON1 ICON DISCARDABLE "src/icons/cb2bib.ico" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cmake/���������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045520050�013647� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cmake/README.txt�����������������������������������������������������������������������0000644�0001750�0001750�00000001376�12045517740�015370� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # cb2bib cmake #------------------------------------------------------------------------------- To CONFIGURE cb2bib build, from the base directory, type cd cmake/build cmake ../.. To find out and eventually modify the build options, type cmake -i ../.. To COMPILE cb2bib, type make To INSTALL cb2bib, type make install/strip For make options, type make help #------------------------------------------------------------------------------- EXAMPLE: Configure, compile, and install to a non-default location cd cmake/build cmake ../.. -DCMAKE_INSTALL_PREFIX=/usr/local make make install/strip #-------------------------------------------------------------------------------������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cmake/modules/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045517740�015333� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cmake/modules/FindLZO.cmake������������������������������������������������������������0000644�0001750�0001750�00000003255�12045517740�017607� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # cb2bib cmake lzo find module #------------------------------------------------------------------------------- # Modified FindLZO.cmake module from the LGPL 3.0 project blobseer # http://blobseer.gforge.inria.fr/doku.php #------------------------------------------------------------------------------- # Find liblzo2 # LZO_FOUND - system has LZO2 library # LZO_INCLUDE_DIR - LZO2 include directory # LZO_LIBRARIES - The libraries needed to use LZO2 #------------------------------------------------------------------------------- if (LZO_INCLUDE_DIR AND LZO_LIBRARIES) # in cache already SET(LZO_FOUND TRUE) else (LZO_INCLUDE_DIR AND LZO_LIBRARIES) FIND_PATH(LZO_INCLUDE_DIR lzo/lzoconf.h ${LZO_ROOT}/include/lzo/ /usr/include/lzo/ /usr/local/include/lzo/ /sw/lib/lzo/ /sw/local/lib/lzo/ ) if(WIN32 AND MSVC) else(WIN32 AND MSVC) FIND_LIBRARY(LZO_LIBRARIES NAMES lzo2 PATHS ${LZO_ROOT}/lib /sw/lib /sw/local/lib /usr/lib /usr/local/lib ) endif(WIN32 AND MSVC) if (LZO_INCLUDE_DIR AND LZO_LIBRARIES) set(LZO_FOUND TRUE) endif (LZO_INCLUDE_DIR AND LZO_LIBRARIES) if (LZO_FOUND) if (NOT LZO_FIND_QUIETLY) message(STATUS "Found LZO2: ${LZO_LIBRARIES}") endif (NOT LZO_FIND_QUIETLY) else (LZO_FOUND) if (LZO_FIND_REQUIRED) message(FATAL_ERROR "Could NOT find LZO2") endif (LZO_FIND_REQUIRED) endif (LZO_FOUND) MARK_AS_ADVANCED(LZO_INCLUDE_DIR LZO_LIBRARIES) endif (LZO_INCLUDE_DIR AND LZO_LIBRARIES) #-------------------------------------------------------------------------------���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cmake/modules/c2bUtilities.cmake�������������������������������������������������������0000644�0001750�0001750�00000002052�12045517740�020676� 0����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # cb2bib cmake build macros #------------------------------------------------------------------------------- macro(PATH_OPTION VAR DESCRIPTION DEFAULT) if(DEFINED ${VAR}) set(${VAR} ${${VAR}} CACHE PATH "${DESCRIPTION}" FORCE) else() set(${VAR} ${DEFAULT} CACHE PATH "${DESCRIPTION}" FORCE) endif() endmacro(PATH_OPTION) macro(LIST_SOURCE_FILES_AT CPP H MOCH RPATH) file(GLOB ${CPP} RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${RPATH}*.cpp") file(GLOB ${H} RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${RPATH}*.h") set(${MOCH}) foreach(_file ${${H}}) file(READ ${_file} _contents) string(REGEX MATCH "[\n\r] *Q_OBJECT" _match "${_contents}") if(_match) list(APPEND ${MOCH} ${_file}) endif(_match) endforeach(_file ${${H}}) endmacro(LIST_SOURCE_FILES_AT) macro(LIST_SOURCE_FILES CPP H MOCH) list_source_files_at(${CPP} ${H} ${MOCH} "") endmacro(LIST_SOURCE_FILES) #-------------------------------------------------------------------------------��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cb2bib-1.4.9/cmake/build/���������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12045520050�014746� 5����������������������������������������������������������������������������������������������������ustar �rusconi�������������������������rusconi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������