1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
4 * (LIBGLABELS) Template library for GLABELS
6 * xml-template.c: template xml module
8 * Copyright (C) 2001-2006 Jim Evins <evins@snaught.com>.
10 * This file is part of the LIBGLABELS library.
12 * This library is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Library General Public
14 * License as published by the Free Software Foundation; either
15 * version 2 of the License, or (at your option) any later version.
17 * This library is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Library General Public License for more details.
22 * You should have received a copy of the GNU Library General Public
23 * License along with this library; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
29 #include "xml-template.h"
31 #include <glib/gi18n.h>
32 #include <glib/gmessages.h>
36 #include "libglabels-private.h"
41 /*===========================================*/
43 /*===========================================*/
45 /*===========================================*/
47 /*===========================================*/
49 /*===========================================*/
50 /* Local function prototypes */
51 /*===========================================*/
52 static void xml_parse_meta_node (xmlNodePtr label_node,
53 lglTemplate *template);
54 static void xml_parse_label_rectangle_node (xmlNodePtr label_node,
55 lglTemplate *template);
56 static void xml_parse_label_round_node (xmlNodePtr label_node,
57 lglTemplate *template);
58 static void xml_parse_label_cd_node (xmlNodePtr label_node,
59 lglTemplate *template);
60 static void xml_parse_layout_node (xmlNodePtr layout_node,
61 lglTemplateFrame *frame);
62 static void xml_parse_markup_margin_node (xmlNodePtr markup_node,
63 lglTemplateFrame *frame);
64 static void xml_parse_markup_line_node (xmlNodePtr markup_node,
65 lglTemplateFrame *frame);
66 static void xml_parse_markup_circle_node (xmlNodePtr markup_node,
67 lglTemplateFrame *frame);
68 static void xml_parse_markup_rect_node (xmlNodePtr markup_node,
69 lglTemplateFrame *frame);
70 static void xml_parse_alias_node (xmlNodePtr alias_node,
71 lglTemplate *template);
73 static void xml_create_meta_node (const gchar *category,
76 static void xml_create_label_node (const lglTemplateFrame *frame,
79 static void xml_create_layout_node (const lglTemplateLayout *layout,
82 static void xml_create_markup_margin_node (const lglTemplateMarkup *margin,
85 static void xml_create_markup_line_node (const lglTemplateMarkup *line,
88 static void xml_create_markup_circle_node (const lglTemplateMarkup *circle,
91 static void xml_create_markup_rect_node (const lglTemplateMarkup *circle,
94 static void xml_create_alias_node (const lglTemplateAlias *alias,
100 * lgl_xml_template_read_templates_from_file:
101 * @utf8_filename: Filename of papers file (name encoded as UTF-8)
103 * Read glabels templates from template file.
105 * Returns: a list of #lglTemplate structures.
109 lgl_xml_template_read_templates_from_file (const gchar *utf8_filename)
112 xmlDocPtr templates_doc;
113 GList *templates = NULL;
117 filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
119 g_message ("Utf8 filename conversion error");
123 templates_doc = xmlParseFile (filename);
124 if (!templates_doc) {
125 g_message ("\"%s\" is not a glabels template file (not XML)",
130 templates = lgl_xml_template_parse_templates_doc (templates_doc);
133 xmlFreeDoc (templates_doc);
140 * lgl_xml_template_parse_templates_doc:
141 * @templates_doc: libxml #xmlDocPtr tree, representing template file.
143 * Read glabels templates from a libxml #xmlDocPtr tree.
145 * Returns: a list of #lglTemplate structures.
149 lgl_xml_template_parse_templates_doc (const xmlDocPtr templates_doc)
152 GList *templates = NULL;
153 xmlNodePtr root, node;
154 lglTemplate *template;
158 root = xmlDocGetRootElement (templates_doc);
159 if (!root || !root->name) {
160 g_message ("\"%s\" is not a glabels template file (no root node)",
164 if (!lgl_xml_is_node (root, "Glabels-templates")) {
165 g_message ("\"%s\" is not a glabels template file (wrong root node)",
170 for (node = root->xmlChildrenNode; node != NULL; node = node->next) {
172 if (lgl_xml_is_node (node, "Template")) {
173 template = lgl_xml_template_parse_template_node (node);
174 templates = g_list_append (templates, template);
176 if ( !xmlNodeIsText(node) ) {
177 if (!lgl_xml_is_node (node,"comment")) {
178 g_message ("bad node = \"%s\"",node->name);
189 * lgl_xml_template_parse_template_node:
190 * @template_node: libxml #xmlNodePtr template node from a #xmlDocPtr tree.
192 * Read a single glabels template from a libxml #xmlNodePtr node.
194 * Returns: a pointer to a newly created #lglTemplate structure.
198 lgl_xml_template_parse_template_node (const xmlNodePtr template_node)
205 gdouble page_width, page_height;
206 lglPaper *paper = NULL;
207 lglTemplate *template;
211 brand = lgl_xml_get_prop_string (template_node, "brand", NULL);
212 part = lgl_xml_get_prop_string (template_node, "part", NULL);
215 name = lgl_xml_get_prop_string (template_node, "name", NULL);
218 v = g_strsplit (name, " ", 2);
219 brand = g_strdup (v[0]);
220 part = g_strchug (g_strdup (v[1]));
227 g_message (_("Missing name or brand/part attributes."));
231 description = lgl_xml_get_prop_i18n_string (template_node, "description", NULL);
232 paper_id = lgl_xml_get_prop_string (template_node, "size", NULL);
234 if (lgl_db_is_paper_id_other (paper_id)) {
236 page_width = lgl_xml_get_prop_length (template_node, "width", 0);
237 page_height = lgl_xml_get_prop_length (template_node, "height", 0);
240 paper = lgl_db_lookup_paper_from_id (paper_id);
242 /* This should always be an id, but just in case a name
244 g_message (_("Unknown page size id \"%s\", trying as name"),
246 paper = lgl_db_lookup_paper_from_name (paper_id);
248 paper_id = g_strdup (paper->id);
251 page_width = paper->width;
252 page_height = paper->height;
256 g_message (_("Unknown page size id or name \"%s\""),
259 lgl_paper_free (paper);
263 template = lgl_template_new (brand, part, description,
264 paper_id, page_width, page_height);
266 for (node = template_node->xmlChildrenNode; node != NULL;
268 if (lgl_xml_is_node (node, "Meta")) {
269 xml_parse_meta_node (node, template);
270 } else if (lgl_xml_is_node (node, "Label-rectangle")) {
271 xml_parse_label_rectangle_node (node, template);
272 } else if (lgl_xml_is_node (node, "Label-round")) {
273 xml_parse_label_round_node (node, template);
274 } else if (lgl_xml_is_node (node, "Label-cd")) {
275 xml_parse_label_cd_node (node, template);
276 } else if (lgl_xml_is_node (node, "Alias")) {
277 xml_parse_alias_node (node, template);
279 if (!xmlNodeIsText (node)) {
280 if (!lgl_xml_is_node (node,"comment")) {
281 g_message ("bad node = \"%s\"",node->name);
289 g_free (description);
293 * Create a default full-page frame, if a known frame type was not found.
295 if ( template->frames == NULL )
297 lglTemplateFrame *frame;
299 frame = lgl_template_frame_rect_new ("0", page_width, page_height, 0, 0, 0);
300 lgl_template_frame_add_layout (frame, lgl_template_layout_new (1, 1, 0, 0, 0, 0));
301 lgl_template_add_frame (template, frame);
307 /*--------------------------------------------------------------------------*/
308 /* PRIVATE. Parse XML Template->Meta Node. */
309 /*--------------------------------------------------------------------------*/
311 xml_parse_meta_node (xmlNodePtr meta_node,
312 lglTemplate *template)
316 category = lgl_xml_get_prop_string (meta_node, "category", NULL);
318 if (category != NULL)
320 lgl_template_add_category (template, category);
325 /*--------------------------------------------------------------------------*/
326 /* PRIVATE. Parse XML Template->Label-rectangle Node. */
327 /*--------------------------------------------------------------------------*/
329 xml_parse_label_rectangle_node (xmlNodePtr label_node,
330 lglTemplate *template)
334 gdouble x_waste, y_waste;
336 lglTemplateFrame *frame;
339 id = lgl_xml_get_prop_string (label_node, "id", NULL);
341 if ((tmp = lgl_xml_get_prop_string (label_node, "waste", NULL))) {
342 /* Handle single "waste" property. */
343 x_waste = y_waste = lgl_xml_get_prop_length (label_node, "waste", 0);
346 x_waste = lgl_xml_get_prop_length (label_node, "x_waste", 0);
347 y_waste = lgl_xml_get_prop_length (label_node, "y_waste", 0);
350 w = lgl_xml_get_prop_length (label_node, "width", 0);
351 h = lgl_xml_get_prop_length (label_node, "height", 0);
352 r = lgl_xml_get_prop_length (label_node, "round", 0);
354 frame = lgl_template_frame_rect_new ((gchar *)id, w, h, r, x_waste, y_waste);
355 lgl_template_add_frame (template, frame);
357 for (node = label_node->xmlChildrenNode; node != NULL;
359 if (lgl_xml_is_node (node, "Layout")) {
360 xml_parse_layout_node (node, frame);
361 } else if (lgl_xml_is_node (node, "Markup-margin")) {
362 xml_parse_markup_margin_node (node, frame);
363 } else if (lgl_xml_is_node (node, "Markup-line")) {
364 xml_parse_markup_line_node (node, frame);
365 } else if (lgl_xml_is_node (node, "Markup-circle")) {
366 xml_parse_markup_circle_node (node, frame);
367 } else if (lgl_xml_is_node (node, "Markup-rect")) {
368 xml_parse_markup_rect_node (node, frame);
369 } else if (!xmlNodeIsText (node)) {
370 if (!lgl_xml_is_node (node, "comment")) {
371 g_message ("bad node = \"%s\"",node->name);
379 /*--------------------------------------------------------------------------*/
380 /* PRIVATE. Parse XML Template->Label-round Node. */
381 /*--------------------------------------------------------------------------*/
383 xml_parse_label_round_node (xmlNodePtr label_node,
384 lglTemplate *template)
389 lglTemplateFrame *frame;
392 id = lgl_xml_get_prop_string (label_node, "id", NULL);
393 waste = lgl_xml_get_prop_length (label_node, "waste", 0);
394 r = lgl_xml_get_prop_length (label_node, "radius", 0);
396 frame = lgl_template_frame_round_new ((gchar *)id, r, waste);
397 lgl_template_add_frame (template, frame);
399 for (node = label_node->xmlChildrenNode; node != NULL;
401 if (lgl_xml_is_node (node, "Layout")) {
402 xml_parse_layout_node (node, frame);
403 } else if (lgl_xml_is_node (node, "Markup-margin")) {
404 xml_parse_markup_margin_node (node, frame);
405 } else if (lgl_xml_is_node (node, "Markup-line")) {
406 xml_parse_markup_line_node (node, frame);
407 } else if (lgl_xml_is_node (node, "Markup-circle")) {
408 xml_parse_markup_circle_node (node, frame);
409 } else if (lgl_xml_is_node (node, "Markup-rect")) {
410 xml_parse_markup_rect_node (node, frame);
411 } else if (!xmlNodeIsText (node)) {
412 if (!lgl_xml_is_node (node, "comment")) {
413 g_message ("bad node = \"%s\"",node->name);
421 /*--------------------------------------------------------------------------*/
422 /* PRIVATE. Parse XML Template->Label-cd Node. */
423 /*--------------------------------------------------------------------------*/
425 xml_parse_label_cd_node (xmlNodePtr label_node,
426 lglTemplate *template)
430 gdouble r1, r2, w, h;
431 lglTemplateFrame *frame;
434 id = lgl_xml_get_prop_string (label_node, "id", NULL);
435 waste = lgl_xml_get_prop_length (label_node, "waste", 0);
436 r1 = lgl_xml_get_prop_length (label_node, "radius", 0);
437 r2 = lgl_xml_get_prop_length (label_node, "hole", 0);
438 w = lgl_xml_get_prop_length (label_node, "width", 0);
439 h = lgl_xml_get_prop_length (label_node, "height", 0);
441 frame = lgl_template_frame_cd_new ((gchar *)id, r1, r2, w, h, waste);
442 lgl_template_add_frame (template, frame);
444 for (node = label_node->xmlChildrenNode; node != NULL;
446 if (lgl_xml_is_node (node, "Layout")) {
447 xml_parse_layout_node (node, frame);
448 } else if (lgl_xml_is_node (node, "Markup-margin")) {
449 xml_parse_markup_margin_node (node, frame);
450 } else if (lgl_xml_is_node (node, "Markup-line")) {
451 xml_parse_markup_line_node (node, frame);
452 } else if (lgl_xml_is_node (node, "Markup-circle")) {
453 xml_parse_markup_circle_node (node, frame);
454 } else if (lgl_xml_is_node (node, "Markup-rect")) {
455 xml_parse_markup_rect_node (node, frame);
456 } else if (!xmlNodeIsText (node)) {
457 if (!lgl_xml_is_node (node, "comment")) {
458 g_message ("bad node = \"%s\"",node->name);
466 /*--------------------------------------------------------------------------*/
467 /* PRIVATE. Parse XML Template->Label->Layout Node. */
468 /*--------------------------------------------------------------------------*/
470 xml_parse_layout_node (xmlNodePtr layout_node,
471 lglTemplateFrame *frame)
474 gdouble x0, y0, dx, dy;
477 nx = lgl_xml_get_prop_int (layout_node, "nx", 1);
478 ny = lgl_xml_get_prop_int (layout_node, "ny", 1);
480 x0 = lgl_xml_get_prop_length (layout_node, "x0", 0);
481 y0 = lgl_xml_get_prop_length (layout_node, "y0", 0);
483 dx = lgl_xml_get_prop_length (layout_node, "dx", 0);
484 dy = lgl_xml_get_prop_length (layout_node, "dy", 0);
486 lgl_template_frame_add_layout (frame, lgl_template_layout_new (nx, ny, x0, y0, dx, dy));
488 for (node = layout_node->xmlChildrenNode; node != NULL;
490 if (!xmlNodeIsText (node)) {
491 if (!lgl_xml_is_node (node, "comment")) {
492 g_message ("bad node = \"%s\"",node->name);
499 /*--------------------------------------------------------------------------*/
500 /* PRIVATE. Parse XML Template->Label->Markup-margin Node. */
501 /*--------------------------------------------------------------------------*/
503 xml_parse_markup_margin_node (xmlNodePtr markup_node,
504 lglTemplateFrame *frame)
509 size = lgl_xml_get_prop_length (markup_node, "size", 0);
511 lgl_template_frame_add_markup (frame, lgl_template_markup_margin_new (size));
513 for (node = markup_node->xmlChildrenNode; node != NULL;
515 if (!xmlNodeIsText (node)) {
516 if (!lgl_xml_is_node (node, "comment")) {
517 g_message ("bad node = \"%s\"",node->name);
524 /*--------------------------------------------------------------------------*/
525 /* PRIVATE. Parse XML Template->Label->Markup-line Node. */
526 /*--------------------------------------------------------------------------*/
528 xml_parse_markup_line_node (xmlNodePtr markup_node,
529 lglTemplateFrame *frame)
531 gdouble x1, y1, x2, y2;
534 x1 = lgl_xml_get_prop_length (markup_node, "x1", 0);
535 y1 = lgl_xml_get_prop_length (markup_node, "y1", 0);
536 x2 = lgl_xml_get_prop_length (markup_node, "x2", 0);
537 y2 = lgl_xml_get_prop_length (markup_node, "y2", 0);
539 lgl_template_frame_add_markup (frame, lgl_template_markup_line_new (x1, y1, x2, y2));
541 for (node = markup_node->xmlChildrenNode; node != NULL;
543 if (!xmlNodeIsText (node)) {
544 if (!lgl_xml_is_node (node, "comment")) {
545 g_message ("bad node = \"%s\"",node->name);
552 /*--------------------------------------------------------------------------*/
553 /* PRIVATE. Parse XML Template->Label->Markup-circle Node. */
554 /*--------------------------------------------------------------------------*/
556 xml_parse_markup_circle_node (xmlNodePtr markup_node,
557 lglTemplateFrame *frame)
562 x0 = lgl_xml_get_prop_length (markup_node, "x0", 0);
563 y0 = lgl_xml_get_prop_length (markup_node, "y0", 0);
564 r = lgl_xml_get_prop_length (markup_node, "radius", 0);
566 lgl_template_frame_add_markup (frame, lgl_template_markup_circle_new (x0, y0, r));
568 for (node = markup_node->xmlChildrenNode; node != NULL;
570 if (!xmlNodeIsText (node)) {
571 if (!lgl_xml_is_node (node, "comment")) {
572 g_message ("bad node = \"%s\"",node->name);
579 /*--------------------------------------------------------------------------*/
580 /* PRIVATE. Parse XML Template->Label->Markup-rect Node. */
581 /*--------------------------------------------------------------------------*/
583 xml_parse_markup_rect_node (xmlNodePtr markup_node,
584 lglTemplateFrame *frame)
586 gdouble x1, y1, w, h, r;
589 x1 = lgl_xml_get_prop_length (markup_node, "x1", 0);
590 y1 = lgl_xml_get_prop_length (markup_node, "y1", 0);
591 w = lgl_xml_get_prop_length (markup_node, "w", 0);
592 h = lgl_xml_get_prop_length (markup_node, "h", 0);
593 r = lgl_xml_get_prop_length (markup_node, "r", 0);
595 lgl_template_frame_add_markup (frame, lgl_template_markup_rect_new (x1, y1, w, h, r));
597 for (node = markup_node->xmlChildrenNode; node != NULL;
599 if (!xmlNodeIsText (node)) {
600 if (!lgl_xml_is_node (node, "comment")) {
601 g_message ("bad node = \"%s\"",node->name);
608 /*--------------------------------------------------------------------------*/
609 /* PRIVATE. Parse XML Template->Alias Node. */
610 /*--------------------------------------------------------------------------*/
612 xml_parse_alias_node (xmlNodePtr alias_node,
613 lglTemplate *template)
620 brand = lgl_xml_get_prop_string (alias_node, "brand", NULL);
621 part = lgl_xml_get_prop_string (alias_node, "part", NULL);
624 name = lgl_xml_get_prop_string (alias_node, "name", NULL);
627 g_message (_("Missing required \"brand\" or \"part\" attribute, trying deprecated name."));
628 v = g_strsplit (name, " ", 2);
629 brand = g_strdup (v[0]);
630 part = g_strdup (v[1]);
637 g_message (_("Name attribute also missing."));
641 lgl_template_add_alias (template, lgl_template_alias_new (brand, part));
648 * lgl_xml_template_write_templates_to_file:
649 * @templates: List of #lglTemplate structures
650 * @utf8_filename: Filename of templates file (name encoded as UTF-8)
652 * Write a list of #lglTemplate structures to a glabels XML template file.
654 * Returns: the number of bytes written or -1 in case of failure
658 lgl_xml_template_write_templates_to_file (GList *templates,
659 const gchar *utf8_filename)
665 lglTemplate *template;
668 doc = xmlNewDoc ((xmlChar *)"1.0");
669 doc->xmlRootNode = xmlNewDocNode (doc, NULL, (xmlChar *)"Glabels-templates", NULL);
671 ns = xmlNewNs (doc->xmlRootNode, (xmlChar *)LGL_XML_NAME_SPACE, NULL);
672 xmlSetNs (doc->xmlRootNode, ns);
674 for (p=templates; p!=NULL; p=p->next) {
675 template = (lglTemplate *)p->data;
676 lgl_xml_template_create_template_node (template, doc->xmlRootNode, ns);
679 filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
682 g_message (_("Utf8 conversion error."));
687 xmlSetDocCompressMode (doc, 0);
688 bytes_written = xmlSaveFormatFile (filename, doc, TRUE);
691 return bytes_written;
698 * lgl_xml_template_write_template_to_file:
699 * @template: #lglTemplate structure to be written
700 * @utf8_filename: Filename of templates file (name encoded as UTF-8)
702 * Write a single #lglTemplate structures to a glabels XML template file.
704 * Returns: the number of bytes written or -1 in case of failure
708 lgl_xml_template_write_template_to_file (const lglTemplate *template,
709 const gchar *utf8_filename)
711 GList *templates = NULL;
714 templates = g_list_append (templates, (gpointer)template);
716 bytes_written = lgl_xml_template_write_templates_to_file (templates, utf8_filename);
718 g_list_free (templates);
720 return bytes_written;
725 * lgl_xml_template_create_template_node:
726 * @template: #lglTemplate structure to be written
727 * @root: parent node to receive new child node
728 * @ns: a libxml #xmlNsPtr
730 * Add a single #lglTemplate child node to given #xmlNodePtr.
734 lgl_xml_template_create_template_node (const lglTemplate *template,
740 lglTemplateAlias *alias;
741 lglTemplateFrame *frame;
743 node = xmlNewChild (root, ns, (xmlChar *)"Template", NULL);
745 lgl_xml_set_prop_string (node, "brand", template->brand);
746 lgl_xml_set_prop_string (node, "part", template->part);
748 lgl_xml_set_prop_string (node, "size", template->paper_id);
749 if (xmlStrEqual ((xmlChar *)template->paper_id, (xmlChar *)"Other"))
752 lgl_xml_set_prop_length (node, "width", template->page_width);
753 lgl_xml_set_prop_length (node, "height", template->page_height);
757 lgl_xml_set_prop_string (node, "description", template->description);
759 for ( p=template->aliases; p != NULL; p=p->next ) {
760 alias = (lglTemplateAlias *)p->data;
761 if ( !(xmlStrEqual ((xmlChar *)template->brand, (xmlChar *)alias->brand) &&
762 xmlStrEqual ((xmlChar *)template->part, (xmlChar *)alias->part)) )
764 xml_create_alias_node ( alias, node, ns );
767 for ( p=template->category_ids; p != NULL; p=p->next )
769 xml_create_meta_node ( p->data, node, ns );
771 for ( p=template->frames; p != NULL; p=p->next )
773 frame = (lglTemplateFrame *)p->data;
774 xml_create_label_node (frame, node, ns);
779 /*--------------------------------------------------------------------------*/
780 /* PRIVATE. Add XML Template->Meta Node. */
781 /*--------------------------------------------------------------------------*/
783 xml_create_meta_node (const gchar *category,
789 node = xmlNewChild (root, ns, (xmlChar *)"Meta", NULL);
790 lgl_xml_set_prop_string (node, "category", category);
794 /*--------------------------------------------------------------------------*/
795 /* PRIVATE. Add XML Template->Label Node. */
796 /*--------------------------------------------------------------------------*/
798 xml_create_label_node (const lglTemplateFrame *frame,
804 lglTemplateMarkup *markup;
805 lglTemplateLayout *layout;
807 switch (frame->shape) {
809 case LGL_TEMPLATE_FRAME_SHAPE_RECT:
810 node = xmlNewChild(root, ns, (xmlChar *)"Label-rectangle", NULL);
811 lgl_xml_set_prop_string (node, "id", frame->all.id);
812 lgl_xml_set_prop_length (node, "width", frame->rect.w);
813 lgl_xml_set_prop_length (node, "height", frame->rect.h);
814 lgl_xml_set_prop_length (node, "round", frame->rect.r);
815 lgl_xml_set_prop_length (node, "x_waste", frame->rect.x_waste);
816 lgl_xml_set_prop_length (node, "y_waste", frame->rect.y_waste);
819 case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
820 node = xmlNewChild(root, ns, (xmlChar *)"Label-round", NULL);
821 lgl_xml_set_prop_string (node, "id", frame->all.id);
822 lgl_xml_set_prop_length (node, "radius", frame->round.r);
823 lgl_xml_set_prop_length (node, "waste", frame->round.waste);
826 case LGL_TEMPLATE_FRAME_SHAPE_CD:
827 node = xmlNewChild(root, ns, (xmlChar *)"Label-cd", NULL);
828 lgl_xml_set_prop_string (node, "id", frame->all.id);
829 lgl_xml_set_prop_length (node, "radius", frame->cd.r1);
830 lgl_xml_set_prop_length (node, "hole", frame->cd.r2);
831 if (frame->cd.w != 0.0) {
832 lgl_xml_set_prop_length (node, "width", frame->cd.w);
834 if (frame->cd.h != 0.0) {
835 lgl_xml_set_prop_length (node, "height", frame->cd.h);
837 lgl_xml_set_prop_length (node, "waste", frame->cd.waste);
841 g_message ("Unknown label style");
847 for ( p=frame->all.markups; p != NULL; p=p->next ) {
848 markup = (lglTemplateMarkup *)p->data;
849 switch (markup->type) {
850 case LGL_TEMPLATE_MARKUP_MARGIN:
851 xml_create_markup_margin_node (markup, node, ns);
853 case LGL_TEMPLATE_MARKUP_LINE:
854 xml_create_markup_line_node (markup, node, ns);
856 case LGL_TEMPLATE_MARKUP_CIRCLE:
857 xml_create_markup_circle_node (markup, node, ns);
859 case LGL_TEMPLATE_MARKUP_RECT:
860 xml_create_markup_rect_node (markup, node, ns);
863 g_message ("Unknown markup type");
868 for ( p=frame->all.layouts; p != NULL; p=p->next ) {
869 layout = (lglTemplateLayout *)p->data;
870 xml_create_layout_node (layout, node, ns);
875 /*--------------------------------------------------------------------------*/
876 /* PRIVATE. Add XML Template->Label->Layout Node. */
877 /*--------------------------------------------------------------------------*/
879 xml_create_layout_node (const lglTemplateLayout *layout,
885 node = xmlNewChild(root, ns, (xmlChar *)"Layout", NULL);
886 lgl_xml_set_prop_int (node, "nx", layout->nx);
887 lgl_xml_set_prop_int (node, "ny", layout->ny);
888 lgl_xml_set_prop_length (node, "x0", layout->x0);
889 lgl_xml_set_prop_length (node, "y0", layout->y0);
890 lgl_xml_set_prop_length (node, "dx", layout->dx);
891 lgl_xml_set_prop_length (node, "dy", layout->dy);
895 /*--------------------------------------------------------------------------*/
896 /* PRIVATE. Add XML Template->Label->Markup-margin Node. */
897 /*--------------------------------------------------------------------------*/
899 xml_create_markup_margin_node (const lglTemplateMarkup *markup,
905 node = xmlNewChild(root, ns, (xmlChar *)"Markup-margin", NULL);
907 lgl_xml_set_prop_length (node, "size", markup->margin.size);
911 /*--------------------------------------------------------------------------*/
912 /* PRIVATE. Add XML Template->Label->Markup-line Node. */
913 /*--------------------------------------------------------------------------*/
915 xml_create_markup_line_node (const lglTemplateMarkup *markup,
921 node = xmlNewChild(root, ns, (xmlChar *)"Markup-line", NULL);
923 lgl_xml_set_prop_length (node, "x1", markup->line.x1);
924 lgl_xml_set_prop_length (node, "y1", markup->line.y1);
925 lgl_xml_set_prop_length (node, "x2", markup->line.x2);
926 lgl_xml_set_prop_length (node, "y2", markup->line.y2);
930 /*--------------------------------------------------------------------------*/
931 /* PRIVATE. Add XML Template->Label->Markup-circle Node. */
932 /*--------------------------------------------------------------------------*/
934 xml_create_markup_circle_node (const lglTemplateMarkup *markup,
940 node = xmlNewChild(root, ns, (xmlChar *)"Markup-circle", NULL);
942 lgl_xml_set_prop_length (node, "x0", markup->circle.x0);
943 lgl_xml_set_prop_length (node, "y0", markup->circle.y0);
944 lgl_xml_set_prop_length (node, "radius", markup->circle.r);
948 /*--------------------------------------------------------------------------*/
949 /* PRIVATE. Add XML Template->Label->Markup-rect Node. */
950 /*--------------------------------------------------------------------------*/
952 xml_create_markup_rect_node (const lglTemplateMarkup *markup,
958 node = xmlNewChild(root, ns, (xmlChar *)"Markup-rect", NULL);
960 lgl_xml_set_prop_length (node, "x1", markup->rect.x1);
961 lgl_xml_set_prop_length (node, "y1", markup->rect.y1);
962 lgl_xml_set_prop_length (node, "w", markup->rect.w);
963 lgl_xml_set_prop_length (node, "h", markup->rect.h);
964 lgl_xml_set_prop_length (node, "r", markup->rect.r);
968 /*--------------------------------------------------------------------------*/
969 /* PRIVATE. Add XML Template->Alias Node. */
970 /*--------------------------------------------------------------------------*/
972 xml_create_alias_node (const lglTemplateAlias *alias,
978 node = xmlNewChild (root, ns, (xmlChar *)"Alias", NULL);
980 lgl_xml_set_prop_string (node, "brand", alias->brand);
981 lgl_xml_set_prop_string (node, "part", alias->part);