Enable tex2lyx to read the LyX textclass and to use this info a little.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7362 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Angus Leeming 2003-07-26 00:15:38 +00:00
parent c7f1fcdc65
commit 812b659d89
8 changed files with 168 additions and 47 deletions

View File

@ -5,3 +5,11 @@ Makefile.in
*.lo
libtexparser.la
tex2lyx
FloatList.C
Floating.C
boost.C
counters.C
lyxlayout.[Ch]
lyxtextclass.[Ch]
lyxlex.C
lyxlex_pimpl.C

View File

@ -1,3 +1,34 @@
2003-07-26 Angus Leeming <leeming@lyx.org>
* Spacing.h:
* lyxfont.[Ch]:
* gettext.[Ch]: minimal (near empty) analogues of the real LyX
files; enough to get LyXTextClass and LyXLayout to compile without
needing to store any real information about Spacing or Font.
* Makefile.am: add these files above and also include a minimal
chunk of the main lyx source tree as soft links in order to add in
LyXTextClass and LyXLayout.
* .cvsignore: add all these soft links.
* preamble.C (end_preamble): passed a LyXTextClass arg.
(parse_preamble): returns the document LyXTextClass.
* tabular.C (handle_tabular): passed a LyXTextClass arg. In turn
pass it to parse_text.
* tex2lyx.C: add some global vars, build_lyxdir et al. For now,
give them some horrible hard-coded value.
(main): receive a LyXTextClass var from parse_preamble and pass it
on to parse_text.
* text.C (parse_text): receives a LyXTextClass arg. Use it to
remove the hard-coded handling of floats and instead check the
textclass for its existence. Also handle wide floats naturally.
* tex2lyx.h: associated changes to function declarations.
2003-07-18 Lars Gullik Bjønnes <larsbj@gullik.net>
* texparser.C (catInit): same warning avoidance as in math_parser.C

View File

@ -12,7 +12,27 @@ INCLUDES = -I$(srcdir)/../ $(BOOST_INCLUDES)
bin_PROGRAMS = tex2lyx
linked_files = \
FloatList.C \
Floating.C \
boost.C \
counters.C \
lyxlayout.h \
lyxlayout.C \
lyxtextclass.C \
lyxtextclass.h \
lyxlex.C \
lyxlex_pimpl.C
# debug.C
tex2lyx_SOURCES = \
$(linked_files) \
Spacing.h \
gettext.C \
gettext.h \
lyxfont.C \
lyxfont.h \
texparser.C \
texparser.h \
tex2lyx.C \
@ -21,3 +41,20 @@ tex2lyx_SOURCES = \
math.C \
table.C \
text.C
tex2lyx_LDADD = \
../support/libsupport.la \
../../boost/libs/regex/src/libboostregex.la
FloatList.C: link_files
link_files:
for i in $(linked_files); do \
ln -sf "$(top_srcdir)/src/$$i" . ; \
done ; \
for i in $(graphics_linked_files); do \
ln -sf "$(top_srcdir)/src/graphics/$$i" . ; \
done
rm_link_files:
rm -f $(linked_files) $(graphics_linked_files)

View File

@ -8,6 +8,11 @@
#include "tex2lyx.h"
#include "layout.h"
#include "lyxtextclass.h"
#include "lyxlex.h"
#include "support/filetools.h"
#include <algorithm>
#include <iostream>
#include <sstream>
@ -25,6 +30,8 @@ using std::ostringstream;
using std::string;
using std::vector;
using lyx::support::LibFileSearch;
// special columntypes
extern std::map<char, int> special_columns;
@ -128,7 +135,7 @@ void handle_package(string const & name, string const & options)
void end_preamble(ostream & os)
void end_preamble(ostream & os, LyXTextClass const & textclass)
{
os << "# tex2lyx 0.0.3 created this file\n"
<< "\\lyxformat 224\n"
@ -165,7 +172,7 @@ void end_preamble(ostream & os)
} // anonymous namespace
void parse_preamble(Parser & p, ostream & os)
LyXTextClass const parse_preamble(Parser & p, ostream & os)
{
// initialize fixed types
special_columns['D'] = 3;
@ -334,17 +341,19 @@ void parse_preamble(Parser & p, ostream & os)
else if (t.cs() == "begin") {
string const name = p.getArg('{', '}');
if (name == "document") {
end_preamble(os);
return;
}
if (name == "document")
break;
h_preamble << "\\begin{" << name << "}";
}
else if (t.cs().size())
h_preamble << '\\' << t.cs() << ' ';
}
LyXTextClass textclass;
textclass.Read(LibFileSearch("layouts", h_textclass, "layout"));
end_preamble(os, textclass);
return textclass;
}
// }])

View File

