How to build an grouped archive in Textpattern

You can build an archive of blog posts/articles which is grouped by year and months with built in tags. The nested tags and HTML elements are looking really weird but it works as unordered nested list.

<txp:article_custom sort="Posted desc" limit="99999" wraptag="ul" break="" class="archive">

	<txp:variable name="year" value='<txp:if_different><txp:posted format="%Y" /></txp:if_different>' />
	<txp:variable name="month" value='<txp:if_different><txp:posted format="%B" /></txp:if_different>' />

	<txp:if_variable name="year" value=""><txp:else />
		<txp:if_first_article><txp:else />
					</ul>
				</li>
			</ul>
		</txp:if_first_article>
		<li><h2><txp:posted format="%Y" /></h2>
			<ul>
	</txp:variable>

	<txp:if_variable name="month" value=""><txp:else />
		<txp:if_variable name="year" value="">
				</ul>
			</li>
		<txp:else /></txp:if_variable>
		<li><h3><txp:posted format="%B" /></h3>
			<ul>
	</txp:variable>

	<li><txp:posted />: <txp:permlink><txp:title /></txp:permlink></li>

	<txp:if_last_article></ul></li></ul></txp:if_last_article>

</txp:article_custom>

Neue Kategorie

Da ich überhaupt keine Ordnung in meinen Bookmarks halten kann und ich externe Bookmarkdienste auch selten nutze und auch bei einem Problem nicht jedes mal wieder die Suchmaschine anwerfen will, habe ich eine neue Kategorie »Programmierung« angelegt.

Ich werde dort Snippets und Code-Beispiele ablegen, die ich entweder mal gebraucht habe oder in der anderer Weise für mich interessant sind. Hauptsächlich wird es sich dabei um PHP und Javascript handeln. Vielleicht ist aber auch mal was von Bash, Awk, Sed etc. dabei.

PHP: UTF-8-Kodierung eines Streams für fgetscsv()

Problem

Hochgeladene Datei ist ISO-8859-1, fgetscsv() erwartet jedoch eine UTF-8-kodierte Datei. Sonderzeichen, Umlaute werden abgeschnitten bzw. ignoriert.

Lösung

Stream UTF-8 kodieren:

<?php

class utf8encode_filter extends php_user_filter 
{ 
	function filter($in, $out, &$consumed, $closing)
	{
		while ($bucket = stream_bucket_make_writeable($in))
		{
			$bucket->data = utf8_encode($bucket->data);
			$consumed += $bucket->datalen;
			stream_bucket_append($out, $bucket);
		}
		return PSFS_PASS_ON;
	}
}

?>

<?php

$handle = fopen($file, 'r');
stream_filter_register('utf8encode', 'utf8encode_filter')
	or die('Failed to register filter');
stream_filter_prepend($handle, 'utf8encode');

?>

(Via: php.net)

premature end of script headers

Holla, diese Meldung hat mich heute ‘nen halben Tag gekostet.
Also falls Ihr so eine Meldung bei Euren PHP-Scripten bekommt und ein 500-Status wegen möglicher Miskonfiguration zurückgeliefert wird, liegt das mit großer Wahrscheinlichkeit an falschen (nicht unbedingt fehlenden) Dateirechten.

Bei mir war folgendes der Fall:
PHP läuft als CGI, Apache greift also mit Userrechten auf die Dateien zu. Beim Hochladen bzw. Entpacken der Dateien werden diese auch fein dem user zugeordnet.

Aber:

Den Dateien waren natürlich vorher schon Zugriffsrechte zugeteilt gewesen. In meinem Fall die Rechte, die auf einem anderem Webserver benötigt wurden. Und das war hauptsächlich 664 — aber auch teilweise ganz krudes Zeuch wie 766.

So weit so unspektakulär. Da ich die Dateien aber als gezipptes tarball-Archiv hochgeladen und auf dem Server entpackt habe, sind die Berechtigungen beibehalten worden. Ist auch noch alles normal.

Das Problem, was sich bei mir auftat: Bei allen Dateien mit zuviel zugewiesen Rechten, wurden mit dem premature end of script headers-Fehler quittiert. Nach Änderung der Dateirechte auf 644 lüppt nun alles wieder. Also Owner darf Lesen/Schreiben, Gruppe und Rest darf nur lesen.

Nota bene: Von 777 lässt man lieber die Finger. Das kann man höchtens mal temporär zum Testen/Debuggen vergeben. Ansonsten ist das böse … ganz böse!

Ajax Regular Expression Evaluator

