summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--html.c28
-rw-r--r--mandoc.111
-rw-r--r--mandoc.c81
3 files changed, 103 insertions, 17 deletions
diff --git a/html.c b/html.c
index 094cc86e..d64385a5 100644
--- a/html.c
+++ b/html.c
@@ -270,21 +270,19 @@ print_escape(struct html *h, const char **p)
return;
}
- switch (*wp) {
- case ('B'):
- /* TODO */
- break;
- case ('I'):
- /* TODO */
- break;
- case ('P'):
- /* FALLTHROUGH */
- case ('R'):
- /* TODO */
- break;
- default:
- break;
- }
+ /*
+ * These aren't supported, as they're symmetry-breaking
+ * constructs that don't play well with hierarchical
+ * mark-up. Consider:
+ *
+ * \fBHello.
+ * .PP
+ * World.
+ *
+ * The style started before "Hello" wouldn't be able to
+ * propogate into the next `PP' because we'd exit the
+ * current paragraph's scope.
+ */
*p = wp;
return;
diff --git a/mandoc.1 b/mandoc.1
index 0aebd7eb..1e6dd4b3 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -419,3 +419,14 @@ the maximum size of an element attribute is determined by
which is usually 1024 bytes. Be aware of this when setting long link
formats with
.Fl O Ns Ar man=fmt .
+.Pp
+The
+.Fl T Ns Ar html
+utility doesn't support the
+.Sq \ef
+and
+.Sq \es
+text decorations documented in
+.Xr mdoc 7
+and
+.Xr man 7 .
diff --git a/mandoc.c b/mandoc.c
index 1099ca4d..58c2d273 100644
--- a/mandoc.c
+++ b/mandoc.c
@@ -35,7 +35,9 @@ static int a2time(time_t *, const char *, const char *);
int
mandoc_special(const char *p)
{
- int c;
+ int terminator; /* Terminator for \s. */
+ int lim; /* Limit for N in \s. */
+ int c, i;
if ('\\' != *p++)
return(0);
@@ -74,9 +76,84 @@ mandoc_special(const char *p)
case ('e'):
return(2);
case ('f'):
- if (0 == *++p || ! isgraph((u_char)*p))
+ if ('\0' == *++p || ! isgraph((u_char)*p))
return(0);
return(3);
+ case ('s'):
+ if ('\0' == *++p)
+ return(2);
+
+ c = 2;
+ terminator = 0;
+ lim = 1;
+
+ if (*p == '\'') {
+ lim = 0;
+ terminator = 1;
+ ++p;
+ ++c;
+ } else if (*p == '[') {
+ lim = 0;
+ terminator = 2;
+ ++p;
+ ++c;
+ } else if (*p == '(') {
+ lim = 2;
+ terminator = 3;
+ ++p;
+ ++c;
+ }
+
+ if (*p == '+' || *p == '-') {
+ ++p;
+ ++c;
+ }
+
+ if (*p == '\'') {
+ if (terminator)
+ return(0);
+ lim = 0;
+ terminator = 1;
+ ++p;
+ ++c;
+ } else if (*p == '[') {
+ if (terminator)
+ return(0);
+ lim = 0;
+ terminator = 2;
+ ++p;
+ ++c;
+ } else if (*p == '(') {
+ if (terminator)
+ return(0);
+ lim = 2;
+ terminator = 3;
+ ++p;
+ ++c;
+ }
+
+ /* TODO: needs to handle floating point. */
+
+ if ( ! isdigit((u_char)*p))
+ return(0);
+
+ for (i = 0; isdigit((u_char)*p); i++) {
+ if (lim && i >= lim)
+ break;
+ ++p;
+ ++c;
+ }
+
+ if (terminator && terminator < 3) {
+ if (1 == terminator && *p != '\'')
+ return(0);
+ if (2 == terminator && *p != ']')
+ return(0);
+ ++p;
+ ++c;
+ }
+
+ return(c);
case ('*'):
if (0 == *++p || ! isgraph((u_char)*p))
return(0);