]> git.lyx.org Git - lyx.git/commitdiff
DocBook: use a hash to determine the file names for generated images.
authorThibaut Cuvelier <tcuvelier@lyx.org>
Sat, 16 Oct 2021 20:41:20 +0000 (22:41 +0200)
committerThibaut Cuvelier <tcuvelier@lyx.org>
Sat, 16 Oct 2021 20:41:38 +0000 (22:41 +0200)
This way, the file names no more change without a reason.

autotests/export/docbook/Linguistics_forest.xml
autotests/export/docbook/lyx_EafAhhREpvwrFIFUHprlnoS9qCdR7kk23QfWTsObCjg.png [new file with mode: 0644]
autotests/export/docbook/lyx_Evmv0h17wY4EoBIBFZjUQJMv0cyWz6KodzrzPiY1tQ.png [new file with mode: 0644]
autotests/export/docbook/lyx_Neo86S96tfZZQHjpBg7ADIb30ZP0DTrDTR1DEIL6dM.png [new file with mode: 0644]
autotests/export/docbook/lyx_waUJAzFwGUKDEN7MJCcs6gYNMbJuYBkgsRTDTpIvs.png [new file with mode: 0644]
autotests/export/docbook/lyxpreviewAJskuj1.png [deleted file]
src/insets/InsetText.cpp

index 65c0f0bc989a5ac3b524cefa94384915e120701a..65144e7f21dd5f6eea25d75dfcf0becd70fd6bcf 100644 (file)
@@ -13,7 +13,7 @@
 <para>Here is a simple example:</para>
 <mediaobject>
 <imageobject>
