version 1.206, 2014/09/27 10:56:18 |
version 1.217, 2014/12/23 09:31:46 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
|
|
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
#include <unistd.h> |
|
|
#include "mandoc.h" |
|
#include "mandoc_aux.h" |
#include "mandoc_aux.h" |
|
#include "mdoc.h" |
#include "out.h" |
#include "out.h" |
#include "html.h" |
#include "html.h" |
#include "mdoc.h" |
|
#include "main.h" |
#include "main.h" |
|
|
#define INDENT 5 |
#define INDENT 5 |
Line 56 static void synopsis_pre(struct html *, |
|
Line 55 static void synopsis_pre(struct html *, |
|
const struct mdoc_node *); |
const struct mdoc_node *); |
|
|
static void a2width(const char *, struct roffsu *); |
static void a2width(const char *, struct roffsu *); |
static void a2offs(const char *, struct roffsu *); |
|
|
|
static void mdoc_root_post(MDOC_ARGS); |
static void mdoc_root_post(MDOC_ARGS); |
static int mdoc_root_pre(MDOC_ARGS); |
static int mdoc_root_pre(MDOC_ARGS); |
Line 99 static int mdoc_mt_pre(MDOC_ARGS); |
|
Line 97 static int mdoc_mt_pre(MDOC_ARGS); |
|
static int mdoc_ms_pre(MDOC_ARGS); |
static int mdoc_ms_pre(MDOC_ARGS); |
static int mdoc_nd_pre(MDOC_ARGS); |
static int mdoc_nd_pre(MDOC_ARGS); |
static int mdoc_nm_pre(MDOC_ARGS); |
static int mdoc_nm_pre(MDOC_ARGS); |
|
static int mdoc_no_pre(MDOC_ARGS); |
static int mdoc_ns_pre(MDOC_ARGS); |
static int mdoc_ns_pre(MDOC_ARGS); |
static int mdoc_pa_pre(MDOC_ARGS); |
static int mdoc_pa_pre(MDOC_ARGS); |
static void mdoc_pf_post(MDOC_ARGS); |
static void mdoc_pf_post(MDOC_ARGS); |
Line 183 static const struct htmlmdoc mdocs[MDOC_MAX] = { |
|
Line 182 static const struct htmlmdoc mdocs[MDOC_MAX] = { |
|
{mdoc_quote_pre, mdoc_quote_post}, /* Bq */ |
{mdoc_quote_pre, mdoc_quote_post}, /* Bq */ |
{mdoc_xx_pre, NULL}, /* Bsx */ |
{mdoc_xx_pre, NULL}, /* Bsx */ |
{mdoc_bx_pre, NULL}, /* Bx */ |
{mdoc_bx_pre, NULL}, /* Bx */ |
{NULL, NULL}, /* Db */ |
{mdoc_skip_pre, NULL}, /* Db */ |
{NULL, NULL}, /* Dc */ |
{NULL, NULL}, /* Dc */ |
{mdoc_quote_pre, mdoc_quote_post}, /* Do */ |
{mdoc_quote_pre, mdoc_quote_post}, /* Do */ |
{mdoc_quote_pre, mdoc_quote_post}, /* Dq */ |
{mdoc_quote_pre, mdoc_quote_post}, /* Dq */ |
Line 193 static const struct htmlmdoc mdocs[MDOC_MAX] = { |
|
Line 192 static const struct htmlmdoc mdocs[MDOC_MAX] = { |
|
{mdoc_quote_pre, mdoc_quote_post}, /* Eo */ |
{mdoc_quote_pre, mdoc_quote_post}, /* Eo */ |
{mdoc_xx_pre, NULL}, /* Fx */ |
{mdoc_xx_pre, NULL}, /* Fx */ |
{mdoc_ms_pre, NULL}, /* Ms */ |
{mdoc_ms_pre, NULL}, /* Ms */ |
{mdoc_igndelim_pre, NULL}, /* No */ |
{mdoc_no_pre, NULL}, /* No */ |
{mdoc_ns_pre, NULL}, /* Ns */ |
{mdoc_ns_pre, NULL}, /* Ns */ |
{mdoc_xx_pre, NULL}, /* Nx */ |
{mdoc_xx_pre, NULL}, /* Nx */ |
{mdoc_xx_pre, NULL}, /* Ox */ |
{mdoc_xx_pre, NULL}, /* Ox */ |
|
|
a2width(const char *p, struct roffsu *su) |
a2width(const char *p, struct roffsu *su) |
{ |
{ |
|
|
if ( ! a2roffsu(p, su, SCALE_MAX)) { |
if (a2roffsu(p, su, SCALE_MAX) < 2) { |
su->unit = SCALE_BU; |
su->unit = SCALE_EN; |
su->scale = html_strlen(p); |
su->scale = html_strlen(p); |
} |
} |
} |
} |
Line 328 synopsis_pre(struct html *h, const struct mdoc_node *n |
|
Line 327 synopsis_pre(struct html *h, const struct mdoc_node *n |
|
} |
} |
} |
} |
|
|
/* |
|
* Calculate the scaling unit passed in an `-offset' argument. This |
|
* uses either a native scaling unit (e.g., 1i, 2m), one of a set of |
|
* predefined strings (indent, etc.), or the string length of the value. |
|
*/ |
|
static void |
static void |
a2offs(const char *p, struct roffsu *su) |
|
{ |
|
|
|
/* FIXME: "right"? */ |
|
|
|
if (0 == strcmp(p, "left")) |
|
SCALE_HS_INIT(su, 0); |
|
else if (0 == strcmp(p, "indent")) |
|
SCALE_HS_INIT(su, INDENT); |
|
else if (0 == strcmp(p, "indent-two")) |
|
SCALE_HS_INIT(su, INDENT * 2); |
|
else if ( ! a2roffsu(p, su, SCALE_MAX)) |
|
SCALE_HS_INIT(su, html_strlen(p)); |
|
} |
|
|
|
static void |
|
print_mdoc(MDOC_ARGS) |
print_mdoc(MDOC_ARGS) |
{ |
{ |
struct tag *t, *tt; |
struct tag *t, *tt; |
Line 444 print_mdoc_node(MDOC_ARGS) |
|
Line 422 print_mdoc_node(MDOC_ARGS) |
|
* the "meta" table state. This will be reopened on the |
* the "meta" table state. This will be reopened on the |
* next table element. |
* next table element. |
*/ |
*/ |
if (h->tblt) { |
if (h->tblt != NULL) { |
print_tblclose(h); |
print_tblclose(h); |
t = h->tags.head; |
t = h->tags.head; |
} |
} |
|
assert(h->tblt == NULL); |
assert(NULL == h->tblt); |
if (mdocs[n->tok].pre && (n->end == ENDBODY_NOT || n->child)) |
if (mdocs[n->tok].pre && ENDBODY_NOT == n->end) |
|
child = (*mdocs[n->tok].pre)(meta, n, h); |
child = (*mdocs[n->tok].pre)(meta, n, h); |
break; |
break; |
} |
} |
Line 475 print_mdoc_node(MDOC_ARGS) |
|
Line 452 print_mdoc_node(MDOC_ARGS) |
|
case MDOC_EQN: |
case MDOC_EQN: |
break; |
break; |
default: |
default: |
if (mdocs[n->tok].post && ENDBODY_NOT == n->end) |
if ( ! mdocs[n->tok].post || n->flags & MDOC_ENDED) |
(*mdocs[n->tok].post)(meta, n, h); |
break; |
|
(*mdocs[n->tok].post)(meta, n, h); |
|
if (n->end != ENDBODY_NOT) |
|
n->pending->flags |= MDOC_ENDED; |
|
if (n->end == ENDBODY_NOSPACE) |
|
h->flags |= HTML_NOSPACE; |
break; |
break; |
} |
} |
} |
} |
Line 994 mdoc_bl_pre(MDOC_ARGS) |
|
Line 976 mdoc_bl_pre(MDOC_ARGS) |
|
/* Set the block's left-hand margin. */ |
/* Set the block's left-hand margin. */ |
|
|
if (n->norm->Bl.offs) { |
if (n->norm->Bl.offs) { |
a2offs(n->norm->Bl.offs, &su); |
a2width(n->norm->Bl.offs, &su); |
bufcat_su(h, "margin-left", &su); |
bufcat_su(h, "margin-left", &su); |
} |
} |
|
|
Line 1160 mdoc_bd_pre(MDOC_ARGS) |
|
Line 1142 mdoc_bd_pre(MDOC_ARGS) |
|
return(1); |
return(1); |
} |
} |
|
|
SCALE_HS_INIT(&su, 0); |
/* Handle the -offset argument. */ |
if (n->norm->Bd.offs) |
|
a2offs(n->norm->Bd.offs, &su); |
|
|
|
|
if (n->norm->Bd.offs == NULL || |
|
! strcmp(n->norm->Bd.offs, "left")) |
|
SCALE_HS_INIT(&su, 0); |
|
else if ( ! strcmp(n->norm->Bd.offs, "indent")) |
|
SCALE_HS_INIT(&su, INDENT); |
|
else if ( ! strcmp(n->norm->Bd.offs, "indent-two")) |
|
SCALE_HS_INIT(&su, INDENT * 2); |
|
else |
|
a2width(n->norm->Bd.offs, &su); |
|
|
bufinit(h); |
bufinit(h); |
bufcat_su(h, "margin-left", &su); |
bufcat_su(h, "margin-left", &su); |
PAIR_STYLE_INIT(&tag[0], h); |
PAIR_STYLE_INIT(&tag[0], h); |
Line 1211 mdoc_bd_pre(MDOC_ARGS) |
|
Line 1201 mdoc_bd_pre(MDOC_ARGS) |
|
default: |
default: |
break; |
break; |
} |
} |
if (nn->next && nn->next->line == nn->line) |
if (h->flags & HTML_NONEWLINE || |
|
(nn->next && ! (nn->next->flags & MDOC_LINE))) |
continue; |
continue; |
else if (nn->next) |
else if (nn->next) |
print_text(h, "\n"); |
print_text(h, "\n"); |
Line 1577 mdoc_sp_pre(MDOC_ARGS) |
|
Line 1568 mdoc_sp_pre(MDOC_ARGS) |
|
if (MDOC_sp == n->tok) { |
if (MDOC_sp == n->tok) { |
if (NULL != (n = n->child)) |
if (NULL != (n = n->child)) |
if ( ! a2roffsu(n->string, &su, SCALE_VS)) |
if ( ! a2roffsu(n->string, &su, SCALE_VS)) |
SCALE_VS_INIT(&su, atoi(n->string)); |
su.scale = 1.0; |
} else |
} else |
su.scale = 0.0; |
su.scale = 0.0; |
|
|
|
|
mdoc_pf_post(MDOC_ARGS) |
mdoc_pf_post(MDOC_ARGS) |
{ |
{ |
|
|
h->flags |= HTML_NOSPACE; |
if ( ! (n->next == NULL || n->next->flags & MDOC_LINE)) |
|
h->flags |= HTML_NOSPACE; |
} |
} |
|
|
static int |
static int |
Line 1898 mdoc_rs_pre(MDOC_ARGS) |
|
Line 1890 mdoc_rs_pre(MDOC_ARGS) |
|
} |
} |
|
|
static int |
static int |
|
mdoc_no_pre(MDOC_ARGS) |
|
{ |
|
struct htmlpair tag; |
|
|
|
PAIR_CLASS_INIT(&tag, "none"); |
|
print_otag(h, TAG_CODE, 1, &tag); |
|
return(1); |
|
} |
|
|
|
static int |
mdoc_li_pre(MDOC_ARGS) |
mdoc_li_pre(MDOC_ARGS) |
{ |
{ |
struct htmlpair tag; |
struct htmlpair tag; |
Line 2078 mdoc_quote_pre(MDOC_ARGS) |
|
Line 2080 mdoc_quote_pre(MDOC_ARGS) |
|
case MDOC_Ao: |
case MDOC_Ao: |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case MDOC_Aq: |
case MDOC_Aq: |
print_text(h, "\\(la"); |
print_text(h, n->parent->prev != NULL && |
|
n->parent->prev->tok == MDOC_An ? "<" : "\\(la"); |
break; |
break; |
case MDOC_Bro: |
case MDOC_Bro: |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
|
|
mdoc_quote_post(MDOC_ARGS) |
mdoc_quote_post(MDOC_ARGS) |
{ |
{ |
|
|
if (MDOC_BODY != n->type) |
if (n->type != MDOC_BODY && n->type != MDOC_ELEM) |
return; |
return; |
|
|
if (MDOC_En != n->tok) |
if ( ! (n->tok == MDOC_En || |
|
(n->tok == MDOC_Eo && n->end == ENDBODY_SPACE))) |
h->flags |= HTML_NOSPACE; |
h->flags |= HTML_NOSPACE; |
|
|
switch (n->tok) { |
switch (n->tok) { |
case MDOC_Ao: |
case MDOC_Ao: |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case MDOC_Aq: |
case MDOC_Aq: |
print_text(h, "\\(ra"); |
print_text(h, n->parent->prev != NULL && |
|
n->parent->prev->tok == MDOC_An ? ">" : "\\(ra"); |
break; |
break; |
case MDOC_Bro: |
case MDOC_Bro: |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |