]> git.cameronkatri.com Git - mandoc.git/commitdiff
Sx to Sh anchors work.
authorKristaps Dzonsons <kristaps@bsd.lv>
Wed, 10 Dec 2008 13:41:58 +0000 (13:41 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Wed, 10 Dec 2008 13:41:58 +0000 (13:41 +0000)
Makefile
html.c
index.7
mlg.c
roff.c

index 4494c3c5428a398f9c9d6bb228122240ae6ba54c..d44977aeb53ca9b433549ec26b36c6eac35e48f7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,7 @@ SUCCEED       = test.7 test.8 test.9 test.10 test.11 test.12 test.13 \
          test.35 test.38 test.39 test.41 test.42 test.43 test.44 \
          test.45 test.46 test.47 test.48 test.49 test.51 test.52 \
          test.54 test.55 test.56 test.57 test.58 test.59 test.60 \
-         test.62 test.63 test.67 test.68 test.71
+         test.62 test.63 test.67 test.68 test.71 test.72 test.73
 
 all: mdocml
 
diff --git a/html.c b/html.c
index 530b6437c772fb822538613223a7259477763e9e..80991f14b43e585b3e83190ef822d0bbb1c0033f 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.23 2008/12/10 12:09:47 kristaps Exp $ */
+/* $Id: html.c,v 1.24 2008/12/10 13:41:58 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -764,6 +764,25 @@ html_inlinetagargs(struct md_mbuf *mbuf,
                return(0);
 
        switch (tok) {
+       case (ROFF_Sh):
+
+               /* FIXME: use API in ml.h. */
+
+               assert(*argv);
+               if ( ! ml_nputs(mbuf, " name=\"", 7, res))
+                       return(0);
+               if ( ! ml_putstring(mbuf, *argv++, res))
+                       return(0);
+               while (*argv) {
+                       if ( ! ml_putstring(mbuf, "_", res))
+                               return(0);
+                       if ( ! ml_putstring(mbuf, *argv++, res))
+                               return(0);
+               }
+               if ( ! ml_nputs(mbuf, "\"", 1, res))
+                       return(0);
+               break;
+
        case (ROFF_Sx):
 
                /* FIXME: use API in ml.h. */
@@ -771,10 +790,17 @@ html_inlinetagargs(struct md_mbuf *mbuf,
                assert(*argv);
                if ( ! ml_nputs(mbuf, " href=\"#", 8, res))
                        return(0);
-               if ( ! ml_putstring(mbuf, *argv, res))
+               if ( ! ml_putstring(mbuf, *argv++, res))
                        return(0);
+               while (*argv) {
+                       if ( ! ml_putstring(mbuf, "_", res))
+                               return(0);
+                       if ( ! ml_putstring(mbuf, *argv++, res))
+                               return(0);
+               }
                if ( ! ml_nputs(mbuf, "\"", 1, res))
                        return(0);
+
                break;
        default:
                break;
@@ -791,6 +817,8 @@ html_inlinetagname(struct md_mbuf *mbuf,
 {
 
        switch (tok) {
+       case (ROFF_Sh):
+               return(html_stput(mbuf, HTML_TAG_A, res));
        case (ROFF_Pp):
                return(html_stput(mbuf, HTML_TAG_DIV, res));
        case (ROFF_Sx):
diff --git a/index.7 b/index.7
index 5930cc38c64a8f2eae14472ef28a2231023cc1d5..718b1e254c4f59db0574f05b87bdecdf77199206 100644 (file)
--- a/index.7
+++ b/index.7
@@ -22,6 +22,10 @@ and
 is a full macro parser operating on source documents, specifically mdoc,
 validating input and compiling to HTML and XML output types.
 .Pp
+Downloads (source and ports) are available in the
+.Sx DOWNLOADS
+section.
+.Pp
 The
 .Nm
 utility is tested specifically on
diff --git a/mlg.c b/mlg.c
index 546217a6a58cb526c1cc0cc3569b6bc82518e4b1..31ec43d9e45b5109c350556161395ce566835d8e 100644 (file)
--- a/mlg.c
+++ b/mlg.c
@@ -1,4 +1,4 @@
-/* $Id: mlg.c,v 1.27 2008/12/10 12:09:47 kristaps Exp $ */
+/* $Id: mlg.c,v 1.28 2008/12/10 13:41:58 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -92,6 +92,10 @@ static       int              mlg_function_special(struct md_mlg *,
                                const char *, const char **);
 static int              mlg_atom_special(struct md_mlg *, int,
                                const char *, const char **);
+static int              mlg_link_special(struct md_mlg *, int,
+                               const char *, const char **);
+static int              mlg_anchor_special(struct md_mlg *, 
+                               int, const char **);
 
 static int              mlg_begintag(struct md_mlg *, enum md_ns, 
                                int, int *, const char **);
@@ -534,7 +538,6 @@ mlg_atom_special(struct md_mlg *p, int tok,
        if ( ! mlg_string(p, start, *more++))
                return(0);
 
-       /*assert(NULL == *more);*/ /* FIXME: ROFF_Sx */
        return(mlg_endtag(p, MD_NS_INLINE, tok));
 }
 
@@ -583,6 +586,34 @@ mlg_function_special(struct md_mlg *p,
 }
 
 
+static int
+mlg_anchor_special(struct md_mlg *p, int tok, const char **more)
+{
+       if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))
+               return(0);
+       return(mlg_endtag(p, MD_NS_INLINE, tok));
+}
+
+
+static int
+mlg_link_special(struct md_mlg *p, int tok,
+               const char *start, const char **more)
+{
+
+       if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more))
+               return(0);
+       if ( ! mlg_string(p, start, *more++))
+               return(0);
+       while (*more) {
+               if ( ! mlg_string(p, start, " "))
+                       return(0);
+               if ( ! mlg_string(p, start, *more++))
+                       return(0);
+       }
+       return(mlg_endtag(p, MD_NS_INLINE, tok));
+}
+
+
 /* ARGSUSED */
 static int
 mlg_roffspecial(void *arg, int tok, const char *start, 
@@ -611,9 +642,13 @@ mlg_roffspecial(void *arg, int tok, const char *start,
 
        case (ROFF_Xr):
                return(mlg_ref_special(p, tok, start, more));
+
+       case (ROFF_Sh):
+               return(mlg_anchor_special(p, tok, more));
  
-       case (ROFF_Sx): /* FIXME */
-               /* FALLTHROUGH */
+       case (ROFF_Sx):
+               return(mlg_link_special(p, tok, start, more));
+
        case (ROFF_Nm):
                return(mlg_atom_special(p, tok, start, more));
        
diff --git a/roff.c b/roff.c
index 14db440e3fe6a34c6469b6ce2a2f66bc637d6f5b..5243fe7169e790ea75a85e34f9f43585321df263 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.61 2008/12/10 13:15:55 kristaps Exp $ */
+/* $Id: roff.c,v 1.62 2008/12/10 13:41:59 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -38,7 +38,6 @@
 /* TODO: (warn) some sections need specific elements. */
 /* TODO: (warn) NAME section has particular order. */
 /* TODO: macros with a set number of arguments? */
-/* TODO: validate Dt macro arguments. */
 /* FIXME: Bl -diag supposed to ignore callable children. */
 
 struct roffnode {
@@ -1166,7 +1165,7 @@ static int
 roff_layout(ROFFCALL_ARGS) 
 {
        int              i, c, argcp[ROFF_MAXLINEARG];
-       char            *argvp[ROFF_MAXLINEARG];
+       char            *argvp[ROFF_MAXLINEARG], *p;
 
        /*
         * The roff_layout function is for multi-line macros.  A layout
@@ -1192,7 +1191,7 @@ roff_layout(ROFFCALL_ARGS)
                return((*tree->cb.roffblkout)(tree->arg, tok));
        } 
 
-       argv++;
+       p = *argv++;
        assert( ! (ROFF_CALLABLE & tokens[tok].flags));
 
        if ( ! roffparseopts(tree, tok, &argv, argcp, argvp))
@@ -1249,6 +1248,10 @@ roff_layout(ROFFCALL_ARGS)
                        return(0);
 
                tree->asec |= tree->csec;
+
+               if ( ! roffspecial(tree, tok, p, argcp, 
+                                       (const char **)argvp, 0, argv))
+                       return(0);
                break;
        default:
                break;