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>