From 812b659d89dfeaae7795b3aa0c472fe5174a57cf Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Sat, 26 Jul 2003 00:15:38 +0000 Subject: [PATCH] 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 --- src/tex2lyx/.cvsignore | 8 ++++ src/tex2lyx/ChangeLog | 31 ++++++++++++++++ src/tex2lyx/Makefile.am | 37 +++++++++++++++++++ src/tex2lyx/preamble.C | 23 ++++++++---- src/tex2lyx/table.C | 7 ++-- src/tex2lyx/tex2lyx.C | 16 +++++++- src/tex2lyx/tex2lyx.h | 12 ++++-- src/tex2lyx/text.C | 81 +++++++++++++++++++++++++---------------- 8 files changed, 168 insertions(+), 47 deletions(-) diff --git a/src/tex2lyx/.cvsignore b/src/tex2lyx/.cvsignore index ecb851b8c6..2a658c1dbb 100644 --- a/src/tex2lyx/.cvsignore +++ b/src/tex2lyx/.cvsignore @@ -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 diff --git a/src/tex2lyx/ChangeLog b/src/tex2lyx/ChangeLog index c3579c5c34..6d9ba1d79e 100644 --- a/src/tex2lyx/ChangeLog +++ b/src/tex2lyx/ChangeLog @@ -1,3 +1,34 @@ +2003-07-26 Angus Leeming + + * 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 * texparser.C (catInit): same warning avoidance as in math_parser.C diff --git a/src/tex2lyx/Makefile.am b/src/tex2lyx/Makefile.am index cc6a83c40a..dcfe5df8a2 100644 --- a/src/tex2lyx/Makefile.am +++ b/src/tex2lyx/Makefile.am @@ -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) diff --git a/src/tex2lyx/preamble.C b/src/tex2lyx/preamble.C index 897bb4b8bb..a51be6160a 100644 --- a/src/tex2lyx/preamble.C +++ b/src/tex2lyx/preamble.C @@ -8,6 +8,11 @@ #include "tex2lyx.h" +#include "layout.h" +#include "lyxtextclass.h" +#include "lyxlex.h" +#include "support/filetools.h" + #include #include #include @@ -25,6 +30,8 @@ using std::ostringstream; using std::string; using std::vector; +using lyx::support::LibFileSearch; + // special columntypes extern std::map 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; +} // }]) diff --git a/src/tex2lyx/table.C b/src/tex2lyx/table.C index ca01117dc6..773741005b 100644 --- a/src/tex2lyx/table.C +++ b/src/tex2lyx/table.C @@ -282,7 +282,8 @@ void handle_hline_below(RowInfo & ri, vector & 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); } } diff --git a/src/tex2lyx/tex2lyx.C b/src/tex2lyx/tex2lyx.C index 5377c3d975..a08b26feb2 100644 --- a/src/tex2lyx/tex2lyx.C +++ b/src/tex2lyx/tex2lyx.C @@ -6,6 +6,10 @@ #include "tex2lyx.h" +#include "lyx_main.h" +#include "debug.h" +#include "lyxtextclass.h" + #include #include #include @@ -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); diff --git a/src/tex2lyx/tex2lyx.h b/src/tex2lyx/tex2lyx.h index 2803d3e153..365462e510 100644 --- a/src/tex2lyx/tex2lyx.h +++ b/src/tex2lyx/tex2lyx.h @@ -7,19 +7,23 @@ #include #include +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"); diff --git a/src/tex2lyx/text.C b/src/tex2lyx/text.C index 1329d6df10..524605b529 100644 --- a/src/tex2lyx/text.C +++ b/src/tex2lyx/text.C @@ -7,6 +7,10 @@ #include #include "tex2lyx.h" +#include "FloatList.h" +#include "lyxtextclass.h" +#include "support/lstrings.h" +#include "support/tostr.h" #include #include @@ -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" - << "\\layout Standard\n"; - parse_text(p, os, FLAG_END, outer); + os << "wide " << tostr(is_starred) + << "\ncollapsed false\n\n" + << "\\layout Standard\n"; + 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(); } -- 2.39.2