Klasse Wort …
Ich wollte nur den Link dafür los werden: Ajax Regular Expression Evaluator

Was macht das: Das evaluiert reguläre Ausdrücke anhand vorgegebener Beispiele bzw. Ziele.

Und …

… in drei verschiedenen Systemen:

  1. PHP PCRE
  2. PHP Posix
  3. Javascript

Find’ ich klasse. In Verbindung mit dem KRegExpEditor (ziemlich veraltete Seite, hab keine aktuellere gefunden) zum Erstellen von regulären Ausdrücken eine ziemlich geniale Sache – vor allem wenn die Ausdrücke … äh … unhandlich werden.

Von OPML zu HTML (OPML2HTML)

Ich bin endlich mal wieder dazu gekommen meine gar sehr veraltete Blogroll auf den neuesten Stand zu bringen. Am Einfachsten geht das natürlich über ein Export meines Feedreaders Akregator. Aus der erzeugten OPML lässt sich mit Hilfe eines PHP-Skriptes eine HTML-Datei erzeugen, die man schnell auf einer bestehenden Seite einbauen kann.

Das Problem, welches ich heute hatte: Netcologne ließ mich heute ca. eine Stunde lang nicht ins Internet um nach dem Skript zu suchen. :/

Aber mein nettes Linux ließ mir noch die Bash, die für solche Dinge bestens geeignet ist. Folgendes Skript kann man bestimmt viel einfacher und eleganter schreiben, aber als Skript-Dilletant konnte ich mir nur folgendes aus man awk und man sort zusammenreimen:

echo "<ul>" > opml.html && cat akregator.opml | grep htmlUrl | awk -F\" '{print "<li><a href=\"" $(NF-25) "\" " "title=\"" $(NF-1) "\">" $(NF-23) "</a> <a href=\"" $(NF-7) "\">(Feed)" "</a></li>"}' | sort -t\> -bfk 3 >> opml.html && echo "</ul>" >> opml.html

Um das Chaos etwas aufzudröseln:

Da ich gerne eine Liste mit den abonnierten Feeds haben möchte, schreibe das entsprechende öffnende Listentag des HTML-Markup in eine Datei namens opml.html:

echo "<ul>" > opml.html

Dannach öffne die exportierte OPML und schreibe dessen Inhalt nach stdout:

cat akregator.opml

Suche mir dann alle Zeilen, in denen das Suchmuster htmlUrl vorkommt:

grep htmlUrl

Benutze awk, setzt den Seperator auf das Zollzeichen (”) und schreibe einen Listenpunkt als a-Link mit Title-Tag und Feedangabe und setze an die entsprechenden Stellen die korrespondierenden Werte ein, die mit dem Seperator aus der OPML-Zeile ausgelesen werden (z.B.: $(NF-1)):

awk -F\" '{print "<li><a href=\"" $(NF-25) "\" " "title=\"" $(NF-1) "\">" $(NF-23) "</a> <a href=\"" $(NF-7) "\">(Feed)" "</a></li>"}'

Jetzt sortiere das Ganze alphabetisch über den Linktext (k 3), nimm dabei das Endtag (>) als Trenner, ignoriere Leerzeichen am Anfang (b) und verhalte dich gefälligst case-insensitiv (f); ach ja: Schreib das bitte in die schon angefangene Datei opml.html ohne den bisherigen Inhalt zu löschen (nämlich den öffnenden Listentag):

sort -t\> -bfk 3 >> opml.html

Fein, und jetzt schreib den geschlossenen Listentag auch noch in die Datei:

echo "</ul>" >> opml.html

Das wars. Das kann man jetzt relativ schmerzlos in bestehende HTML-Seiten kopieren. Das heißt, wenn das Internet wieder erreichbar ist.:)

Das kleine Skript hat gegen über PHP auch den Vorteil, dass ich meine OPML nicht erst auf einen PHP-fähigen Account laden oder lokal einen Webserver anwerfen muss. Der Vorteil gilt natürlich nur für *nix-Benutzer

Wer das Skript als ausführbare Datei haben möchte der bediene sich: opml2html
Mittlerweile habe ich das Script auf die OPML angepasst, welche vom Akregator aus dem KDE4 exportiert wird.

Etwas missfällt mir aber dennoch: Wenn man meine Blogroll durschaut, sieht man, dass die Sonderzeichen nicht richtig einsortiert werden. Vielleicht hat ja jemand einen Tip für mich, warum das so ist und wie das beheben kann.

neuere Einträge |