@ -282,7 +282,8 @@ void handle_hline_below(RowInfo & ri, vector<CellInfo> & ci)
}
void handle_tabular(Parser & p, ostream & os)
void handle_tabular(Parser & p, ostream & os,
LyXTextClass const & textclass)
{
string posopts = p.getOpt();
if (posopts.size())
@ -397,7 +398,7 @@ void handle_tabular(Parser & p, ostream & os)
handle_colalign(p, t);
cellinfo[row][col].multi = 1;
cellinfo[row][col].align = t.front().align;
cellinfo[row][col].content = parse_text(p, FLAG_ITEM, false);
cellinfo[row][col].content = parse_text(p, FLAG_ITEM, false, textclass);
cellinfo[row][col].leftline |= t.front().leftline;
cellinfo[row][col].rightline |= t.front().rightline;
@ -414,7 +415,7 @@ void handle_tabular(Parser & p, ostream & os)
} else {
// FLAG_END is a hack, we need to read all of it
cellinfo[row][col].content = parse_text(p, FLAG_END, false);
cellinfo[row][col].content = parse_text(p, FLAG_END, false, textclass);
}
}

View File

@ -6,6 +6,10 @@
#include "tex2lyx.h"
#include "lyx_main.h"
#include "debug.h"
#include "lyxtextclass.h"
#include <cctype>
#include <fstream>
#include <iostream>
@ -26,6 +30,14 @@ using std::stringstream;
using std::string;
using std::vector;
// A hack to allow the thing to link in the lyxlayout stuff
string system_lyxdir = "../../../lib";
string build_lyxdir = "../../lib";
string user_lyxdir = ".";
DebugStream lyxerr;
void LyX::emergencyCleanup() {}
void handle_comment(Parser & p)
{
@ -142,9 +154,9 @@ int main(int argc, char * argv[])
//p.dump();
stringstream ss;
parse_preamble(p, ss);
LyXTextClass textclass = parse_preamble(p, ss);
active_environments.push_back("document");
parse_text(p, ss, FLAG_END, true);
parse_text(p, ss, FLAG_END, true, textclass);
ss << "\n\\the_end\n";
ss.seekg(0);

View File

@ -7,19 +7,23 @@
#include <string>
#include <vector>
class LyXTextClass;
void parse_preamble(Parser & p, std::ostream & os);
LyXTextClass const parse_preamble(Parser & p, std::ostream & os);
void parse_text(Parser & p, std::ostream & os, unsigned flags, bool outer);
void parse_text(Parser & p, std::ostream & os, unsigned flags,
bool outer, LyXTextClass const & textclass);
void parse_table(Parser & p, std::ostream & os, unsigned flags);
void parse_math(Parser & p, std::ostream & os, unsigned flags, mode_type mode);
void handle_tabular(Parser & p, std::ostream & os);
void handle_tabular(Parser & p, std::ostream & os,
LyXTextClass const & textclass);
// Helper
std::string parse_text(Parser & p, unsigned flags, const bool outer);
std::string parse_text(Parser & p, unsigned flags, const bool outer,
LyXTextClass const & textclass);
void handle_comment(Parser & p);
std::string const trim(std::string const & a, char const * p = " \t\n\r");

View File

@ -7,6 +7,10 @@
#include <config.h>
#include "tex2lyx.h"
#include "FloatList.h"
#include "lyxtextclass.h"
#include "support/lstrings.h"
#include "support/tostr.h"
#include <iostream>
#include <map>
@ -21,6 +25,8 @@ using std::ostringstream;
using std::string;
using std::vector;
using lyx::support::rtrim;
using lyx::support::suffixIs;
namespace {
@ -132,7 +138,8 @@ void handle_par(ostream & os)
} // anonymous namespace
void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
LyXTextClass const & textclass)
{
while (p.good()) {
Token const & t = p.get_token();
@ -215,7 +222,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
else if (t.cat() == catBegin) {
// special handling of size changes
bool const is_size = is_known(p.next_token().cs(), known_sizes);
string const s = parse_text(p, FLAG_BRACE_LAST, outer);
string const s = parse_text(p, FLAG_BRACE_LAST, outer, textclass);
if (s.empty() && p.next_token().character() == '`')
; // ignore it in {}``
else if (is_size || s == "[" || s == "]" || s == "*")
@ -274,22 +281,33 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
parse_math(p, os, FLAG_END, MATH_MODE);
os << "\\end{" << name << "}";
end_inset(os);
} else if (name == "tabular") {
continue;
}
if (name == "tabular") {
begin_inset(os, "Tabular ");
handle_tabular(p, os);
handle_tabular(p, os, textclass);
end_inset(os);
} else if (name == "table" || name == "figure") {
continue;
}
bool is_starred = suffixIs(name, '*');
string unstarred_name = rtrim(name, "*");
if (textclass.floats().typeExist(unstarred_name)) {
string opts = p.getOpt();
begin_inset(os, "Float " + name + "\n");
begin_inset(os, "Float " + unstarred_name + "\n");
if (opts.size())
os << "placement " << opts << '\n';
os << "wide false\ncollapsed false\n\n"
os << "wide " << tostr(is_starred)
<< "\ncollapsed false\n\n"
<< "\\layout Standard\n";
parse_text(p, os, FLAG_END, outer);
parse_text(p, os, FLAG_END, outer,
textclass);
end_inset(os);
} else if (name == "center") {
handle_par(os);
parse_text(p, os, FLAG_END, outer);
parse_text(p, os, FLAG_END, outer,
textclass);
} else if (name == "enumerate" || name == "itemize"
|| name == "lyxlist") {
size_t const n = active_environments.size();
@ -301,17 +319,17 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
os << "\n\\layout " << cap(name) << "\n\n";
if (name == "lyxlist")
p.verbatim_item(); // swallow next arg
parse_text(p, os, FLAG_END, outer);
parse_text(p, os, FLAG_END, outer, textclass);
if (deeper)
os << "\n\\end_deeper\n";
handle_par(os);
} else if (name == "thebibliography") {
p.verbatim_item(); // swallow next arg
parse_text(p, os, FLAG_END, outer);
parse_text(p, os, FLAG_END, outer, textclass);
os << "\n\\layout Bibliography\n\n";
} else {
handle_par(os);
parse_text(p, os, FLAG_END, outer);
parse_text(p, os, FLAG_END, outer, textclass);
}
}
@ -334,7 +352,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
string s;
if (p.next_token().character() == '[') {
p.get_token(); // eat '['
s = parse_text(p, FLAG_BRACK_LAST, outer);
s = parse_text(p, FLAG_BRACK_LAST, outer, textclass);
}
handle_par(os);
os << s << ' ';
@ -367,7 +385,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
os << "collapsed true\n\n\\layout Standard\n\n" << opt;
end_inset(os);
}
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\n\\layout Standard\n\n";
}
@ -386,12 +404,12 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
else if (t.cs() == "footnote") {
begin_inset(os, "Foot\n");
os << "collapsed true\n\n\\layout Standard\n\n";
parse_text(p, os, FLAG_ITEM, false);
parse_text(p, os, FLAG_ITEM, false, textclass);
end_inset(os);
}
else if (t.cs() == "ensuremath") {
string s = parse_text(p, FLAG_ITEM, false);
string s = parse_text(p, FLAG_ITEM, false, textclass);
if (s == "±" || s == "³" || s == "²" || s == "µ")
os << s;
else
@ -401,7 +419,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
else if (t.cs() == "marginpar") {
begin_inset(os, "Marginal\n");
os << "collapsed true\n\n\\layout Standard\n\n";
parse_text(p, os, FLAG_ITEM, false);
parse_text(p, os, FLAG_ITEM, false, textclass);
end_inset(os);
}
@ -418,49 +436,49 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
else if (t.cs() == "textrm") {
os << "\n\\family roman \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\family default \n";
}
else if (t.cs() == "textsf") {
os << "\n\\family sans \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\family default \n";
}
else if (t.cs() == "texttt") {
os << "\n\\family typewriter \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\family default \n";
}
else if (t.cs() == "textit") {
os << "\n\\shape italic \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\shape default \n";
}
else if (t.cs() == "textsc") {
os << "\n\\noun on \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\noun default \n";
}
else if (t.cs() == "textbf") {
os << "\n\\series bold \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\series default \n";
}
else if (t.cs() == "underbar") {
os << "\n\\bar under \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\bar default \n";
}
else if (t.cs() == "emph" || t.cs() == "noun") {
os << "\n\\" << t.cs() << " on \n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\" << t.cs() << " default \n";
}
@ -562,7 +580,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
|| t.cs() == "^" || t.cs() == "'" || t.cs() == "~") {
// we need the trim as the LyX parser chokes on such spaces
os << "\n\\i \\" << t.cs() << "{"
<< trim(parse_text(p, FLAG_ITEM, outer), " ") << "}\n";
<< trim(parse_text(p, FLAG_ITEM, outer, textclass), " ") << "}\n";
}
else if (t.cs() == "ss")
@ -579,13 +597,13 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
else if (t.cs() == "lyxrightaddress") {
os << "\n\\layout Right Address\n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\layout Standard\n";
}
else if (t.cs() == "lyxaddress") {
os << "\n\\layout Address\n";
parse_text(p, os, FLAG_ITEM, outer);
parse_text(p, os, FLAG_ITEM, outer, textclass);
os << "\n\\layout Standard\n";
}
@ -625,10 +643,11 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
}
string parse_text(Parser & p, unsigned flags, const bool outer)
string parse_text(Parser & p, unsigned flags, const bool outer,
LyXTextClass const & textclass)
{
ostringstream os;
parse_text(p, os, flags, outer);
parse_text(p, os, flags, outer, textclass);
return os.str();
}