summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@src.gnome.org>2009-03-08 21:51:19 +0000
committerShaun McCance <shaunm@src.gnome.org>2009-03-08 21:51:19 +0000
commitc1110e5e9ea2524aa6cc7ce15a3818e7d793eaa1 (patch)
tree58aa726de45ffc750fd91adae1eb89816741ab35
parent368098751de2fb9d09fb375f39c7fc51e11112bd (diff)
downloadyelp-c1110e5e9ea2524aa6cc7ce15a3818e7d793eaa1.tar.gz
- Don't assume order of certain macros, bug #568066, from Andy Owen
* src/yelp-man-parser.c: - Don't assume order of certain macros, bug #568066, from Andy Owen svn path=/trunk/; revision=3229
-rw-r--r--ChangeLog5
-rw-r--r--src/yelp-man-parser.c101
2 files changed, 66 insertions, 40 deletions
diff --git a/ChangeLog b/ChangeLog
index 4c762bf3..37acca1c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2009-03-08 Shaun McCance <shaunm@gnome.org>
+ * src/yelp-man-parser.c:
+ - Don't assume order of certain macros, bug #568066, from Andy Owen
+
+2009-03-08 Shaun McCance <shaunm@gnome.org>
+
* src/yelp-document.c:
- Unlock mutex on error, bug #568058, from Andy Owen
diff --git a/src/yelp-man-parser.c b/src/yelp-man-parser.c
index b1381ca3..933b3589 100644
--- a/src/yelp-man-parser.c
+++ b/src/yelp-man-parser.c
@@ -67,6 +67,7 @@ typedef struct _StackElem StackElem;
struct _YelpManParser {
xmlDocPtr doc; /* The top-level XML document */
xmlNodePtr ins; /* The insertion node */
+ xmlNodePtr th_node; /* The TH node, or NULL if it doesn't exist */
GIOChannel *channel; /* GIOChannel for the entire document */
@@ -512,53 +513,73 @@ macro_hanging_paragraph_handler (YelpManParser *parser, gchar *macro, GSList *ar
}
}
-/* BSD mandoc macros
- * Since mandoc man pages are required to begin with Dd, Dt, Os,
- * we will use this to create the TH tag.
- */
+static xmlNodePtr
+create_th_node (YelpManParser *parser)
+{
+ /* Create a TH node if we don't have one already */
+ if (!parser->th_node) {
+ parser->th_node = parser_append_node (parser, "TH");
+ }
+ return parser->th_node;
+}
+
static void
-macro_mandoc_handler (YelpManParser *parser, gchar *macro, GSList *args)
+macro_title_handler (YelpManParser *parser, gchar *macro, GSList *args)
{
gchar *str = NULL;
-
- if (g_str_equal (macro, "Dd")) {
- parser->ins = parser_append_node (parser, "TH");
+
+ parser->ins = create_th_node (parser);
+
+ if (args && args->data) {
+ parser->ins = parser_append_node (parser, "Title");
+ parser_append_given_text (parser, args->data);
+ parser->ins = parser->ins->parent;
+ }
+
+ if (args && args->next && args->next->data) {
+ parser->ins = parser_append_node (parser, "Section");
+ parser_append_given_text (parser, args->next->data);
+ }
+ parser->ins = parser->th_node->parent;
+}
+
+static void
+macro_os_handler (YelpManParser *parser, gchar *macro, GSList *args)
+{
+ gchar *str = NULL;
+ xmlNodePtr new_ins = parser->ins;
+
+ parser->ins = create_th_node (parser);
+
+ if (args && args->data) {
+ parser->ins = parser_append_node (parser, "Os");
+ parser_append_given_text (parser, args->data);
+ }
+
+ parser->ins = parser->th_node->parent;
+}
+static void
+macro_date_handler (YelpManParser *parser, gchar *macro, GSList *args)
+{
+ gchar *str = NULL;
+
+ parser->ins = create_th_node (parser);
+
+ if (args && args->data) {
+
str = args_concat_all (args);
- if (args && args->data) {
- parser->ins = parser_append_node (parser, "Date");
- parser_append_given_text (parser, str);
- parser->ins = parser->ins->parent;
- }
+ parser->ins = parser_append_node (parser, "Date");
+ parser_append_given_text (parser, str);
g_free (str);
- }
- else if (g_str_equal (macro, "Dt")) {
- if (args && args->data) {
- parser->ins = parser_append_node (parser, "Title");
- parser_append_given_text (parser, args->data);
- parser->ins = parser->ins->parent;
- }
-
- if (args && args->next && args->next->data) {
- parser->ins = parser_append_node (parser, "Section");
- parser_append_given_text (parser, args->next->data);
- parser->ins = parser->ins->parent;
- }
- }
- else if (g_str_equal (macro, "Os")) {
- if (args && args->data) {
- parser->ins = parser_append_node (parser, "Os");
- parser_append_given_text (parser, args->data);
- parser->ins = parser->ins->parent;
- }
+ }
- /* Leave the TH tag */
- parser->ins = parser->ins->parent;
- }
+ parser->ins = parser->th_node->parent;
}
+
static void
macro_url_handler (YelpManParser *parser, gchar *macro, GSList *args)
{
@@ -728,7 +749,7 @@ macro_reference_handler (YelpManParser *parser, gchar *macro, GSList *args)
basename = (gchar *)args->data;
}
- parser->ins = parser_append_node (parser, "TH");
+ parser->ins = create_th_node (parser);
parser->ins = parser_append_node (parser, "Title");
parser_append_given_text (parser, "REFERENCE");
parser->ins = parser->ins->parent;
@@ -982,12 +1003,12 @@ static struct MacroHandler macro_handlers[] = {
{ "Cd", macro_mandoc_utility_handler }, /* mandoc: Configuration declaration */
{ "Cm", macro_mandoc_utility_handler }, /* mandoc: Command line argument modifier */
{ "ce", macro_ignore_handler }, /* groff: center text */
- { "Dd", macro_mandoc_handler }, /* mandoc: Document date */
+ { "Dd", macro_date_handler }, /* mandoc: Document date */
{ "de", macro_define_handler }, /* groff: define macro */
{ "ds", macro_ignore_handler }, /* groff: define string variable */
{ "D1", macro_ignore_handler }, /* mandoc: Indent and display one text line */
{ "Dl", macro_ignore_handler }, /* mandoc: Indent and display one line of literal text */
- { "Dt", macro_mandoc_handler }, /* mandoc: Document title */
+ { "Dt", macro_title_handler }, /* mandoc: Document title */
{ "Dv", macro_mandoc_utility_handler }, /* mandoc: Defined variable */
{ "Ed", macro_ignore_handler }, /* mandoc: End-display block */
{ "El", macro_mandoc_list_handler }, /* mandoc: end list */
@@ -1022,7 +1043,7 @@ static struct MacroHandler macro_handlers[] = {
{ "Nd", macro_mandoc_utility_handler }, /* mandoc: ? */
{ "Nm", macro_mandoc_utility_handler }, /* mandoc: Command/utility/program name*/
{ "Op", macro_mandoc_utility_handler }, /* mandoc: Option */
- { "Os", macro_mandoc_handler }, /* mandoc: Operating System */
+ { "Os", macro_os_handler }, /* mandoc: Operating System */
{ "Ot", macro_mandoc_utility_handler }, /* mandoc: Old style function type (Fortran) */
{ "P", macro_new_paragraph_handler }, /* man: line break and left margin and indentation are reset */
{ "Pa", macro_mandoc_utility_handler }, /* mandoc: Pathname or filename */