XMetaL-Makro-Beispiele

XMetaL kann durch eigene Makros sehr weitgehend angepaßt werden. Hier einige Code-Beispiele (Auszüge):

Typisches Markup einfügen

<!--=================================================================-->
<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>

Mit TUSTEP setzen

<!--=================================================================-->
<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>

File-Locking nachbilden

<!--=================================================================-->
<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>

Tageseintrag isolieren

<!--=================================================================-->
<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>