•     LPIC-3

     •     LPIC-3 (Security)

     •     OCP DBA

     •     OCP PL/SQL Programmer

     •     ITIL v3

Wie bringe ich meine Lesezeichen aus Safari automatisch auf meine Webseite?

     1.     Schritt

Ein wichtiger Prozess ist der launchd. Er überwacht z.B., ob sich eine Datei geändert hat, was mit einer plist-Datei konfiguriert wird:


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

     <key>WatchPaths</key>

     <array>

          <string>/Users/matthias/Library/Safari/Bookmarks.plist</string>

     </array>

     <key>ProgramArguments</key>

     <array>

          <string>/Users/matthias/bin/Safari2html</string>

     </array>

     <key>Label</key>

     <string>com.peick.Safari2html</string>

</dict>

</plist>


In der Bookmarks.plist speichert Safari seine Lesezeichen. Diese XML-Datei wird mittels XSLT gewandelt. Zuerst muss aber die komprimierte Variante expandiert werden:


plutil -convert xml1 -o ~/Library/Safari/Bookmarks-xml.plist ~/Library/Safari/Bookmarks.plist

java -d64 -classpath ~/java/saxon9he.jar net.sf.saxon.Transform -s:$HOME/Library/Safari/Bookmarks-xml.plist -o:$HOME/Sites/www.peick.com/XXX/XXX.html -xsl:$HOME/xslt/Safari2Html.xsl

Die eigentliche Intelligenz steckt in der XSL-Datei:


<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="2.0"

          xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xhtml" indent="yes"/>


<!-- The entry. -->

  <xsl:template match="/plist/dict/array">

    <html>

      <head>

     <title>Matthias' Lesezeichen</title>

     <link rel="stylesheet" type="text/css" href="Bookmarks.css" />

      </head>

     <h1>Matthias' Lesezeichen</h1>

      <ul>

     <xsl:apply-templates/>

      </ul>

    </html>

  </xsl:template>


<!-- This is a bookmarklist. -->

  <xsl:template match="array">

    <xsl:choose>

      <!-- Dismiss the base because of optical reasons. -->

      <xsl:when test="../string[1] = 'WebBookmarkTypeList'">

     <xsl:apply-templates/>

      </xsl:when>

      <!-- Dismiss unwanted branches. -->

      <xsl:when test="../string[1] = 'Ausnahme' or ../string[1] = 'privat' "/>

      <!-- Better name -->

      <xsl:when test="../string[1] = 'BookmarksBar'">

     <li> Lesezeichenleiste

       <ul>

         <xsl:apply-templates/>

       </ul>

     </li>

      </xsl:when>

      <!-- Better name -->

      <xsl:when test="../string[1] = 'BookmarksMenu'">

     <li> Lesezeichenmenü

       <ul>

         <xsl:apply-templates/>

       </ul>

     </li>

      </xsl:when>

      <!-- All submenus -->

      <xsl:otherwise>

     <li>

       <xsl:value-of select="../string[1]"/>

       <ul>

         <xsl:apply-templates/>

       </ul>

     </li>

      </xsl:otherwise>

    </xsl:choose>

  </xsl:template>


<!-- This ist a bookmark. -->

  <xsl:template match="string[ text() = 'WebBookmarkTypeLeaf' ]">

    <li>

      <xsl:value-of select="'<a href="', ../string[1], '" target="_blank" >'" disable-output-escaping="yes"/>

      <xsl:value-of select="../dict[2]/string[1]" disable-output-escaping="yes"/>

      <xsl:value-of select="'</a>'" disable-output-escaping="yes"/>

    </li>

</xsl:template>


<!-- The other stuff which mustn't be seen. -->

  <xsl:template match="text()"/>

</xsl:stylesheet>


Die XSL-Datei begleitet mich schon seit Safari 3 und musste von mir in all den Jahren nur einmal geringfügig angepasst werden, weil Apple die plist geändert hatte.


Der letzte Akt ist wieder eine Skriptzeile:


touch "$HOME/Sites/www.peick.com/assets.http:--www.peick.com.plist"


Mit dieser Zeile setze ich den Lademechanismus in Gang. Wie das? Ich benutze iWeb zum Erstellen meiner Webseiten. Wenn ich die Seiten in einem lokalen Verzeichnis „veröffentliche“, wird immer diese Datei verändert. Folglich wacht der launchd auch darüber.


Der Mechanismus führt an den Webseiten ein paar Wandlungen durch, die mir das Leben mit iWeb erleichtern. Wichtiger Bestandteil, der den letzten Schritt durchführt, ist sitecopy, welches ich mir selber kompilieren musste. Aber das ist unkritisch.