+2003-02-28 Alfredo Braunstein <abraunst@libero.it>
+
+ * converter.[Ch]: split into itself +
+ * graph.[Ch]
+ * format.[Ch]
+ * Makefile.am: += graph.[Ch] + format.[Ch]
+ * MenuBackend.C
+ * buffer.C
+ * exporter.C
+ * importer.C
+ * lyx_main.C
+ * lyxfunc.C
+ * lyxrc.C: added #include "format.h"
+
2003-02-27 Angus Leeming <leeming@lyx.org>
* BufferView_pimpl.C (dispatch): call a real, LyX dialog to insert
- a label.
+ a label.
* factory.C (createInset): add "label" to the factory.
* lyx_cb.[Ch] (getPossibleLabel): rewrite MenuInsertLabel to return the
- string and do no more.
+ string and do no more.
2003-02-27 Angus Leeming <leeming@lyx.org>
* LyXAction.C (init):
* factory.C (createInset):
* BufferView_pimpl.C (dispatch):
- collapse LFUN_XYZ_APPLY to LFUN_INSET_APPLY.
+ collapse LFUN_XYZ_APPLY to LFUN_INSET_APPLY.
* lyxfunc.C (getStatus): remove LFUN_BIBTEX_APPLY, LFUN_CITATION_APPLY.
2003-02-26 Angus Leeming <leeming@lyx.org>
* BufferView_pimpl.C (dispatch): collapse the various LFUN_XYZ_APPLY
- blocks together.
- Rearrange the ~includes. Strip out the unnecessary ones.
+ blocks together.
+ Rearrange the ~includes. Strip out the unnecessary ones.
* factory.C (createInset): reformat.
- create new insets for the various LFUN_XYZ_APPLY lfuns.
+ create new insets for the various LFUN_XYZ_APPLY lfuns.
2003-02-26 John Levon <levon@movementarian.org>
* text3.C:
* text2.C:
* text.C: use lyxrow helpers above.
- Move draw and paint routines to RowPainter.
- Make several methods use refs not pointers.
- Make backgroundColor() const.
- Add markChangeInDraw(), isInInset().
- Merge changeRegionCase into changeCase.
- Make workWidth() shouldn't-happen code into an Assert.
+ Move draw and paint routines to RowPainter.
+ Make several methods use refs not pointers.
+ Make backgroundColor() const.
+ Add markChangeInDraw(), isInInset().
+ Merge changeRegionCase into changeCase.
+ Make workWidth() shouldn't-happen code into an Assert.
* rowpainter.h:
* rowpainter.C: new class for painting a row.
2003-02-21 Angus Leeming <leeming@lyx.org>
* commandtags.h: Retire LFUN_CITATION_INSERT, LFUN_CITATION_CREATE,
- LFUN_INSERT_BIBTEX, LFUN_BIBTEX_STYLE, LFUN_BIBDB_ADD, LFUN_BIBDB_DEL.
- Bring to life LFUN_DIALOG_SHOW_NEW_INSET, LFUN_DIALOG_SHOW_NEXT_INSET,
- LFUN_DIALOG_UPDATE, LFUN_DIALOG_HIDE, LFUN_DIALOG_DISCONNECT_INSET,
- LFUN_BIBITEM_APPLY, LFUN_BIBTEX_APPLY, LFUN_CITATION_APPLY,
- LFUN_INDEX_APPLY, LFUN_REF_APPLY, LFUN_TOC_APPLY, LFUN_URL_APPLY,
+ LFUN_INSERT_BIBTEX, LFUN_BIBTEX_STYLE, LFUN_BIBDB_ADD, LFUN_BIBDB_DEL.
+ Bring to life LFUN_DIALOG_SHOW_NEW_INSET, LFUN_DIALOG_SHOW_NEXT_INSET,
+ LFUN_DIALOG_UPDATE, LFUN_DIALOG_HIDE, LFUN_DIALOG_DISCONNECT_INSET,
+ LFUN_BIBITEM_APPLY, LFUN_BIBTEX_APPLY, LFUN_CITATION_APPLY,
+ LFUN_INDEX_APPLY, LFUN_REF_APPLY, LFUN_TOC_APPLY, LFUN_URL_APPLY,
* BufferView_pimpl.C (dispatch):
* LyXAction.C (init):
* BufferView_pimpl.C (MenuInsertLyXFile):
* lyx_cb.C (WriteAs, getContentsOfAsciiFile):
* lyxfunc.C (menuNew, open, doImport):
- no longer pass a LyXView & to fileDlg.
+ no longer pass a LyXView & to fileDlg.
2003-02-21 Angus Leeming <leeming@lyx.org>
2003-02-15 Jean-Marc Lasgouttes <lasgouttes@freesurf.fr>
* buffer.C (makeLaTeXFile): move the code that generates the
- preamble...
+ preamble...
* bufferparams.C (writeLaTeX): ... in this new method
* LaTeXFeatures.C (getEncodingSet): make const
- (getLanguages): make const
+ (getLanguages): make const
* MenuBackend.C (binding): returns the binding associated to this
- action
- (add): sets the status of each item by calling getStatus. Adds
- some intelligence.
- (read): add support for OptSubMenu
- (expand): remove extra separator at the end of expanded menu
+ action
+ (add): sets the status of each item by calling getStatus. Adds
+ some intelligence.
+ (read): add support for OptSubMenu
+ (expand): remove extra separator at the end of expanded menu
2003-02-15 John Levon <levon@movementarian.org>
* BufferView_pimpl.C:
* bufferlist.h:
* bufferlist.C: remove pointless BufferStorage bloat. Remove
- inset code that had no actual effect. Remove unneeded status
- code.
+ inset code that had no actual effect. Remove unneeded status
+ code.
2003-02-14 Jean-Marc Lasgouttes <lasgouttes@freesurf.fr>
* buffer.C (makeLaTeXFile): fix counting of number of line feeds
- in preamble
+ in preamble
2003-02-14 Michael Schmitt <michael.schmitt@teststep.org>
* text.C (drawLengthMarker): also draw an arrow marker for
- symbolic lengths (medskip...)
+ symbolic lengths (medskip...)
2003-02-14 John Levon <levon@movementarian.org>
2003-02-14 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
* text2.C (LyXText): change order of initilizers to shut off
- warnings
+ warnings
2003-02-14 John Levon <levon@movementarian.org>
* paragraph.C (asString): remove two unused variables
* lyxtextclass.C (readTitleType):
- (Read):
- (LyXTextClass): handle new members titletype_ and titlename_
+ (Read):
+ (LyXTextClass): handle new members titletype_ and titlename_
* buffer.C (latexParagraphs): honor LyXTextClass::titletype
version.C \
version.h \
vspace.C \
- vspace.h
+ vspace.h \
+ graph.C \
+ graph.h \
+ format.C \
+ format.h
lyx_main.o: lyx_main.C lyx_main.h config.h version.h \
lyxrc.h support/path.h support/filetools.h \
#include "lyx_main.h" // for lastfiles
#include "bufferlist.h"
#include "buffer.h"
-#include "converter.h"
+#include "format.h"
#include "exporter.h"
#include "importer.h"
#include "FloatList.h"
#include "language.h"
#include "exporter.h"
#include "Lsstream.h"
-#include "converter.h"
+#include "format.h"
#include "BufferView.h"
#include "ParagraphParameters.h"
#include "iterators.h"
-/* This file is part of
- * ======================================================
+/**
+ * \file converter.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * LyX, The Document Processor
+ * \author Dekel Tsur
*
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
+ * Full author contact details are available in file CREDITS
+ */
#include <config.h>
#include "converter.h"
+#include "graph.h"
+#include "format.h"
#include "lyxrc.h"
#include "buffer.h"
#include "bufferview_funcs.h"
#endif
using std::vector;
-using std::queue;
using std::endl;
-using std::fill;
using std::find_if;
-using std::reverse;
-using std::sort;
namespace {
string const token_to("$$o");
string const token_path("$$p");
-//////////////////////////////////////////////////////////////////////////////
-inline
+
string const add_options(string const & command, string const & options)
{
string head;
} // namespace anon
-//////////////////////////////////////////////////////////////////////////////
-
-bool Format::dummy() const
-{
- return extension().empty();
-}
-
-
-bool Format::isChildFormat() const
-{
- if (name_.empty())
- return false;
- return isdigit(name_[name_.length() - 1]);
-}
-
-
-string const Format::parentFormat() const
-{
- return name_.substr(0, name_.length() - 1);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-
-// This method should return a reference, and throw an exception
-// if the format named name cannot be found (Lgb)
-Format const * Formats::getFormat(string const & name) const
-{
- FormatList::const_iterator cit =
- find_if(formatlist.begin(), formatlist.end(),
- lyx::compare_memfun(&Format::name, name));
- if (cit != formatlist.end())
- return &(*cit);
- else
- return 0;
-}
-
-
-int Formats::getNumber(string const & name) const
-{
- FormatList::const_iterator cit =
- find_if(formatlist.begin(), formatlist.end(),
- lyx::compare_memfun(&Format::name, name));
- if (cit != formatlist.end())
- return cit - formatlist.begin();
- else
- return -1;
-}
-
-
-void Formats::add(string const & name)
-{
- if (!getFormat(name))
- add(name, name, name, string());
-}
-
-
-// FIXME: horrednously mis-named, especially given the other ::add
-// function
-void Formats::add(string const & name, string const & extension,
- string const & prettyname, string const & shortcut)
-{
- FormatList::iterator it =
- find_if(formatlist.begin(), formatlist.end(),
- lyx::compare_memfun(&Format::name, name));
- if (it == formatlist.end())
- formatlist.push_back(Format(name, extension, prettyname,
- shortcut, ""));
- else {
- string viewer = it->viewer();
- *it = Format(name, extension, prettyname, shortcut, viewer);
- }
-}
-
-
-void Formats::erase(string const & name)
-{
- FormatList::iterator it =
- find_if(formatlist.begin(), formatlist.end(),
- lyx::compare_memfun(&Format::name, name));
- if (it != formatlist.end())
- formatlist.erase(it);
-}
-
-
-void Formats::sort()
-{
- std::sort(formatlist.begin(), formatlist.end());
-}
-
-
-void Formats::setViewer(string const & name, string const & command)
-{
- add(name);
- FormatList::iterator it =
- find_if(formatlist.begin(), formatlist.end(),
- lyx::compare_memfun(&Format::name, name));
- if (it != formatlist.end())
- it->setViewer(command);
-}
-
-
-bool Formats::view(Buffer const * buffer, string const & filename,
- string const & format_name) const
-{
- if (filename.empty())
- return false;
-
- Format const * format = getFormat(format_name);
- if (format && format->viewer().empty() &&
- format->isChildFormat())
- format = getFormat(format->parentFormat());
- if (!format || format->viewer().empty()) {
-#if USE_BOOST_FORMAT
- Alert::alert(_("Cannot view file"),
- boost::io::str(boost::format(_("No information for viewing %1$s"))
- % prettyName(format_name)));
-#else
- Alert::alert(_("Cannot view file"),
- _("No information for viewing ")
- + prettyName(format_name));
-#endif
- return false;
- }
-
- string command = format->viewer();
-
- if (format_name == "dvi" &&
- !lyxrc.view_dvi_paper_option.empty()) {
- command += ' ' + lyxrc.view_dvi_paper_option;
- string paper_size = converters.papersize(buffer);
- if (paper_size == "letter")
- paper_size = "us";
- command += ' ' + paper_size;
- if (buffer->params.orientation
- == BufferParams::ORIENTATION_LANDSCAPE)
- command += 'r';
- }
-
- if (!contains(command, token_from))
- command += ' ' + token_from;
-
- command = subst(command, token_from,
- QuoteName(OnlyFilename(filename)));
- command = subst(command, token_path, QuoteName(OnlyPath(filename)));
-
- lyxerr[Debug::FILES] << "Executing command: " << command << endl;
- ShowMessage(buffer, _("Executing command:"), command);
-
- Path p(OnlyPath(filename));
- Systemcall one;
- int const res = one.startscript(Systemcall::DontWait, command);
-
- if (res) {
- Alert::alert(_("Cannot view file"),
- _("Error while executing"),
- command.substr(0, 50));
- return false;
- }
- return true;
-}
-
-string const Formats::prettyName(string const & name) const
-{
- Format const * format = getFormat(name);
- if (format)
- return format->prettyname();
- else
- return name;
-}
-
-
-string const Formats::extension(string const & name) const
-{
- Format const * format = getFormat(name);
- if (format)
- return format->extension();
- else
- return name;
-}
-
-//////////////////////////////////////////////////////////////////////////////
+Converter::Converter(string const & f, string const & t, string const & c,
+ string const & l): from(f), to(t), command(c), flags(l),
+ From(0), To(0), latex(false),
+ original_dir(false), need_aux(false)
+{}
void Converter::readFlags()
{
return i < 0;
}
-//////////////////////////////////////////////////////////////////////////////
+
class compare_Converter {
public:
};
+
Converter const * Converters::getConverter(string const & from,
string const & to)
{
}
-int Converters::bfs_init(string const & start, bool clear_visited)
-{
- int const s = formats.getNumber(start);
- if (s < 0)
- return s;
-
- Q_ = queue<int>();
- if (clear_visited)
- fill(visited_.begin(), visited_.end(), false);
- if (visited_[s] == false) {
- Q_.push(s);
- visited_[s] = true;
- }
- return s;
-}
-
-
-vector<Format const *> const
-Converters::getReachableTo(string const & target, bool clear_visited)
-{
- vector<Format const *> result;
- int const s = bfs_init(target, clear_visited);
- if (s < 0)
- return result;
-
- while (!Q_.empty()) {
- int const i = Q_.front();
- Q_.pop();
- if (i != s || target != "lyx") {
- result.push_back(&formats.get(i));
- }
-
- vector<int>::iterator it = vertices_[i].in_vertices.begin();
- vector<int>::iterator end = vertices_[i].in_vertices.end();
- for (; it != end; ++it) {
- if (!visited_[*it]) {
- visited_[*it] = true;
- Q_.push(*it);
- }
- }
- }
-
- return result;
-}
-
-
-vector<Format const *> const
-Converters::getReachable(string const & from, bool only_viewable,
- bool clear_visited)
-{
- vector<Format const *> result;
-
- if (bfs_init(from, clear_visited) < 0)
- return result;
-
- while (!Q_.empty()) {
- int const i = Q_.front();
- Q_.pop();
- Format const & format = formats.get(i);
- if (format.name() == "lyx")
- continue;
- if (!only_viewable || !format.viewer().empty() ||
- format.isChildFormat())
- result.push_back(&format);
-
- vector<int>::const_iterator cit =
- vertices_[i].out_vertices.begin();
- vector<int>::const_iterator end =
- vertices_[i].out_vertices.end();
- for (; cit != end; ++cit)
- if (!visited_[*cit]) {
- visited_[*cit] = true;
- Q_.push(*cit);
- }
- }
-
- return result;
-}
-
-
-bool Converters::isReachable(string const & from, string const & to)
-{
- if (from == to)
- return true;
-
- int const s = bfs_init(from);
- int const t = formats.getNumber(to);
- if (s < 0 || t < 0)
- return false;
-
- while (!Q_.empty()) {
- int const i = Q_.front();
- Q_.pop();
- if (i == t)
- return true;
-
- vector<int>::const_iterator cit =
- vertices_[i].out_vertices.begin();
- vector<int>::const_iterator end =
- vertices_[i].out_vertices.end();
- for (; cit != end; ++cit) {
- if (!visited_[*cit]) {
- visited_[*cit] = true;
- Q_.push(*cit);
- }
- }
- }
-
- return false;
-}
-
-
-Converters::EdgePath const
-Converters::getPath(string const & from, string const & to)
-{
- EdgePath path;
- if (from == to)
- return path;
-
- int const s = bfs_init(from);
- int t = formats.getNumber(to);
- if (s < 0 || t < 0)
- return path;
-
- vector<int> prev_edge(formats.size());
- vector<int> prev_vertex(formats.size());
-
- bool found = false;
- while (!Q_.empty()) {
- int const i = Q_.front();
- Q_.pop();
- if (i == t) {
- found = true;
- break;
- }
-
- vector<int>::const_iterator beg =
- vertices_[i].out_vertices.begin();
- vector<int>::const_iterator cit = beg;
- vector<int>::const_iterator end =
- vertices_[i].out_vertices.end();
- for (; cit != end; ++cit)
- if (!visited_[*cit]) {
- int const j = *cit;
- visited_[j] = true;
- Q_.push(j);
- int const k = cit - beg;
- prev_edge[j] = vertices_[i].out_edges[k];
- prev_vertex[j] = i;
- }
- }
- if (!found)
- return path;
-
- while (t != s) {
- path.push_back(prev_edge[t]);
- t = prev_vertex[t];
- }
- reverse(path.begin(), path.end());
- return path;
-}
-
-
-bool Converters::usePdflatex(EdgePath const & path)
+bool Converters::usePdflatex(Graph::EdgePath const & path)
{
- for (EdgePath::const_iterator cit = path.begin();
+ for (Graph::EdgePath::const_iterator cit = path.begin();
cit != path.end(); ++cit) {
Converter const & conv = converterlist_[*cit];
if (conv.latex)
if (from_format == to_format)
return move(from_file, to_file, false);
- EdgePath edgepath = getPath(from_format, to_format);
+ Graph::EdgePath edgepath = getPath(from_format, to_format);
if (edgepath.empty()) {
return false;
}
string to_base = ChangeExtension(to_file, "");
string infile;
string outfile = from_file;
- for (EdgePath::const_iterator cit = edgepath.begin();
+ for (Graph::EdgePath::const_iterator cit = edgepath.begin();
cit != edgepath.end(); ++cit) {
Converter const & conv = converterlist_[*cit];
bool dummy = conv.To->dummy() && conv.to != "program";
}
-void Converters::buildGraph()
-{
- vertices_ = vector<Vertex>(formats.size());
- visited_.resize(formats.size());
-
- for (ConverterList::iterator it = converterlist_.begin();
- it != converterlist_.end(); ++it) {
- int const s = formats.getNumber(it->from);
- int const t = formats.getNumber(it->to);
- vertices_[t].in_vertices.push_back(s);
- vertices_[s].out_vertices.push_back(t);
- vertices_[s].out_edges.push_back(it - converterlist_.begin());
- }
-}
-
-
bool Converters::formatIsUsed(string const & format)
{
ConverterList::const_iterator cit = converterlist_.begin();
}
-string const Converters::papersize(Buffer const * buffer)
-{
- char real_papersize = buffer->params.papersize;
- if (real_papersize == BufferParams::PAPER_DEFAULT)
- real_papersize = lyxrc.default_papersize;
-
- switch (real_papersize) {
- case BufferParams::PAPER_A3PAPER:
- return "a3";
- case BufferParams::PAPER_A4PAPER:
- return "a4";
- case BufferParams::PAPER_A5PAPER:
- return "a5";
- case BufferParams::PAPER_B5PAPER:
- return "b5";
- case BufferParams::PAPER_EXECUTIVEPAPER:
- return "foolscap";
- case BufferParams::PAPER_LEGALPAPER:
- return "legal";
- case BufferParams::PAPER_USLETTER:
- default:
- return "letter";
- }
-}
-
-
string const Converters::dvips_options(Buffer const * buffer)
{
string result;
return result;
}
+void Converters::buildGraph()
+{
+ G_.init(formats.size());
+ ConverterList::iterator beg = converterlist_.begin();
+ ConverterList::iterator end = converterlist_.end();
+ for (ConverterList::iterator it = beg; it != end ; ++it) {
+ int const s = formats.getNumber(it->from);
+ int const t = formats.getNumber(it->to);
+ G_.addEdge(s,t);
+ }
+}
-vector<Converters::Vertex> Converters::vertices_;
+vector<Format const *> const
+Converters::intToFormat(std::vector<int> const & input)
+{
+ vector<Format const *> result(input.size());
+ vector<int>::const_iterator it = input.begin();
+ vector<int>::const_iterator end = input.end();
+ vector<Format const *>::iterator rit = result.begin();
+ for ( ; it != end; ++it, ++rit) {
+ *rit = &formats.get(*it);
+ }
+ return result;
+}
+
+vector<Format const *> const
+Converters::getReachableTo(string const & target, bool clear_visited)
+{
+ vector<int> const & reachablesto =
+ G_.getReachableTo(formats.getNumber(target), clear_visited);
+
+ return intToFormat(reachablesto);
+}
+
+vector<Format const *> const
+Converters::getReachable(string const & from, bool only_viewable,
+ bool clear_visited)
+{
+ vector<int> const & reachables =
+ G_.getReachable(formats.getNumber(from),
+ only_viewable,
+ clear_visited);
+
+ return intToFormat(reachables);
+}
+
+bool Converters::isReachable(string const & from, string const & to)
+{
+ return G_.isReachable(formats.getNumber(from),
+ formats.getNumber(to));
+}
+
+Graph::EdgePath const
+Converters::getPath(string const & from, string const & to)
+{
+ return G_.getPath(formats.getNumber(from),
+ formats.getNumber(to));
+}
/// The global instance
-Formats formats;
Converters converters;
// The global copy after reading lyxrc.defaults
-Formats system_formats;
Converters system_converters;
// -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
#ifndef CONVERTER_H
#define CONVERTER_H
-#include <vector>
-#include <queue>
-#include "LString.h"
-#include "support/lstrings.h"
-
-class Buffer;
-
-///
-class Format {
-public:
- ///
- Format(string const & n, string const & e, string const & p,
- string const & s, string const & v) :
- name_(n), extension_(e), prettyname_(p), shortcut_(s),
- viewer_(v) {};
- ///
- bool dummy() const;
- ///
- bool isChildFormat() const;
- ///
- string const parentFormat() const;
- ///
- string const & name() const {
- return name_;
- }
- ///
- string const & extension() const {
- return extension_;
- }
- ///
- string const & prettyname() const {
- return prettyname_;
- }
- ///
- string const & shortcut() const {
- return shortcut_;
- }
- ///
- string const & viewer() const {
- return viewer_;
- }
- ///
- void setViewer(string const & v) {
- viewer_ = v;
- }
-private:
- string name_;
- ///
- string extension_;
- ///
- string prettyname_;
- ///
- string shortcut_;
- ///
- string viewer_;
-};
-
+/**
+ * \file converter.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
-inline
-bool operator<(Format const & a, Format const & b)
-{
- // use the compare_ascii_no_case instead of compare_no_case,
- // because in turkish, 'i' is not the lowercase version of 'I',
- // and thus turkish locale breaks parsing of tags.
+#include "graph.h"
- return compare_ascii_no_case(a.prettyname(), b.prettyname()) < 0;
-}
+#include <vector>
+class Format;
+class Formats;
-///
-class Formats {
-public:
- ///
- typedef std::vector<Format> FormatList;
- ///
- typedef FormatList::const_iterator const_iterator;
- ///
- Format const & get(FormatList::size_type i) const {
- return formatlist[i];
- }
- ///
- Format const * getFormat(string const & name) const;
- ///
- int getNumber(string const & name) const;
- ///
- void add(string const & name);
- ///
- void add(string const & name, string const & extension,
- string const & prettyname, string const & shortcut);
- ///
- void erase(string const & name);
- ///
- void sort();
- ///
- void setViewer(string const & name, string const & command);
- ///
- bool view(Buffer const * buffer, string const & filename,
- string const & format_name) const;
- ///
- string const prettyName(string const & name) const;
- ///
- string const extension(string const & name) const;
- ///
- const_iterator begin() const {
- return formatlist.begin();
- }
- ///
- const_iterator end() const {
- return formatlist.end();
- }
- ///
- FormatList::size_type size() const {
- return formatlist.size();
- }
-private:
- ///
- FormatList formatlist;
-};
-
-///////////////////////////////////////////////////////////////////////
+class Buffer;
///
class Converter {
public:
///
Converter(string const & f, string const & t, string const & c,
- string const & l)
- : from(f), to(t), command(c), flags(l), From(0), To(0),
- latex(false), original_dir(false), need_aux(false) {}
+ string const & l);
///
void readFlags();
///
///
class Converters {
public:
+ ///
+ typedef std::vector<int> EdgePath; // to be removed SOON
+ ///
typedef std::vector<Converter> ConverterList;
///
typedef ConverterList::const_iterator const_iterator;
///
- typedef std::vector<int> EdgePath;
- ///
Converter const & get(int i) const {
return converterlist_[i];
}
///
bool isReachable(string const & from, string const & to);
///
- EdgePath const getPath(string const & from, string const & to);
+ Graph::EdgePath const getPath(string const & from, string const & to);
///
- bool usePdflatex(EdgePath const & path);
+ bool usePdflatex(Graph::EdgePath const & path);
///
bool convert(Buffer const * buffer,
string const & from_file, string const & to_file_base,
string const & from_file, string const & to_file_base,
string const & from_format, string const & to_format);
///
- string const papersize(Buffer const * buffer);
- ///
string const dvips_options(Buffer const * buffer);
///
string const dvipdfm_options(Buffer const * buffer);
///
void updateLast(Formats const & formats);
///
- void buildGraph();
- ///
bool formatIsUsed(string const & format);
///
const_iterator begin() const {
const_iterator end() const {
return converterlist_.end();
}
+ ///
+ void buildGraph();
private:
+ ///
+ std::vector<Format const *> const
+ Converters::intToFormat(std::vector<int> const & input);
///
bool scanLog(Buffer const * buffer, string const & command,
string const & filename);
///
string latex_command_;
///
- struct Vertex {
- std::vector<int> in_vertices;
- std::vector<int> out_vertices;
- std::vector<int> out_edges;
- };
- ///
- static
- std::vector<Vertex> vertices_;
- ///
- std::vector<bool> visited_;
- ///
- std::queue<int> Q_;
- ///
- int bfs_init(string const & start, bool clear_visited = true);
- ///
bool move(string const & from, string const & to, bool copy);
+ ///
+ Graph G_;
};
-extern Formats formats;
extern Converters converters;
-extern Formats system_formats;
extern Converters system_converters;
-#endif
+#endif //CONVERTER_H
#include "support/filetools.h"
#include "lyxrc.h"
#include "converter.h"
+#include "format.h"
#include "frontends/Alert.h"
#include "gettext.h"
#include "BufferView.h"
if (find(backends.begin(), backends.end(), format) == backends.end()) {
for (vector<string>::const_iterator it = backends.begin();
it != backends.end(); ++it) {
- Converters::EdgePath p =
+ Graph::EdgePath p =
converters.getPath(*it, format);
if (!p.empty()) {
lyxrc.pdf_mode = converters.usePdflatex(p);
--- /dev/null
+/**
+ * \file format.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "format.h"
+#include "lyxrc.h"
+#include "debug.h"
+#include "lyx_cb.h" // for ShowMessage() ... to be removed?
+#include "gettext.h"
+#include "LString.h"
+
+#include "frontends/Alert.h" //to be removed?
+
+#include "support/filetools.h"
+#include "support/path.h"
+#include "support/systemcall.h"
+#include "support/lyxfunctional.h"
+
+
+namespace {
+
+string const token_from("$$i");
+string const token_path("$$p");
+
+} //namespace anon
+
+bool operator<(Format const & a, Format const & b)
+{
+ // use the compare_ascii_no_case instead of compare_no_case,
+ // because in turkish, 'i' is not the lowercase version of 'I',
+ // and thus turkish locale breaks parsing of tags.
+
+ return compare_ascii_no_case(a.prettyname(), b.prettyname()) < 0;
+}
+
+Format::Format(string const & n, string const & e, string const & p,
+ string const & s, string const & v): name_(n),
+ extension_(e),
+ prettyname_(p),
+ shortcut_(s),
+ viewer_(v)
+{}
+
+
+bool Format::dummy() const
+{
+ return extension().empty();
+}
+
+
+bool Format::isChildFormat() const
+{
+ if (name_.empty())
+ return false;
+ return isdigit(name_[name_.length() - 1]);
+}
+
+
+string const Format::parentFormat() const
+{
+ return name_.substr(0, name_.length() - 1);
+}
+
+
+// This method should return a reference, and throw an exception
+// if the format named name cannot be found (Lgb)
+Format const * Formats::getFormat(string const & name) const
+{
+ FormatList::const_iterator cit =
+ find_if(formatlist.begin(), formatlist.end(),
+ lyx::compare_memfun(&Format::name, name));
+ if (cit != formatlist.end())
+ return &(*cit);
+ else
+ return 0;
+}
+
+
+int Formats::getNumber(string const & name) const
+{
+ FormatList::const_iterator cit =
+ find_if(formatlist.begin(), formatlist.end(),
+ lyx::compare_memfun(&Format::name, name));
+ if (cit != formatlist.end())
+ return cit - formatlist.begin();
+ else
+ return -1;
+}
+
+
+void Formats::add(string const & name)
+{
+ if (!getFormat(name))
+ add(name, name, name, string());
+}
+
+
+void Formats::add(string const & name, string const & extension,
+ string const & prettyname, string const & shortcut)
+{
+ FormatList::iterator it =
+ find_if(formatlist.begin(), formatlist.end(),
+ lyx::compare_memfun(&Format::name, name));
+ if (it == formatlist.end())
+ formatlist.push_back(Format(name, extension, prettyname,
+ shortcut, ""));
+ else {
+ string viewer = it->viewer();
+ *it = Format(name, extension, prettyname, shortcut, viewer);
+ }
+}
+
+
+void Formats::erase(string const & name)
+{
+ FormatList::iterator it =
+ find_if(formatlist.begin(), formatlist.end(),
+ lyx::compare_memfun(&Format::name, name));
+ if (it != formatlist.end())
+ formatlist.erase(it);
+}
+
+
+void Formats::sort()
+{
+ cout << "here" << endl;
+ std::sort(formatlist.begin(), formatlist.end());
+ cout << "and here " << formatlist.size() << endl;
+}
+
+
+void Formats::setViewer(string const & name, string const & command)
+{
+ add(name);
+ FormatList::iterator it =
+ find_if(formatlist.begin(), formatlist.end(),
+ lyx::compare_memfun(&Format::name, name));
+ if (it != formatlist.end())
+ it->setViewer(command);
+}
+
+
+bool Formats::view(Buffer const * buffer, string const & filename,
+ string const & format_name) const
+{
+ if (filename.empty())
+ return false;
+
+ Format const * format = getFormat(format_name);
+ if (format && format->viewer().empty() &&
+ format->isChildFormat())
+ format = getFormat(format->parentFormat());
+ if (!format || format->viewer().empty()) {
+#if USE_BOOST_FORMAT
+ Alert::alert(_("Cannot view file"),
+ boost::io::str(boost::format(_("No information for viewing %1$s"))
+ % prettyName(format_name)));
+#else
+ Alert::alert(_("Cannot view file"),
+ _("No information for viewing ")
+ + prettyName(format_name));
+#endif
+ return false;
+ }
+
+ string command = format->viewer();
+
+ if (format_name == "dvi" &&
+ !lyxrc.view_dvi_paper_option.empty()) {
+ command += ' ' + lyxrc.view_dvi_paper_option;
+ string paper_size = papersize(buffer);
+ if (paper_size == "letter")
+ paper_size = "us";
+ command += ' ' + paper_size;
+ if (buffer->params.orientation
+ == BufferParams::ORIENTATION_LANDSCAPE)
+ command += 'r';
+ }
+
+ if (!contains(command, token_from))
+ command += ' ' + token_from;
+
+ command = subst(command, token_from,
+ QuoteName(OnlyFilename(filename)));
+ command = subst(command, token_path, QuoteName(OnlyPath(filename)));
+
+ lyxerr[Debug::FILES] << "Executing command: " << command << endl;
+ ShowMessage(buffer, _("Executing command:"), command);
+
+ Path p(OnlyPath(filename));
+ Systemcall one;
+ int const res = one.startscript(Systemcall::DontWait, command);
+
+ if (res) {
+ Alert::alert(_("Cannot view file"),
+ _("Error while executing"),
+ command.substr(0, 50));
+ return false;
+ }
+ return true;
+}
+
+
+string const Formats::prettyName(string const & name) const
+{
+ Format const * format = getFormat(name);
+ if (format)
+ return format->prettyname();
+ else
+ return name;
+}
+
+
+string const Formats::extension(string const & name) const
+{
+ Format const * format = getFormat(name);
+ if (format)
+ return format->extension();
+ else
+ return name;
+}
+
+
+string const papersize(Buffer const * buffer)
+{
+ char real_papersize = buffer->params.papersize;
+ if (real_papersize == BufferParams::PAPER_DEFAULT)
+ real_papersize = lyxrc.default_papersize;
+
+ switch (real_papersize) {
+ case BufferParams::PAPER_A3PAPER:
+ return "a3";
+ case BufferParams::PAPER_A4PAPER:
+ return "a4";
+ case BufferParams::PAPER_A5PAPER:
+ return "a5";
+ case BufferParams::PAPER_B5PAPER:
+ return "b5";
+ case BufferParams::PAPER_EXECUTIVEPAPER:
+ return "foolscap";
+ case BufferParams::PAPER_LEGALPAPER:
+ return "legal";
+ case BufferParams::PAPER_USLETTER:
+ default:
+ return "letter";
+ }
+}
+
+
+Formats formats;
+
+Formats system_formats;
--- /dev/null
+// -*- C++ -*-
+
+
+#ifndef FORMAT_H
+#define FORMAT_H
+
+
+/**
+ * \file format.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+
+
+#include "buffer.h"
+#include "LString.h"
+#include "support/lstrings.h"
+
+#include <vector>
+
+string const papersize(Buffer const * buffer) ;
+
+class Format {
+public:
+ ///
+ Format(string const & n, string const & e, string const & p,
+ string const & s, string const & v);
+ ///
+ bool dummy() const;
+ ///
+ bool isChildFormat() const;
+ ///
+ string const parentFormat() const;
+ ///
+ string const & name() const {
+ return name_;
+ }
+ ///
+ string const & extension() const {
+ return extension_;
+ }
+ ///
+ string const & prettyname() const {
+ return prettyname_;
+ }
+ ///
+ string const & shortcut() const {
+ return shortcut_;
+ }
+ ///
+ string const & viewer() const {
+ return viewer_;
+ }
+ ///
+ void setViewer(string const & v) {
+ viewer_ = v;
+ }
+private:
+ string name_;
+ ///
+ string extension_;
+ ///
+ string prettyname_;
+ ///
+ string shortcut_;
+ ///
+ string viewer_;
+};
+
+
+bool operator<(Format const & a, Format const & b);
+
+///
+class Formats {
+public:
+ ///
+ typedef std::vector<Format> FormatList;
+ ///
+ typedef FormatList::const_iterator const_iterator;
+ ///
+ Format const & get(FormatList::size_type i) const {
+ return formatlist[i];
+ }
+ ///
+ Format const * getFormat(string const & name) const;
+ ///
+ int getNumber(string const & name) const;
+ ///
+ void add(string const & name);
+ ///
+ void add(string const & name, string const & extension,
+ string const & prettyname, string const & shortcut);
+ ///
+ void erase(string const & name);
+ ///
+ void sort();
+ ///
+ void setViewer(string const & name, string const & command);
+ ///
+ bool view(Buffer const * buffer, string const & filename,
+ string const & format_name) const;
+ ///
+ string const prettyName(string const & name) const;
+ ///
+ string const extension(string const & name) const;
+ ///
+ const_iterator begin() const {
+ return formatlist.begin();
+ }
+ ///
+ const_iterator end() const {
+ return formatlist.end();
+ }
+ ///
+ FormatList::size_type size() const {
+ return formatlist.size();
+ }
+private:
+ ///
+ FormatList formatlist;
+};
+
+extern Formats formats;
+
+extern Formats system_formats;
+
+#endif //FORMAT_H
+2003-02-28 Alfredo Braunstein <abraunst@libero.it>
+
+ * ControlGraphics.C: removed #include "converter.h"
+ * ControlPrefs.C:
+ * ControlSendto.C: added #include "format.h"
+
2003-02-27 Angus Leeming <leeming@lyx.org>
* ControlLabel.[Ch]: new files. A controller for the Label dialog.
#include "buffer.h"
#include "BufferView.h"
-#include "converter.h"
#include "gettext.h"
#include "lyxrc.h"
#include "support/filetools.h"
#include "frontends/Dialogs.h"
#include "converter.h"
+#include "format.h"
#include "debug.h"
extern string system_lyxdir;
#include "ViewBase.h"
#include "buffer.h"
#include "converter.h"
+#include "format.h"
#include "exporter.h"
#include "gettext.h"
#include "lyxrc.h"
+2003-02-28 Alfredo Braunstein <abraunst@libero.it>
+
+ * QLImage.C
+ * QSendto.C
+ * QSendtoDialog.C: removed #include "converter.h", and...
+ * QPrefs.h: added #include "format.h"
+
2003-02-25 John Levon <levon@movementarian.org>
From Nathan Weston
#include "QLImage.h"
#include "graphics/GraphicsParams.h"
-#include "converter.h"
+#include "format.h"
#include "debug.h"
#include "support/LAssert.h"
#include "support/lyxfunctional.h" // compare_memfun
#include "converter.h"
+#include "format.h"
#include "Qt2Base.h"
#include "ControlPrefs.h"
#include "debug.h"
#include "qt_helpers.h"
-#include "converter.h"
+#include "format.h"
using std::vector;
#include "qt_helpers.h"
#include "debug.h"
-#include "converter.h"
#include "LString.h"
#include <qcombobox.h>
void lyx_gui::parse_lyxrc()
-{
-}
+{}
void lyx_gui::start(string const & batch, vector<string> const & files)
+2003-02-28 Alfredo Braunstein <abraunst@libero.it>
+
+ * FormPreferences.C
+ * FormSento.C
+ * xformsImage.C: Added #include "format.h"
+
2003-02-27 Angus Leeming <leeming@lyx.org>
* Dialogs.C (build): add a label dialog.
#include "buffer.h"
#include "converter.h"
+#include "format.h"
#include "debug.h"
#include "language.h"
#include "frnt_lang.h"
#include "xformsBC.h"
#include "Tooltips.h"
#include "xforms_helpers.h"
-#include "converter.h"
+#include "format.h"
#include "gettext.h"
#include FORMS_H_LOCATION
#include "xformsImage.h"
#include "graphics/GraphicsParams.h"
#include "Color.h"
-#include "converter.h" // formats
+#include "format.h"
#include "debug.h"
#include "support/LAssert.h"
#include "support/lyxfunctional.h" // compare_memfun
--- /dev/null
+/**
+ * \file graph.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "graph.h"
+#include "format.h"
+
+#include <queue>
+#include <vector>
+
+using std::queue;
+using std::vector;
+
+
+
+int Graph::bfs_init(int s, bool clear_visited)
+{
+ if (s < 0)
+ return s;
+
+ Q_ = std::queue<int>();
+
+ if (clear_visited)
+ fill(visited_.begin(), visited_.end(), false);
+ if (visited_[s] == false) {
+ Q_.push(s);
+ visited_[s] = true;
+ }
+ return s;
+}
+
+
+vector<int> const
+Graph::getReachableTo(int target, bool clear_visited)
+{
+ vector<int> result;
+ int const s = bfs_init(target, clear_visited);
+ if (s < 0)
+ return result;
+
+ while (!Q_.empty()) {
+ int const i = Q_.front();
+ Q_.pop();
+ if (i != s || formats.get(target).name() != "lyx") {
+ result.push_back(i);
+ }
+
+ vector<int>::iterator it = vertices_[i].in_vertices.begin();
+ vector<int>::iterator end = vertices_[i].in_vertices.end();
+ for (; it != end; ++it) {
+ if (!visited_[*it]) {
+ visited_[*it] = true;
+ Q_.push(*it);
+ }
+ }
+ }
+
+ return result;
+}
+
+
+vector<int> const
+Graph::getReachable(int from, bool only_viewable,
+ bool clear_visited)
+{
+ vector<int> result;
+ if (bfs_init(from, clear_visited) < 0)
+ return result;
+
+ while (!Q_.empty()) {
+ int const i = Q_.front();
+ Q_.pop();
+ Format const & format = formats.get(i);
+ if (format.name() == "lyx")
+ continue;
+ if (!only_viewable || !format.viewer().empty() ||
+ format.isChildFormat())
+ result.push_back(i);
+
+ vector<int>::const_iterator cit =
+ vertices_[i].out_vertices.begin();
+ vector<int>::const_iterator end =
+ vertices_[i].out_vertices.end();
+ for (; cit != end; ++cit)
+ if (!visited_[*cit]) {
+ visited_[*cit] = true;
+ Q_.push(*cit);
+ }
+ }
+
+ return result;
+}
+
+
+bool Graph::isReachable(int from, int to)
+{
+ if (from == to)
+ return true;
+
+ int const s = bfs_init(from);
+ if (s < 0 || to < 0)
+ return false;
+
+ while (!Q_.empty()) {
+ int const i = Q_.front();
+ Q_.pop();
+ if (i == to)
+ return true;
+
+ vector<int>::const_iterator cit =
+ vertices_[i].out_vertices.begin();
+ vector<int>::const_iterator end =
+ vertices_[i].out_vertices.end();
+ for (; cit != end; ++cit) {
+ if (!visited_[*cit]) {
+ visited_[*cit] = true;
+ Q_.push(*cit);
+ }
+ }
+ }
+
+ return false;
+}
+
+
+Graph::EdgePath const
+Graph::getPath(int from, int t)
+{
+ EdgePath path;
+ if (from == t)
+ return path;
+
+ int const s = bfs_init(from);
+ if (s < 0 || t < 0)
+ return path;
+
+ vector<int> prev_edge(formats.size());
+ vector<int> prev_vertex(formats.size());
+
+ bool found = false;
+ while (!Q_.empty()) {
+ int const i = Q_.front();
+ Q_.pop();
+ if (i == t) {
+ found = true;
+ break;
+ }
+
+ vector<int>::const_iterator beg =
+ vertices_[i].out_vertices.begin();
+ vector<int>::const_iterator cit = beg;
+ vector<int>::const_iterator end =
+ vertices_[i].out_vertices.end();
+ for (; cit != end; ++cit)
+ if (!visited_[*cit]) {
+ int const j = *cit;
+ visited_[j] = true;
+ Q_.push(j);
+ int const k = cit - beg;
+ prev_edge[j] = vertices_[i].out_edges[k];
+ prev_vertex[j] = i;
+ }
+ }
+ if (!found)
+ return path;
+
+ while (t != s) {
+ path.push_back(prev_edge[t]);
+ t = prev_vertex[t];
+ }
+ reverse(path.begin(), path.end());
+ return path;
+}
+
+void Graph::init(int size)
+{
+ vertices_ = vector<Vertex>(size);
+ visited_.resize(size);
+ numedges_ = 0;
+}
+
+void Graph::addEdge(int s, int t)
+{
+ vertices_[t].in_vertices.push_back(s);
+ vertices_[s].out_vertices.push_back(t);
+ vertices_[s].out_edges.push_back(numedges_++);
+}
+
+vector<Graph::Vertex> Graph::vertices_;
+
+
--- /dev/null
+// -*- C++ -*-
+
+#ifndef GRAPH_H
+#define GRAPH_H
+
+/**
+ * \file graph.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Dekel Tsur
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "LString.h"
+
+#include <queue>
+#include <vector>
+
+class Graph {
+public:
+ Graph() : numedges_(0) {};
+ ///
+ typedef std::vector<int> EdgePath;
+ ///
+ std::vector<int> const
+ getReachableTo(int, bool clear_visited);
+ ///
+ std::vector<int> const
+ getReachable(int, bool only_viewable,
+ bool clear_visited);
+ ///
+ bool isReachable(int, int);
+ ///
+ EdgePath const getPath(int, int);
+ ///
+ void addEdge(int s, int t);
+ ///
+ void init(int size);
+
+private:
+ ///
+ int bfs_init(int, bool clear_visited = true);
+
+ ///
+ struct Vertex {
+ std::vector<int> in_vertices;
+ std::vector<int> out_vertices;
+ std::vector<int> out_edges;
+ };
+ ///
+ static
+ std::vector<Vertex> vertices_;
+ ///
+ std::vector<bool> visited_;
+ ///
+ std::queue<int> Q_;
+
+ int numedges_;
+
+};
+
+
+#endif //GRAPH_H
+2003-02-28 Alfredo Braunstein <abraunst@libero.it>
+
+ * GraphicsConverter.C
+ * PreviewLoader.C: added #include "format.h"
+
2003-02-26 Angus Leeming <leeming@lyx.org>
* PreviewedInset.[Ch]: strip out the caching of the BufferView and
#include "GraphicsConverter.h"
#include "converter.h"
+#include "format.h"
#include "debug.h"
#include "support/filetools.h"
#include "buffer.h"
#include "converter.h"
+#include "format.h"
+
#include "debug.h"
#include "lyxrc.h"
#include "LColor.h"
#include "importer.h"
#include "converter.h"
+#include "format.h"
#include "frontends/LyXView.h"
#include "funcrequest.h"
+2003-02-28 Alfredo Braunstein <abraunst@libero.it>
+
+ * insetgraphics.C: added include "format.h"
+
2003-02-27 Angus Leeming <leeming@lyx.org>
* indexlabel.C: use a real, LyX dialog rather than that nasty Alert
#include "buffer.h"
#include "BufferView.h"
#include "converter.h"
+#include "format.h"
#include "frontends/Painter.h"
#include "lyxrc.h"
#include "frontends/font_metrics.h"
#include "lastfiles.h"
#include "encoding.h"
#include "converter.h"
+#include "format.h"
#include "lyxtextclasslist.h"
#include "frontends/Alert.h"
#include "frontends/lyx_gui.h"
#include "vspace.h"
#include "FloatList.h"
-#include "converter.h"
+#include "format.h"
#include "exporter.h"
#include "importer.h"
#include "TextCache.h"
#include "support/LAssert.h"
#include "support/userinfo.h"
#include "converter.h"
+#include "format.h"
#include "gettext.h"
#include "lyxlex.h"