Alfredo's patch

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6305 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-02-28 09:49:49 +00:00
parent 74c92c4b91
commit f566e7c604
34 changed files with 859 additions and 607 deletions

View File

@ -1,12 +1,26 @@
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>
@ -14,7 +28,7 @@
* 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.
@ -24,11 +38,11 @@
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>
@ -44,12 +58,12 @@
* 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.
@ -75,11 +89,11 @@
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):
@ -92,7 +106,7 @@
* 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>
@ -166,19 +180,19 @@
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>
@ -186,18 +200,18 @@
* 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>
@ -217,7 +231,7 @@
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>
@ -273,8 +287,8 @@
* 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

View File

@ -223,7 +223,11 @@ lyx_SOURCES = \
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 \

View File

@ -23,7 +23,7 @@
#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"

View File

@ -33,7 +33,7 @@
#include "language.h"
#include "exporter.h"
#include "Lsstream.h"
#include "converter.h"
#include "format.h"
#include "BufferView.h"
#include "ParagraphParameters.h"
#include "iterators.h"

View File

@ -1,16 +1,18 @@
/* 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"
@ -37,12 +39,8 @@ using std::isdigit;
#endif
using std::vector;
using std::queue;
using std::endl;
using std::fill;
using std::find_if;
using std::reverse;
using std::sort;
namespace {
@ -51,9 +49,8 @@ string const token_base("$$b");
string const token_to("$$o");
string const token_path("$$p");
//////////////////////////////////////////////////////////////////////////////
inline
string const add_options(string const & command, string const & options)
{
string head;
@ -63,188 +60,12 @@ string const add_options(string const & command, string const & options)
} // 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()
{
@ -288,7 +109,7 @@ bool operator<(Converter const & a, Converter const & b)
return i < 0;
}
//////////////////////////////////////////////////////////////////////////////
class compare_Converter {
public:
@ -303,6 +124,7 @@ private:
};
Converter const * Converters::getConverter(string const & from,
string const & to)
{
@ -407,172 +229,9 @@ void Converters::sort()
}
int Converters::bfs_init(string const & start, bool clear_visited)
bool Converters::usePdflatex(Graph::EdgePath const & path)
{
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)
{
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)
@ -593,7 +252,7 @@ bool Converters::convert(Buffer const * buffer,
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;
}
@ -606,7 +265,7 @@ bool Converters::convert(Buffer const * buffer,
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";
@ -794,22 +453,6 @@ bool Converters::convert(Buffer const * buffer,
}
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();
@ -947,32 +590,6 @@ bool Converters::runLaTeX(Buffer const * buffer, string const & command)
}
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;
@ -1023,14 +640,68 @@ string const Converters::dvipdfm_options(Buffer const * buffer)
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;

View File

@ -1,146 +1,33 @@
// -*- 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
/**
* \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
*/
#include "graph.h"
#include <vector>
#include <queue>
#include "LString.h"
#include "support/lstrings.h"
class Format;
class Formats;
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_;
};
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.
return compare_ascii_no_case(a.prettyname(), b.prettyname()) < 0;
}
///
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 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();
///
@ -176,12 +63,13 @@ public:
///
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];
}
@ -206,9 +94,9 @@ public:
///
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,
@ -219,8 +107,6 @@ public:
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);
@ -229,8 +115,6 @@ public:
///
void updateLast(Formats const & formats);
///
void buildGraph();
///
bool formatIsUsed(string const & format);
///
const_iterator begin() const {
@ -239,7 +123,12 @@ public:
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);
@ -250,28 +139,13 @@ private:
///
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

View File

@ -18,6 +18,7 @@
#include "support/filetools.h"
#include "lyxrc.h"
#include "converter.h"
#include "format.h"
#include "frontends/Alert.h"
#include "gettext.h"
#include "BufferView.h"
@ -46,7 +47,7 @@ bool Exporter::Export(Buffer * buffer, string const & format,
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);

258
src/format.C Normal file
View File

@ -0,0 +1,258 @@
/**
* \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;

132
src/format.h Normal file
View File

@ -0,0 +1,132 @@
// -*- 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

View File

@ -1,3 +1,9 @@
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.

View File

@ -18,7 +18,6 @@
#include "buffer.h"
#include "BufferView.h"
#include "converter.h"
#include "gettext.h"
#include "lyxrc.h"

View File

@ -23,6 +23,7 @@
#include "support/filetools.h"
#include "frontends/Dialogs.h"
#include "converter.h"
#include "format.h"
#include "debug.h"
extern string system_lyxdir;

View File

@ -15,6 +15,7 @@
#include "ViewBase.h"
#include "buffer.h"
#include "converter.h"
#include "format.h"
#include "exporter.h"
#include "gettext.h"
#include "lyxrc.h"

View File

@ -1,3 +1,10 @@
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

View File

@ -14,7 +14,7 @@
#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

View File

@ -14,6 +14,7 @@
#include "converter.h"
#include "format.h"
#include "Qt2Base.h"
#include "ControlPrefs.h"

View File

@ -23,7 +23,7 @@
#include "debug.h"
#include "qt_helpers.h"
#include "converter.h"
#include "format.h"
using std::vector;

View File

@ -16,7 +16,6 @@
#include "qt_helpers.h"
#include "debug.h"
#include "converter.h"
#include "LString.h"
#include <qcombobox.h>

View File

@ -125,8 +125,7 @@ void lyx_gui::parse_init(int & argc, char * argv[])
void lyx_gui::parse_lyxrc()
{
}
{}
void lyx_gui::start(string const & batch, vector<string> const & files)

View File

@ -1,3 +1,9 @@
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.

View File

@ -25,6 +25,7 @@
#include "buffer.h"
#include "converter.h"
#include "format.h"
#include "debug.h"
#include "language.h"
#include "frnt_lang.h"

View File

@ -17,7 +17,7 @@
#include "xformsBC.h"
#include "Tooltips.h"
#include "xforms_helpers.h"
#include "converter.h"
#include "format.h"
#include "gettext.h"
#include FORMS_H_LOCATION

View File

@ -14,7 +14,7 @@
#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

197
src/graph.C Normal file
View File

@ -0,0 +1,197 @@
/**
* \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_;

65
src/graph.h Normal file
View File

@ -0,0 +1,65 @@
// -*- 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

View File

@ -1,3 +1,8 @@
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

View File

@ -13,6 +13,7 @@
#include "GraphicsConverter.h"
#include "converter.h"
#include "format.h"
#include "debug.h"
#include "support/filetools.h"

View File

@ -15,6 +15,8 @@
#include "buffer.h"
#include "converter.h"
#include "format.h"
#include "debug.h"
#include "lyxrc.h"
#include "LColor.h"

View File

@ -12,6 +12,7 @@
#include "importer.h"
#include "converter.h"
#include "format.h"
#include "frontends/LyXView.h"
#include "funcrequest.h"

View File

@ -1,3 +1,7 @@
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

View File

@ -64,6 +64,7 @@ TODO
#include "buffer.h"
#include "BufferView.h"
#include "converter.h"
#include "format.h"
#include "frontends/Painter.h"
#include "lyxrc.h"
#include "frontends/font_metrics.h"

View File

@ -33,6 +33,7 @@
#include "lastfiles.h"
#include "encoding.h"
#include "converter.h"
#include "format.h"
#include "lyxtextclasslist.h"
#include "frontends/Alert.h"

View File

@ -34,7 +34,7 @@
#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"

View File

@ -24,6 +24,7 @@
#include "support/LAssert.h"
#include "support/userinfo.h"
#include "converter.h"
#include "format.h"
#include "gettext.h"
#include "lyxlex.h"