]> git.sur5r.net Git - glabels/commitdiff
Moved template xml functions to separate module (xml-template.[ch]).
authorJim Evins <evins@snaught.com>
Mon, 28 Apr 2003 02:35:17 +0000 (02:35 +0000)
committerJim Evins <evins@snaught.com>
Mon, 28 Apr 2003 02:35:17 +0000 (02:35 +0000)
git-svn-id: https://glabels.svn.sourceforge.net/svnroot/glabels/trunk@254 f5e0f49d-192f-0410-a22d-a8d8700d0965

glabels2/po/POTFILES.in
glabels2/src/Makefile.am
glabels2/src/template.c
glabels2/src/template.h
glabels2/src/xml-label.c
glabels2/src/xml-template.c [new file with mode: 0644]
glabels2/src/xml-template.h [new file with mode: 0644]

index e5c4af7677bdfdaeed1d7e2b5e2c51eb5df4273c..206856856c4c46abdf815a473cbd6de4c03067f0 100644 (file)
@@ -77,6 +77,8 @@ src/xml-label.c
 src/xml-label.h
 src/xml-label-04.c
 src/xml-label-04.h
+src/xml-template.c
+src/xml-template.h
 src/xml.c
 src/xml.h
 src/pixbuf-cache.c
index 244ff6b792c1c70bb83d19c5f0a1a69eccaaad91..b2c8b3848c02cf51328571c5e52bd733feb785f0 100644 (file)
@@ -118,6 +118,8 @@ glabels_SOURCES =                   \
        xml-label.h                     \
        xml-label-04.c                  \
        xml-label-04.h                  \
+       xml-template.c                  \
+       xml-template.h                  \
        xml.c                           \
        xml.h                           \
        pixbuf-cache.c                  \
@@ -214,6 +216,8 @@ glabels_batch_SOURCES =             \
        xml-label.h                     \
        xml-label-04.c                  \
        xml-label-04.h                  \
+       xml-template.c                  \
+       xml-template.h                  \
        xml.c                           \
        xml.h                           \
        pixbuf-cache.c                  \
index 374d6fd0f027a2c8dbf974abb5ba31d3dc38e6d8..de9536147fb338849ac5b1f898972adb46059f0a 100644 (file)
@@ -29,6 +29,7 @@
 #include "util.h"
 #include "xml.h"
 #include "template.h"
+#include "xml-template.h"
 
 #include "debug.h"
 
@@ -59,52 +60,13 @@ static GList      *read_templates               (void);
 static gchar      *get_home_data_dir            (void);
 static GList      *read_template_files_from_dir (GList                  *templates,
                                                 const gchar            *dirname);
-static GList      *read_templates_from_file     (GList                  *templates,
-                                                gchar                  *xml_filename);
-
-static void        xml_parse_label              (xmlNodePtr              label_node,
-                                                glTemplate             *template);
-static void        xml_parse_layout             (xmlNodePtr              layout_node,
-                                                glTemplate             *template);
-static void        xml_parse_markup             (xmlNodePtr              markup_node,
-                                                glTemplate             *template);
-static void        xml_parse_alias              (xmlNodePtr              alias_node,
-                                                glTemplate             *template);
-
-static void        xml_add_label                (const glTemplate       *template,
-                                                xmlNodePtr              root,
-                                                xmlNsPtr                ns);
-static void        xml_add_layout               (glTemplateLayout       *layout,
-                                                xmlNodePtr              root,
-                                                xmlNsPtr                ns);
-static void        xml_add_markup_margin        (glTemplateMarkupMargin *margin,
-                                                xmlNodePtr              root,
-                                                xmlNsPtr                ns);
-static void        xml_add_markup_line          (glTemplateMarkupLine   *line,
-                                                xmlNodePtr              root,
-                                                xmlNsPtr                ns);
-static void        xml_add_alias                (gchar                  *name,
-                                                xmlNodePtr              root,
-                                                xmlNsPtr                ns);
-
 static gint        compare_origins              (gconstpointer           a,
                                                 gconstpointer           b,
                                                 gpointer                user_data);
 
-static glTemplateLayout *layout_new             (gdouble                 nx,
-                                                gdouble                 ny,
-                                                gdouble                 x0,
-                                                gdouble                 y0,
-                                                gdouble                 dx,
-                                                gdouble                 dy);
 static glTemplateLayout *layout_dup             (glTemplateLayout       *orig_layout);
 static void              layout_free            (glTemplateLayout      **layout);
 
-static glTemplateMarkup *markup_margin_new      (gdouble                 size);
-static glTemplateMarkup *markup_line_new        (gdouble                 x1,
-                                                gdouble                 y1,
-                                                gdouble                 x2,
-                                                gdouble                 y2);
 static glTemplateMarkup *markup_dup             (glTemplateMarkup       *orig_markup);
 static void              markup_free            (glTemplateMarkup      **markup);
 
@@ -392,11 +354,11 @@ template_full_page (const gchar *page_size)
 
        template->label.any.layouts =
                g_list_append (template->label.any.layouts,
-                              layout_new (1, 1, 0., 0., 0., 0.));
+                              gl_template_layout_new (1, 1, 0., 0., 0., 0.));
 
        template->label.any.markups =
                g_list_append (template->label.any.markups,
-                              markup_margin_new (5.0));
+                              gl_template_markup_margin_new (5.0));
 
        return template;
 }
