X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=d8296e9795a5721e06dec63ab1f0656d794adcb7;hb=9577dae301866e69016c26300826114a611ea779;hp=f039b180b36b6ae9e8766054179dd2ee3d155f86;hpb=cb0bfc9445d20b57a87b20cbe595a417abd5eab9;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index f039b180b3..d8296e9795 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -32,6 +32,7 @@ #include "Format.h" #include "FuncRequest.h" #include "FuncStatus.h" +#include "IndicesList.h" #include "InsetIterator.h" #include "InsetList.h" #include "Language.h" @@ -46,6 +47,7 @@ #include "output_docbook.h" #include "output.h" #include "output_latex.h" +#include "output_xhtml.h" #include "output_plaintext.h" #include "paragraph_funcs.h" #include "Paragraph.h" @@ -124,7 +126,7 @@ namespace { // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -int const LYX_FORMAT = 349; // jspitzm: initial XeTeX support +int const LYX_FORMAT = 361; // jspitzm: bibliography custom width typedef map DepClean; typedef map > RefCache; @@ -458,10 +460,12 @@ string Buffer::logName(LogType * type) const FileName const fname(addName(temppath(), onlyFilename(changeExtension(filename, ".log")))); + + // FIXME: how do we know this is the name of the build log? FileName const bname( addName(path, onlyFilename( changeExtension(filename, - formats.extension("literate") + ".out")))); + formats.extension(bufferFormat()) + ".out")))); // If no Latex log or Build log is newer, show Build log @@ -523,6 +527,8 @@ int Buffer::readHeader(Lexer & lex) params().clearLayoutModules(); params().clearRemovedModules(); params().pdfoptions().clear(); + params().indiceslist().clear(); + params().backgroundcolor = lyx::rgbFromHexName("#ffffff"); for (int i = 0; i < 4; ++i) { params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i]; @@ -1332,6 +1338,65 @@ void Buffer::writeDocBookSource(odocstream & os, string const & fname, } +void Buffer::makeLyXHTMLFile(FileName const & fname, + OutputParams const & runparams, + bool const body_only) const +{ + LYXERR(Debug::LATEX, "makeLYXHTMLFile..."); + + ofdocstream ofs; + if (!openFileWrite(ofs, fname)) + return; + + writeLyXHTMLSource(ofs, runparams, body_only); + + ofs.close(); + if (ofs.fail()) + lyxerr << "File '" << fname << "' was not closed properly." << endl; +} + + +void Buffer::writeLyXHTMLSource(odocstream & os, + OutputParams const & runparams, + bool const only_body) const +{ + LaTeXFeatures features(*this, params(), runparams); + validate(features); + + d->texrow.reset(); + + if (!only_body) { + os << "\n"; + // FIXME Language should be set properly. + os << "\n"; + // FIXME Header + os << "\n"; + // FIXME Presumably need to set this right + os << "\n"; + // FIXME Get this during validation? What about other meta-data? + os << "TBA\n"; + + os << features.getTClassHTMLPreamble(); + + os << '\n'; + + docstring const styleinfo = features.getTClassHTMLStyles(); + if (!styleinfo.empty()) { + os << "\n"; + } + os << "\n\n"; + } + + params().documentClass().counters().reset(); + xhtmlParagraphs(paragraphs(), *this, os, runparams); + if (!only_body) + os << "\n\n"; +} + + // chktex should be run with these flags disabled: 3, 22, 25, 30, 38(?) // Other flags: -wall -v0 -x int Buffer::runChktex() @@ -1566,156 +1631,156 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) bool dispatched = true; switch (func.action) { - case LFUN_BUFFER_EXPORT: { - bool success = doExport(to_utf8(func.argument()), false); - dr.setError(success); - if (!success) - dr.setMessage(bformat(_("Error exporting to format: %1$s."), - func.argument())); + case LFUN_BUFFER_EXPORT: { + bool success = doExport(to_utf8(func.argument()), false); + dr.setError(success); + if (!success) + dr.setMessage(bformat(_("Error exporting to format: %1$s."), + func.argument())); + break; + } + + case LFUN_BRANCH_ACTIVATE: + case LFUN_BRANCH_DEACTIVATE: { + BranchList & branchList = params().branchlist(); + docstring const branchName = func.argument(); + // the case without a branch name is handled elsewhere + if (branchName.empty()) { + dispatched = false; break; } + Branch * branch = branchList.find(branchName); + if (!branch) { + LYXERR0("Branch " << branchName << " does not exist."); + dr.setError(true); + docstring const msg = + bformat(_("Branch \"%1$s\" does not exist."), branchName); + dr.setMessage(msg); + } else { + branch->setSelected(func.action == LFUN_BRANCH_ACTIVATE); + dr.setError(false); + dr.update(Update::Force); + } + break; + } - case LFUN_BRANCH_ACTIVATE: - case LFUN_BRANCH_DEACTIVATE: { - BranchList & branchList = params().branchlist(); - docstring const branchName = func.argument(); - // the case without a branch name is handled elsewhere - if (branchName.empty()) { - dispatched = false; - break; - } - Branch * branch = branchList.find(branchName); - if (!branch) { - LYXERR0("Branch " << branchName << " does not exist."); - dr.setError(true); - docstring const msg = - bformat(_("Branch \%1$s\" does not exist."), branchName); - dr.setMessage(msg); - } else { - branch->setSelected(func.action == LFUN_BRANCH_ACTIVATE); - dr.setError(false); - dr.update(Update::Force); - } + case LFUN_BUFFER_PRINT: { + // we'll assume there's a problem until we succeed + dr.setError(true); + string target = func.getArg(0); + string target_name = func.getArg(1); + string command = func.getArg(2); + + if (target.empty() + || target_name.empty() + || command.empty()) { + LYXERR0("Unable to parse " << func.argument()); + docstring const msg = + bformat(_("Unable to parse \"%1$s\""), func.argument()); + dr.setMessage(msg); + break; + } + if (target != "printer" && target != "file") { + LYXERR0("Unrecognized target \"" << target << '"'); + docstring const msg = + bformat(_("Unrecognized target \"%1$s\""), from_utf8(target)); + dr.setMessage(msg); break; } - case LFUN_BUFFER_PRINT: { - // we'll assume there's a problem until we succeed - dr.setError(true); - string target = func.getArg(0); - string target_name = func.getArg(1); - string command = func.getArg(2); - - if (target.empty() - || target_name.empty() - || command.empty()) { - LYXERR0("Unable to parse " << func.argument()); - docstring const msg = - bformat(_("Unable to parse \"%1$s\""), func.argument()); - dr.setMessage(msg); - break; - } - if (target != "printer" && target != "file") { - LYXERR0("Unrecognized target \"" << target << '"'); - docstring const msg = - bformat(_("Unrecognized target \"%1$s\""), from_utf8(target)); - dr.setMessage(msg); - break; - } + if (!doExport("dvi", true)) { + showPrintError(absFileName()); + dr.setMessage(_("Error exporting to DVI.")); + break; + } - if (!doExport("dvi", true)) { - showPrintError(absFileName()); - dr.setMessage(_("Error exporting to DVI.")); - break; - } + // Push directory path. + string const path = temppath(); + // Prevent the compiler from optimizing away p + FileName pp(path); + PathChanger p(pp); + + // there are three cases here: + // 1. we print to a file + // 2. we print directly to a printer + // 3. we print using a spool command (print to file first) + Systemcall one; + int res = 0; + string const dviname = changeExtension(latexName(true), "dvi"); + + if (target == "printer") { + if (!lyxrc.print_spool_command.empty()) { + // case 3: print using a spool + string const psname = changeExtension(dviname,".ps"); + command += ' ' + lyxrc.print_to_file + + quoteName(psname) + + ' ' + + quoteName(dviname); - // Push directory path. - string const path = temppath(); - // Prevent the compiler from optimizing away p - FileName pp(path); - PathChanger p(pp); - - // there are three cases here: - // 1. we print to a file - // 2. we print directly to a printer - // 3. we print using a spool command (print to file first) - Systemcall one; - int res = 0; - string const dviname = changeExtension(latexName(true), "dvi"); - - if (target == "printer") { - if (!lyxrc.print_spool_command.empty()) { - // case 3: print using a spool - string const psname = changeExtension(dviname,".ps"); - command += ' ' + lyxrc.print_to_file - + quoteName(psname) - + ' ' - + quoteName(dviname); - - string command2 = lyxrc.print_spool_command + ' '; - if (target_name != "default") { - command2 += lyxrc.print_spool_printerprefix - + target_name - + ' '; - } - command2 += quoteName(psname); - // First run dvips. - // If successful, then spool command - res = one.startscript(Systemcall::Wait, command); - - if (res == 0) { - // If there's no GUI, we have to wait on this command. Otherwise, - // LyX deletes the temporary directory, and with it the spooled - // file, before it can be printed!! - Systemcall::Starttype stype = use_gui ? - Systemcall::DontWait : Systemcall::Wait; - res = one.startscript(stype, command2); - } - } else { - // case 2: print directly to a printer - if (target_name != "default") - command += ' ' + lyxrc.print_to_printer + target_name + ' '; - // as above.... + string command2 = lyxrc.print_spool_command + ' '; + if (target_name != "default") { + command2 += lyxrc.print_spool_printerprefix + + target_name + + ' '; + } + command2 += quoteName(psname); + // First run dvips. + // If successful, then spool command + res = one.startscript(Systemcall::Wait, command); + + if (res == 0) { + // If there's no GUI, we have to wait on this command. Otherwise, + // LyX deletes the temporary directory, and with it the spooled + // file, before it can be printed!! Systemcall::Starttype stype = use_gui ? Systemcall::DontWait : Systemcall::Wait; - res = one.startscript(stype, command + quoteName(dviname)); + res = one.startscript(stype, command2); } - } else { - // case 1: print to a file - FileName const filename(makeAbsPath(target_name, filePath())); - FileName const dvifile(makeAbsPath(dviname, path)); - if (filename.exists()) { - docstring text = bformat( - _("The file %1$s already exists.\n\n" - "Do you want to overwrite that file?"), - makeDisplayPath(filename.absFilename())); - if (Alert::prompt(_("Overwrite file?"), - text, 0, 1, _("&Overwrite"), _("&Cancel")) != 0) - break; - } - command += ' ' + lyxrc.print_to_file - + quoteName(filename.toFilesystemEncoding()) - + ' ' - + quoteName(dvifile.toFilesystemEncoding()); + // case 2: print directly to a printer + if (target_name != "default") + command += ' ' + lyxrc.print_to_printer + target_name + ' '; // as above.... Systemcall::Starttype stype = use_gui ? Systemcall::DontWait : Systemcall::Wait; - res = one.startscript(stype, command); + res = one.startscript(stype, command + quoteName(dviname)); } - if (res == 0) - dr.setError(false); - else { - dr.setMessage(_("Error running external commands.")); - showPrintError(absFileName()); + } else { + // case 1: print to a file + FileName const filename(makeAbsPath(target_name, filePath())); + FileName const dvifile(makeAbsPath(dviname, path)); + if (filename.exists()) { + docstring text = bformat( + _("The file %1$s already exists.\n\n" + "Do you want to overwrite that file?"), + makeDisplayPath(filename.absFilename())); + if (Alert::prompt(_("Overwrite file?"), + text, 0, 1, _("&Overwrite"), _("&Cancel")) != 0) + break; } - break; + command += ' ' + lyxrc.print_to_file + + quoteName(filename.toFilesystemEncoding()) + + ' ' + + quoteName(dvifile.toFilesystemEncoding()); + // as above.... + Systemcall::Starttype stype = use_gui ? + Systemcall::DontWait : Systemcall::Wait; + res = one.startscript(stype, command); } - default: - dispatched = false; - break; + if (res == 0) + dr.setError(false); + else { + dr.setMessage(_("Error running external commands.")); + showPrintError(absFileName()); + } + break; + } + + default: + dispatched = false; + break; } dr.dispatched(dispatched); } @@ -2414,9 +2479,9 @@ void Buffer::getSourceCode(odocstream & os, pit_type par_begin, // No side effect of file copying and image conversion runparams.dryrun = true; - d->texrow.reset(); if (full_source) { os << "% " << _("Preview source code") << "\n\n"; + d->texrow.reset(); d->texrow.newline(); d->texrow.newline(); if (isDocBook()) @@ -2438,14 +2503,16 @@ void Buffer::getSourceCode(odocstream & os, pit_type par_begin, convert(par_end - 1)) << "\n\n"; } - d->texrow.newline(); - d->texrow.newline(); + TexRow texrow; + texrow.reset(); + texrow.newline(); + texrow.newline(); // output paragraphs if (isDocBook()) docbookParagraphs(paragraphs(), *this, os, runparams); else // latex or literate - latexParagraphs(*this, text(), os, d->texrow, runparams); + latexParagraphs(*this, text(), os, texrow, runparams); } } @@ -2605,7 +2672,16 @@ int AutoSaveBuffer::generateChild() FileName Buffer::getAutosaveFilename() const { - string const fpath = isUnnamed() ? lyxrc.document_path : filePath(); + // if the document is unnamed try to save in the backup dir, else + // in the default document path, and as a last try in the filePath, + // which will most often be the temporary directory + string fpath; + if (isUnnamed()) + fpath = lyxrc.backupdir_path.empty() ? lyxrc.document_path + : lyxrc.backupdir_path; + if (!isUnnamed() || fpath.empty() || !FileName(fpath).exists()) + fpath = filePath(); + string const fname = "#" + d->filename.onlyFileName() + "#"; return makeAbsPath(fname, fpath); } @@ -2619,6 +2695,14 @@ void Buffer::removeAutosaveFile() const } +void Buffer::moveAutosaveFile(support::FileName const & oldauto) const +{ + FileName const newauto = getAutosaveFilename(); + if (!(oldauto == newauto || oldauto.moveTo(newauto))) + LYXERR0("Unable to remove autosave file `" << oldauto << "'!"); +} + + // Perfect target for a thread... void Buffer::autoSave() const { @@ -2640,20 +2724,22 @@ void Buffer::autoSave() const string Buffer::bufferFormat() const { - if (isDocBook()) - return "docbook"; - if (isLiterate()) - return "literate"; - if (params().useXetex) - return "xetex"; - if (params().encoding().package() == Encoding::japanese) - return "platex"; - return "latex"; + string format = params().documentClass().outputFormat(); + if (format == "latex") { + if (params().useXetex) + return "xetex"; + if (params().encoding().package() == Encoding::japanese) + return "platex"; + } + return format; } string Buffer::getDefaultOutputFormat() const { + if (!params().defaultOutputFormat.empty() + && params().defaultOutputFormat != "default") + return params().defaultOutputFormat; typedef vector Formats; Formats formats = exportableFormats(true); if (isDocBook() @@ -2716,6 +2802,8 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir, if (backend_format == "text") writePlaintextFile(*this, FileName(filename), runparams); // no backend + else if (backend_format == "xhtml") + makeLyXHTMLFile(FileName(filename), runparams); else if (backend_format == "lyx") writeFile(FileName(filename)); // Docbook backend @@ -2845,6 +2933,7 @@ vector Buffer::backends() const v.push_back("pdflatex"); } v.push_back("text"); + v.push_back("xhtml"); v.push_back("lyx"); return v; } @@ -3119,7 +3208,8 @@ static void setLabel(Buffer const & buf, ParIterator & it) // Compute the item depth of the paragraph par.itemdepth = getItemDepth(it); - if (layout.margintype == MARGIN_MANUAL) { + if (layout.margintype == MARGIN_MANUAL + || layout.latextype == LATEX_BIB_ENVIRONMENT) { if (par.params().labelWidthString().empty()) par.params().labelWidthString(par.translateIfPossible(layout.labelstring(), bp)); } else { @@ -3164,9 +3254,7 @@ static void setLabel(Buffer const & buf, ParIterator & it) } case LABEL_ENUMERATE: { - // FIXME: Yes I know this is a really, really! bad solution - // (Lgb) - docstring enumcounter = from_ascii("enum"); + docstring enumcounter = layout.counter.empty() ? from_ascii("enum") : layout.counter; switch (par.itemdepth) { case 2: @@ -3187,31 +3275,9 @@ static void setLabel(Buffer const & buf, ParIterator & it) // Maybe we have to reset the enumeration counter. if (needEnumCounterReset(it)) counters.reset(enumcounter); - counters.step(enumcounter); - string format; - - switch (par.itemdepth) { - case 0: - format = N_("\\arabic{enumi}."); - break; - case 1: - format = N_("(\\alph{enumii})"); - break; - case 2: - format = N_("\\roman{enumiii}."); - break; - case 3: - format = N_("\\Alph{enumiv}."); - break; - default: - // not a valid enumdepth... - break; - } - - par.params().labelString(counters.counterLabel( - par.translateIfPossible(from_ascii(format), bp))); + par.params().labelString(counters.theCounter(enumcounter)); break; }