-<imagedata fileref='lyxpreviewAJskuj1.png' />
+<imagedata fileref='lyx_waUJAzFwGUKDEN7MJCcs6gYNMbJuYBkgsRTDTpIvs.png' />
 </imageobject>
 <textobject>
 <programlisting language='latex' role='forest'>[VP [DP[John]] [V' [V[sent]] [DP[Mary]] [DP[D[a]][NP[letter]]] ] ]</programlisting>
@@ -26,7 +26,7 @@
 <para>expands to a real structure tree. To view the result within the work area, you can simply embed the Structure Tree inset into a Preview inset. If instant preview is correctly installed and activated, you should see the tree immediately (just click on the image in order to edit):</para>
 <para><mediaobject>
 <imageobject>
-<imagedata fileref='lyxpreviewWZhpAx1.png' />
+<imagedata fileref='lyx_Neo86S96tfZZQHjpBg7ADIb30ZP0DTrDTR1DEIL6dM.png' />
 </imageobject>
 <textobject>
 <programlisting language='latex' role='forest'>[VP [DP[Mary]] [V' [V[sent]] [DP[John]] [DP[D[a]][NP[response]]] ] ]</programlisting>
@@ -35,7 +35,7 @@
 <para>Roofs can be easily generated by means of the <code>roof</code> option (note that the comma has special meaning, as it marks options):</para>
 <mediaobject>
 <imageobject>
-<imagedata fileref='lyxpreviewQJTcYJ1.png' />
+<imagedata fileref='lyx_Evmv0h17wY4EoBIBFZjUQJMv0cyWz6KodzrzPiY1tQ.png' />
 </imageobject>
 <textobject>
 <programlisting language='latex' role='forest'>[VP [DP[John]] [V' [V[sent]] [DP[Mary]] [DP[another letter, roof]] ] ]</programlisting>
@@ -44,7 +44,7 @@
 <para>In order to align nodes of the tree more elegantly, use the &#8220;tier&#8221; option. All nodes which have the same <code>tier</code> allocated get aligned. Here is an example:</para>
 <mediaobject>
 <imageobject>
-<imagedata fileref='lyxpreviewBkSuoA1.png' />
+<imagedata fileref='lyx_EafAhhREpvwrFIFUHprlnoS9qCdR7kk23QfWTsObCjg.png' />
 </imageobject>
 <textobject>
 <programlisting language='latex' role='forest'>[VP [DP[John,tier=word]] [V' [V[sent,tier=word]] [DP[Mary,tier=word]] [DP[D[a,tier=word]][NP[letter,tier=word]]] ] ]</programlisting>
diff --git a/autotests/export/docbook/lyx_EafAhhREpvwrFIFUHprlnoS9qCdR7kk23QfWTsObCjg.png b/autotests/export/docbook/lyx_EafAhhREpvwrFIFUHprlnoS9qCdR7kk23QfWTsObCjg.png
new file mode 100644 (file)
index 0000000..d2c57a4
Binary files /dev/null and b/autotests/export/docbook/lyx_EafAhhREpvwrFIFUHprlnoS9qCdR7kk23QfWTsObCjg.png differ
diff --git a/autotests/export/docbook/lyx_Evmv0h17wY4EoBIBFZjUQJMv0cyWz6KodzrzPiY1tQ.png b/autotests/export/docbook/lyx_Evmv0h17wY4EoBIBFZjUQJMv0cyWz6KodzrzPiY1tQ.png
new file mode 100644 (file)
index 0000000..0fa6b40
Binary files /dev/null and b/autotests/export/docbook/lyx_Evmv0h17wY4EoBIBFZjUQJMv0cyWz6KodzrzPiY1tQ.png differ
diff --git a/autotests/export/docbook/lyx_Neo86S96tfZZQHjpBg7ADIb30ZP0DTrDTR1DEIL6dM.png b/autotests/export/docbook/lyx_Neo86S96tfZZQHjpBg7ADIb30ZP0DTrDTR1DEIL6dM.png
new file mode 100644 (file)
index 0000000..4245f72
Binary files /dev/null and b/autotests/export/docbook/lyx_Neo86S96tfZZQHjpBg7ADIb30ZP0DTrDTR1DEIL6dM.png differ
diff --git a/autotests/export/docbook/lyx_waUJAzFwGUKDEN7MJCcs6gYNMbJuYBkgsRTDTpIvs.png b/autotests/export/docbook/lyx_waUJAzFwGUKDEN7MJCcs6gYNMbJuYBkgsRTDTpIvs.png
new file mode 100644 (file)
index 0000000..3de9d3a
Binary files /dev/null and b/autotests/export/docbook/lyx_waUJAzFwGUKDEN7MJCcs6gYNMbJuYBkgsRTDTpIvs.png differ
diff --git a/autotests/export/docbook/lyxpreviewAJskuj1.png b/autotests/export/docbook/lyxpreviewAJskuj1.png
deleted file mode 100644 (file)
index 3de9d3a..0000000
Binary files a/autotests/export/docbook/lyxpreviewAJskuj1.png and /dev/null differ
index 2fc63cef7fcfcde209408c184fb635e376106a60..7bb0c0c8dfd22941dbddd530762d86439a8dfca1 100644 (file)
@@ -72,6 +72,8 @@
 #include <algorithm>
 #include <stack>
 
+#include <QCryptographicHash>
+
 
 using namespace std;
 using namespace lyx::support;
@@ -669,8 +671,28 @@ void InsetText::docbookRenderAsImage(XMLStream & xs, OutputParams const & rp, XH
        LASSERT(img != nullptr, return);
        support::FileName const & filename = img->filename();
 
+       // Use a file name that is only determined by the LaTeX code: the name of
+       // the snippet is more or less random (i.e., if the user generates the file
+       // several times, they will have a clutter of preview files).
+       // Hence: use a cryptographic hash of the snippet. If the snippet changes,
+       // the file name will change a lot; two snippets are unlikely to have the
+       // same hash (by design of cryptographic hash functions). Computing a hash
+       // is typically slow, but extremely fast compared to compilation of the
+       // preview and image rendering.
+       QString snippetQ = QString(snippet.c_str());
+#if QT_VERSION >= 0x050000
+       QByteArray hash = QCryptographicHash::hash(snippetQ.toLocal8Bit(), QCryptographicHash::Sha256);
+#else
+       QByteArray hash = QCryptographicHash::hash(snippetQ.toLocal8Bit(), QCryptographicHash::Sha1);
+#endif
+       auto newFileBase = QString(hash.toBase64())
+                       .replace("/", "")
+                       .replace("+", "")
+                       .replace("=", "");
+       std::string newFileName = "lyx_" + newFileBase.toStdString() + "." + filename.extension();
+
        // Copy the image into the right folder.
-       rp.exportdata->addExternalFile("docbook5", filename, filename.onlyFileName());
+       rp.exportdata->addExternalFile("docbook5", filename, newFileName);
 
        // TODO: deal with opts. What exactly is the WriterOuterTag here, for instance?
        // Start writing the DocBook code for the image.
@@ -680,7 +702,7 @@ void InsetText::docbookRenderAsImage(XMLStream & xs, OutputParams const & rp, XH
        // Output the rendered inset.
        xs << xml::StartTag("imageobject")
           << xml::CR()
-          << xml::CompTag("imagedata", std::string("fileref='") + filename.onlyFileName() + "'")
+          << xml::CompTag("imagedata", std::string("fileref='") + newFileName + "'")
           << xml::CR()
           << xml::EndTag("imageobject")
           << xml::CR();