@@ -479,8 +441,8 @@ read_template_files_from_dir (GList       *templates,
                                full_filename =
                                    g_build_filename (dirname, filename, NULL);
                                templates =
-                                   read_templates_from_file (templates,
-                                                             full_filename);
+                                   gl_xml_template_read_templates_from_file (templates,
+                                                                             full_filename);
                                g_free (full_filename);
 
                        }
@@ -495,473 +457,6 @@ read_template_files_from_dir (GList       *templates,
        return templates;
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Read templates from template file.                             */
-/*--------------------------------------------------------------------------*/
-static GList *
-read_templates_from_file (GList *templates,
-                         gchar *xml_filename)
-{
-       xmlDocPtr   doc;
-       xmlNodePtr  root, node;
-       glTemplate *template;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       doc = xmlParseFile (xml_filename);
-       if (!doc) {
-               g_warning ("\"%s\" is not a glabels template file (not XML)",
-                     xml_filename);
-               return templates;
-       }
-
-       root = xmlDocGetRootElement (doc);
-       if (!root || !root->name) {
-               g_warning ("\"%s\" is not a glabels template file (no root node)",
-                     xml_filename);
-               xmlFreeDoc (doc);
-               return templates;
-       }
-       if (g_strcasecmp (root->name, "glabels-templates") != 0) {
-               g_warning ("\"%s\" is not a glabels template file (wrong root node)",
-                     xml_filename);
-               xmlFreeDoc (doc);
-               return templates;
-       }
-
-       for (node = root->xmlChildrenNode; node != NULL; node = node->next) {
-
-               if (g_strcasecmp (node->name, "Sheet") == 0) {
-                       template = gl_template_xml_parse_sheet (node);
-                       templates = g_list_append (templates, template);
-               } else {
-                       if ( !xmlNodeIsText(node) ) {
-                               if (g_strcasecmp (node->name,"comment") != 0) {
-                                       g_warning ("bad node =  \"%s\"",node->name);
-                               }
-                       }
-               }
-       }
-
-       xmlFreeDoc (doc);
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-       return templates;
-}
-
-/*****************************************************************************/
-/* Parse XML template Node.                                                  */
-/*****************************************************************************/
-glTemplate *
-gl_template_xml_parse_sheet (xmlNodePtr sheet_node)
-{
-       glTemplate            *template;
-       xmlNodePtr             node;
-       const GnomePrintPaper *paper;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       template = g_new0 (glTemplate, 1);
-
-       template->name = g_list_append (template->name,
-                                       xmlGetProp (sheet_node, "name"));
-       gl_debug (DEBUG_TEMPLATE, "Sheet = %s", template->name->data);
-
-       template->page_size = xmlGetProp (sheet_node, "size");
-       if ( strcmp (template->page_size,"US-Letter") == 0 ) {
-               template->page_size = "US Letter";
-       }
-       if (g_strcasecmp (template->page_size, "Other") == 0) {
-
-               template->page_width = gl_xml_get_prop_double (sheet_node, "width", 0);
-               template->page_height = gl_xml_get_prop_double (sheet_node, "height", 0);
-
-       } else {
-               paper = gnome_print_paper_get_by_name (template->page_size);
-               if (paper != NULL) {
-                       template->page_width  = paper->width;
-                       template->page_height = paper->height;
-               } else {
-                       g_warning (_("Unknown page size \"%s\""), template->page_size);
-               }
-       }
-
-       template->description = xmlGetProp (sheet_node, "description");
-
-       for (node = sheet_node->xmlChildrenNode; node != NULL;
-            node = node->next) {
-               if (g_strcasecmp (node->name, "Label") == 0) {
-                       xml_parse_label (node, template);
-               } else if (g_strcasecmp (node->name, "Alias") == 0) {
-                       xml_parse_alias (node, template);
-               } else {
-                       if (g_strcasecmp (node->name, "text") != 0) {
-                               g_warning ("bad node =  \"%s\"", node->name);
-                       }
-               }
-       }
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-
-       return template;
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Parse XML Sheet->Label Node.                                   */
-/*--------------------------------------------------------------------------*/
-static void
-xml_parse_label (xmlNodePtr  label_node,
-                glTemplate *template)
-{
-       xmlNodePtr  node;
-       gchar      *style;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       style = xmlGetProp (label_node, "style");
-       if (g_strcasecmp (style, "rectangle") == 0) {
-               template->label.style = GL_TEMPLATE_STYLE_RECT;
-       } else if (g_strcasecmp (style, "round") == 0) {
-               template->label.style = GL_TEMPLATE_STYLE_ROUND;
-       } else if (g_strcasecmp (style, "cd") == 0) {
-               template->label.style = GL_TEMPLATE_STYLE_CD;
-       } else {
-               template->label.style = GL_TEMPLATE_STYLE_RECT;
-               g_warning ("Unknown label style in template");
-       }
-       g_free (style);
-
-       switch (template->label.style) {
-
-       case GL_TEMPLATE_STYLE_RECT:
-               template->label.rect.w = gl_xml_get_prop_double (label_node, "width", 0);
-               template->label.rect.h = gl_xml_get_prop_double (label_node, "height", 0);
-               template->label.rect.r = gl_xml_get_prop_double (label_node, "round", 0);
-               break;
-
-       case GL_TEMPLATE_STYLE_ROUND:
-               template->label.round.r = gl_xml_get_prop_double (label_node, "radius", 0);
-               break;
-
-       case GL_TEMPLATE_STYLE_CD:
-               template->label.cd.r1 = gl_xml_get_prop_double (label_node, "radius", 0);
-               template->label.cd.r2 = gl_xml_get_prop_double (label_node, "hole", 0);
-               template->label.cd.w  = gl_xml_get_prop_double (label_node, "width", 0);
-               template->label.cd.h  = gl_xml_get_prop_double (label_node, "height", 0);
-               break;
-
-       default:
-               break;
-
-       }
-
-       for (node = label_node->xmlChildrenNode; node != NULL;
-            node = node->next) {
-               if (g_strcasecmp (node->name, "Layout") == 0) {
-                       xml_parse_layout (node, template);
-               } else if (g_strcasecmp (node->name, "Markup") == 0) {
-                       xml_parse_markup (node, template);
-               } else if (g_strcasecmp (node->name, "text") != 0) {
-                       g_warning ("bad node =  \"%s\"", node->name);
-               }
-       }
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Parse XML Sheet->Label->Layout Node.                           */
-/*--------------------------------------------------------------------------*/
-static void
-xml_parse_layout (xmlNodePtr  layout_node,
-                 glTemplate *template)
-{
-       gint        nx, ny;
-       gdouble     x0, y0, dx, dy;
-       xmlNodePtr  node;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       nx = gl_xml_get_prop_int (layout_node, "nx", 1);
-       ny = gl_xml_get_prop_int (layout_node, "ny", 1);
-
-       x0 = gl_xml_get_prop_double (layout_node, "x0", 0);
-       y0 = gl_xml_get_prop_double (layout_node, "y0", 0);
-
-       dx = gl_xml_get_prop_double (layout_node, "dx", 0);
-       dy = gl_xml_get_prop_double (layout_node, "dy", 0);
-
-       for (node = layout_node->xmlChildrenNode; node != NULL;
-            node = node->next) {
-               if (g_strcasecmp (node->name, "text") != 0) {
-                       g_warning ("bad node =  \"%s\"", node->name);
-               }
-       }
-
-       template->label.any.layouts =
-               g_list_append (template->label.any.layouts,
-                              layout_new (nx, ny, x0, y0, dx, dy));
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Parse XML Sheet->Label->Markup Node.                           */
-/*--------------------------------------------------------------------------*/
-static void
-xml_parse_markup (xmlNodePtr  markup_node,
-                 glTemplate *template)
-{
-       gchar      *type;
-       gdouble     size;
-       gdouble     x1, y1, x2, y2;
-       xmlNodePtr  node;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       type = xmlGetProp (markup_node, "type");
-       if (g_strcasecmp (type, "margin") == 0) {
-
-               size = gl_xml_get_prop_double (markup_node, "size", 0);
-
-               template->label.any.markups =
-                       g_list_append (template->label.any.markups,
-                                      markup_margin_new (size));
-
-       } else if (g_strcasecmp (type, "line") == 0) {
-
-               x1 = gl_xml_get_prop_double (markup_node, "x1", 0);
-               y1 = gl_xml_get_prop_double (markup_node, "y1", 0);
-               x2 = gl_xml_get_prop_double (markup_node, "x2", 0);
-               y2 = gl_xml_get_prop_double (markup_node, "y2", 0);
-
-               template->label.any.markups =
-                       g_list_append (template->label.any.markups,
-                                      markup_line_new (x1, y1, x2, y2));
-       }
-       g_free (type);
-
-       for (node = markup_node->xmlChildrenNode; node != NULL;
-            node = node->next) {
-               if (g_strcasecmp (node->name, "text") != 0) {
-                       g_warning ("bad node =  \"%s\"", node->name);
-               }
-       }
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Parse XML Sheet->Alias Node.                                   */
-/*--------------------------------------------------------------------------*/
-static void
-xml_parse_alias (xmlNodePtr  alias_node,
-                glTemplate *template)
-{
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       template->name = g_list_append (template->name,
-                                       xmlGetProp (alias_node, "name"));
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/****************************************************************************/
-/* Add XML Template Node                                                    */
-/****************************************************************************/
-void
-gl_template_xml_add_sheet (const glTemplate *template,
-                          xmlNodePtr        root,
-                          xmlNsPtr          ns)
-{
-       xmlNodePtr  node;
-       GList      *p;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       node = xmlNewChild (root, ns, "Sheet", NULL);
-
-       xmlSetProp (node, "name", template->name->data);
-
-       xmlSetProp (node, "size", template->page_size);
-       if (g_strcasecmp (template->page_size, "Other") == 0) {
-
-               gl_xml_set_prop_double (node, "width", template->page_width);
-               gl_xml_set_prop_double (node, "height", template->page_height);
-
-       }
-
-       xmlSetProp (node, "description", template->description);
-
-       xml_add_label (template, node, ns);
-
-       for ( p=template->name->next; p != NULL; p=p->next ) {
-               xml_add_alias( p->data, node, ns );
-       }
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Add XML Sheet->Label Node.                                     */
-/*--------------------------------------------------------------------------*/
-static void
-xml_add_label (const glTemplate *template,
-              xmlNodePtr        root,
-              xmlNsPtr          ns)
-{
-       xmlNodePtr        node;
-       GList            *p;
-       glTemplateMarkup *markup;
-       glTemplateLayout *layout;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       node = xmlNewChild(root, ns, "Label", NULL);
-
-       xmlSetProp (node, "id", "0");
-
-       switch (template->label.style) {
-
-       case GL_TEMPLATE_STYLE_RECT:
-               xmlSetProp (node, "style", "rectangle");
-               gl_xml_set_prop_double (node, "width",  template->label.rect.w);
-               gl_xml_set_prop_double (node, "height", template->label.rect.h);
-               gl_xml_set_prop_double (node, "round",  template->label.rect.r);
-               break;
-
-       case GL_TEMPLATE_STYLE_ROUND:
-               xmlSetProp (node, "style", "round");
-               gl_xml_set_prop_double (node, "radius",  template->label.round.r);
-               break;
-
-       case GL_TEMPLATE_STYLE_CD:
-               xmlSetProp (node, "style", "cd");
-               gl_xml_set_prop_double (node, "radius",  template->label.cd.r1);
-               gl_xml_set_prop_double (node, "hole",    template->label.cd.r2);
-               if (template->label.cd.w != 0.0) {
-                       gl_xml_set_prop_double (node, "width",  template->label.cd.w);
-               }
-               if (template->label.cd.h != 0.0) {
-                       gl_xml_set_prop_double (node, "height", template->label.cd.h);
-               }
-               break;
-
-       default:
-               g_warning ("Unknown label style");
-               break;
-
-       }
-
-       for ( p=template->label.any.markups; p != NULL; p=p->next ) {
-               markup = (glTemplateMarkup *)p->data;
-               switch (markup->type) {
-               case GL_TEMPLATE_MARKUP_MARGIN:
-                       xml_add_markup_margin ((glTemplateMarkupMargin *)markup,
-                                              node, ns);
-                       break;
-               case GL_TEMPLATE_MARKUP_LINE:
-                       xml_add_markup_line ((glTemplateMarkupLine *)markup,
-                                            node, ns);
-                       break;
-               default:
-                       g_warning ("Unknown markup type");
-                       break;
-               }
-       }
-
-       for ( p=template->label.any.layouts; p != NULL; p=p->next ) {
-               layout = (glTemplateLayout *)p->data;
-               xml_add_layout (layout, node, ns);
-       }
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Add XML Sheet->Label->Layout Node.                             */
-/*--------------------------------------------------------------------------*/
-static void
-xml_add_layout (glTemplateLayout *layout,
-               xmlNodePtr        root,
-               xmlNsPtr          ns)
-{
-       xmlNodePtr  node;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       node = xmlNewChild(root, ns, "Layout", NULL);
-       gl_xml_set_prop_int (node, "nx", layout->nx);
-       gl_xml_set_prop_int (node, "ny", layout->ny);
-       gl_xml_set_prop_double (node, "x0", layout->x0);
-       gl_xml_set_prop_double (node, "y0", layout->y0);
-       gl_xml_set_prop_double (node, "dx", layout->dx);
-       gl_xml_set_prop_double (node, "dy", layout->dy);
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Add XML Sheet->Label->Markup (margin) Node.                    */
-/*--------------------------------------------------------------------------*/
-static void
-xml_add_markup_margin (glTemplateMarkupMargin *margin,
-                      xmlNodePtr              root,
-                      xmlNsPtr                ns)
-{
-       xmlNodePtr  node;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       node = xmlNewChild(root, ns, "Markup", NULL);
-       xmlSetProp (node, "type", "margin");
-
-       gl_xml_set_prop_double (node, "size", margin->size);
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Add XML Sheet->Label->Markup (line) Node.                      */
-/*--------------------------------------------------------------------------*/
-static void
-xml_add_markup_line (glTemplateMarkupLine *line,
-                    xmlNodePtr            root,
-                    xmlNsPtr              ns)
-{
-       xmlNodePtr  node;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       node = xmlNewChild(root, ns, "Markup", NULL);
-       xmlSetProp (node, "type", "line");
-
-       gl_xml_set_prop_double (node, "x1", line->x1);
-       gl_xml_set_prop_double (node, "y1", line->y1);
-       gl_xml_set_prop_double (node, "x2", line->x2);
-       gl_xml_set_prop_double (node, "y2", line->y2);
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Add XML Sheet->Alias Node.                                     */
-/*--------------------------------------------------------------------------*/
-static void
-xml_add_alias (gchar      *name,
-              xmlNodePtr  root,
-              xmlNsPtr    ns)
-{
-       xmlNodePtr node;
-
-       gl_debug (DEBUG_TEMPLATE, "START");
-
-       node = xmlNewChild (root, ns, "Alias", NULL);
-       xmlSetProp (node, "name", name);
-
-       gl_debug (DEBUG_TEMPLATE, "END");
-}
-
 /****************************************************************************/
 /* Get label size description.                                              */ 
 /****************************************************************************/
@@ -1167,16 +662,16 @@ gl_template_get_layout_desc (const glTemplate *template)
        return string;
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Create new layout structure.                                   */
-/*--------------------------------------------------------------------------*/
-static glTemplateLayout *
-layout_new (gdouble nx,
-           gdouble ny,
-           gdouble x0,
-           gdouble y0,
-           gdouble dx,
-           gdouble dy)
+/*****************************************************************************/
+/* Create new layout structure.                                              */
+/*****************************************************************************/
+glTemplateLayout *
+gl_template_layout_new (gdouble nx,
+                       gdouble ny,
+                       gdouble x0,
+                       gdouble y0,
+                       gdouble dx,
+                       gdouble dy)
 {
        glTemplateLayout *layout;
 
@@ -1218,11 +713,11 @@ layout_free (glTemplateLayout **layout)
        *layout = NULL;
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Create new margin markup structure.                            */
-/*--------------------------------------------------------------------------*/
-static glTemplateMarkup *
-markup_margin_new (gdouble size)
+/*****************************************************************************/
+/* Create new margin markup structure.                                       */
+/*****************************************************************************/
+glTemplateMarkup *
+gl_template_markup_margin_new (gdouble size)
 {
        glTemplateMarkup *markup;
 
@@ -1234,14 +729,14 @@ markup_margin_new (gdouble size)
        return markup;
 }
 
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Create new margin line structure.                              */
-/*--------------------------------------------------------------------------*/
-static glTemplateMarkup *
-markup_line_new (gdouble x1,
-                gdouble y1,
-                gdouble x2,
-                gdouble y2)
+/*****************************************************************************/
+/* Create new margin line structure.                                         */
+/*****************************************************************************/
+glTemplateMarkup *
+gl_template_markup_line_new (gdouble x1,
+                            gdouble y1,
+                            gdouble x2,
+                            gdouble y2)
 {
        glTemplateMarkup *markup;
 
index d9e596a0362eb31414f099a87f5addd7987685a1..43a25f75f447e5943c0273db8bf539b053892b8b 100644 (file)
@@ -164,6 +164,20 @@ gint                 gl_template_get_n_labels        (const glTemplate  *templat
 glTemplateOrigin    *gl_template_get_origins         (const glTemplate  *template);
 gchar               *gl_template_get_layout_desc     (const glTemplate  *template);
 
+glTemplateLayout    *gl_template_layout_new          (gdouble            nx,
+                                                     gdouble            ny,
+                                                     gdouble            x0,
+                                                     gdouble            y0,
+                                                     gdouble            dx,
+                                                     gdouble            dy);
+
+glTemplateMarkup    *gl_template_markup_margin_new   (gdouble            size);
+glTemplateMarkup    *gl_template_markup_line_new     (gdouble            x1,
+                                                     gdouble            y1,
+                                                     gdouble            x2,
+                                                     gdouble            y2);
+
+
 G_END_DECLS
 
 #endif
index 37f7f71efb3dd5d9be8e85d5ece01dde5929ad41..15de406412b77f048655031870a6f53939978b90 100644 (file)
@@ -40,6 +40,7 @@
 #include "base64.h"
 #include "xml-label.h"
 #include "xml-label-04.h"
+#include "xml-template.h"
 #include "xml.h"
 #include "util.h"
 
@@ -302,7 +303,7 @@ xml_parse_label (xmlNodePtr        root,
        for (node = root->xmlChildrenNode; node != NULL; node = node->next) {
 
                if (g_strcasecmp (node->name, "Sheet") == 0) {
-                       template = gl_template_xml_parse_sheet (node);
+                       template = gl_xml_template_parse_sheet (node);
                        if (!template) {
                                *status = XML_LABEL_UNKNOWN_MEDIA;
                                return NULL;
@@ -884,7 +885,7 @@ xml_label_to_doc (glLabel          *label,
        xmlSetNs (doc->xmlRootNode, ns);
 
        template = gl_label_get_template (label);
-       gl_template_xml_add_sheet (template, doc->xmlRootNode, ns);
+       gl_xml_template_add_sheet (template, doc->xmlRootNode, ns);
 
        xml_create_objects (doc->xmlRootNode, ns, label);
 
diff --git a/glabels2/src/xml-template.c b/glabels2/src/xml-template.c
new file mode 100644 (file)
index 0000000..5fc3b22
--- /dev/null
@@ -0,0 +1,537 @@
+/*
+ *  (GLABELS) Label and Business Card Creation program for GNOME
+ *
+ *  xml-template.c:  template xml module
+ *
+ *  Copyright (C) 2001-2003  Jim Evins <evins@snaught.com>.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <libgnomeprint/gnome-print-paper.h>
+
+#include "util.h"
+#include "xml.h"
+#include "xml-template.h"
+
+#include "debug.h"
+
+/*===========================================*/
+/* Private types                             */
+/*===========================================*/
+
+/*===========================================*/
+/* Private globals                           */
+/*===========================================*/
+
+/*===========================================*/
+/* Local function prototypes                 */
+/*===========================================*/
+static void        xml_parse_label              (xmlNodePtr              label_node,
+                                                glTemplate             *template);
+static void        xml_parse_layout             (xmlNodePtr              layout_node,
+                                                glTemplate             *template);
+static void        xml_parse_markup             (xmlNodePtr              markup_node,
+                                                glTemplate             *template);
+static void        xml_parse_alias              (xmlNodePtr              alias_node,
+                                                glTemplate             *template);
+
+static void        xml_add_label                (const glTemplate       *template,
+                                                xmlNodePtr              root,
+                                                xmlNsPtr                ns);
+static void        xml_add_layout               (glTemplateLayout       *layout,
+                                                xmlNodePtr              root,
+                                                xmlNsPtr                ns);
+static void        xml_add_markup_margin        (glTemplateMarkupMargin *margin,
+                                                xmlNodePtr              root,
+                                                xmlNsPtr                ns);
+static void        xml_add_markup_line          (glTemplateMarkupLine   *line,
+                                                xmlNodePtr              root,
+                                                xmlNsPtr                ns);
+static void        xml_add_alias                (gchar                  *name,
+                                                xmlNodePtr              root,
+                                                xmlNsPtr                ns);
+
+
+/*****************************************************************************/
+/* Read templates from template file.                                        */
+/*****************************************************************************/
+GList *
+gl_xml_template_read_templates_from_file (GList *templates,
+                                         gchar *xml_filename)
+{
+       xmlDocPtr   doc;
+       xmlNodePtr  root, node;
+       glTemplate *template;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       doc = xmlParseFile (xml_filename);
+       if (!doc) {
+               g_warning ("\"%s\" is not a glabels template file (not XML)",
+                     xml_filename);
+               return templates;
+       }
+
+       root = xmlDocGetRootElement (doc);
+       if (!root || !root->name) {
+               g_warning ("\"%s\" is not a glabels template file (no root node)",
+                     xml_filename);
+               xmlFreeDoc (doc);
+               return templates;
+       }
+       if (g_strcasecmp (root->name, "glabels-templates") != 0) {
+               g_warning ("\"%s\" is not a glabels template file (wrong root node)",
+                     xml_filename);
+               xmlFreeDoc (doc);
+               return templates;
+       }
+
+       for (node = root->xmlChildrenNode; node != NULL; node = node->next) {
+
+               if (g_strcasecmp (node->name, "Sheet") == 0) {
+                       template = gl_xml_template_parse_sheet (node);
+                       templates = g_list_append (templates, template);
+               } else {
+                       if ( !xmlNodeIsText(node) ) {
+                               if (g_strcasecmp (node->name,"comment") != 0) {
+                                       g_warning ("bad node =  \"%s\"",node->name);
+                               }
+                       }
+               }
+       }
+
+       xmlFreeDoc (doc);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+       return templates;
+}
+
+/*****************************************************************************/
+/* Parse XML template Node.                                                  */
+/*****************************************************************************/
+glTemplate *
+gl_xml_template_parse_sheet (xmlNodePtr sheet_node)
+{
+       glTemplate            *template;
+       xmlNodePtr             node;
+       const GnomePrintPaper *paper;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       template = g_new0 (glTemplate, 1);
+
+       template->name = g_list_append (template->name,
+                                       xmlGetProp (sheet_node, "name"));
+       gl_debug (DEBUG_TEMPLATE, "Sheet = %s", template->name->data);
+
+       template->page_size = xmlGetProp (sheet_node, "size");
+       if ( strcmp (template->page_size,"US-Letter") == 0 ) {
+               template->page_size = "US Letter";
+       }
+       if (g_strcasecmp (template->page_size, "Other") == 0) {
+
+               template->page_width = gl_xml_get_prop_double (sheet_node, "width", 0);
+               template->page_height = gl_xml_get_prop_double (sheet_node, "height", 0);
+
+       } else {
+               paper = gnome_print_paper_get_by_name (template->page_size);
+               if (paper != NULL) {
+                       template->page_width  = paper->width;
+                       template->page_height = paper->height;
+               } else {
+                       g_warning (_("Unknown page size \"%s\""), template->page_size);
+               }
+       }
+
+       template->description = xmlGetProp (sheet_node, "description");
+
+       for (node = sheet_node->xmlChildrenNode; node != NULL;
+            node = node->next) {
+               if (g_strcasecmp (node->name, "Label") == 0) {
+                       xml_parse_label (node, template);
+               } else if (g_strcasecmp (node->name, "Alias") == 0) {
+                       xml_parse_alias (node, template);
+               } else {
+                       if (g_strcasecmp (node->name, "text") != 0) {
+                               g_warning ("bad node =  \"%s\"", node->name);
+                       }
+               }
+       }
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+
+       return template;
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Parse XML Sheet->Label Node.                                   */
+/*--------------------------------------------------------------------------*/
+static void
+xml_parse_label (xmlNodePtr  label_node,
+                glTemplate *template)
+{
+       xmlNodePtr  node;
+       gchar      *style;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       style = xmlGetProp (label_node, "style");
+       if (g_strcasecmp (style, "rectangle") == 0) {
+               template->label.style = GL_TEMPLATE_STYLE_RECT;
+       } else if (g_strcasecmp (style, "round") == 0) {
+               template->label.style = GL_TEMPLATE_STYLE_ROUND;
+       } else if (g_strcasecmp (style, "cd") == 0) {
+               template->label.style = GL_TEMPLATE_STYLE_CD;
+       } else {
+               template->label.style = GL_TEMPLATE_STYLE_RECT;
+               g_warning ("Unknown label style in template");
+       }
+       g_free (style);
+
+       switch (template->label.style) {
+
+       case GL_TEMPLATE_STYLE_RECT:
+               template->label.rect.w = gl_xml_get_prop_double (label_node, "width", 0);
+               template->label.rect.h = gl_xml_get_prop_double (label_node, "height", 0);
+               template->label.rect.r = gl_xml_get_prop_double (label_node, "round", 0);
+               break;
+
+       case GL_TEMPLATE_STYLE_ROUND:
+               template->label.round.r = gl_xml_get_prop_double (label_node, "radius", 0);
+               break;
+
+       case GL_TEMPLATE_STYLE_CD:
+               template->label.cd.r1 = gl_xml_get_prop_double (label_node, "radius", 0);
+               template->label.cd.r2 = gl_xml_get_prop_double (label_node, "hole", 0);
+               template->label.cd.w  = gl_xml_get_prop_double (label_node, "width", 0);
+               template->label.cd.h  = gl_xml_get_prop_double (label_node, "height", 0);
+               break;
+
+       default:
+               break;
+
+       }
+
+       for (node = label_node->xmlChildrenNode; node != NULL;
+            node = node->next) {
+               if (g_strcasecmp (node->name, "Layout") == 0) {
+                       xml_parse_layout (node, template);
+               } else if (g_strcasecmp (node->name, "Markup") == 0) {
+                       xml_parse_markup (node, template);
+               } else if (g_strcasecmp (node->name, "text") != 0) {
+                       g_warning ("bad node =  \"%s\"", node->name);
+               }
+       }
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Parse XML Sheet->Label->Layout Node.                           */
+/*--------------------------------------------------------------------------*/
+static void
+xml_parse_layout (xmlNodePtr  layout_node,
+                 glTemplate *template)
+{
+       gint        nx, ny;
+       gdouble     x0, y0, dx, dy;
+       xmlNodePtr  node;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       nx = gl_xml_get_prop_int (layout_node, "nx", 1);
+       ny = gl_xml_get_prop_int (layout_node, "ny", 1);
+
+       x0 = gl_xml_get_prop_double (layout_node, "x0", 0);
+       y0 = gl_xml_get_prop_double (layout_node, "y0", 0);
+
+       dx = gl_xml_get_prop_double (layout_node, "dx", 0);
+       dy = gl_xml_get_prop_double (layout_node, "dy", 0);
+
+       for (node = layout_node->xmlChildrenNode; node != NULL;
+            node = node->next) {
+               if (g_strcasecmp (node->name, "text") != 0) {
+                       g_warning ("bad node =  \"%s\"", node->name);
+               }
+       }
+
+       template->label.any.layouts =
+               g_list_append (template->label.any.layouts,
+                              gl_template_layout_new (nx, ny, x0, y0, dx, dy));
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Parse XML Sheet->Label->Markup Node.                           */
+/*--------------------------------------------------------------------------*/
+static void
+xml_parse_markup (xmlNodePtr  markup_node,
+                 glTemplate *template)
+{
+       gchar      *type;
+       gdouble     size;
+       gdouble     x1, y1, x2, y2;
+       xmlNodePtr  node;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       type = xmlGetProp (markup_node, "type");
+       if (g_strcasecmp (type, "margin") == 0) {
+
+               size = gl_xml_get_prop_double (markup_node, "size", 0);
+
+               template->label.any.markups =
+                       g_list_append (template->label.any.markups,
+                                      gl_template_markup_margin_new (size));
+
+       } else if (g_strcasecmp (type, "line") == 0) {
+
+               x1 = gl_xml_get_prop_double (markup_node, "x1", 0);
+               y1 = gl_xml_get_prop_double (markup_node, "y1", 0);
+               x2 = gl_xml_get_prop_double (markup_node, "x2", 0);
+               y2 = gl_xml_get_prop_double (markup_node, "y2", 0);
+
+               template->label.any.markups =
+                       g_list_append (template->label.any.markups,
+                                      gl_template_markup_line_new (x1, y1, x2, y2));
+       }
+       g_free (type);
+
+       for (node = markup_node->xmlChildrenNode; node != NULL;
+            node = node->next) {
+               if (g_strcasecmp (node->name, "text") != 0) {
+                       g_warning ("bad node =  \"%s\"", node->name);
+               }
+       }
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Parse XML Sheet->Alias Node.                                   */
+/*--------------------------------------------------------------------------*/
+static void
+xml_parse_alias (xmlNodePtr  alias_node,
+                glTemplate *template)
+{
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       template->name = g_list_append (template->name,
+                                       xmlGetProp (alias_node, "name"));
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/****************************************************************************/
+/* Add XML Template Node                                                    */
+/****************************************************************************/
+void
+gl_xml_template_add_sheet (const glTemplate *template,
+                          xmlNodePtr        root,
+                          xmlNsPtr          ns)
+{
+       xmlNodePtr  node;
+       GList      *p;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       node = xmlNewChild (root, ns, "Sheet", NULL);
+
+       xmlSetProp (node, "name", template->name->data);
+
+       xmlSetProp (node, "size", template->page_size);
+       if (g_strcasecmp (template->page_size, "Other") == 0) {
+
+               gl_xml_set_prop_double (node, "width", template->page_width);
+               gl_xml_set_prop_double (node, "height", template->page_height);
+
+       }
+
+       xmlSetProp (node, "description", template->description);
+
+       xml_add_label (template, node, ns);
+
+       for ( p=template->name->next; p != NULL; p=p->next ) {
+               xml_add_alias( p->data, node, ns );
+       }
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Add XML Sheet->Label Node.                                     */
+/*--------------------------------------------------------------------------*/
+static void
+xml_add_label (const glTemplate *template,
+              xmlNodePtr        root,
+              xmlNsPtr          ns)
+{
+       xmlNodePtr        node;
+       GList            *p;
+       glTemplateMarkup *markup;
+       glTemplateLayout *layout;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       node = xmlNewChild(root, ns, "Label", NULL);
+
+       xmlSetProp (node, "id", "0");
+
+       switch (template->label.style) {
+
+       case GL_TEMPLATE_STYLE_RECT:
+               xmlSetProp (node, "style", "rectangle");
+               gl_xml_set_prop_double (node, "width",  template->label.rect.w);
+               gl_xml_set_prop_double (node, "height", template->label.rect.h);
+               gl_xml_set_prop_double (node, "round",  template->label.rect.r);
+               break;
+
+       case GL_TEMPLATE_STYLE_ROUND:
+               xmlSetProp (node, "style", "round");
+               gl_xml_set_prop_double (node, "radius",  template->label.round.r);
+               break;
+
+       case GL_TEMPLATE_STYLE_CD:
+               xmlSetProp (node, "style", "cd");
+               gl_xml_set_prop_double (node, "radius",  template->label.cd.r1);
+               gl_xml_set_prop_double (node, "hole",    template->label.cd.r2);
+               if (template->label.cd.w != 0.0) {
+                       gl_xml_set_prop_double (node, "width",  template->label.cd.w);
+               }
+               if (template->label.cd.h != 0.0) {
+                       gl_xml_set_prop_double (node, "height", template->label.cd.h);
+               }
+               break;
+
+       default:
+               g_warning ("Unknown label style");
+               break;
+
+       }
+
+       for ( p=template->label.any.markups; p != NULL; p=p->next ) {
+               markup = (glTemplateMarkup *)p->data;
+               switch (markup->type) {
+               case GL_TEMPLATE_MARKUP_MARGIN:
+                       xml_add_markup_margin ((glTemplateMarkupMargin *)markup,
+                                              node, ns);
+                       break;
+               case GL_TEMPLATE_MARKUP_LINE:
+                       xml_add_markup_line ((glTemplateMarkupLine *)markup,
+                                            node, ns);
+                       break;
+               default:
+                       g_warning ("Unknown markup type");
+                       break;
+               }
+       }
+
+       for ( p=template->label.any.layouts; p != NULL; p=p->next ) {
+               layout = (glTemplateLayout *)p->data;
+               xml_add_layout (layout, node, ns);
+       }
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Add XML Sheet->Label->Layout Node.                             */
+/*--------------------------------------------------------------------------*/
+static void
+xml_add_layout (glTemplateLayout *layout,
+               xmlNodePtr        root,
+               xmlNsPtr          ns)
+{
+       xmlNodePtr  node;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       node = xmlNewChild(root, ns, "Layout", NULL);
+       gl_xml_set_prop_int (node, "nx", layout->nx);
+       gl_xml_set_prop_int (node, "ny", layout->ny);
+       gl_xml_set_prop_double (node, "x0", layout->x0);
+       gl_xml_set_prop_double (node, "y0", layout->y0);
+       gl_xml_set_prop_double (node, "dx", layout->dx);
+       gl_xml_set_prop_double (node, "dy", layout->dy);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Add XML Sheet->Label->Markup (margin) Node.                    */
+/*--------------------------------------------------------------------------*/
+static void
+xml_add_markup_margin (glTemplateMarkupMargin *margin,
+                      xmlNodePtr              root,
+                      xmlNsPtr                ns)
+{
+       xmlNodePtr  node;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       node = xmlNewChild(root, ns, "Markup", NULL);
+       xmlSetProp (node, "type", "margin");
+
+       gl_xml_set_prop_double (node, "size", margin->size);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Add XML Sheet->Label->Markup (line) Node.                      */
+/*--------------------------------------------------------------------------*/
+static void
+xml_add_markup_line (glTemplateMarkupLine *line,
+                    xmlNodePtr            root,
+                    xmlNsPtr              ns)
+{
+       xmlNodePtr  node;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       node = xmlNewChild(root, ns, "Markup", NULL);
+       xmlSetProp (node, "type", "line");
+
+       gl_xml_set_prop_double (node, "x1", line->x1);
+       gl_xml_set_prop_double (node, "y1", line->y1);
+       gl_xml_set_prop_double (node, "x2", line->x2);
+       gl_xml_set_prop_double (node, "y2", line->y2);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Add XML Sheet->Alias Node.                                     */
+/*--------------------------------------------------------------------------*/
+static void
+xml_add_alias (gchar      *name,
+              xmlNodePtr  root,
+              xmlNsPtr    ns)
+{
+       xmlNodePtr node;
+
+       gl_debug (DEBUG_TEMPLATE, "START");
+
+       node = xmlNewChild (root, ns, "Alias", NULL);
+       xmlSetProp (node, "name", name);
+
+       gl_debug (DEBUG_TEMPLATE, "END");
+}
+
diff --git a/glabels2/src/xml-template.h b/glabels2/src/xml-template.h
new file mode 100644 (file)
index 0000000..b2efac9
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  (GLABELS) Label and Business Card Creation program for GNOME
+ *
+ *  xml-template.h:  template xml module header file
+ *
+ *  Copyright (C) 2001-2003  Jim Evins <evins@snaught.com>.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+#ifndef __XML_TEMPLATE_H__
+#define __XML_TEMPLATE_H__
+
+#include <libgnome/libgnome.h>
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+
+#include "template.h"
+
+G_BEGIN_DECLS
+
+GList       *gl_xml_template_read_templates_from_file (GList             *templates,
+                                                      gchar             *xml_filename);
+
+glTemplate  *gl_xml_template_parse_sheet              (xmlNodePtr         sheet_node);
+
+void         gl_xml_template_add_sheet                (const glTemplate  *template,
+                                                      xmlNodePtr         root,
+                                                      xmlNsPtr           ns);
+
+G_END_DECLS
+
+#endif /* __XML_TEMPLATE_H__ */