Update Markdown support.

This commit is contained in:
Michael Sweet 2017-04-21 20:37:27 -04:00
parent b06830dc0d
commit f1f1703050
4 changed files with 43 additions and 17 deletions

View File

@ -1,4 +1,4 @@
.TH mxml 3 "Mini-XML API" "04/11/17" "Mini-XML API" .TH mxml 3 "Mini-XML API" "04/21/17" "Mini-XML API"
.SH NAME .SH NAME
mxml \- Mini-XML API mxml \- Mini-XML API
.SH INCLUDE FILE .SH INCLUDE FILE

24
mmd.c
View File

@ -296,6 +296,12 @@ mmdLoad(const char *filename) /* I - File to load */
doc = current = mmd_add(NULL, MMD_TYPE_DOCUMENT, 0, NULL, NULL); doc = current = mmd_add(NULL, MMD_TYPE_DOCUMENT, 0, NULL, NULL);
if (!doc)
{
fclose(fp);
return (NULL);
}
/* /*
* Read lines until end-of-file... * Read lines until end-of-file...
*/ */
@ -718,7 +724,17 @@ mmd_parse_inline(mmd_t *parent, /* I - Parent node */
lineptr = mmd_parse_link(lineptr, &text, &url); lineptr = mmd_parse_link(lineptr, &text, &url);
if (text) if (text && *text == '`')
{
char *end = text + strlen(text) - 1;
text ++;
if (end > text && *end == '`')
*end = '\0';
mmd_add(parent, MMD_TYPE_CODE_TEXT, whitespace, text, url);
}
else if (text)
mmd_add(parent, MMD_TYPE_LINKED_TEXT, whitespace, text, url); mmd_add(parent, MMD_TYPE_LINKED_TEXT, whitespace, text, url);
if (!*lineptr) if (!*lineptr)
@ -816,9 +832,9 @@ mmd_parse_inline(mmd_t *parent, /* I - Parent node */
*/ */
static char * /* O - End of link text */ static char * /* O - End of link text */
mmd_parse_link(char *lineptr, /* I - Pointer into line */ mmd_parse_link(char *lineptr, /* I - Pointer into line */
char **text, /* O - Text */ char **text, /* O - Text */
char **url) /* O - URL */ char **url) /* O - URL */
{ {
lineptr ++; /* skip "[" */ lineptr ++; /* skip "[" */

View File

@ -173,7 +173,7 @@ static int is_markdown(const char *filename);
static mxml_type_t load_cb(mxml_node_t *node); static mxml_type_t load_cb(mxml_node_t *node);
static const char *markdown_anchor(const char *text); static const char *markdown_anchor(const char *text);
static void markdown_write_block(FILE *out, mmd_t *parent, int mode); static void markdown_write_block(FILE *out, mmd_t *parent, int mode);
static void markdown_write_inline(FILE *out, mmd_t *node, int mode); static void markdown_write_leaf(FILE *out, mmd_t *node, int mode);
static mxml_node_t *new_documentation(mxml_node_t **mxmldoc); static mxml_node_t *new_documentation(mxml_node_t **mxmldoc);
static int remove_directory(const char *path); static int remove_directory(const char *path);
static void safe_strcpy(char *dst, const char *src); static void safe_strcpy(char *dst, const char *src);
@ -915,10 +915,7 @@ build_toc(mxml_node_t *doc, /* I - Documentation */
} }
add_toc(toc, type - MMD_TYPE_HEADING_1 + 1, markdown_anchor(title), title); add_toc(toc, type - MMD_TYPE_HEADING_1 + 1, markdown_anchor(title), title);
next = NULL;
} }
else
next = mmdGetFirstChild(node);
if ((next = mmdGetNextSibling(node)) == NULL) if ((next = mmdGetNextSibling(node)) == NULL)
{ {
@ -1518,7 +1515,7 @@ markdown_write_block(FILE *out, /* I - Output file */
if (mmdIsBlock(node)) if (mmdIsBlock(node))
markdown_write_block(out, node, mode); markdown_write_block(out, node, mode);
else else
markdown_write_inline(out, node, mode); markdown_write_leaf(out, node, mode);
} }
fputs("\n", out); fputs("\n", out);
@ -1611,7 +1608,7 @@ markdown_write_block(FILE *out, /* I - Output file */
if (mmdIsBlock(node)) if (mmdIsBlock(node))
markdown_write_block(out, node, mode); markdown_write_block(out, node, mode);
else else
markdown_write_inline(out, node, mode); markdown_write_leaf(out, node, mode);
} }
if (type >= MMD_TYPE_HEADING_1 && type <= MMD_TYPE_HEADING_6) if (type >= MMD_TYPE_HEADING_1 && type <= MMD_TYPE_HEADING_6)
@ -1623,13 +1620,13 @@ markdown_write_block(FILE *out, /* I - Output file */
/* /*
* 'markdown_write_inline()' - Write an inline markdown node. * 'markdown_write_leaf()' - Write an leaf markdown node.
*/ */
static void static void
markdown_write_inline(FILE *out, /* I - Output file */ markdown_write_leaf(FILE *out, /* I - Output file */
mmd_t *node, /* I - Node to write */ mmd_t *node, /* I - Node to write */
int mode) /* I - Output mode */ int mode) /* I - Output mode */
{ {
const char *text, /* Text to write */ const char *text, /* Text to write */
*url; /* URL to write */ *url; /* URL to write */
@ -1704,7 +1701,7 @@ markdown_write_inline(FILE *out, /* I - Output file */
break; break;
case MMD_TYPE_LINKED_TEXT : case MMD_TYPE_LINKED_TEXT :
element = "a"; element = NULL;
break; break;
case MMD_TYPE_CODE_TEXT : case MMD_TYPE_CODE_TEXT :
@ -1751,7 +1748,8 @@ markdown_write_inline(FILE *out, /* I - Output file */
else else
fprintf(out, "<a href=\"%s\">", url); fprintf(out, "<a href=\"%s\">", url);
} }
else if (element)
if (element)
fprintf(out, "<%s>", element); fprintf(out, "<%s>", element);
if (!strcmp(text, "(c)")) if (!strcmp(text, "(c)"))
@ -1765,6 +1763,9 @@ markdown_write_inline(FILE *out, /* I - Output file */
if (element) if (element)
fprintf(out, "</%s>", element); fprintf(out, "</%s>", element);
if (url)
fputs("</a>", out);
} }
} }

View File

@ -23,6 +23,7 @@
/* End PBXAggregateTarget section */ /* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
271227FF1EAADBE200167F24 /* mmd.c in Sources */ = {isa = PBXBuildFile; fileRef = 271227FD1EAADBE200167F24 /* mmd.c */; };
272C00191E8C66C8007EBCAC /* mxml-attr.c in Sources */ = {isa = PBXBuildFile; fileRef = 272C000D1E8C66C8007EBCAC /* mxml-attr.c */; }; 272C00191E8C66C8007EBCAC /* mxml-attr.c in Sources */ = {isa = PBXBuildFile; fileRef = 272C000D1E8C66C8007EBCAC /* mxml-attr.c */; };
272C001A1E8C66C8007EBCAC /* mxml-entity.c in Sources */ = {isa = PBXBuildFile; fileRef = 272C000E1E8C66C8007EBCAC /* mxml-entity.c */; }; 272C001A1E8C66C8007EBCAC /* mxml-entity.c in Sources */ = {isa = PBXBuildFile; fileRef = 272C000E1E8C66C8007EBCAC /* mxml-entity.c */; };
272C001B1E8C66C8007EBCAC /* mxml-file.c in Sources */ = {isa = PBXBuildFile; fileRef = 272C000F1E8C66C8007EBCAC /* mxml-file.c */; }; 272C001B1E8C66C8007EBCAC /* mxml-file.c in Sources */ = {isa = PBXBuildFile; fileRef = 272C000F1E8C66C8007EBCAC /* mxml-file.c */; };
@ -104,6 +105,8 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
271227FD1EAADBE200167F24 /* mmd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mmd.c; path = ../mmd.c; sourceTree = "<group>"; };
271227FE1EAADBE200167F24 /* mmd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mmd.h; path = ../mmd.h; sourceTree = "<group>"; };
272C00051E8C6664007EBCAC /* libmxml.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libmxml.a; sourceTree = BUILT_PRODUCTS_DIR; }; 272C00051E8C6664007EBCAC /* libmxml.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libmxml.a; sourceTree = BUILT_PRODUCTS_DIR; };
272C000D1E8C66C8007EBCAC /* mxml-attr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "mxml-attr.c"; path = "../mxml-attr.c"; sourceTree = "<group>"; }; 272C000D1E8C66C8007EBCAC /* mxml-attr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "mxml-attr.c"; path = "../mxml-attr.c"; sourceTree = "<group>"; };
272C000E1E8C66C8007EBCAC /* mxml-entity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "mxml-entity.c"; path = "../mxml-entity.c"; sourceTree = "<group>"; }; 272C000E1E8C66C8007EBCAC /* mxml-entity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "mxml-entity.c"; path = "../mxml-entity.c"; sourceTree = "<group>"; };
@ -189,6 +192,8 @@
272C00321E8C6ABB007EBCAC /* tools */ = { 272C00321E8C6ABB007EBCAC /* tools */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
271227FD1EAADBE200167F24 /* mmd.c */,
271227FE1EAADBE200167F24 /* mmd.h */,
272C00331E8C6ADE007EBCAC /* mxmldoc.c */, 272C00331E8C6ADE007EBCAC /* mxmldoc.c */,
272C00401E8C6B1B007EBCAC /* testmxml.c */, 272C00401E8C6B1B007EBCAC /* testmxml.c */,
272C00571E943266007EBCAC /* zipc.c */, 272C00571E943266007EBCAC /* zipc.c */,
@ -358,6 +363,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
271227FF1EAADBE200167F24 /* mmd.c in Sources */,
272C00431E8C6B34007EBCAC /* mxmldoc.c in Sources */, 272C00431E8C6B34007EBCAC /* mxmldoc.c in Sources */,
272C00591E943266007EBCAC /* zipc.c in Sources */, 272C00591E943266007EBCAC /* zipc.c in Sources */,
); );
@ -601,6 +607,7 @@
272C00301E8C6A94007EBCAC /* Release */, 272C00301E8C6A94007EBCAC /* Release */,
); );
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
}; };
272C003D1E8C6AEB007EBCAC /* Build configuration list for PBXNativeTarget "testmxml" */ = { 272C003D1E8C6AEB007EBCAC /* Build configuration list for PBXNativeTarget "testmxml" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
@ -609,6 +616,7 @@
272C003F1E8C6AEB007EBCAC /* Release */, 272C003F1E8C6AEB007EBCAC /* Release */,
); );
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
}; };
272C00451E8C6B5A007EBCAC /* Build configuration list for PBXAggregateTarget "All" */ = { 272C00451E8C6B5A007EBCAC /* Build configuration list for PBXAggregateTarget "All" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
@ -617,6 +625,7 @@
272C00471E8C6B5A007EBCAC /* Release */, 272C00471E8C6B5A007EBCAC /* Release */,
); );
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
}; };
/* End XCConfigurationList section */ /* End XCConfigurationList section */
}; };