]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
New module 'html-styled-ostream'.
authorBruno Haible <bruno@clisp.org>
Tue, 12 Dec 2006 14:20:38 +0000 (14:20 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Jun 2009 10:14:27 +0000 (12:14 +0200)
gnulib-local/ChangeLog
gnulib-local/Makefile.am
gnulib-local/lib/html-styled-ostream.oo.c [new file with mode: 0644]
gnulib-local/lib/html-styled-ostream.oo.h [new file with mode: 0644]
gnulib-local/modules/html-styled-ostream [new file with mode: 0644]

index 0d4dda556f2d8b33fd57705a7e4afb4c6f619bf8..cc9ad2e4a84cb70f25b0ee212e198fb4d6443815 100644 (file)
@@ -1,3 +1,10 @@
+2006-12-01  Bruno Haible  <bruno@clisp.org>
+
+       * modules/html-styled-ostream: New file.
+       * lib/html-styled-ostream.oo.c: New file.
+       * lib/html-styled-ostream.oo.h: New file.
+       * Makefile.am (EXTRA_DIST): Add the new files.
+
 2006-12-01  Bruno Haible  <bruno@clisp.org>
 
        * modules/styled-ostream: New file.
index 8a801d0fe6ceaf3c4c4bd6609a5561389f010abf..2395a1e60036a5cb15d5d23ce1c283e279bdb5e6 100644 (file)
@@ -68,6 +68,8 @@ lib/hash.c \
 lib/hash.h \
 lib/html-ostream.oo.c \
 lib/html-ostream.oo.h \
+lib/html-styled-ostream.oo.c \
+lib/html-styled-ostream.oo.h \
 lib/iconv-ostream.oo.c \
 lib/iconv-ostream.oo.h \
 lib/javacomp.c.diff \
@@ -283,6 +285,7 @@ modules/gettext-tools-misc \
 modules/gettext-tools-libgettextpo-misc \
 modules/hash \
 modules/html-ostream \
+modules/html-styled-ostream \
 modules/iconv-ostream \
 modules/java \
 modules/javacomp.diff \
diff --git a/gnulib-local/lib/html-styled-ostream.oo.c b/gnulib-local/lib/html-styled-ostream.oo.c
new file mode 100644 (file)
index 0000000..3a32287
--- /dev/null
@@ -0,0 +1,159 @@
+/* Output stream for CSS styled text, producing HTML output.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "html-styled-ostream.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "html-ostream.h"
+
+#include "binary-io.h"
+#ifndef O_TEXT
+# define O_TEXT 0
+#endif
+
+#include "error.h"
+#include "safe-read.h"
+#include "exit.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+struct html_styled_ostream : struct styled_ostream
+{
+fields:
+  /* The destination stream.  */
+  ostream_t destination;
+  /* A HTML aware wrapper around the destination stream.  */
+  html_ostream_t html_destination;
+};
+
+/* Implementation of ostream_t methods.  */
+
+static void
+html_styled_ostream::write_mem (html_styled_ostream_t stream,
+                               const void *data, size_t len)
+{
+  html_ostream_write_mem (stream->html_destination, data, len);
+}
+
+static void
+html_styled_ostream::flush (html_styled_ostream_t stream)
+{
+  html_ostream_flush (stream->html_destination);
+}
+
+static void
+html_styled_ostream::free (html_styled_ostream_t stream)
+{
+  html_ostream_free (stream->html_destination);
+  ostream_write_str (stream->destination, "</body>\n");
+  ostream_write_str (stream->destination, "</html>\n");
+}
+
+/* Implementation of styled_ostream_t methods.  */
+
+static void
+html_styled_ostream::begin_use_class (html_styled_ostream_t stream,
+                                     const char *classname)
+{
+  html_ostream_begin_span (stream->html_destination, classname);
+}
+
+static void
+html_styled_ostream::end_use_class (html_styled_ostream_t stream,
+                                   const char *classname)
+{
+  html_ostream_end_span (stream->html_destination, classname);
+}
+
+/* Constructor.  */
+
+html_styled_ostream_t
+html_styled_ostream_create (ostream_t destination, const char *css_filename)
+{
+  html_styled_ostream_t stream =
+    XMALLOC (struct html_styled_ostream_representation);
+
+  stream->base.base.vtable = &html_styled_ostream_vtable;
+  stream->destination = destination;
+  stream->html_destination = html_ostream_create (destination);
+
+  ostream_write_str (stream->destination, "<?xml version=\"1.0\"?>\n");
+  /* HTML 4.01 or XHTML 1.0?
+     Use HTML 4.01.  This is conservative.  Before switching to XHTML 1.0,
+     verify that in the output
+       - all HTML element names are in lowercase,
+       - all empty elements are denoted like <br/> or <p></p>,
+       - every attribute specification is in assignment form, like
+         <table border="1">,
+       - every <a name="..."> element also has an 'id' attribute,
+       - special characters like < > & " are escaped in the <style> and
+         <script> elements.  */
+  ostream_write_str (stream->destination,
+                    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n");
+  ostream_write_str (stream->destination, "<html>\n");
+  ostream_write_str (stream->destination, "<head>\n");
+  if (css_filename != NULL)
+    {
+      ostream_write_str (stream->destination, "<style type=\"text/css\">\n"
+                                             "<!--\n");
+
+      /* Include the contents of CSS_FILENAME literally.  */
+      {
+       int fd;
+       char buf[4096];
+
+       fd = open (css_filename, O_RDONLY | O_TEXT);
+       if (fd < 0)
+         error (EXIT_FAILURE, errno,
+                _("error while opening \"%s\" for reading"),
+                css_filename);
+
+       for (;;)
+         {
+           size_t n_read = safe_read (fd, buf, sizeof (buf));
+           if (n_read == SAFE_READ_ERROR)
+             error (EXIT_FAILURE, errno, _("error reading \"%s\""),
+                    css_filename);
+           if (n_read == 0)
+             break;
+
+           ostream_write_mem (stream->destination, buf, n_read);
+         }
+
+       if (close (fd) < 0)
+         error (EXIT_FAILURE, errno, _("error after reading \"%s\""),
+                css_filename);
+      }
+
+      ostream_write_str (stream->destination, "-->\n"
+                                             "</style>\n");
+    }
+  ostream_write_str (stream->destination, "</head>\n");
+  ostream_write_str (stream->destination, "<body>\n");
+
+  return stream;
+}
diff --git a/gnulib-local/lib/html-styled-ostream.oo.h b/gnulib-local/lib/html-styled-ostream.oo.h
new file mode 100644 (file)
index 0000000..241ae6e
--- /dev/null
@@ -0,0 +1,49 @@
+/* Output stream for CSS styled text, producing HTML output.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef _HTML_STYLED_OSTREAM_H
+#define _HTML_STYLED_OSTREAM_H
+
+#include "styled-ostream.h"
+
+
+struct html_styled_ostream : struct styled_ostream
+{
+methods:
+};
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Create an output stream that takes input in the UTF-8 encoding and
+   writes it in HTML form on DESTINATION, styled with the file CSS_FILENAME.
+   Note that the resulting stream must be closed before DESTINATION can be
+   closed.  */
+extern html_styled_ostream_t
+       html_styled_ostream_create (ostream_t destination,
+                                  const char *css_filename);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _HTML_STYLED_OSTREAM_H */
diff --git a/gnulib-local/modules/html-styled-ostream b/gnulib-local/modules/html-styled-ostream
new file mode 100644 (file)
index 0000000..9ac89ba
--- /dev/null
@@ -0,0 +1,36 @@
+Description:
+Output stream for CSS styled text, producing HTML output.
+
+Files:
+lib/html-styled-ostream.oo.h
+lib/html-styled-ostream.oo.c
+
+Depends-on:
+styled-ostream
+unistd
+html-ostream
+binary-io
+error
+safe-read
+exit
+xalloc
+gettext-h
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += html-styled-ostream.c
+html-styled-ostream.h html-styled-ostream.c : $(top_srcdir)/build-aux/moopp html-styled-ostream.oo.h html-styled-ostream.oo.c styled-ostream.oo.h ostream.oo.h
+       $(top_srcdir)/build-aux/moopp $(srcdir)/html-styled-ostream.oo.c $(srcdir)/html-styled-ostream.oo.h $(srcdir)/styled-ostream.oo.h $(srcdir)/ostream.oo.h
+BUILT_SOURCES += html-styled-ostream.h html-styled-ostream.c html_styled_ostream.priv.h html_styled_ostream.vt.h
+CLEANFILES += html-styled-ostream.h html-styled-ostream.c html_styled_ostream.priv.h html_styled_ostream.vt.h
+
+Include:
+"html-styled-ostream.h"
+
+License:
+GPL
+
+Maintainer:
+Bruno Haible
+