XMetaL kann durch eigene Makros sehr weitgehend angepaßt werden. Hier einige Code-Beispiele (Auszüge):
<!--=================================================================--> <MACRO name="Person" key="Alt+Shift+P" lang="JScript" id="180" tooltip="Person (Alt-Shift-P)" desc="Fügt eine Personen-Markierung ein"><![CDATA[ //===================================================================== // SoftQuad Script Language JScript: if (ActiveDocument.ViewType == 2) { Selection.InsertElement ("rs"); Application.Alert ("In dieser Sicht funktioniert dieses Makro nur teilweise."); } else { Selection.Surround ("rs"); Selection.ElementAttribute ("type", "rs", 0) = "per"; } ]]></MACRO> <!--=================================================================--> <MACRO name="Ort" key="Alt+Shift+O" lang="JScript" id="178" tooltip="Ort (Alt-Shift-O)" desc="Fügt eine Orts-Markierung ein"><![CDATA[ //===================================================================== // SoftQuad Script Language JScript: if (ActiveDocument.ViewType == 2) { Selection.InsertElement ("rs"); Application.Alert ("In dieser Sicht funktioniert dieses Makro nur teilweise."); } else { Selection.Surround ("rs"); Selection.ElementAttribute ("type", "rs", 0) = "loc"; } ]]></MACRO>
<!--=================================================================--> <MACRO name="Mit TUSTEP setzen" key="" lang="JScript" id="1220" tooltip="Mit TUSTEP setzen" desc="Formatiert das aktuelle Dokument mit dem TUSTEP-Satzprogramm"><![CDATA[ //===================================================================== function doMitTUSTEPSetzen() { if (ActiveDocument.FullName.length == 0) { Application.Alert("Neue Dokumente bitte speichern, um eine aktuelle Ausgabe zu erhalten."); return; } if (! ActiveDocument.Saved) Application.Alert("Bitte vorher speichern, um eine aktuelle Ausgabe zu erhalten."); try { var xml = new ActiveXObject("MSXML2.DOMDocument"), //input xsl = new ActiveXObject("MSXML2.DOMDocument"), //style out = new ActiveXObject("MSXML2.DOMDocument"); //output } catch (exception) { result = reportRuntimeError("Mit TUSTEP setzen: Error:", exception); Application.Alert(result + "\nYou need to get the latest version of MSXML from the Microsoft site."); return; } xml.async=false; xml.validateOnParse=false; xml.load(ActiveDocument.FullName); if (xml.parseError.errorCode != 0) { result = reportParseError(xml.parseError); Application.Alert("Input (XML) Parse Error:\n"+ result); return; } xsl.async=false; xsl.validateOnParse=false; xsl.load(ActiveDocument.Path + "\\..\\..\\dtd\\hgkdiary-tustep.xsl"); if (xsl.parseError.errorCode != 0) { result = reportParseError(xsl.parseError); Application.Alert("Style Sheet (XSL) Parser-Fehlermeldung:\n"+ result); return; } out.async = false; out.validateOnParse=false; try { xml.transformNodeToObject(xsl, out); } catch (exception) { result = reportRuntimeError("Mit TUSTEP setzen: Error:", exception); Application.Alert(result); return; } if (out.parseError.errorCode != 0) { result = reportParseError(out.parseError); Application.Alert("Output (TUSTEP) Parser-Fehlermeldung:\n"+ result); return; } var TustepFile = ActiveDocument.Path + "\\..\\work\\" + ComputerName.substring(0, 7) + "_temp.sdf"; try { out.save(TustepFile); } catch (exception) { result = reportRuntimeError("Mit TUSTEP setzen: Error:", exception); Application.Alert(result); return; } // Application.MessageBox ("TUSTEP-Code geschrieben nach "+ TustepFile , 64, "Mit TUSTEP setzen"); var WSHShell = new ActiveXObject("WScript.Shell"), TustepCmd = ActiveDocument.Path + "\\..\\work\\preview.tsd"; try { WSHShell.Run(TustepCmd); } catch (exception) { result = reportRuntimeError("Mit TUSTEP setzen: Error:", exception); Application.Alert(result); return; } return; } doMitTUSTEPSetzen(); ]]></MACRO>
<!--=================================================================--> <MACRO name="On_Document_Open_Complete" hide="true" lang="JScript"><![CDATA[ //=================================================================== // Wird aufgerufen, wenn ein Dokument geladen wurde. // Setzt ggf. einen Schreibschutz, um Zugriffskonflikte im Netz zu vermeiden; // aber nur, wenn nicht schon ein Schreibschutz besteht. // Application.alert("On_Document_Open_Complete"); var Name = ActiveDocument.FullName; if (Name) { var FSO = new ActiveXObject("Scripting.FileSystemObject"), F = FSO.GetFile(Name); // Pruefen, ob Datei schon r/o ist. Falls ja, ist sie vermutlich // woanders bereits geoeffnet. Falls nein, setzen wir sie auf // r/o und merken uns, dass wir das Aenderungsrecht haben. if (F.attributes & 1) { // Datei ist r/o Application.alert("Die Datei ist nur lesbar und kann nicht verändert werden.\n" + "Möglicherweise wird sie an einem anderen PC verwendet."); } else // Datei ist r/w { var Props = ActiveDocument.CustomDocumentProperties; Props.Add("LockedByMe", "yes"); F.attributes += 1; } } ]]></MACRO> <!--=================================================================--> <MACRO name="File_Save" hide="true" lang="JScript"><![CDATA[ //=================================================================== // Wird bei jedem Speichern aufgerufen. // Entfernt temporaer den Schreibschutz, wenn wir selbst das // Aenderungsrecht an der Datei haben. // Eine entsprechende Logik fuer "SaveAs" fehlt noch! // Application.alert("File_Save"); var Name = ActiveDocument.FullName; if (Name) { var FSO = new ActiveXObject("Scripting.FileSystemObject"), F = FSO.GetFile(Name), Props = ActiveDocument.CustomDocumentProperties; if (Props.item("LockedByMe")) { F.attributes -= 1; // Datei r/w setzen; ActiveDocument.Save(); F.attributes += 1; // Datei r/o setzen; } else { ActiveDocument.Save(); Application.Run("On_Document_Open_Complete"); } } else // neues Dokument { ActiveDocument.Save(); Application.Run("On_Document_Open_Complete"); } ]]></MACRO>
<!--=================================================================--> <MACRO name="Tageseintrag isolieren" lang="JScript" id="1101" tooltip="Tageseintrag isolieren" desc="Stellt den aktuellen Tageseintrag als eigenes Dokument dar (z.B. für einen Ausdruck)"><![CDATA[ //=================================================================== function DoTagesEintragIsolieren() { var Rng1 = ActiveDocument.Range, Path = ActiveDocument.Path.replace(/\\[^\\]*$/, ""); // Tageseintrag finden und in die Zwischenablage stellen: Rng1.MoveToElement("div", false); Rng1.Select(); Selection.SelectElement(); Selection.Copy(); Selection.Collapse(); // Temp. Druckdatei oeffnen: if (Documents.Open(Path + "\\work\\print-template.xml") == null) { return; } var Rng2 = ActiveDocument.Range; // Einfuegestelle finden Rng2.MoveToElement("div", true); Rng2.Select(); if (Rng2.FindInsertLocation("div")) { Selection.Paste(); Rng2.MoveToDocumentStart(); ActiveDocument.SaveAs(Path + "\\work\\" + ComputerName + "-print-temp.xml"); ActiveDocument.ViewType = sqViewBrowse; } else { Application.Alert("Finde keine Stelle, um Tageseintrag einzufügen"); } Rng1 = null; Rng2 = null; } DoTagesEintragIsolieren(); ]]></MACRO>