Annotation of Amaya/amaya/templateInstantiate.c, revision 1.25
1.19 vatton 1: /*
2: *
3: * COPYRIGHT INRIA and W3C, 2006-2007
4: * Please first read the full copyright statement in file COPYRIGHT.
5: *
6: */
7:
1.1 vatton 8: #include "templates.h"
9:
10: #define THOT_EXPORT extern
11: #include "templateDeclarations.h"
12:
1.8 kia 13: #include "Elemlist.h"
14:
1.1 vatton 15: #include "EDITimage_f.h"
16: #include "HTMLactions_f.h"
17: #include "HTMLsave_f.h"
18: #include "init_f.h"
19: #include "mydictionary_f.h"
20: #include "templates_f.h"
21: #include "templateDeclarations_f.h"
22: #include "templateInstantiate_f.h"
23: #include "Templatebuilder_f.h"
24: #include "templateUtils_f.h"
25: #include "fetchHTMLname_f.h"
26: #include "Template.h"
27:
28: #ifdef TEMPLATES
29: #define TEMPLATE_SCHEMA_NAME "Template"
30:
31: typedef struct _InstantiateCtxt
32: {
33: char * templatePath;
34: char * instancePath;
35: char * schemaName;
36: DocumentType docType;
37: ThotBool dontReplace;
38: } InstantiateCtxt;
39: #endif /* TEMPLATES */
40:
41:
42: /*----------------------------------------------------------------------
43: CreateInstance
1.3 vatton 44: ----------------------------------------------------------------------*/
1.1 vatton 45: void CreateInstance(char *templatePath, char *instancePath)
1.3 vatton 46: {
1.1 vatton 47: #ifdef TEMPLATES
1.14 vatton 48: Document doc = 0;
1.5 vatton 49: DocumentType docType;
1.14 vatton 50: ElementType elType;
51: Element root, title, text;
52: char *s;
53: int alreadyOnDoc = 0;
54: ThotBool alreadyViewing = FALSE;
1.1 vatton 55:
1.8 kia 56: XTigerTemplate t = (XTigerTemplate)Dictionary_Get (Templates_Dic, templatePath);
1.1 vatton 57: if (t == NULL)
58: //The template must be loaded before calling this function
59: return;
60:
1.5 vatton 61: doc = GetTemplateDocument (t);
1.3 vatton 62: while (alreadyOnDoc < DocumentTableLength-1 && !alreadyViewing)
1.1 vatton 63: {
64: alreadyOnDoc++;
65: if (DocumentURLs[alreadyOnDoc])
66: alreadyViewing = !strcmp (DocumentURLs[alreadyOnDoc],instancePath);
67: }
68:
69: if (!TtaPrepareUndo (doc))
70: {
71: TtaOpenUndoSequence (doc, NULL, NULL, 0, 0);
1.14 vatton 72: root = TtaGetRootElement(doc);
73: elType = TtaGetElementType (root);
74: // get the target document type
75: s = TtaGetSSchemaName (elType.ElSSchema);
76: if (strcmp (s, "HTML") == 0)
77: docType = docHTML;
78: else if (strcmp (s, "SVG") == 0)
79: docType = docSVG;
80: else if (strcmp (s, "MathML") == 0)
81: docType = docMath;
82: else
83: docType = docXml;
84:
1.1 vatton 85: SetRelativeURLs (doc, instancePath);
86:
87: switch (docType)
88: {
1.14 vatton 89: case docSVG:
1.1 vatton 90: TtaExportDocumentWithNewLineNumbers (doc, instancePath, "SVGT");
91: break;
1.14 vatton 92: case docMath:
1.1 vatton 93: TtaExportDocumentWithNewLineNumbers (doc, instancePath, "MathMLT");
94: break;
1.14 vatton 95: case docHTML:
96: // Initialize the document title
97: elType.ElTypeNum = HTML_EL_TITLE;
98: title = TtaSearchTypedElement (elType, SearchInTree, root);
99: text = TtaGetFirstChild (title);
100: while (text)
101: {
102: elType = TtaGetElementType (text);
103: if (elType.ElTypeNum == HTML_EL_TEXT_UNIT && Answer_text[0] != EOS)
104: {
105: TtaSetTextContent (text, (unsigned char*)Answer_text,
106: TtaGetDefaultLanguage (), doc);
107: text = NULL;
108: }
109: else if ((elType.ElTypeNum == Template_EL_useEl ||
110: elType.ElTypeNum == Template_EL_useSimple) &&
111: !strcmp (TtaGetSSchemaName (elType.ElSSchema), "Template"))
112: // Ignore the template use element
113: text = TtaGetFirstChild (text);
114: else
115: // Look for the first text child
116: TtaNextSibling (&text);
117: }
1.1 vatton 118: if (TtaGetDocumentProfile(doc)==L_Xhtml11 || TtaGetDocumentProfile(doc)==L_Basic)
119: TtaExportDocumentWithNewLineNumbers (doc, instancePath, "HTMLT11");
120: else
121: TtaExportDocumentWithNewLineNumbers (doc, instancePath, "HTMLTX");
122: break;
1.14 vatton 123: default:
1.1 vatton 124: TtaExportDocumentWithNewLineNumbers (doc, instancePath, NULL);
125: break;
126: }
127:
128: TtaCloseUndoSequence (doc);
129: TtaUndoNoRedo (doc);
130: TtaClearUndoHistory (doc);
131: }
132:
1.3 vatton 133: if (!alreadyViewing)
134: {
135: // Open the instance
1.1 vatton 136: TtaExtractName (instancePath, DirectoryName, DocumentName);
137: CallbackDialogue (BaseDialog + OpenForm, INTEGER_DATA, (char *) 1);
138: }
1.3 vatton 139: else
140: {
141: // Reload on the existing view
142: Reload (alreadyOnDoc, 0);
143: }
1.1 vatton 144: #endif /* TEMPLATES */
145: }
146:
147: /*----------------------------------------------------------------------
1.3 vatton 148: ----------------------------------------------------------------------*/
1.7 cvs 149: void InstantiateTemplate_callback (int newdoc, int status, char *urlName, char *outputfile,
150: char *proxyName, AHTHeaders *http_headers, void * context)
1.1 vatton 151: {
152: #ifdef TEMPLATES
153: InstantiateCtxt *ctx = (InstantiateCtxt*)context;
154:
155: DoInstanceTemplate (ctx->templatePath);
156: CreateInstance (ctx->templatePath, ctx->instancePath);
157: TtaFreeMemory (ctx->templatePath);
158: TtaFreeMemory (ctx->instancePath);
159: TtaFreeMemory (ctx);
160: #endif /* TEMPLATES */
161: }
162:
163: /*----------------------------------------------------------------------
1.3 vatton 164: ----------------------------------------------------------------------*/
1.1 vatton 165: void InstantiateTemplate (Document doc, char *templatename, char *docname,
166: DocumentType docType, ThotBool loaded)
167: {
168: #ifdef TEMPLATES
169: if (!loaded)
1.3 vatton 170: {
171: // Create the callback context
172: InstantiateCtxt *ctx = (InstantiateCtxt *)TtaGetMemory (sizeof (InstantiateCtxt));
173: ctx->templatePath = TtaStrdup (templatename);
174: ctx->instancePath = TtaStrdup (docname);
175: ctx->schemaName = GetSchemaFromDocType(docType);
176: ctx->docType = docType;
1.1 vatton 177:
1.3 vatton 178: GetAmayaDoc (templatename, NULL, doc, doc, CE_MAKEBOOK, FALSE,
1.6 cvs 179: (void (*)(int, int, char*, char*, char*, const AHTHeaders*, void*)) InstantiateTemplate_callback,
1.3 vatton 180: (void *) ctx);
181: }
1.1 vatton 182: else
183: {
184: DoInstanceTemplate (templatename);
185: CreateInstance (templatename, docname);
1.3 vatton 186: }
1.1 vatton 187: #endif /* TEMPLATES */
188: }
189:
190: /*----------------------------------------------------------------------
191: InstantiateAttribute
1.3 vatton 192: ----------------------------------------------------------------------*/
1.1 vatton 193: static void InstantiateAttribute (XTigerTemplate t, Element el, Document doc)
194: {
195: #ifdef TEMPLATES
196: AttributeType useType, nameType, defaultType, attrType;
197: Attribute useAttr, nameAttr, defAttr, attr;
198: ElementType elType;
199: Element parent;
200: char *text, *elementName;
201: ThotBool level;
202: NotifyAttribute event;
203:
204: parent = TtaGetParent (el);
205: if (!parent)
206: return;
207: // if attribute "use" has value "optional", don't do anything
208: useType.AttrSSchema = TtaGetSSchema (TEMPLATE_SCHEMA_NAME, doc);
209: useType.AttrTypeNum = Template_ATTR_useAt;
210: useAttr = TtaGetAttribute (el, useType);
211: if (useAttr)
212: // there is a "use" attribute. Check its value
213: {
1.10 kia 214: text = GetAttributeStringValue (el, useAttr, NULL);
1.25 ! vatton 215: if (!text)
1.1 vatton 216: return;
1.25 ! vatton 217: if (strcmp (text, "optional") == 0)
1.18 kia 218: {
219: TtaFreeMemory(text);
220: return;
221: }
222: TtaFreeMemory(text);
1.1 vatton 223: }
1.18 kia 224:
1.1 vatton 225: // get the "name" and "default" attributes
226: nameType.AttrSSchema = defaultType.AttrSSchema = TtaGetSSchema (TEMPLATE_SCHEMA_NAME, doc);
1.9 vatton 227: nameType.AttrTypeNum = Template_ATTR_ref_name;
1.1 vatton 228: defaultType.AttrTypeNum = Template_ATTR_defaultAt;
229: nameAttr = TtaGetAttribute (el, nameType);
230: defAttr = TtaGetAttribute (el, defaultType);
231: if (nameAttr)
232: {
1.10 kia 233: text = GetAttributeStringValue (el, nameAttr, NULL);
1.1 vatton 234: if (text)
235: {
236: elType = TtaGetElementType (parent);
237: elementName = TtaGetElementTypeName (elType);
238: level = TRUE;
239: MapHTMLAttribute (text, &attrType, elementName, &level, doc);
240: TtaFreeMemory(text);
241: attr = TtaNewAttribute (attrType);
242: if (attr)
243: {
244: TtaAttachAttribute (parent, attr, doc);
245: if (defAttr)
246: {
1.10 kia 247: text = GetAttributeStringValue (el, defAttr, NULL);
1.25 ! vatton 248: if (text)
1.18 kia 249: TtaSetAttributeText(attr, text, parent, doc);
1.1 vatton 250: TtaFreeMemory(text);
251: // if it's a src arttribute for an image, load the image
252: if (!strcmp (TtaGetSSchemaName (elType.ElSSchema), "HTML") &&
253: elType.ElTypeNum == HTML_EL_IMG)
254: if (attrType.AttrTypeNum == HTML_ATTR_SRC &&
255: attrType.AttrSSchema == elType.ElSSchema)
256: {
257: event.document = doc;
258: event.element = parent;
259: event.attribute = attr;
260: SRCattrModified (&event);
261: }
262: }
263: }
264: }
265: }
266: #endif /* TEMPLATES */
267: }
268:
269: #ifdef TEMPLATES
270: /*----------------------------------------------------------------------
271: ProcessAttr
1.9 vatton 272: Look for all "attribute" elements in the subtree and instantiate them
1.3 vatton 273: ----------------------------------------------------------------------*/
1.1 vatton 274: static void ProcessAttr (XTigerTemplate t, Element el, Document doc)
275: {
276: Element child;
277: ElementType elType;
278:
279: for (child = TtaGetFirstChild (el); child; TtaNextSibling(&child))
280: {
281: elType = TtaGetElementType (child);
282: if (elType.ElTypeNum == Template_EL_attribute &&
283: !strcmp (TtaGetSSchemaName (elType.ElSSchema), TEMPLATE_SCHEMA_NAME))
284: InstantiateAttribute (t, child, doc);
285: else
286: ProcessAttr (t, child, doc);
287: }
288: }
289: #endif /* TEMPLATES */
290:
1.12 kia 291:
292: /*----------------------------------------------------------------------
293: Template_GetNewSimpleTypeInstance
294: Create an new instance of xt:use/SimpleType
295: The decl attribute must embed SimpleType declaration (no validation).
296: @param decl Declaration of new element
297: @param parent Future parent element
298: @param doc Document
299: @return The new element
300: ----------------------------------------------------------------------*/
301: Element Template_GetNewSimpleTypeInstance(Document doc, Element parent, Declaration decl)
302: {
303: Element newEl = NULL;
304: #ifdef TEMPLATES
305: ElementType elType;
306: char *empty = " ";
1.24 vatton 307:
1.17 kia 308: elType.ElSSchema = TtaGetSSchema(TEMPLATE_SSHEMA_NAME, doc);
1.12 kia 309: elType.ElTypeNum = Template_EL_TEXT_UNIT;
310: newEl = TtaNewElement (doc, elType);
311: TtaSetTextContent (newEl, (unsigned char*) empty, 0, doc);
1.24 vatton 312: #endif /* TEMPLATES */
1.12 kia 313: return newEl;
314: }
315:
316: /*----------------------------------------------------------------------
317: Template_GetNewXmlElementInstance
318: Create an new instance of xt:use/XmlElement
319: The decl attribute must embed XmlElement declaration (no validation).
320: @param decl Declaration of new element
321: @param parent Future parent element
322: @param doc Document
323: @return The new element
324: ----------------------------------------------------------------------*/
325: Element Template_GetNewXmlElementInstance(Document doc, Element parent, Declaration decl)
326: {
327: Element newEl = NULL;
328: #ifdef TEMPLATES
329: ElementType elType;
330:
1.24 vatton 331: GIType (decl->name, &elType, doc);
332: if (elType.ElTypeNum != 0)
1.12 kia 333: {
1.23 kia 334: newEl = TtaNewTree (doc, elType, "");
1.12 kia 335: }
336: #endif /* TEMPLATES */
337: return newEl;
338: }
339:
340: /*----------------------------------------------------------------------
1.16 kia 341: Template_InsertUseChildren
342: Insert children to a xt:use
343: The dec parameter must be valid and will not be verified. It must be a
344: direct child element (for union elements).
345: @param el element (xt:use) in which insert a new element
346: @param dec Template declaration of the element to insert
347: @return The inserted element (the xt:use element if insertion is multiple as component)
348: ----------------------------------------------------------------------*/
349: Element Template_InsertUseChildren(Document doc, Element el, Declaration dec)
350: {
1.19 vatton 351: Element newEl = NULL;
1.16 kia 352: #ifdef TEMPLATES
1.19 vatton 353: Element current = NULL;
354: Element child = NULL;
355: //char *attrCurrentTypeValue;
356: //ElementType elType;
1.17 kia 357:
1.25 ! vatton 358: if (TtaGetDocumentAccessMode(doc))
1.16 kia 359: {
1.23 kia 360: switch (dec->nature)
361: {
362: case SimpleTypeNat:
363: newEl = Template_GetNewSimpleTypeInstance(doc, el, dec);
364: TtaInsertFirstChild (&newEl, el, doc);
365: break;
366: case XmlElementNat:
367: newEl = Template_GetNewXmlElementInstance(doc, el, dec);
368: TtaInsertFirstChild (&newEl, el, doc);
369: break;
370: case ComponentNat:
371: newEl = TtaCopyTree(dec->componentType.content, doc, doc, el);
372: ProcessAttr (dec->declaredIn, newEl, doc);
373:
374: /* Copy elements from new use to existing use. */
375: while((child = TtaGetFirstChild(newEl)))
376: {
377: TtaRemoveTree (child, doc);
1.25 ! vatton 378: if (current)
1.23 kia 379: TtaInsertSibling (child, current, FALSE, doc);
380: else
381: TtaInsertFirstChild (&child, el, doc);
382: current = child;
383: }
384:
385: /* Copy currentType attribute. */
386: //attrCurrentTypeValue = GetAttributeStringValue (el, Template_ATTR_currentType, NULL);
387: //SetAttributeStringValue (el, Template_ATTR_currentType, attrCurrentTypeValue);
388: TtaDeleteTree(newEl, doc);
389: newEl = el;
390: break;
391: case UnionNat :
392: /* Nothing to do.*/
393: // elType.ElTypeNum = Template_EL_useEl;
394: // cont = TtaNewElement (doc, elType);
395: // if (cont)
396: // {
397: // TtaSetAccessRight (cont, ReadWrite, doc);
398: // at = TtaNewAttribute (att);
399: // if (at)
400: // {
401: // TtaAttachAttribute (cont, at, doc);
402: // TtaSetAttributeText(at, types, cont, doc);
403: // }
404: // }
405: /* @@@@@ */
406: break;
407: default :
408: //Impossible
409: break;
410: }
411: }
1.16 kia 412: #endif /* TEMPLATES */
413: return newEl;
414: }
415:
416: /*----------------------------------------------------------------------
1.1 vatton 417: InstantiateUse
1.3 vatton 418: ----------------------------------------------------------------------*/
1.1 vatton 419: Element InstantiateUse (XTigerTemplate t, Element el, Document doc,
420: ThotBool insert)
421: {
422: #ifdef TEMPLATES
1.23 kia 423: Element cont = NULL;
1.1 vatton 424: ElementType elType;
425: Declaration dec;
426: int size, nbitems;
427: struct menuType *items;
428: char *types;
429: ThotBool oldStructureChecking;
430:
1.25 ! vatton 431: if (!t)
1.23 kia 432: return NULL;
433:
1.1 vatton 434: /* get the value of the "types" attribute */
435: cont = NULL;
1.12 kia 436: elType = TtaGetElementType (el);
1.18 kia 437: types = GetAttributeStringValueFromNum(el, Template_ATTR_types, &size);
1.25 ! vatton 438: if (!types)
1.18 kia 439: return NULL;
1.1 vatton 440: giveItems (types, size, &items, &nbitems);
441: // No structure checking
442: oldStructureChecking = TtaGetStructureChecking (doc);
443: TtaSetStructureChecking (FALSE, doc);
1.10 kia 444:
1.1 vatton 445: if (nbitems == 1)
446: /* only one type in the "types" attribute */
447: {
1.17 kia 448: dec = Template_GetDeclaration (t, items[0].label);
1.1 vatton 449: if (dec)
1.16 kia 450: cont = Template_InsertUseChildren(doc, el, dec);
1.1 vatton 451: }
1.4 quint 452: TtaFreeMemory(types);
1.18 kia 453: TtaFreeMemory(items);
1.1 vatton 454: TtaSetStructureChecking (oldStructureChecking, doc);
455: return cont;
1.23 kia 456: #else /* TEMPLATES */
457: return NULL;
1.1 vatton 458: #endif /* TEMPLATES */
459: }
460:
461: /*----------------------------------------------------------------------
1.22 kia 462: InstantiateRepeat
463: Check for min and max param and validate xt:repeat element content.
464: @param registerUndo True to register undo creation sequences.
1.3 vatton 465: ----------------------------------------------------------------------*/
1.22 kia 466: void InstantiateRepeat (XTigerTemplate t, Element el, Document doc, ThotBool registerUndo)
1.1 vatton 467: {
468: #ifdef TEMPLATES
469: int curVal, minVal, maxVal;
470: Attribute curAtt, minAtt, maxAtt;
471: AttributeType curType, minType, maxType;
472: char *text;
473:
1.25 ! vatton 474: if (!t)
1.23 kia 475: return;
476:
1.1 vatton 477: //Preparing types
478: curType.AttrSSchema = TtaGetSSchema (TEMPLATE_SCHEMA_NAME, doc);
479: minType.AttrSSchema = maxType.AttrSSchema = curType.AttrSSchema;
480: curType.AttrTypeNum = Template_ATTR_currentOccurs;
481: minType.AttrTypeNum = Template_ATTR_minOccurs;
482: maxType.AttrTypeNum = Template_ATTR_maxOccurs;
483:
484: //Get currentOccurs, minOccurs and maxOccurs attributes
485: curAtt = TtaGetAttribute (el, curType);
486: minAtt = TtaGetAttribute (el, minType);
487: maxAtt = TtaGetAttribute (el, maxType);
488:
489: //Get the values
490: if (minAtt)
491: {
1.10 kia 492: text = GetAttributeStringValue(el, minAtt, NULL);
1.1 vatton 493: if (text)
494: {
495: minVal = atoi(text);
496: TtaFreeMemory(text);
497: }
498: else
499: //Error : Attribute with no value
500: return;
501: }
502: else
503: minVal = 0;
504:
505: if (maxAtt)
506: {
1.10 kia 507: text = GetAttributeStringValue (el, maxAtt, NULL);
1.1 vatton 508: if (text)
509: {
510: if (!strcmp (text, "*"))
511: maxVal = INT_MAX;
512: else
513: maxVal = atoi (text);
514: TtaFreeMemory (text);
515: }
516: else
517: //Error : Attribute with no value
518: return;
519: }
520: else
521: maxVal = INT_MAX;
522:
523: if (curAtt)
524: {
1.10 kia 525: text = GetAttributeStringValue(el, curAtt, NULL);
1.1 vatton 526: if (text)
527: {
1.2 quint 528: curVal = atoi(text);
1.1 vatton 529: TtaFreeMemory(text);
530: }
531: else
532: //Error : Attribute with no value
533: return;
534: }
535: else
536: curVal = minVal;
537:
538: text = (char*)TtaGetMemory(MAX_LENGTH);
539:
540: //Create non existing attributes
541: if (!minAtt)
542: {
543: minAtt = TtaNewAttribute(minType);
544: sprintf(text,"%d",minVal);
545: TtaAttachAttribute(el, minAtt, doc);
546: TtaSetAttributeText(minAtt, text, el, doc);
1.25 ! vatton 547: if (registerUndo)
1.22 kia 548: TtaRegisterAttributeCreate(minAtt, el, doc);
1.1 vatton 549: }
550:
551: if (!maxAtt)
552: {
553: maxAtt = TtaNewAttribute(maxType);
554: if (maxVal<INT_MAX)
555: sprintf(text,"%d",maxVal);
556: else
557: sprintf(text,"*");
558: TtaAttachAttribute(el, maxAtt, doc);
559: TtaSetAttributeText(maxAtt, text, el, doc);
1.25 ! vatton 560: if (registerUndo)
1.22 kia 561: TtaRegisterAttributeCreate(maxAtt, el, doc);
1.1 vatton 562: }
563:
564: if (!curAtt)
1.2 quint 565: {
1.1 vatton 566: curAtt = TtaNewAttribute(curType);
567: sprintf(text,"%d",curVal);
568: TtaAttachAttribute(el, curAtt, doc);
569: TtaSetAttributeText(curAtt, text, el, doc);
1.25 ! vatton 570: if (registerUndo)
1.22 kia 571: TtaRegisterAttributeCreate(curAtt, el, doc);
1.1 vatton 572: }
573:
574: if (text)
575: TtaFreeMemory(text);
576:
577: //We must have currentOccurs children
578: Element child, newChild;
579: int childrenCount;
580:
581: child = TtaGetFirstChild(el);
582: if (!child)
583: //Error : a repeat must have at least one child which will be the model
584: return;
585:
586: for(childrenCount = 0; child; TtaNextSibling(&child))
587: {
588: //TODO : Check that every child is valid
589: childrenCount ++;
590: }
591:
592: if (childrenCount > maxVal)
593: //Error : too many children!
594: return;
595:
596: child = TtaGetLastChild(el);
597:
598: while(childrenCount < curVal)
599: {
600: //Create a new child
601: newChild = TtaCopyTree(child, doc, doc, el);
602: TtaInsertSibling(newChild, child, FALSE, doc);
1.25 ! vatton 603: if (registerUndo)
1.22 kia 604: TtaRegisterElementCreate(newChild, doc);
1.1 vatton 605: child = newChild;
606: childrenCount++;
607: }
608: #endif /* TEMPLATES */
609: }
610:
611: /*----------------------------------------------------------------------
612: ParseTemplate
1.3 vatton 613: ----------------------------------------------------------------------*/
1.1 vatton 614: static void ParseTemplate (XTigerTemplate t, Element el, Document doc,
615: ThotBool loading)
616: {
617: #ifdef TEMPLATES
618: AttributeType attType;
1.5 vatton 619: Attribute att;
620: Element aux, child; //Needed when deleting trees
621: char *name;
622: ElementType elType = TtaGetElementType (el);
1.1 vatton 623:
1.25 ! vatton 624: if (!t)
1.23 kia 625: return;
626:
1.5 vatton 627: name = TtaGetSSchemaName (elType.ElSSchema);
628: if (!strcmp (name, "Template"))
1.1 vatton 629: {
1.5 vatton 630: switch(elType.ElTypeNum)
1.1 vatton 631: {
632: case Template_EL_head :
633: //Remove it and all of its children
634: TtaDeleteTree(el, doc);
635: //We must stop searching into this tree
636: return;
637: break;
638: case Template_EL_component :
1.25 ! vatton 639: // remove the name attribute
1.5 vatton 640: attType.AttrSSchema = elType.ElSSchema;
1.1 vatton 641: attType.AttrTypeNum = Template_ATTR_name;
1.18 kia 642: name = GetAttributeStringValueFromNum (el, Template_ATTR_name, NULL);
1.5 vatton 643: TtaRemoveAttribute (el, TtaGetAttribute (el, attType), doc);
1.25 ! vatton 644: // replace the component by a use
1.1 vatton 645: if (NeedAMenu (el, doc))
1.5 vatton 646: TtaChangeElementType (el, Template_EL_useEl);
1.1 vatton 647: else
1.5 vatton 648: TtaChangeElementType (el, Template_EL_useSimple);
1.25 ! vatton 649: // generate the types attribute
1.1 vatton 650: attType.AttrTypeNum = Template_ATTR_types;
1.5 vatton 651: att = TtaNewAttribute (attType);
652: TtaAttachAttribute (el, att, doc);
1.25 ! vatton 653: if (name)
1.18 kia 654: TtaSetAttributeText (att, name, el, doc);
1.25 ! vatton 655: // generate the title attribute
! 656: attType.AttrTypeNum = Template_ATTR_title;
! 657: att = TtaNewAttribute (attType);
! 658: TtaAttachAttribute (el, att, doc);
! 659: if (name)
! 660: TtaSetAttributeText (att, name, el, doc);
! 661: // generate the currentType attribute
1.1 vatton 662: attType.AttrTypeNum = Template_ATTR_currentType;
1.5 vatton 663: att = TtaNewAttribute (attType);
1.18 kia 664: TtaAttachAttribute (el, att, doc);
1.25 ! vatton 665: if (name)
1.18 kia 666: TtaSetAttributeText (att, name, el, doc);
1.1 vatton 667: break;
668: case Template_EL_option :
669: aux = NULL;
670: break;
671: case Template_EL_bag :
672: //Link to types
673: //Allow editing the content
674: break;
675: case Template_EL_useEl :
676: case Template_EL_useSimple :
677: /* if this use element is not empty, don't do anything: it is
678: supposed to contain a valid instance. This should be
679: checked, though */
680: if (!TtaGetFirstChild (el))
681: InstantiateUse (t, el, doc, TRUE);
682: break;
683: case Template_EL_attribute :
684: if (!loading)
685: InstantiateAttribute (t, el, doc);
686: break;
687: case Template_EL_repeat :
1.22 kia 688: InstantiateRepeat (t, el, doc, FALSE);
1.1 vatton 689: break;
690: default :
691: break;
692: }
693: }
694:
1.5 vatton 695: child = TtaGetFirstChild (el);
696: while (child)
1.1 vatton 697: {
698: aux = child;
1.5 vatton 699: TtaNextSibling (&aux);
700: ParseTemplate (t, child, doc, loading);
1.1 vatton 701: child = aux;
702: }
703: #endif /* TEMPLATES */
704: }
705:
706: /*----------------------------------------------------------------------
1.3 vatton 707: ----------------------------------------------------------------------*/
1.1 vatton 708: void DoInstanceTemplate (char *templatename)
709: {
710: #ifdef TEMPLATES
711: XTigerTemplate t;
712: ElementType elType;
713: Element root, piElem, doctype, elFound, text;
714: char *s, *charsetname = NULL, buffer[MAX_LENGTH];
715: int pi_type;
716: Document doc;
717:
718: //Instantiate all elements
1.8 kia 719: t = (XTigerTemplate) Dictionary_Get (Templates_Dic, templatename);
1.25 ! vatton 720: if (!t)
1.23 kia 721: return;
722:
1.1 vatton 723: doc = GetTemplateDocument (t);
724: root = TtaGetMainRoot (doc);
725: ParseTemplate (t, root, doc, FALSE);
726:
727: //Look for PIs
728: /* check if the document has a DOCTYPE declaration */
729: #ifdef ANNOTATIONS
730: if (DocumentTypes[doc] == docAnnot)
731: elType = TtaGetElementType (root);
732: else
733: #endif /* ANNOTATIONS */
734: elType = TtaGetElementType (root);
735: s = TtaGetSSchemaName (elType.ElSSchema);
736: if (strcmp (s, "HTML") == 0)
737: {
738: elType.ElTypeNum = HTML_EL_DOCTYPE;
739: pi_type = HTML_EL_XMLPI;
740: }
741: #ifdef _SVG
742: else if (strcmp (s, "SVG") == 0)
743: {
744: elType.ElTypeNum = SVG_EL_DOCTYPE;
745: pi_type = SVG_EL_XMLPI;
746: }
747: #endif /* _SVG */
748: else if (strcmp (s, "MathML") == 0)
749: {
750: elType.ElTypeNum = MathML_EL_DOCTYPE;
751: pi_type = MathML_EL_XMLPI;
752: }
753: else
754: {
755: elType.ElTypeNum = XML_EL_doctype;
756: pi_type = XML_EL_xmlpi;
757: }
758: doctype = TtaSearchTypedElement (elType, SearchInTree, root);
759: if (!doctype)
760: {
761: /* generate the XML declaration */
762: /* Check the Thot abstract tree against the structure schema. */
763: TtaSetStructureChecking (FALSE, doc);
764: elType.ElTypeNum = pi_type;
765: doctype = TtaNewTree (doc, elType, "");
766: TtaInsertFirstChild (&doctype, root, doc);
767: elFound = TtaGetFirstChild (doctype);
768: text = TtaGetFirstChild (elFound);
769: strcpy (buffer, "xml version=\"1.0\" encoding=\"");
770: charsetname = UpdateDocumentCharset (doc);
771: strcat (buffer, charsetname);
772: strcat (buffer, "\"");
773: TtaSetTextContent (text, (unsigned char*)buffer, Latin_Script, doc);
774: TtaSetStructureChecking (TRUE, doc);
775: }
776:
777: /* generate the XTiger PI */
778: /* Check the Thot abstract tree against the structure schema. */
779: TtaSetStructureChecking (FALSE, doc);
780: elType.ElTypeNum = pi_type;
781: piElem = TtaNewTree (doc, elType, "");
782: TtaInsertSibling(piElem, doctype, FALSE, doc);
783: elFound = TtaGetFirstChild (piElem);
784: text = TtaGetFirstChild (elFound);
785: strcpy (buffer, "xtiger template=\"");
786: strcat (buffer, templatename);
1.17 kia 787: strcat (buffer, "\" version=\"");
1.20 vatton 788: if (t->version)
789: strcat (buffer, t->version);
790: else
791: strcat (buffer, "0.8");
1.1 vatton 792: strcat (buffer, "\"");
1.25 ! vatton 793: if (t->templateVersion)
1.20 vatton 794: {
795: strcat (buffer, " templateVersion=\"");
796: strcat (buffer, t->templateVersion);
797: strcat (buffer, "\"");
798: }
1.1 vatton 799: TtaSetTextContent (text, (unsigned char*)buffer, Latin_Script, doc);
800: TtaSetStructureChecking (TRUE, doc);
1.5 vatton 801:
802: // update the document title
803: if (!strcmp (s, "HTML"))
804: {
805: elType.ElTypeNum = HTML_EL_TITLE;
806: elFound = TtaSearchTypedElement (elType, SearchInTree, root);
807: if (elFound)
808: {
809: elFound = TtaGetFirstChild (elFound);
810: TtaSetTextContent (elFound, (unsigned char *)Answer_text,
811: TtaGetDefaultLanguage (), doc);
812: }
813: }
1.1 vatton 814: #endif /* TEMPLATES */
815: }
816:
817: /*----------------------------------------------------------------------
1.3 vatton 818: PreInstantiateComponents: Instantiates all components in order to improve
819: editing.
820: ----------------------------------------------------------------------*/
1.25 ! vatton 821: void PreInstantiateComponents (XTigerTemplate t)
1.1 vatton 822: {
823: #ifdef TEMPLATES
1.25 ! vatton 824: if (!t)
1.23 kia 825: return;
826:
1.1 vatton 827: DicDictionary components = GetComponents(t);
828: Declaration comp;
829:
1.8 kia 830: for(Dictionary_First(components);!Dictionary_IsDone(components);Dictionary_Next(components))
1.1 vatton 831: {
1.8 kia 832: comp = (Declaration) Dictionary_CurrentElement(components);
1.1 vatton 833: ParseTemplate(t, GetComponentContent(comp), GetTemplateDocument(t), TRUE);
834: }
835: #endif /* TEMPLATES */
836: }
Webmaster