3 * Copyright (C) 2001-2009 Jim Evins <evins@snaught.com>.
5 * This file is part of libglabels.
7 * libglabels is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * libglabels is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with libglabels. If not, see <http://www.gnu.org/licenses/>.
23 #include "xml-template.h"
25 #include <glib/gi18n.h>
30 #include "libglabels-private.h"
35 /*===========================================*/
37 /*===========================================*/
39 /*===========================================*/
41 /*===========================================*/
43 /*===========================================*/
44 /* Local function prototypes */
45 /*===========================================*/
46 static void xml_parse_meta_node (xmlNodePtr label_node,
47 lglTemplate *template);
48 static void xml_parse_label_rectangle_node (xmlNodePtr label_node,
49 lglTemplate *template);
50 static void xml_parse_label_round_node (xmlNodePtr label_node,
51 lglTemplate *template);
52 static void xml_parse_label_cd_node (xmlNodePtr label_node,
53 lglTemplate *template);
54 static void xml_parse_layout_node (xmlNodePtr layout_node,
55 lglTemplateFrame *frame);
56 static void xml_parse_markup_margin_node (xmlNodePtr markup_node,
57 lglTemplateFrame *frame);
58 static void xml_parse_markup_line_node (xmlNodePtr markup_node,
59 lglTemplateFrame *frame);
60 static void xml_parse_markup_circle_node (xmlNodePtr markup_node,
61 lglTemplateFrame *frame);
62 static void xml_parse_markup_rect_node (xmlNodePtr markup_node,
63 lglTemplateFrame *frame);
64 static void xml_parse_alias_node (xmlNodePtr alias_node,
65 lglTemplate *template);
67 static void xml_create_meta_node (const gchar *category,
70 static void xml_create_label_node (const lglTemplateFrame *frame,
73 static void xml_create_layout_node (const lglTemplateLayout *layout,
76 static void xml_create_markup_margin_node (const lglTemplateMarkup *margin,
79 static void xml_create_markup_line_node (const lglTemplateMarkup *line,
82 static void xml_create_markup_circle_node (const lglTemplateMarkup *circle,
85 static void xml_create_markup_rect_node (const lglTemplateMarkup *circle,
88 static void xml_create_alias_node (const lglTemplateAlias *alias,
94 * lgl_xml_template_read_templates_from_file:
95 * @utf8_filename: Filename of papers file (name encoded as UTF-8)
97 * Read glabels templates from template file.
99 * Returns: a list of #lglTemplate structures.
103 lgl_xml_template_read_templates_from_file (const gchar *utf8_filename)
106 xmlDocPtr templates_doc;
107 GList *templates = NULL;
111 filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
113 g_message ("Utf8 filename conversion error");
117 templates_doc = xmlParseFile (filename);
118 if (!templates_doc) {
119 g_message ("\"%s\" is not a glabels template file (not XML)",
124 templates = lgl_xml_template_parse_templates_doc (templates_doc);
127 xmlFreeDoc (templates_doc);
134 * lgl_xml_template_parse_templates_doc:
135 * @templates_doc: libxml #xmlDocPtr tree, representing template file.
137 * Read glabels templates from a libxml #xmlDocPtr tree.
139 * Returns: a list of #lglTemplate structures.
143 lgl_xml_template_parse_templates_doc (const xmlDocPtr templates_doc)
146 GList *templates = NULL;
147 xmlNodePtr root, node;
148 lglTemplate *template;
152 root = xmlDocGetRootElement (templates_doc);
153 if (!root || !root->name) {
154 g_message ("\"%s\" is not a glabels template file (no root node)",
158 if (!lgl_xml_is_node (root, "Glabels-templates")) {
159 g_message ("\"%s\" is not a glabels template file (wrong root node)",
164 for (node = root->xmlChildrenNode; node != NULL; node = node->next) {
166 if (lgl_xml_is_node (node, "Template")) {
167 template = lgl_xml_template_parse_template_node (node);
168 templates = g_list_append (templates, template);
170 if ( !xmlNodeIsText(node) ) {
171 if (!lgl_xml_is_node (node,"comment")) {
172 g_message ("bad node = \"%s\"",node->name);
183 * lgl_xml_template_parse_template_node:
184 * @template_node: libxml #xmlNodePtr template node from a #xmlDocPtr tree.
186 * Read a single glabels template from a libxml #xmlNodePtr node.
188 * Returns: a pointer to a newly created #lglTemplate structure.
192 lgl_xml_template_parse_template_node (const xmlNodePtr template_node)
199 gdouble page_width, page_height;
200 lglPaper *paper = NULL;
201 lglTemplate *template;
205 brand = lgl_xml_get_prop_string (template_node, "brand", NULL);
206 part = lgl_xml_get_prop_string (template_node, "part", NULL);
209 name = lgl_xml_get_prop_string (template_node, "name", NULL);
212 v = g_strsplit (name, " ", 2);
213 brand = g_strdup (v[0]);
214 part = g_strchug (g_strdup (v[1]));
221 g_message (_("Missing name or brand/part attributes."));
225 description = lgl_xml_get_prop_i18n_string (template_node, "description", NULL);
226 paper_id = lgl_xml_get_prop_string (template_node, "size", NULL);
228 if (lgl_db_is_paper_id_other (paper_id)) {
230 page_width = lgl_xml_get_prop_length (template_node, "width", 0);
231 page_height = lgl_xml_get_prop_length (template_node, "height", 0);
234 paper = lgl_db_lookup_paper_from_id (paper_id);
236 /* This should always be an id, but just in case a name
238 g_message (_("Unknown page size id \"%s\", trying as name"),
240 paper = lgl_db_lookup_paper_from_name (paper_id);
242 paper_id = g_strdup (paper->id);
245 page_width = paper->width;
246 page_height = paper->height;
250 g_message (_("Unknown page size id or name \"%s\""),
253 lgl_paper_free (paper);
257 template = lgl_template_new (brand, part, description,
258 paper_id, page_width, page_height);
260 for (node = template_node->xmlChildrenNode; node != NULL;
262 if (lgl_xml_is_node (node, "Meta")) {
263 xml_parse_meta_node (node, template);
264 } else if (lgl_xml_is_node (node, "Label-rectangle")) {
265 xml_parse_label_rectangle_node (node, template);
266 } else if (lgl_xml_is_node (node, "Label-round")) {
267 xml_parse_label_round_node (node, template);
268 } else if (lgl_xml_is_node (node, "Label-cd")) {
269 xml_parse_label_cd_node (node, template);
270 } else if (lgl_xml_is_node (node, "Alias")) {
271 xml_parse_alias_node (node, template);
273 if (!xmlNodeIsText (node)) {
274 if (!lgl_xml_is_node (node,"comment")) {
275 g_message ("bad node = \"%s\"",node->name);
283 g_free (description);
289 /*--------------------------------------------------------------------------*/
290 /* PRIVATE. Parse XML Template->Meta Node. */
291 /*--------------------------------------------------------------------------*/
293 xml_parse_meta_node (xmlNodePtr meta_node,
294 lglTemplate *template)
298 category = lgl_xml_get_prop_string (meta_node, "category", NULL);
300 if (category != NULL)
302 lgl_template_add_category (template, category);
307 /*--------------------------------------------------------------------------*/
308 /* PRIVATE. Parse XML Template->Label-rectangle Node. */
309 /*--------------------------------------------------------------------------*/
311 xml_parse_label_rectangle_node (xmlNodePtr label_node,
312 lglTemplate *template)
316 gdouble x_waste, y_waste;
318 lglTemplateFrame *frame;
321 id = lgl_xml_get_prop_string (label_node, "id", NULL);
323 if ((tmp = lgl_xml_get_prop_string (label_node, "waste", NULL))) {
324 /* Handle single "waste" property. */
325 x_waste = y_waste = lgl_xml_get_prop_length (label_node, "waste", 0);
328 x_waste = lgl_xml_get_prop_length (label_node, "x_waste", 0);
329 y_waste = lgl_xml_get_prop_length (label_node, "y_waste", 0);
332 w = lgl_xml_get_prop_length (label_node, "width", 0);
333 h = lgl_xml_get_prop_length (label_node, "height", 0);
334 r = lgl_xml_get_prop_length (label_node, "round", 0);
336 frame = lgl_template_frame_rect_new ((gchar *)id, w, h, r, x_waste, y_waste);
337 lgl_template_add_frame (template, frame);
339 for (node = label_node->xmlChildrenNode; node != NULL;
341 if (lgl_xml_is_node (node, "Layout")) {
342 xml_parse_layout_node (node, frame);
343 } else if (lgl_xml_is_node (node, "Markup-margin")) {
344 xml_parse_markup_margin_node (node, frame);
345 } else if (lgl_xml_is_node (node, "Markup-line")) {
346 xml_parse_markup_line_node (node, frame);
347 } else if (lgl_xml_is_node (node, "Markup-circle")) {
348 xml_parse_markup_circle_node (node, frame);
349 } else if (lgl_xml_is_node (node, "Markup-rect")) {
350 xml_parse_markup_rect_node (node, frame);
351 } else if (!xmlNodeIsText (node)) {
352 if (!lgl_xml_is_node (node, "comment")) {
353 g_message ("bad node = \"%s\"",node->name);
361 /*--------------------------------------------------------------------------*/
362 /* PRIVATE. Parse XML Template->Label-round Node. */
363 /*--------------------------------------------------------------------------*/
365 xml_parse_label_round_node (xmlNodePtr label_node,
366 lglTemplate *template)
371 lglTemplateFrame *frame;
374 id = lgl_xml_get_prop_string (label_node, "id", NULL);
375 waste = lgl_xml_get_prop_length (label_node, "waste", 0);
376 r = lgl_xml_get_prop_length (label_node, "radius", 0);
378 frame = lgl_template_frame_round_new ((gchar *)id, r, waste);
379 lgl_template_add_frame (template, frame);
381 for (node = label_node->xmlChildrenNode; node != NULL;
383 if (lgl_xml_is_node (node, "Layout")) {
384 xml_parse_layout_node (node, frame);
385 } else if (lgl_xml_is_node (node, "Markup-margin")) {
386 xml_parse_markup_margin_node (node, frame);
387 } else if (lgl_xml_is_node (node, "Markup-line")) {
388 xml_parse_markup_line_node (node, frame);
389 } else if (lgl_xml_is_node (node, "Markup-circle")) {
390 xml_parse_markup_circle_node (node, frame);
391 } else if (lgl_xml_is_node (node, "Markup-rect")) {
392 xml_parse_markup_rect_node (node, frame);
393 } else if (!xmlNodeIsText (node)) {
394 if (!lgl_xml_is_node (node, "comment")) {
395 g_message ("bad node = \"%s\"",node->name);
403 /*--------------------------------------------------------------------------*/
404 /* PRIVATE. Parse XML Template->Label-cd Node. */
405 /*--------------------------------------------------------------------------*/
407 xml_parse_label_cd_node (xmlNodePtr label_node,
408 lglTemplate *template)
412 gdouble r1, r2, w, h;
413 lglTemplateFrame *frame;
416 id = lgl_xml_get_prop_string (label_node, "id", NULL);
417 waste = lgl_xml_get_prop_length (label_node, "waste", 0);
418 r1 = lgl_xml_get_prop_length (label_node, "radius", 0);
419 r2 = lgl_xml_get_prop_length (label_node, "hole", 0);
420 w = lgl_xml_get_prop_length (label_node, "width", 0);
421 h = lgl_xml_get_prop_length (label_node, "height", 0);
423 frame = lgl_template_frame_cd_new ((gchar *)id, r1, r2, w, h, waste);
424 lgl_template_add_frame (template, frame);
426 for (node = label_node->xmlChildrenNode; node != NULL;
428 if (lgl_xml_is_node (node, "Layout")) {
429 xml_parse_layout_node (node, frame);
430 } else if (lgl_xml_is_node (node, "Markup-margin")) {
431 xml_parse_markup_margin_node (node, frame);
432 } else if (lgl_xml_is_node (node, "Markup-line")) {
433 xml_parse_markup_line_node (node, frame);
434 } else if (lgl_xml_is_node (node, "Markup-circle")) {
435 xml_parse_markup_circle_node (node, frame);
436 } else if (lgl_xml_is_node (node, "Markup-rect")) {
437 xml_parse_markup_rect_node (node, frame);
438 } else if (!xmlNodeIsText (node)) {
439 if (!lgl_xml_is_node (node, "comment")) {
440 g_message ("bad node = \"%s\"",node->name);
448 /*--------------------------------------------------------------------------*/
449 /* PRIVATE. Parse XML Template->Label->Layout Node. */
450 /*--------------------------------------------------------------------------*/
452 xml_parse_layout_node (xmlNodePtr layout_node,
453 lglTemplateFrame *frame)
456 gdouble x0, y0, dx, dy;
459 nx = lgl_xml_get_prop_int (layout_node, "nx", 1);
460 ny = lgl_xml_get_prop_int (layout_node, "ny", 1);
462 x0 = lgl_xml_get_prop_length (layout_node, "x0", 0);
463 y0 = lgl_xml_get_prop_length (layout_node, "y0", 0);
465 dx = lgl_xml_get_prop_length (layout_node, "dx", 0);
466 dy = lgl_xml_get_prop_length (layout_node, "dy", 0);
468 lgl_template_frame_add_layout (frame, lgl_template_layout_new (nx, ny, x0, y0, dx, dy));
470 for (node = layout_node->xmlChildrenNode; node != NULL;
472 if (!xmlNodeIsText (node)) {
473 if (!lgl_xml_is_node (node, "comment")) {
474 g_message ("bad node = \"%s\"",node->name);
481 /*--------------------------------------------------------------------------*/
482 /* PRIVATE. Parse XML Template->Label->Markup-margin Node. */
483 /*--------------------------------------------------------------------------*/
485 xml_parse_markup_margin_node (xmlNodePtr markup_node,
486 lglTemplateFrame *frame)
491 size = lgl_xml_get_prop_length (markup_node, "size", 0);
493 lgl_template_frame_add_markup (frame, lgl_template_markup_margin_new (size));
495 for (node = markup_node->xmlChildrenNode; node != NULL;
497 if (!xmlNodeIsText (node)) {
498 if (!lgl_xml_is_node (node, "comment")) {
499 g_message ("bad node = \"%s\"",node->name);
506 /*--------------------------------------------------------------------------*/
507 /* PRIVATE. Parse XML Template->Label->Markup-line Node. */
508 /*--------------------------------------------------------------------------*/
510 xml_parse_markup_line_node (xmlNodePtr markup_node,
511 lglTemplateFrame *frame)
513 gdouble x1, y1, x2, y2;
516 x1 = lgl_xml_get_prop_length (markup_node, "x1", 0);
517 y1 = lgl_xml_get_prop_length (markup_node, "y1", 0);
518 x2 = lgl_xml_get_prop_length (markup_node, "x2", 0);
519 y2 = lgl_xml_get_prop_length (markup_node, "y2", 0);
521 lgl_template_frame_add_markup (frame, lgl_template_markup_line_new (x1, y1, x2, y2));
523 for (node = markup_node->xmlChildrenNode; node != NULL;
525 if (!xmlNodeIsText (node)) {
526 if (!lgl_xml_is_node (node, "comment")) {
527 g_message ("bad node = \"%s\"",node->name);
534 /*--------------------------------------------------------------------------*/
535 /* PRIVATE. Parse XML Template->Label->Markup-circle Node. */
536 /*--------------------------------------------------------------------------*/
538 xml_parse_markup_circle_node (xmlNodePtr markup_node,
539 lglTemplateFrame *frame)
544 x0 = lgl_xml_get_prop_length (markup_node, "x0", 0);
545 y0 = lgl_xml_get_prop_length (markup_node, "y0", 0);
546 r = lgl_xml_get_prop_length (markup_node, "radius", 0);
548 lgl_template_frame_add_markup (frame, lgl_template_markup_circle_new (x0, y0, r));
550 for (node = markup_node->xmlChildrenNode; node != NULL;
552 if (!xmlNodeIsText (node)) {
553 if (!lgl_xml_is_node (node, "comment")) {
554 g_message ("bad node = \"%s\"",node->name);
561 /*--------------------------------------------------------------------------*/
562 /* PRIVATE. Parse XML Template->Label->Markup-rect Node. */
563 /*--------------------------------------------------------------------------*/
565 xml_parse_markup_rect_node (xmlNodePtr markup_node,
566 lglTemplateFrame *frame)
568 gdouble x1, y1, w, h, r;
571 x1 = lgl_xml_get_prop_length (markup_node, "x1", 0);
572 y1 = lgl_xml_get_prop_length (markup_node, "y1", 0);
573 w = lgl_xml_get_prop_length (markup_node, "w", 0);
574 h = lgl_xml_get_prop_length (markup_node, "h", 0);
575 r = lgl_xml_get_prop_length (markup_node, "r", 0);
577 lgl_template_frame_add_markup (frame, lgl_template_markup_rect_new (x1, y1, w, h, r));
579 for (node = markup_node->xmlChildrenNode; node != NULL;
581 if (!xmlNodeIsText (node)) {
582 if (!lgl_xml_is_node (node, "comment")) {
583 g_message ("bad node = \"%s\"",node->name);
590 /*--------------------------------------------------------------------------*/
591 /* PRIVATE. Parse XML Template->Alias Node. */
592 /*--------------------------------------------------------------------------*/
594 xml_parse_alias_node (xmlNodePtr alias_node,
595 lglTemplate *template)
602 brand = lgl_xml_get_prop_string (alias_node, "brand", NULL);
603 part = lgl_xml_get_prop_string (alias_node, "part", NULL);
606 name = lgl_xml_get_prop_string (alias_node, "name", NULL);
609 g_message (_("Missing required \"brand\" or \"part\" attribute, trying deprecated name."));
610 v = g_strsplit (name, " ", 2);
611 brand = g_strdup (v[0]);
612 part = g_strdup (v[1]);
619 g_message (_("Name attribute also missing."));
623 lgl_template_add_alias (template, lgl_template_alias_new (brand, part));
630 * lgl_xml_template_write_templates_to_file:
631 * @templates: List of #lglTemplate structures
632 * @utf8_filename: Filename of templates file (name encoded as UTF-8)
634 * Write a list of #lglTemplate structures to a glabels XML template file.
636 * Returns: the number of bytes written or -1 in case of failure
640 lgl_xml_template_write_templates_to_file (GList *templates,
641 const gchar *utf8_filename)
647 lglTemplate *template;
650 doc = xmlNewDoc ((xmlChar *)"1.0");
651 doc->xmlRootNode = xmlNewDocNode (doc, NULL, (xmlChar *)"Glabels-templates", NULL);
653 ns = xmlNewNs (doc->xmlRootNode, (xmlChar *)LGL_XML_NAME_SPACE, NULL);
654 xmlSetNs (doc->xmlRootNode, ns);
656 for (p=templates; p!=NULL; p=p->next) {
657 template = (lglTemplate *)p->data;
658 lgl_xml_template_create_template_node (template, doc->xmlRootNode, ns);
661 filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
664 g_message (_("Utf8 conversion error."));
669 xmlSetDocCompressMode (doc, 0);
670 bytes_written = xmlSaveFormatFile (filename, doc, TRUE);
673 return bytes_written;
680 * lgl_xml_template_write_template_to_file:
681 * @template: #lglTemplate structure to be written
682 * @utf8_filename: Filename of templates file (name encoded as UTF-8)
684 * Write a single #lglTemplate structures to a glabels XML template file.
686 * Returns: the number of bytes written or -1 in case of failure
690 lgl_xml_template_write_template_to_file (const lglTemplate *template,
691 const gchar *utf8_filename)
693 GList *templates = NULL;
696 templates = g_list_append (templates, (gpointer)template);
698 bytes_written = lgl_xml_template_write_templates_to_file (templates, utf8_filename);
700 g_list_free (templates);
702 return bytes_written;
707 * lgl_xml_template_create_template_node:
708 * @template: #lglTemplate structure to be written
709 * @root: parent node to receive new child node
710 * @ns: a libxml #xmlNsPtr
712 * Add a single #lglTemplate child node to given #xmlNodePtr.
716 lgl_xml_template_create_template_node (const lglTemplate *template,
722 lglTemplateAlias *alias;
723 lglTemplateFrame *frame;
725 node = xmlNewChild (root, ns, (xmlChar *)"Template", NULL);
727 lgl_xml_set_prop_string (node, "brand", template->brand);
728 lgl_xml_set_prop_string (node, "part", template->part);
730 lgl_xml_set_prop_string (node, "size", template->paper_id);
731 if (xmlStrEqual ((xmlChar *)template->paper_id, (xmlChar *)"Other"))
734 lgl_xml_set_prop_length (node, "width", template->page_width);
735 lgl_xml_set_prop_length (node, "height", template->page_height);
739 lgl_xml_set_prop_string (node, "description", template->description);
741 for ( p=template->aliases; p != NULL; p=p->next ) {
742 alias = (lglTemplateAlias *)p->data;
743 if ( !(xmlStrEqual ((xmlChar *)template->brand, (xmlChar *)alias->brand) &&
744 xmlStrEqual ((xmlChar *)template->part, (xmlChar *)alias->part)) )
746 xml_create_alias_node ( alias, node, ns );
749 for ( p=template->category_ids; p != NULL; p=p->next )
751 xml_create_meta_node ( p->data, node, ns );
753 for ( p=template->frames; p != NULL; p=p->next )
755 frame = (lglTemplateFrame *)p->data;
756 xml_create_label_node (frame, node, ns);
761 /*--------------------------------------------------------------------------*/
762 /* PRIVATE. Add XML Template->Meta Node. */
763 /*--------------------------------------------------------------------------*/
765 xml_create_meta_node (const gchar *category,
771 node = xmlNewChild (root, ns, (xmlChar *)"Meta", NULL);
772 lgl_xml_set_prop_string (node, "category", category);
776 /*--------------------------------------------------------------------------*/
777 /* PRIVATE. Add XML Template->Label Node. */
778 /*--------------------------------------------------------------------------*/
780 xml_create_label_node (const lglTemplateFrame *frame,
786 lglTemplateMarkup *markup;
787 lglTemplateLayout *layout;
789 switch (frame->shape) {
791 case LGL_TEMPLATE_FRAME_SHAPE_RECT:
792 node = xmlNewChild(root, ns, (xmlChar *)"Label-rectangle", NULL);
793 lgl_xml_set_prop_string (node, "id", frame->all.id);
794 lgl_xml_set_prop_length (node, "width", frame->rect.w);
795 lgl_xml_set_prop_length (node, "height", frame->rect.h);
796 lgl_xml_set_prop_length (node, "round", frame->rect.r);
797 lgl_xml_set_prop_length (node, "x_waste", frame->rect.x_waste);
798 lgl_xml_set_prop_length (node, "y_waste", frame->rect.y_waste);
801 case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
802 node = xmlNewChild(root, ns, (xmlChar *)"Label-round", NULL);
803 lgl_xml_set_prop_string (node, "id", frame->all.id);
804 lgl_xml_set_prop_length (node, "radius", frame->round.r);
805 lgl_xml_set_prop_length (node, "waste", frame->round.waste);
808 case LGL_TEMPLATE_FRAME_SHAPE_CD:
809 node = xmlNewChild(root, ns, (xmlChar *)"Label-cd", NULL);
810 lgl_xml_set_prop_string (node, "id", frame->all.id);
811 lgl_xml_set_prop_length (node, "radius", frame->cd.r1);
812 lgl_xml_set_prop_length (node, "hole", frame->cd.r2);
813 if (frame->cd.w != 0.0) {
814 lgl_xml_set_prop_length (node, "width", frame->cd.w);
816 if (frame->cd.h != 0.0) {
817 lgl_xml_set_prop_length (node, "height", frame->cd.h);
819 lgl_xml_set_prop_length (node, "waste", frame->cd.waste);
823 g_message ("Unknown label style");
829 for ( p=frame->all.markups; p != NULL; p=p->next ) {
830 markup = (lglTemplateMarkup *)p->data;
831 switch (markup->type) {
832 case LGL_TEMPLATE_MARKUP_MARGIN:
833 xml_create_markup_margin_node (markup, node, ns);
835 case LGL_TEMPLATE_MARKUP_LINE:
836 xml_create_markup_line_node (markup, node, ns);
838 case LGL_TEMPLATE_MARKUP_CIRCLE:
839 xml_create_markup_circle_node (markup, node, ns);
841 case LGL_TEMPLATE_MARKUP_RECT:
842 xml_create_markup_rect_node (markup, node, ns);
845 g_message ("Unknown markup type");
850 for ( p=frame->all.layouts; p != NULL; p=p->next ) {
851 layout = (lglTemplateLayout *)p->data;
852 xml_create_layout_node (layout, node, ns);
857 /*--------------------------------------------------------------------------*/
858 /* PRIVATE. Add XML Template->Label->Layout Node. */
859 /*--------------------------------------------------------------------------*/
861 xml_create_layout_node (const lglTemplateLayout *layout,
867 node = xmlNewChild(root, ns, (xmlChar *)"Layout", NULL);
868 lgl_xml_set_prop_int (node, "nx", layout->nx);
869 lgl_xml_set_prop_int (node, "ny", layout->ny);
870 lgl_xml_set_prop_length (node, "x0", layout->x0);
871 lgl_xml_set_prop_length (node, "y0", layout->y0);
872 lgl_xml_set_prop_length (node, "dx", layout->dx);
873 lgl_xml_set_prop_length (node, "dy", layout->dy);
877 /*--------------------------------------------------------------------------*/
878 /* PRIVATE. Add XML Template->Label->Markup-margin Node. */
879 /*--------------------------------------------------------------------------*/
881 xml_create_markup_margin_node (const lglTemplateMarkup *markup,
887 node = xmlNewChild(root, ns, (xmlChar *)"Markup-margin", NULL);
889 lgl_xml_set_prop_length (node, "size", markup->margin.size);
893 /*--------------------------------------------------------------------------*/
894 /* PRIVATE. Add XML Template->Label->Markup-line Node. */
895 /*--------------------------------------------------------------------------*/
897 xml_create_markup_line_node (const lglTemplateMarkup *markup,
903 node = xmlNewChild(root, ns, (xmlChar *)"Markup-line", NULL);
905 lgl_xml_set_prop_length (node, "x1", markup->line.x1);
906 lgl_xml_set_prop_length (node, "y1", markup->line.y1);
907 lgl_xml_set_prop_length (node, "x2", markup->line.x2);
908 lgl_xml_set_prop_length (node, "y2", markup->line.y2);
912 /*--------------------------------------------------------------------------*/
913 /* PRIVATE. Add XML Template->Label->Markup-circle Node. */
914 /*--------------------------------------------------------------------------*/
916 xml_create_markup_circle_node (const lglTemplateMarkup *markup,
922 node = xmlNewChild(root, ns, (xmlChar *)"Markup-circle", NULL);
924 lgl_xml_set_prop_length (node, "x0", markup->circle.x0);
925 lgl_xml_set_prop_length (node, "y0", markup->circle.y0);
926 lgl_xml_set_prop_length (node, "radius", markup->circle.r);
930 /*--------------------------------------------------------------------------*/
931 /* PRIVATE. Add XML Template->Label->Markup-rect Node. */
932 /*--------------------------------------------------------------------------*/
934 xml_create_markup_rect_node (const lglTemplateMarkup *markup,
940 node = xmlNewChild(root, ns, (xmlChar *)"Markup-rect", NULL);
942 lgl_xml_set_prop_length (node, "x1", markup->rect.x1);
943 lgl_xml_set_prop_length (node, "y1", markup->rect.y1);
944 lgl_xml_set_prop_length (node, "w", markup->rect.w);
945 lgl_xml_set_prop_length (node, "h", markup->rect.h);
946 lgl_xml_set_prop_length (node, "r", markup->rect.r);
950 /*--------------------------------------------------------------------------*/
951 /* PRIVATE. Add XML Template->Alias Node. */
952 /*--------------------------------------------------------------------------*/
954 xml_create_alias_node (const lglTemplateAlias *alias,
960 node = xmlNewChild (root, ns, (xmlChar *)"Alias", NULL);
962 lgl_xml_set_prop_string (node, "brand", alias->brand);
963 lgl_xml_set_prop_string (node, "part", alias->part);
970 * Local Variables: -- emacs
972 * c-basic-offset: 8 -- emacs
973 * tab-width: 8 -- emacs
974 * indent-tabs-mode: nil -- emacs