]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/text.cpp
* src/insets/InsetNote.h:
[lyx.git] / src / tex2lyx / text.cpp
index e1559f031df5c4552d09dac2a1f7b3a0f3d7f7cb..43f6dd64b6bd708d7142f38ebbb39ee4e01f60a3 100644 (file)
 #include "Layout.h"
 #include "Length.h"
 
-#include "support/lstrings.h"
 #include "support/convert.h"
+#include "support/FileName.h"
 #include "support/filetools.h"
+#include "support/lstrings.h"
+
+#include <boost/assert.hpp>
 
+#include <algorithm>
 #include <iostream>
 #include <map>
 #include <sstream>
@@ -86,7 +90,7 @@ string parse_text_snippet(Parser & p, unsigned flags, const bool outer,
 }
 
 
-char const * const known_latex_commands[] = { "ref", "cite", "label",
+char const * const known_latex_commands[] = { "ref", "cite", "nocite", "label",
  "index", "printindex", "pageref", "url", "vref", "vpageref", "prettyref",
  "eqref", 0 };
 
@@ -248,7 +252,7 @@ bool splitLatexLength(string const & len, string & value, string & unit)
        if (contains(len, '\\'))
                unit = trim(string(len, i));
        else
-               unit = support::ascii_lowercase(trim(string(len, i)));
+               unit = ascii_lowercase(trim(string(len, i)));
        return true;
 }
 
@@ -420,27 +424,14 @@ void handle_comment(ostream & os, string const & s, Context & context)
 }
 
 
-class isLayout : public unary_function<LayoutPtr, bool> {
-public:
-       isLayout(string const name) : name_(name) {}
-       bool operator()(LayoutPtr const & ptr) const {
-               return ptr->latexname() == name_;
-       }
-private:
-       string const name_;
-};
-
-
-LayoutPtr findLayout(TextClass const & textclass,
-                        string const & name)
+LayoutPtr findLayout(TextClass const & textclass, string const & name)
 {
-       TextClass::const_iterator beg = textclass.begin();
-       TextClass::const_iterator end = textclass.end();
-
-       TextClass::const_iterator
-               it = find_if(beg, end, isLayout(name));
-
-       return (it == end) ? LayoutPtr() : *it;
+       DocumentClass::const_iterator lit = textclass.begin();
+       DocumentClass::const_iterator len = textclass.end();
+       for (; lit != len; ++lit)
+               if (lit->latexname() == name)
+                       return &*lit;
+       return LayoutPtr();
 }
 
 
@@ -821,7 +812,7 @@ void parse_environment(Parser & p, ostream & os, bool outer,
        }
 
        // The single '=' is meant here.
-       else if ((newlayout = findLayout(parent_context.textclass, name)).get() &&
+       else if ((newlayout = findLayout(parent_context.textclass, name)) &&
                  newlayout->isEnvironment()) {
                eat_whitespace(p, os, parent_context, false);
                Context context(true, parent_context.textclass, newlayout,
@@ -1029,8 +1020,10 @@ string const normalize_filename(string const & name)
 /// convention (relative to .lyx file) if it is relative
 void fix_relative_filename(string & name)
 {
-       if (lyx::support::absolutePath(name))
+       FileName fname(name);
+       if (fname.isAbsolute())
                return;
+
        // FIXME UNICODE encoding of name may be wrong (makeAbsPath expects
        // utf8)
        name = to_utf8(makeRelPath(from_utf8(makeAbsPath(name, getMasterFilePath()).absFilename()),
@@ -1072,7 +1065,7 @@ void parse_noweb(Parser & p, ostream & os, Context & context)
        // always must be in an own paragraph.
        context.new_paragraph(os);
        Context newcontext(true, context.textclass,
-               context.textclass[from_ascii("Scrap")]);
+               &context.textclass[from_ascii("Scrap")]);
        newcontext.check_layout(os);
        os << name;
        while (p.good()) {
@@ -1524,9 +1517,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                else if ((p.next_token().asInput() == "*") &&
                         context.new_layout_allowed &&
                         // The single '=' is meant here.
-                        (newlayout = findLayout(context.textclass,
-                                                t.cs() + '*')).get() &&
-                        newlayout->isCommand()) {
+                        (newlayout = findLayout(context.textclass, t.cs() + '*')) &&
+                         newlayout->isCommand()) {
                        p.get_token();
                        output_command_layout(os, p, outer, context, newlayout);
                        p.skip_spaces();
@@ -1534,7 +1526,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
 
                // The single '=' is meant here.
                else if (context.new_layout_allowed &&
-                        (newlayout = findLayout(context.textclass, t.cs())).get() &&
+                        (newlayout = findLayout(context.textclass, t.cs())) &&
                         newlayout->isCommand()) {
                        output_command_layout(os, p, outer, context, newlayout);
                        p.skip_spaces();
@@ -2378,7 +2370,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
 
                else if (t.cs() == "newcommand" ||
                         t.cs() == "providecommand" ||
-                        t.cs() == "renewcommand") {
+                        t.cs() == "renewcommand" ||
+                        t.cs() == "newlyxcommand") {
                        // these could be handled by parse_command(), but
                        // we need to call add_known_command() here.
                        string name = t.asInput();
@@ -2389,11 +2382,18 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        }
                        string const command = p.verbatim_item();
                        string const opt1 = p.getOpt();
-                       string const opt2 = p.getFullOpt();
-                       add_known_command(command, opt1, !opt2.empty());
-                       string const ert = name + '{' + command + '}' +
-                                          opt1 + opt2 +
-                                          '{' + p.verbatim_item() + '}';
+                       string optionals;
+                       unsigned optionalsNum = 0;
+                       while (true) {
+                               string const opt = p.getFullOpt();
+                               if (opt.empty())
+                                       break;
+                               optionalsNum++;
+                               optionals += opt;
+                       }
+                       add_known_command(command, opt1, optionalsNum);
+                       string const ert = name + '{' + command + '}' + opt1
+                               + optionals + '{' + p.verbatim_item() + '}';
 
                        context.check_layout(os);
                        begin_inset(os, "FormulaMacro");