mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-05 13:26:21 +00:00
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:
parent
74c92c4b91
commit
f566e7c604
@ -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
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
485
src/converter.C
485
src/converter.C
@ -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;
|
||||
|
184
src/converter.h
184
src/converter.h
@ -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
|
||||
|
@ -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
258
src/format.C
Normal 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
132
src/format.h
Normal 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
|
@ -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.
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
#include "buffer.h"
|
||||
#include "BufferView.h"
|
||||
#include "converter.h"
|
||||
#include "gettext.h"
|
||||
#include "lyxrc.h"
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
|
||||
#include "Qt2Base.h"
|
||||
#include "ControlPrefs.h"
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
#include "debug.h"
|
||||
#include "qt_helpers.h"
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
|
||||
using std::vector;
|
||||
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include "qt_helpers.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include "converter.h"
|
||||
#include "LString.h"
|
||||
|
||||
#include <qcombobox.h>
|
||||
|
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
#include "buffer.h"
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
#include "debug.h"
|
||||
#include "language.h"
|
||||
#include "frnt_lang.h"
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
197
src/graph.C
Normal 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
65
src/graph.h
Normal 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
|
@ -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
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "GraphicsConverter.h"
|
||||
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include "support/filetools.h"
|
||||
|
@ -15,6 +15,8 @@
|
||||
|
||||
#include "buffer.h"
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
|
||||
#include "debug.h"
|
||||
#include "lyxrc.h"
|
||||
#include "LColor.h"
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
#include "importer.h"
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
#include "frontends/LyXView.h"
|
||||
#include "funcrequest.h"
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "lastfiles.h"
|
||||
#include "encoding.h"
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
#include "lyxtextclasslist.h"
|
||||
|
||||
#include "frontends/Alert.h"
|
||||
|
@ -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"
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "support/LAssert.h"
|
||||
#include "support/userinfo.h"
|
||||
#include "converter.h"
|
||||
#include "format.h"
|
||||
#include "gettext.h"
|
||||
#include "lyxlex.h"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user