From fad71945f44fd188b2ef78b88e638eb9d1cd0674 Mon Sep 17 00:00:00 2001 From: ulrich <undisclosed> Date: Wed, 22 Mar 2017 17:01:28 +0000 Subject: [PATCH] HTML-Export --- web/ui/index.html | 1 web/ui/api.js | 11 ++ src/java/de/uhilger/filecms/api/HtmlExportService.java | 167 +++++++++++++++++++++++++++++++++++++++++ web/ui/ui.js | 5 + 4 files changed, 184 insertions(+), 0 deletions(-) diff --git a/src/java/de/uhilger/filecms/api/HtmlExportService.java b/src/java/de/uhilger/filecms/api/HtmlExportService.java new file mode 100644 index 0000000..c389d9a --- /dev/null +++ b/src/java/de/uhilger/filecms/api/HtmlExportService.java @@ -0,0 +1,167 @@ +/* + + Dateiverwaltung - File management in your browser + Copyright (C) 2017 Ulrich Hilger, http://uhilger.de + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +package de.uhilger.filecms.api; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.commons.io.FileUtils; + +/** + * Die Klasse HtmlExportService stellt Methoden bereit, mit denen + * .htmi-Dateien der WebBox zusammen mit Bildern und Stylesheets als + * Ordner exportierten werden koennen, aus denen heraus die Inhalte + * als HTML-Seiten im Browser zu oeffnen sind. + */ +public class HtmlExportService extends Api { + + private static final Logger logger = Logger.getLogger(HtmlExportService.class.getName()); + + /** + * Den Inhalt eines Ordners als HTML exportieren + * + * Annahme hierbei ist, dass der Ordner, auf den im Parameter relPath + * verwiesen wird eine oder mehrere .htmi-Dateien enthaelt. Optional + * koennen Bilder im Ordner oder seinen Unterordnern enthalten sein, die + * dann in derselben Struktur im Ausgabeordner landen. + * + * Es werden nur .htmi-Dateien exortiert, die im mit relPath bezeichneten + * Ordner liegen. Eventuell in darin befindlichen Unterordnern befindliche + * .htmk-Dateien werden nicht exportiert. + * + * Es sollten also keine komplexen Webseiten-Strukturen mit dieser Methode + * erzeugt werden sondern einfache Dokumente mit einer oder wenigen + * einzelnen Dateien. + * + * Die Ausgabe erfolgt in den Ordner, in dem der mit relPath bezeichnete + * Ordner liegt, also in dessen Eltern-Ordner. Der ausgegebene Ordner heisst + * genauso wir der mit relPath bezeichnete Ordner und wird mit der + * Ergaenzung _html versehen. + * + * @param relPath + * @return 'ok' oder Fehlermeldung + */ + public String exportHtml(String relPath) { + String result = null; + File dir = getTargetDir(relPath); + File parentDir = dir.getParentFile(); + File outDir = new File(parentDir, dir.getName() + "_html/"); + File[] files = dir.listFiles(new HtmiFileFilter()); + for(int i = 0; i < files.length; i++) { + if (files[i].isDirectory()) { + try { + FileUtils.copyDirectoryToDirectory(files[i], outDir); + } catch (IOException ex) { + result = ex.getLocalizedMessage(); + logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); + } + } else { + BufferedReader br = null; + try { + File out = new File(outDir, stripExt(files[i].getName()) + ".html"); + PrintWriter w = new PrintWriter(out); + printHeader(w); + br = new BufferedReader(new FileReader(files[i])); + String line = br.readLine(); + while(line != null) { + w.print(line); + line = br.readLine(); + } + printFooter(w); + w.flush(); + w.close(); + br.close(); + } catch (FileNotFoundException ex) { + result = ex.getLocalizedMessage(); + logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); + } catch (IOException ex) { + result = ex.getLocalizedMessage(); + logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); + } finally { + try { + if(br != null) { + br.close(); + } + } catch (IOException ex) { + result = ex.getLocalizedMessage(); + logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); + } + } + } + } + File catalinaBase = new File(getCatalinaBase()); + File bsDir = new File(catalinaBase, "webapps/jslib/bootstrap/css/"); + try { + FileUtils.copyFile(new File(bsDir, "bootstrap.min.css"), new File(outDir, "bootstrap.min.css"), true); + File stile = new File(dir, "stile.css"); + if(stile.exists()) { + FileUtils.copyFile(stile, new File(outDir, "stile.css"), true); + } + } catch (IOException ex) { + result = ex.getLocalizedMessage(); + logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); + } + + return result; + } + + private String stripExt(String name) { + int dotpos = name.indexOf("."); + if(dotpos > -1) { + name = name.substring(0, dotpos); + } + return name; + } + + public class HtmiFileFilter implements FileFilter { + + @Override + public boolean accept(File pathname) { + boolean doAccept = false; + if(pathname.getName().endsWith(".htmi") || pathname.isDirectory()) { + doAccept = true; + } + return doAccept; + } + + } + + private void printHeader(PrintWriter out) throws IOException { + out.print("<!DOCTYPE html><html><head>\r\n"); + out.print("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>"); + out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"bootstrap.min.css\">\r\n"); + out.print("<link rel=\"stylesheet\" type=\"text/css\" href=\"stile.css\">\r\n"); + out.print("</head><body class=\"p-3\">\r\n"); + } + + private void printFooter(PrintWriter out) throws IOException { + out.print("</body></html>"); + } + + + +} diff --git a/web/ui/api.js b/web/ui/api.js index 5c79a96..3084d6c 100644 --- a/web/ui/api.js +++ b/web/ui/api.js @@ -187,6 +187,17 @@ }); } +function fm_export_html() { + var m = '?c=de.uhilger.filecms.api.HtmlExportService&m=exportHtml'; + m = m + '&p=' + pfad; + var u = '../svc' + m; + fm_get(u, "text", function(resp) { + $('.system-out').empty(); + $('.system-out').append('Rueckmeldung vom HTML-Export: ' + resp); + fm_fusszeile_zeigen(); + }); +} + /* ------------------- Dateiinhalte --------------------- */ function fm_save_file(saveFileName, method, callback) { diff --git a/web/ui/index.html b/web/ui/index.html index 2782775..0f7846a 100644 --- a/web/ui/index.html +++ b/web/ui/index.html @@ -91,6 +91,7 @@ <div class="dropdown-divider"></div> <a id="renameFile" class="dropdown-item" href="#">Umbenennen..</a> <a id="m-unzip" class="dropdown-item" href="#">Entpacken</a> + <a id="m-html-export" class="dropdown-item" href="#">Export HTML</a> <div class="dropdown-divider"></div> <a id="closeFile" class="dropdown-item" href="#">Schliessen</a> </div> diff --git a/web/ui/ui.js b/web/ui/ui.js index 09ef609..15fed16 100644 --- a/web/ui/ui.js +++ b/web/ui/ui.js @@ -57,6 +57,7 @@ $('#closeFile').on('click', fm_menu_datei_schliessen); $('#renameFile').on('click', fm_menu_datei_umbenennen); $('#m-unzip').on('click', fm_menu_datei_entpacken); + $('#m-html-export').on('click', fm_menu_html_export); $('#m-del').on('click', fm_menu_delete); $('#m-cut').on('click', fm_menu_cut); $('#m-copy').on('click', fm_menu_copy); @@ -298,6 +299,10 @@ return liste; } +function fm_menu_html_export() { + fm_export_html(); +} + /* --------- Dateifunktionen Ende ---------- */ function fm_menu_test() { -- Gitblit v1.9.3