summaryrefslogtreecommitdiffstats
path: root/html.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2008-12-03 19:21:58 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2008-12-03 19:21:58 +0000
commitc67723cb5220a19191e6836e53b8d0a489c86797 (patch)
treee75720ca8fbbb4d7f4a0ed25af3ab2b2ecf392b3 /html.c
parentac4bc07079be4963163734d67749697140f23b4b (diff)
downloadmandoc-c67723cb5220a19191e6836e53b8d0a489c86797.tar.gz
Major update.
Diffstat (limited to 'html.c')
-rw-r--r--html.c204
1 files changed, 199 insertions, 5 deletions
diff --git a/html.c b/html.c
index 0e15a1d5..1a7ea0fd 100644
--- a/html.c
+++ b/html.c
@@ -18,34 +18,228 @@
*/
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include "libmdocml.h"
#include "private.h"
+#include "ml.h"
+
+
+static ssize_t html_endtag(struct md_mbuf *,
+ const struct md_args *,
+ enum md_ns, int);
+static ssize_t html_begintag(struct md_mbuf *,
+ const struct md_args *,
+ enum md_ns, int,
+ const int *, const char **);
+static int html_begin(struct md_mbuf *,
+ const struct md_args *);
+static int html_end(struct md_mbuf *,
+ const struct md_args *);
+static ssize_t html_blocktagname(struct md_mbuf *,
+ const struct md_args *, int);
+static ssize_t html_blocktagargs(struct md_mbuf *,
+ const struct md_args *, int,
+ const int *, const char **);
+static ssize_t html_inlinetagname(struct md_mbuf *,
+ const struct md_args *, int);
+static ssize_t html_inlinetagargs(struct md_mbuf *,
+ const struct md_args *, int,
+ const int *, const char **);
+
+
+static int
+html_begin(struct md_mbuf *mbuf, const struct md_args *args)
+{
+ size_t res;
+
+ res = 0;
+ if ( ! ml_puts(mbuf, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD "
+ "HTML 4.01//EN\" \"http://www.w3.org"
+ "/TR/html4/strict.dtd\">\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, "<html>\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, "<head>\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, " <title>Manual page</title>\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, " <meta http-equiv=\"Content-Type\" "
+ "content=\"text/html; "
+ "charset=utf-8\">\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, " <meta name=\"resource-type\" "
+ "content=\"document\">\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, "</head>\n", &res))
+ return(0);
+ if ( ! ml_puts(mbuf, "<body>", &res))
+ return(0);
+
+ return(1);
+}
+
+
+static int
+html_end(struct md_mbuf *mbuf, const struct md_args *args)
+{
+ size_t res;
+
+ res = 0;
+ if ( ! ml_puts(mbuf, "</body>\n</html>", &res))
+ return(0);
+
+ return(1);
+}
+
+
+static ssize_t
+html_blocktagname(struct md_mbuf *mbuf,
+ const struct md_args *args, int tok)
+{
+ size_t res;
+
+ res = 0;
+
+ switch (tok) {
+ case (ROFF_Sh):
+ if ( ! ml_puts(mbuf, "blockquote", &res))
+ return(-1);
+ break;
+ case (ROFF_Bd):
+ if ( ! ml_puts(mbuf, "pre", &res))
+ return(-1);
+ break;
+ case (ROFF_Bl):
+ if ( ! ml_puts(mbuf, "ul", &res))
+ return(-1);
+ break;
+ case (ROFF_It):
+ if ( ! ml_puts(mbuf, "li", &res))
+ return(-1);
+ break;
+ default:
+ if ( ! ml_puts(mbuf, "div", &res))
+ return(-1);
+ break;
+ }
+
+ return((size_t)res);
+}
+
+
+/* ARGSUSED */
+static ssize_t
+html_blocktagargs(struct md_mbuf *mbuf, const struct md_args *args,
+ int tok, const int *argc, const char **argv)
+{
+
+ switch (tok) {
+ default:
+ return(0);
+ }
+
+ return(-1);
+}
/* ARGSUSED */
+static ssize_t
+html_inlinetagargs(struct md_mbuf *mbuf, const struct md_args *args,
+ int tok, const int *argc, const char **argv)
+{
+
+ switch (tok) {
+ default:
+ return(0);
+ }
+
+ return(-1);
+}
+
+
+static ssize_t
+html_inlinetagname(struct md_mbuf *mbuf,
+ const struct md_args *args, int tok)
+{
+ size_t res;
+
+ res = 0;
+
+ switch (tok) {
+ case (ROFF_Sh):
+ if ( ! ml_puts(mbuf, "h1", &res))
+ return(-1);
+ break;
+ case (ROFF_Ss):
+ if ( ! ml_puts(mbuf, "h2", &res))
+ return(-1);
+ break;
+ default:
+ if ( ! ml_puts(mbuf, "span", &res))
+ return(-1);
+ break;
+ }
+
+ return((ssize_t)res);
+}
+
+
+static ssize_t
+html_begintag(struct md_mbuf *mbuf, const struct md_args *args,
+ enum md_ns ns, int tok,
+ const int *argc, const char **argv)
+{
+
+ assert(ns != MD_NS_DEFAULT);
+ if (MD_NS_BLOCK == ns) {
+ if ( ! html_blocktagname(mbuf, args, tok))
+ return(0);
+ return(html_blocktagargs(mbuf, args,
+ tok, argc, argv));
+ }
+
+ if ( ! html_inlinetagname(mbuf, args, tok))
+ return(0);
+ return(html_inlinetagargs(mbuf, args, tok, argc, argv));
+}
+
+
+static ssize_t
+html_endtag(struct md_mbuf *mbuf, const struct md_args *args,
+ enum md_ns ns, int tok)
+{
+
+ assert(ns != MD_NS_DEFAULT);
+ if (MD_NS_BLOCK == ns)
+ return(html_blocktagname(mbuf, args, tok));
+
+ return(html_inlinetagname(mbuf, args, tok));
+}
+
+
int
md_line_html(void *data, char *buf)
{
- return(1);
+ return(mlg_line((struct md_mlg *)data, buf));
}
-/* ARGSUSED */
int
md_exit_html(void *data, int flush)
{
- return(1);
+ return(mlg_exit((struct md_mlg *)data, flush));
}
-/* ARGSUSED */
void *
md_init_html(const struct md_args *args,
struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
{
- return(NULL);
+ return(mlg_alloc(args, rbuf, mbuf, html_begintag,
+ html_endtag, html_begin, html_end));
}
+