<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>toscho.design&#187; CSS</title>
	<atom:link href="http://toscho.de/thema/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://toscho.de</link>
	<description>Redaktion und schwer geprüftes Webdesign aus Halle (Saale)</description>
	<lastBuildDate>Sat, 07 Jan 2012 14:55:02 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>4</sy:updateFrequency>
	
		<item>
		<title>CSS: tab-size</title>
		<link>http://toscho.de/2012/css-tab-size/</link>
		<comments>http://toscho.de/2012/css-tab-size/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 05:19:10 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1827</guid>
		<description><![CDATA[Wie man das Unsichtbare gestaltet: Die Breite eines Tabulators. Test, Screenshots und genervtes Fazit obendrein.]]></description>
			<content:encoded><![CDATA[<p>Als Kontrapunkt zum letzten Artikel hier mal eine so unterhaltsame wie nutzlose CSS-Spielerei: Alle Browser haben sich inzwischen darauf geeinigt, daß das Zeichen TAB (<abbr title='Unicode Codepoint'>U+0009</abbr>, der Tabulator) wie acht Leerschritte darzustellen sei. Ein schwachsinnig hoher Wert, wenn man Code darstellen möchte – zumindest kenne ich niemanden, der <em>das</em> in seinem Editor eingestellt hat.</p>
<p>Rettung <del>naht</del> gibt es vielleicht irgendwann: Im CSS Text Level 3 wird die Eigenschaft <a href="http://dev.w3.org/csswg/css3-text/#tab-size"><code>tab-size</code></a> vorgeschlagen. Die <a href="http://lists.w3.org/Archives/Public/www-style/2008Dec/0009.html">Diskussion dazu</a> findet man in der CSS-Mailingliste des W3C.</p>
<pre class="notranslate">pre
{
    tab-size: 4; <i>/* Nimm vier Leerzeichen! */</i>
}</pre>
<p>Das setzt freilich voraus, daß der Browser das Zeichen TAB im <a href="http://glazkov.com/2011/01/14/what-the-heck-is-shadow-dom/">Shadow DOM</a> in ein Pseudo-Element packt. Und das können derzeit nur Firefox und Opera. Mit einem Vendorpräfix.</p>
<pre class="notranslate">pre
{
    -moz-tab-size: 4;
    -o-tab-size:   4;
    tab-size:      4;
}</pre>
<p>Der <a href="http://labs.toscho.de/test/css/tab-size.html">Test</a>, der auch andere Präfixe prüft, zeigt in Opera und Firefox das erhoffte Ergebnis:</p>
<p><img src="http://toscho.de/wp-content/uploads/2012/01/tab-size-opera.png" alt="Screenshot Opera" width="493" height="366" class="alignnone size-full wp-image-1828" /></p>
<p>WebKit (hier Chrome) und der IE 9 machen leider dieses:</p>
<p><img src="http://toscho.de/wp-content/uploads/2012/01/tab-size-chrome.png" alt="Screenshot Chrome" width="493" height="366" class="alignnone size-full wp-image-1829" /></p>
<p>Fazit: Taugt erstmal nur fürs Userstylesheet. Immerhin. In den nächsten zwei Jahren werden wir unseren Code weiterhin ein bißchen vorbereiten müssen und <a href="http://labs.toscho.de/escape/">Tabs in Leerzeichen umwandeln</a> – oder auf die ollen Nischenbrowser pfeifen.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2012/css-tab-size/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSS langweilt mich</title>
		<link>http://toscho.de/2012/css-langweilt-mich/</link>
		<comments>http://toscho.de/2012/css-langweilt-mich/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 08:07:49 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1824</guid>
		<description><![CDATA[Warum ich mich von CSS nicht mehr herausgefordert fühle: zu leicht, zu kitschig, zu konzeptlos. Ich kann es jetzt, und damit hat es sich.]]></description>
			<content:encoded><![CDATA[<p>1998 habe ich mich mal zwei Tage hingesetzt und die taufrische <a href="http://www.w3.org/TR/2008/REC-CSS2-20080411/">CSS-2.0-Spezifikation</a> durchgelesen. Vieles hat nirgendwo funktioniert. Ich fand’s trotzdem toll.</p>
<p><img src="http://toscho.de/wp-content/uploads/2012/01/valid-css-500.png" alt="" width="500" height="186" class="alignnone size-full wp-image-1826" /></p>
<p>Quälend langsam haben dann einzelne Browser ihre skurrilen Interpretationen der Regeln eingebaut. Da gab es eine Menge zu lernen und zu hacken. Jeder Browser hatte nicht nur Macken, die zu den Macken der anderen inkompatibel waren, sondern auch ein rasch wechselndes Set proprietärer Eigenschaften. Es hat Spaß gemacht, da herumzukurven, im Usenet oder auf Mailinglisten mit anderen Leuten zu tüfteln und zu testen.</p>
<p>Heute ist das weg. Mit den superkaputten Browsern ist auch das Gefühl verschwunden, beim Umgang mit CSS den Kopf zu brauchen. Klar, es gibt immer noch kleine Hacks und vorläufige proprietäre Implementationen. Meistens laufen die nur auf ein weiteres Snippet in der IDE hinaus. Aber früher, als man nicht einmal <code>width</code> schreiben konnte, ohne von mindestens drei Browsern eins in die Fresse zu kriegen, war das irgendwie … spannender.</p>
<p>CSS3 hat uns viele neue Eigenschaften gebracht aber kaum neue Konzepte. Viele Module sind nicht einmal kompatibel <em>zueinander</em>, und das Entwicklungstempo ist – so wirkt es auf mich – deutlich gesunken. Kein Wunder, ich verlöre angesichts dieses Wustes auch die Lust.</p>
<p>Manches nervt sogar. Ich habe die Nase voll von Schättchen und Verläufen, von abgelutscht aussehenden Ecken und Schrift mit Pseudo-Prägeeffekt. Kitsch. Hier wird das alles demnächst verschwinden.</p>
<p>Der Grund für das <a href="http://toscho.de/2011/fefe-theme/">Fefe-Theme</a> war nicht Fefe. Der Grund waren all die anderen Layouts, die ich in den letzten Jahren verfaßt habe. Bei denen ich zu viel Zeit mit zu leichtem Code verbringen mußte.</p>
<p>Ich bin, wie Aristoteles einst so schön gesagt hat, ein krummes Holz, das mal in die andere Richtung gebogen werden muß. Von mir selbst.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2012/css-langweilt-mich/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WordPress: Adminbar in Systemfarben</title>
		<link>http://toscho.de/2011/wordpress-adminbar-in-systemfarben/</link>
		<comments>http://toscho.de/2011/wordpress-adminbar-in-systemfarben/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 20:38:19 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1788</guid>
		<description><![CDATA[Ein WordPress-Plugin für eine angenehm bedienbare Adminbar. Screenshots und Download.]]></description>
			<content:encoded><![CDATA[<p>Ich finde die neue Adminbar recht praktisch, zumindest mit der <a href="http://wordpress.org/extend/plugins/debug-bar/">Debug-Bar</a>.</p>
<p>Leider sieht sie dämlich aus: Hellgrau auf Mittelgrau, zeitgemäß verhunzt mit Schatten und abgerundeten Ecken. Kinkerlitzchen, CSS3 vom Schlimmsten.</p>
<p>Ich habe diesen Quatsch mal aufgeräumt, die Farben auf die des Betriebssystems umgestellt und ein Plugin daraus gemacht:</p>
<p class="downloadlink"><a class='piwik_download' href="https://github.com/toscho/Admin-Bar-In-System-Colors">Admin Bar In System Colors</a></p>
<p class="wideimg"><a href="http://toscho.de/wp-content/uploads/2011/04/admin-system-compare.png"><img src="http://toscho.de/wp-content/uploads/2011/04/admin-system-compare.png" alt="Vergleich der Adminbar mit und ohne Plugin" width="650" height="400" class="alignnone size-full wp-image-1789" /></a></p>
<p>Das kann hoffentlich jede und jeder gut lesen.</p>
<p>Forks, Fragen oder <del datetime="2011-04-06T20:15:54+00:00">Fer</del> Verbesserungsvorschläge?</p>
<p>Umfangreiche Browsertests habe ich noch nicht gemacht – keine Zeit! – und vielleicht sollte ich das Standardstylesheet komplett ersetzen, statt es zu überschreiben. Auch über die feste Höhe samt Pixelschriftgröße werde ich sicher nochmal nachdenken. Und die kleine Grafik für aufklappbare Menus kann man kaum noch erkennen …</p>
<h2>Weiterlesen</h2>
<ul>
<li><a href="http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/">WordPress-Plugin: Backend Style Enhancements</a></li>
<li><a href="http://toscho.de/2010/wordpress-grundeinstellungen-per-plugin-setzen/">WordPress: Grundeinstellungen per Plugin setzen</a></li>
<li><a href="http://toscho.de/2009/wordpress-administrator-php-herausfinden/">WordPress: Administrator mit PHP herausfinden</a></li>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2011/wordpress-adminbar-in-systemfarben/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>WordPress: Internet Explorer ohne CSS-Hacks ansprechen</title>
		<link>http://toscho.de/2010/wordpress-internet-explorer-ohne-css-hacks-ansprechen/</link>
		<comments>http://toscho.de/2010/wordpress-internet-explorer-ohne-css-hacks-ansprechen/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 07:43:50 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Markup]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Trickkiste]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1731</guid>
		<description><![CDATA[Wie man jede Version des Internet Explorers einfach mit einem Klassennamen ansprechen kann. Extra Code für WordPress-Themes inklusive.]]></description>
			<content:encoded><![CDATA[<p><img src="http://toscho.de/wp-content/uploads/2010/09/ie-150.png" alt="" title="ie-150" width="150" height="150" class="alignright size-full wp-image-1732" />Den Internet Explorer betrachten die meisten Webentwickler zu Recht als chronische Krankheit. Neben anderen Browsern sieht auch die kommende Version 9 <a href="http://www.findmebyip.com/litmus">eher bedrückend</a> aus. Ehe wir diesem Browser keine Extrawurst mehr braten müssen, wird noch viel Zeit vergehen.</p>
<p>Um den IE im Stylesheet gesondert anzusprechen, brauchen wir weder Hacks im CSS noch eine zusätzliche Datei oder gar (pfui!) eine serverseitige Browserweiche. Wir müssen nur das Element <code>&lt;html&gt;</code> über <a href="http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx" lang="en" hreflang="en">Conditional Comments</a> anpassen. Diese Idee <a href="http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/" hreflang="en">hatte Paul Irish schon 2008</a>.</p>
<p>Ich habe das neulich in einem WordPress-Theme eingesetzt und mag es so sehr, daß ich künftig all meine Themes damit ausrüsten werde.<br />
Ein wenig umständlich: Die Sprachattribute werden in WordPress mit der Funktion <a href="http://codex.wordpress.org/Function_Reference/language_attributes"><code>language_attributes()</code></a> erzeugt – und die hat ein fest eingebautes <code>echo</code>, das man nicht abschalten kann. Ich will nun nicht drei Meter Code in der <code>header.php</code> stehen haben, deshalb habe ich mir zwei kleine Funktionen gebaut. Die Funktion <code>get_language_attributes()</code> ist obendrein etwas schlanker als das Original, und sie gibt das Attribut <code>dir</code> nur aus, wenn der Text von rechts nach links läuft. Andernfalls ist es an dieser Stelle überflüssig.</p>
<p>Doch zum Code, er gehört in die <code>functions.php</code>:</p>
<div class="php-code">
<pre class="notranslate php"><span class='openclose'>&lt;?php
</span><i class='comment'>/**
 * html5 start tag + language attribute + conditional tags for IE Win
 * @link   <a href="http://paulirish.com/?p=88">http://paulirish.com/?p=88</a>
 * @param  bool $print
 * @return void|string
 */</i>
<span class='internal'>function</span> htmlstart(<var>$print</var> <span class='operator'>=</span> <span class='internal'>TRUE</span>)
{
    <var>$out</var>  <span class='operator'>=</span> <span class='string'>&#039;&lt;!Doctype html&gt;&#039;</span>;
    <var>$lang</var> <span class='operator'>=</span> get_language_attributes();
    <var>$ies</var>  <span class='operator'>=</span> <span class='internal'>array</span> (
        6 <span class='operator'>=&gt;</span> <span class='string'>&#039;lte6 lte7 lte8&#039;</span>
    ,   7 <span class='operator'>=&gt;</span> <span class='string'>&#039;lte7 lte8&#039;</span>
    ,   8 <span class='operator'>=&gt;</span> <span class='string'>&#039;lte8&#039;</span>
    ,   9 <span class='operator'>=&gt;</span> <span class='string'>&#039;&#039;</span>
    );

    <span class='internal'>foreach</span> ( <var>$ies</var> <span class='internal'>as</span> <var>$n</var> <span class='operator'>=&gt;</span> <var>$class</var> )
    {
        <var>$out</var> <span class='operator'>.=</span> &quot;<span class='string'>&lt;!--[if IE </span><var>$n</var><span class='string'>]&gt;&lt;html </span><var>$lang</var><span class='string'> class=&#039;ie ie</span><var>$n</var><span class='string'> </span><var>$class</var><span class='string'> lte9&#039;&gt;&lt;![endif]--&gt;</span>&quot;;
    }

    <var>$out</var> <span class='operator'>.=</span> &quot;<span class='string'>&lt;!--[if !IE]&gt;&lt;!--&gt;&lt;html </span><var>$lang</var><span class='string'>&gt;&lt;!--&lt;![endif]--&gt;</span>&quot;;

    <span class='internal'>if</span> ( <span class='operator'>!</span> <var>$print</var> )
    {
        <span class='internal'>return</span> <var>$out</var>;
    }

    <span class='internal'>print</span> <var>$out</var>;
}

<span class='internal'>if</span> ( <span class='operator'>!</span> <a href='http://php.net/function_exists'>function_exists</a>(<span class='string'>&#039;get_language_attributes&#039;</span>) )
{
    <i class='comment'>/**
     * Returns the language attributes.
     *
     * Unobstrusive copy from the core.
     * Requires WP 3.0+
     *
     * @param string $doctype The type of html document (xhtml|html).
     */</i>
    <span class='internal'>function</span> get_language_attributes(<var>$doctype</var> <span class='operator'>=</span> <span class='string'>&#039;html&#039;</span>) {
        <var>$output</var> <span class='operator'>=</span> is_rtl() <span class='operator'>?</span> <span class='string'>&#039;dir=&quot;rtl&quot;&#039;</span> <span class='operator'>:</span> <span class='string'>&#039;&#039;</span>;

        <span class='internal'>if</span> ( <var>$lang</var> <span class='operator'>=</span> get_bloginfo(<span class='string'>&#039;language&#039;</span>) )
        {
            <var>$output</var> <span class='operator'>.=</span> ( ( get_option(<span class='string'>&#039;html_type&#039;</span>) <span class='operator'>!=</span> <span class='string'>&#039;text/html&#039;</span>
                <span class='operator'>||</span> <var>$doctype</var> <span class='operator'>==</span> <span class='string'>&#039;xhtml&#039;</span> )
                <span class='operator'>?</span> <span class='string'>&#039; xml:&#039;</span> <span class='operator'>:</span> <span class='string'>&#039;&#039;</span>) <span class='operator'>.</span> <span class='string'>&#039;lang=&quot;&#039;</span> <span class='operator'>.</span> <var>$lang</var> <span class='operator'>.</span> <span class='string'>&#039;&quot;&#039;</span>;
        }

        <span class='internal'>return</span> apply_filters(<span class='string'>&#039;language_attributes&#039;</span>, <var>$output</var>);
    }
}</pre>
</div>
<p>Im Theme rufen wir die Funktion dort auf, wo früher die Doctype-Deklaration und das Start-Tag standen.<br />
Die Ausgabe sieht (hier aufgehübscht) etwa so aus:</p>
<pre class="notranslate html">&lt;!Doctype html&gt;
&lt;!--[if IE 6]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie6 lte6 lte7 lte8 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if IE 7]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie7 lte7 lte8 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if IE 8]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie8 lte8 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if IE 9]&gt;
    &lt;html lang=<code class="string">"de-DE"</code> class=<code class="string">'ie ie9 lte9'</code>&gt;
&lt;![endif]--&gt;
&lt;!--[if !IE]&gt;&lt;!--&gt;
    &lt;html lang=<code class="string">"de-DE"</code>&gt;
&lt;!--&lt;![endif]--&gt;</pre>
<p>Nein, das ist kein sehr schönes Markup mehr. Aber so richtig schlimmes auch nicht. Obendrein validiert es.</p>
<p>Im Stylesheet können wir den Internet Explorer jetzt ganz einfach mit der passenden Klasse ansprechen:</p>
<pre class="notranslate">.ie8
{
    top:        10px;
}
.lte7
{
    top:        15px;
}</pre>
<p>Das kann ich mir viel besser merken als Kommentarhacks oder Spielereien mit ungültigen Selektoren und Eigenschaften.</p>
<p>Mehrere Internet Explorer auf einem Windows kann man sich mit der <a href="http://utilu.com/IECollection/" lang='en' hreflang='en'>Utilo IE Collection</a> einrichten. Zum Testen der Conditional Comments habe ich im Labor eine kleine Seite eingerichtet: <a href="http://labs.toscho.de/test/conditional-comments/">CC-Test</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-internet-explorer-ohne-css-hacks-ansprechen/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>WordPress: Moderationslinks für Kommentare</title>
		<link>http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/</link>
		<comments>http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 20:58:09 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interna]]></category>
		<category><![CDATA[Markup]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1671</guid>
		<description><![CDATA[Wie man jeden Kommentar um Links ergänzt, die beim Verwalten helfen. Mit vollständigem PHP- und CSS-Code.]]></description>
			<content:encoded><![CDATA[<p>Trotz des <a href="http://toscho.de/2010/spam-verhindern-akismet-htaccess/">Antispam-Plugins</a> schlüpft auch hier manchmal ein Müllkommentar durch den Filter, oder ich vertippe mich … für diese Fälle bietet WordPress an, Kommentare zu bearbeiten, als Spam zu markieren oder ganz zu löschen. Im Backend.</p>
<p>Das ist mir ein wenig zu umständlich; deshalb habe ich in meiner Klasse ›XWP‹, die zusätzliche Templatetags erzeugt, folgenden kleinen Schnipsel eingebaut, den ich <a href="http://yoast.com/wordpress-functions-supercharge-theme/" hreflang="en">von Joost de Valk abgeguckt</a> habe:</p>
<pre class="notranslate">    <i>/* Generates comment moderation links.
     *
     * @author Joost de Valk
     * @link   <a href="http://yoast.com/wordpress-functions-supercharge-theme/">http://yoast.com/wordpress-functions-supercharge-theme/</a>
     * @param  int <var>$id</var> Comment id - use get_comment_ID()
     * @return void
     */</i>
    public static function delete_comment_link(<var>$id</var>)
    {
        if ( ! <a href="http://codex.wordpress.org/Roles_and_Capabilities#moderate_comments">current_user_can</a>('<code class="string">moderate_comments</code>') )
        {
            return;
        }

        global <var>$post</var>;

        <var>$redirect</var> = get_permalink( <var>$post</var>-&gt;ID );

        <var>$links</var> = array (
            '<code class="string">delete</code>'  =&gt; '<code class="string">cdc</code>',
            '<code class="string">spam</code>' =&gt; '<code class="string">cdc&amp;dt=spam</code>',
            '<code class="string">edit</code>' =&gt; '<code class="string">editcomment</code>'
        );

        <var>$return</var> = '<code class="string">&lt;span class="comment_admin"&gt;</code>';

        foreach ( <var>$links</var> as <var>$name</var> =&gt; <var>$param</var> )
        {
            <var>$return</var> .= "<code class="string">&lt;a href='</code>"
                    . admin_url("<code class="string">comment.php?c=<var>$id</var>&amp;action=<var>$param</var>&amp;redirect_to=<var>$redirect</var></code>")
                    . "<code class="string">'&gt;<var>$name</var>&lt;/a&gt;</code>";
        }

        print <var>$return</var> . '<code class="string">&lt;/span&gt;</code>';

        return;
    }</pre>
<p>In der <code>comments.php</code> rufe ich die Funktion innerhalb des Kommentarloops auf:</p>
<pre class="notranslate">XWP::delete_comment_link( get_comment_ID() );</pre>
<p>Das erzeugt etwa dieses <a href="http://toscho.de/thema/markup/">Markup</a>:</p>
<pre class="notranslate">&lt;span class="<code class="string">comment_admin</code>"&gt;
  &lt;a href='<code class="string">/wp-admin/comment.php?c=905&amp;action=cdc&amp;redirect_to=/2010/beispiel/</code>'
     &gt;delete&lt;/a&gt;
  &lt;a href='<code class="string">/wp-admin/comment.php?c=905&amp;action=cdc&amp;dt=spam&amp;redirect_to=/2010/beispiel/</code>'
     &gt;spam&lt;/a&gt;
  &lt;a href='<code class="string">/wp-admin/comment.php?c=905&amp;action=editcomment&amp;redirect_to=/2010/beispiel/</code>'
     &gt;edit&lt;/a&gt;
&lt;/span&gt;</pre>
<p>Mit ein wenig <a href="http://toscho.de/thema/css/">CSS</a> aufgepeppt …</p>
<pre class="notranslate">.comment_admin
    {
        float:              right;
        font:               .9em/1 Calibri;
        text-align:         center;
    }
.comment_admin a
    {
        color:              #444;
        background:         #f9f9f9;
        text-decoration:    none;
        border:             1px solid #bbb;
        border-radius:      4px;
        box-shadow:         0 2px 3px rgba(0,0,0,0.2);
        display:            inline-block;
        width:              3em;
        margin:             4px;
        padding:            4px 15px;
    }
#content .comment_admin a:hover
    {
        background:         #666;
        color:              #fff;
        border:             1px solid #222;
    }</pre>
<p>… sieht das Ergebnis dann so aus:</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/comment-moderation.png" alt="" title="comment moderation" width="280" height="123" class="alignnone size-full wp-image-1672 border" /></p>
<p>Nach einem Klick landet man in der Bearbeitungsmaske im Backend, <em>dann erst</em> wird der Kommentar per Knopfdruck gelöscht oder als Spam markiert.</p>
<p>Mehr so’n Zeug:</p>
<ul>
<li><a href="http://toscho.de/2009/wordpress-administrator-php-herausfinden/">Administrator mit PHP herausfinden</a></li>
<li><a href="http://toscho.de/2009/wordpress-moderationsfalle-offenlegen/">Moderationsfalle offenlegen</a></li>
<li><a href="http://toscho.de/2009/no-no-no-nofollow/">No no no nofollow</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-moderationslinks-fuer-kommentare/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Designlinks 12</title>
		<link>http://toscho.de/2010/designlinks-12/</link>
		<comments>http://toscho.de/2010/designlinks-12/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 10:19:33 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Zeichen]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1669</guid>
		<description><![CDATA[Eine Katze, die gerne duscht, langsame Referenzen, schlanke User-Agent-Strings, fette Zeichenreferenzen, ein enorm flexibles Stylesheet und ein Malprogramm.]]></description>
			<content:encoded><![CDATA[<p>Wird mal wieder Zeit. Aber zuerst entspannen wir uns ein bißchen:</p>
<p class="wp-caption-text"><object type="application/x-shockwave-flash" data="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1920326&#038;fullscreen=1" width="480" height="360" ><param name="allowfullscreen" value="true"/><param name="wmode" value="transparent"/><param name="allowScriptAccess" value="always"/><param name="movie" quality="best" value="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1920326&#038;fullscreen=1"/><embed src="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1920326&#038;fullscreen=1" type="application/x-shockwave-flash" wmode="transparent"  width="480" height="360"  allowScriptAccess="always"></embed></object><br />
Quelle: <a href="http://www.collegehumor.com/video:1920326" hreflang="en">CollegeHumor</a>.</p>
<p>›<a href="http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html" hreflang="en" lang="en">Do not use PHP references</a>‹, empfiehlt Johannes Schlüter, denn Referenzen kosten Tempo, Übersicht und Flexibilität. Ob seiner klaren und verständlichen Darstellung dieses kniffligen Themas möchte ich den Artikel jetzt schon in die Liste der zehn besten dieses Jahres rücken.</p>
<p>Nicholas C. Zakas: <a href="http://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/" hreflang="en" lang="en">History of the user-agent string</a>. Warum die UA-Strings heute oft so sonderbar aussehen. Die neue <a href="http://blogs.msdn.com/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx" hreflang="en">Kennung des IE 9</a> lautet:</p>
<pre class="notranslate">Mozilla/5.0 (compatible, MSIE 9.0; Windows NT 6.1; Trident/5.0)</pre>
<p>Anhängsel irgendwelcher Zusatzsoftware werden nicht mehr eingebaut; damit schrumpft die <a href="http://www.useragentstring.com/_uas_Internet%20Explorer_version_8.0.php" hreflang="en">Liste der möglichen Kennungen</a> gewaltig – was es Proxys erheblich erleichtert, gespeicherte Versionen einer Webseite auszuliefern. Das erklärt Billy Hoffman gut in: ›<a href="http://zoompf.com/blog/2010/03/the-big-performance-improvement-in-ie9-no-one-is-talking-about" hreflang="en" lang="en">The Big Performance Improvement in IE9 No One is Talking About</a>‹. Er rät auch dazu, die <a href="http://toscho.de/2010/gzip-pro-und-kontra/">gzip-komprimierte</a> Version <em>nur noch</em> anhand des Accept-Headers zu versenden und den User-Agent zu ignorieren, damit beispielsweise ein Safari-Nutzer die Version bekommt, die der Firefox-Nutzer zuvor in den Proxy gehievt hat.</p>
<p>Man kann <a href="http://toscho.de/2008/zeichenkodierung-begriffe/#toc-maskierung-entity-und-zeichenreferenz">dezimale Zeichenreferenzen</a> mit beliebig vielen führenden Nullen versehen. So läßt sich das <samp>A</samp> als <code>&amp;#65;</code> schreiben oder als <code>&amp;#000000000000000000000000000000065;</code><br />
›hakre‹ hat mal ausprobiert, wie weit man damit gehen kann: ›<a href="http://hakre.wordpress.com/2010/02/25/html-entity-boundaries-zero-padding/" hreflang="en" lang="en">HTML Entity Boundaries – Zero Padding</a>‹.<br />
Ein Experiment, dessen praktischer Nutzen sicher weit unter seinem Unterhaltungswert liegt. Doch zeigt es, wie weit die Entwickler vorausdenken und wo sie die Grenze ziehen zwischen ›das versuche ich noch‹ und ›das wird zu langsam‹. Wenig überraschend frißt Firefox die meisten Nullen – bis zum Erstickungstod.</p>
<p>Anne van Kesteren hat auch ein Experiment mit gewaltigem Geekpotential hingestellt: <a href="http://annevankesteren.nl/test/contenteditable-style.htm" lang="en">Live style sheet editing!</a><br />
Und da muß ich einfach mal den Quelltext zitieren:</p>
<pre class="notranslate">&lt;!doctype html&gt;
&lt;html&gt;
 &lt;head&gt;
  &lt;title&gt;Live style sheet editing!&lt;/title&gt;
  &lt;style style="<code class="string">white-space:pre <i>/* hack for Opera */</i></code>" contenteditable=""&gt;
html {
margin:.2em;
font-size:2em;
color:lime;
background:purple
}
head, title, style
{
display:block
}
body {
display:none
}
  &lt;/style&gt;
 &lt;/head&gt;
 &lt;body&gt;<i>&lt;!-- nothing is needed here --&gt;</i>&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Zum Schluß noch ein Link für die Freunde der Maus: <a href="http://mrdoob.com/projects/harmony/">Harmony</a>, ein Zeichenprogramm in Javascript und Canvas. Das macht wirklich Freude.</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/harmony-toscho.png" alt="Harmony. Ein Experiment." width="485" height="330" class="alignnone size-full wp-image-1670 border" /></p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/designlinks-12/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Text-rendering: illegibility</title>
		<link>http://toscho.de/2010/text-rendering-illegibility/</link>
		<comments>http://toscho.de/2010/text-rendering-illegibility/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 05:11:26 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Typographie]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1665</guid>
		<description><![CDATA[Der Browser des Palm OS stolpert über eine ganz harmlos wirkende CSS-Deklaration – und zeigt dann keinen Text mehr an. Wie man das testet und repariert, zeigt dieser Artikel.]]></description>
			<content:encoded><![CDATA[<p>Wenn zwischen Absicht und Ergebnis fremder Code steht, dann braucht der geübte Binärschubser seine wichtigste Kompetenz: Fluchen. So auch ich, als ich gestern von Christoph Schnieder dieses kleine Horrorstück zugesandt bekam:</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/palm-pre-broken.png" alt="palm-pre-broken" width="320" height="480" class="alignnone size-full wp-image-1666" /></p>
<p>Tatort war ein Palm Pre WebOS, Tatwerkzeug der eingebaute Browser auf WebKit-Basis.</p>
<p>Um das überhaupt nachzuvollziehen, habe ich den <a href="http://www.genuitec.com/mobile/" hreflang="en">MobiOne Emulator für Palm Pre</a> installiert. Das ging verdächtig leicht, und das Ergebnis half mir überhaupt nicht. Es war nämlich in Ordnung:</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/mobi-one-emulator.png" alt="mobi-one-emulator" width="404" height="758" class="alignnone size-full wp-image-1667" /> </p>
<p>Dieser Emulator ist im Wesentlichen ein zurechtgestutztes Eclipse; seine Abhängigkeit vom Gastsystem erkennt man schon daran, daß er dessen Schriften benutzt. Unbrauchbar.</p>
<p>Dann habe ich das <a hreflang="en" href="http://developer.palm.com/index.php?option=com_content&#038;view=article&#038;layout=page&#038;id=1661">Palm webOS SDK</a> installiert, das in einer virtuellen Maschine läuft – und das Problem ganz genau wiedergibt. Das scheint also ein recht realistisch arbeitendes Werkzeug zu sein. Etwas umständlich finde ich nur das <a href="http://www.uni-regensburg.de/EDV/Misc/KeyBoards/keys02.jpg">englische Tastaturlayout</a>, das ich nicht umstellen konnte.</p>
<p>Nach allerlei Tests habe ich endlich die Ursache gefunden: Ich hatte im Stylesheet eine Deklaration stehen, von der ich annahm, sie werde <a href="https://developer.mozilla.org/En/CSS/Text-rendering" hreflang="en">nur von Gecko interpretiert</a>.</p>
<pre class="notranslate">p,
address,
li
    {
        text-rendering:optimizeLegibility;
    }</pre>
<p>Diese Eigenschaft <a href="http://www.w3.org/TR/SVG/painting.html#TextRenderingProperty" hreflang="en">stammt aus SVG</a>, wie man leicht an der dämlichen Binnenmajuskel erkennt. Sie sollte Firefox dazu anregen, auch bei kleineren Schriftgraden als 20px das <a href="http://www.typolexikon.de/k/kerning.html">Kerning</a> zu respektieren.<br />
Was genau der Palm Browser hier versucht, vermag ich nicht zu sagen. Vielleicht hängt es mit der Schriftgröße zusammen, denn Überschriften, die mindestens 20px groß sind, werden noch gezeigt.</p>
<p>Ich habe die ganze Regel jetzt weggeworfen und einen Bugreport geschrieben.</p>
<p>Sicher ließe sich das auch hinter einem proprietären Selektor für Mozilla verstecken, aber davon will ich eigentlich weg. Und wenn ich damit leben kann, daß Mozilla-Nutzer noch keine abgerundeten Ecken sehen, dann darf ich genauso gut unterstellen, daß sie sich an schlampiges Kerning gewöhnt haben. Also nehmt es mir nicht übel, ja?</p>
<p>Ach ja, das aktuelle Ergebnis:</p>
<p><img src="http://toscho.de/wp-content/uploads/2010/04/palm-web-os-sdk-fixed.png" alt="palm-web-os-sdk repariert" width="319" height="480" class="alignnone size-full wp-image-1668" /></p>
<p>Da der Browser jetzt nur die Systemschriften des Palm OS verwendet, setzt er keine Kursivschnitte für serifenlose Schriften mehr um, und eine Monospace-Schrift findet oder nutzt er auch nicht. Das ist nicht schlimm, aber man kann es unter »Aha. Mist!« ablegen.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/text-rendering-illegibility/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSS: Knapp, frisch und lange haltbar</title>
		<link>http://toscho.de/2010/css-knapp-frisch-lange-haltbar/</link>
		<comments>http://toscho.de/2010/css-knapp-frisch-lange-haltbar/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 09:59:28 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Interna]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1662</guid>
		<description><![CDATA[Wie ich die Ladezeit meiner Stylesheets beschleunigt habe: Mit einer Subdomain, ein bißchen mod_rewrite, ETag, Expires und Kompression.]]></description>
			<content:encoded><![CDATA[<!--TOC-->
<p>Vor einiger Zeit habe ich mal <a href="http://toscho.de/2008/frisches-layout/" title="Frisches Layout vom 23.12.2008">gezeigt</a>, wie man mittels eines UNIX-Timestamps in der Adresse dem Browser immer das aktuelle Stylesheet darbietet:</p>
<pre style="clear:none;max-width:30em;">&lt;link
  rel="<code class="string">stylesheet</code>"
  media="<code class="string">screen,projection</code>"
  href="<code class="string">/wp-content/themes/toscho/css?d=1229632675</code>"
  title="<code class="string">screen+projection</code>"
  type="<code class="string">text/css</code>"
></pre>
<p><a href="http://www.flickr.com/photos/yomi955/1254934058/"><img src="http://toscho.de/wp-content/uploads/2010/04/fresh-tomato-yomi955-b.jpg" alt="Tomaten" title="Fresh Tomato von yomi955" width="500" height="375" class="alignnone size-full wp-image-1663" /></a></p>
<h2>Nachteile der alten Variante</h2>
<p>Das Grundprinzip verwende ich immer noch, aber im Zuge des <a href="http://toscho.de/2010/interna-layout-4-0/" title="Interna: Layout 4.0">letzten Redesigns</a> habe ich es um ein paar Nuancen verfeinert. An der alten Variante haben mich nämlich einige Dinge gestört:</p>
<ul>
<li>Ich mußte den Cache des Clients immer <a href="http://github.com/toscho/PHP-HTTP-Tools/blob/master/class.HTTP_Response.php" title="PHP-Klasse HTTP_Response">per PHP validieren</a>, was unnötig Zeit kostet.</li>
<li>Die resultierende URL sieht lang und umständlich aus. Durch das Fragezeichen darin fühlten sich nicht alle Browser zum Cachen angeregt.</li>
<li>Das Stylesheet mußte unter dem selben Host liegen wie das Theme, was parallele Requests erschwert.</li>
</ul>
<h2>Umzug auf die Subdomain</h2>
<p>Nun habe ich hier noch eine ungenutzte Domain herumliegen – mundonaut.de –, auf der mein Bruder eigentlich ein bißchen bloggen wollte. Oder sollte.<br />
Trotz Prüfungen, Umzug und Magisterarbeit hat er das bis heute seltsamerweise nicht geschafft, und so gammelte die Domain nur so vor sich hin. Schade.</p>
<p>Ich habe dort jetzt eine Subdomain angelegt: <a href="http://t4.mundonaut.de/">t4.mundonaut.de</a>, auf der ich alle kleinen Dateien für dieses Theme parke: Bilder, Javascripte und Stylesheets.</p>
<p>Die können jetzt von den Browsern <strong>parallel</strong> zu dieser Seite und ihren Inhaltsbildern heruntergeladen werden, die nur wenige Verbindungen pro Host öffnen – IE 7 beispielsweise nur zwei. Außerdem exisitieren für die Subdomain <strong>keine Cookies</strong>; das reduziert auch den HTTP-Overhead ein wenig.</p>
<h2>Schöner Dateiname</h2>
<p>Den UNIX-Timestamp habe ich vom Parameter in den <strong>Dateinamen</strong> verlegt. Die neue Adresse des Stylesheets – ich benutze jetzt nur noch eines für alle Medientypen und eins für alte Internet Explorer – sieht nun beispielsweise so aus:</p>
<pre class="notranslate">http://t4.mundonaut.de/1271536949.css</pre>
<p>Den lokalen Dateipfad habe ich fest ins Theme geschrieben; mittels <a href="http://php.net/filemtime">filemtime()</a> erzeuge ich den passenden Namen.</p>
<p>In der <a href="http://t4.mundonaut.de/.htaccess">.htaccess der Subdomain t4</a> lenke ich die Anfragen dann auf die jeweils passende Datei:</p>
<pre class="notranslate"><i># Ein UNIX-Timestamp enthält genau 10 Ziffern: \d{10}</i>
RewriteEngine On
RewriteRule ^\d{10}\.css main.css [L]
RewriteRule ^\d{10}\.ie\.css ie.css [L]</pre>
<p>Jetzt kümmert sich der Server um die Validierung des Client-Caches; der macht das natürlich viel schneller als ich.</p>
<h2>Kompression</h2>
<p>Auch die übernimmt der Server. Bei meinem Webhoster <a href="https://all-inkl.com/">all-inkl.com</a> ist die <strong>Kompression für Textdateien</strong> ohnehin schon angeschaltet; auch darum muß ich mich nicht mehr kümmern. Müßte ich es, so verwendete ich <a href="http://httpd.apache.org/docs/2.2/mod/mod_deflate.html">mod_deflate</a>:</p>
<pre class="notranslate">AddOutputFilterByType DEFLATE text/plain text/css</pre>
<p>Der Apache speichert das Ergebnis; so hält sich die Mehrarbeit in engen Grenzen.</p>
<p>Lokal komprimiere ich das Stylesheet vor: Ich entferne unnötige Leerzeichen, Zeilenumbrüche und Kommentare. Für das Script gibt es auch eine Weboberfläche im Labor: <a href="http://labs.toscho.de/css-compressor/">CSS Compressor</a>.</p>
<h2>ETag</h2>
<p>Damit die Cache-Validierung <a href="#comment-2629" title="Im Kommentar erklärt">besser klappt</a>, habe ich noch <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19">ETags</a> aktiviert:</p>
<pre class="notranslate">FileETag MTime Size</pre>
<p><strong>Obacht!</strong> Ältere Apachen (vor Version 2.2.12) <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c22">erzeugen einen kaputten ETag</a> für automatisch komprimierte Dateien. Der sieht dann so aus:</p>
<pre class="notranslate">ETag: "47b5361382042"-gzip</pre>
<p>Damit kann man den Cache des Clients bestenfalls <em>verhindern</em>. Ich habe All-Inkl darauf hingewiesen – und einen Tag darauf hatte ich einen aktualisierten Server. Das nenne ich Service.</p>
<h2>Expires</h2>
<p>Als Sahnehäubchen gibt es noch eine <a href="http://httpd.apache.org/docs/2.2/mod/mod_expires.html" title="mod_expires">ausgedehnte Verfallszeit</a>:</p>
<pre class="notranslate"><i># Lang lebe euer Cache!</i>
ExpiresActive On
ExpiresByType image/png                <code class="string">"access plus 1 year"</code>
ExpiresByType image/jpeg               <code class="string">"access plus 1 year"</code>
ExpiresByType image/gif                <code class="string">"access plus 1 year"</code>
ExpiresByType image/x-icon             <code class="string">"access plus 1 year"</code>
ExpiresByType image/icon               <code class="string">"access plus 1 year"</code>
ExpiresByType application/x-javascript <code class="string">"access plus 3 months"</code>
ExpiresByType text/css                 <code class="string">"access plus 3 months"</code></pre>
<h2>Nachteile der neuen Variante</h2>
<p>Das Theme ist jetzt fest an diese Domain gebunden und nicht mehr portabel. Das spielt hier keine Rolle; aber wer Themes schreibt, deren Einsatzort unbekannt ist, kann damit wenig anfangen.</p>
<p>Die ETag-Direktive kann nur bei einem halbwegs aktuellen Server benutzt werden, und mod_rewrite braucht man auch.</p>
<p>Andererseits läßt sich das Verfahren auf <em>jedes</em> Layout übertragen, ob es nun von WordPress erzeugt wird oder nicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/css-knapp-frisch-lange-haltbar/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>WordPress-Plugin: Backend Style Enhancements</title>
		<link>http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/</link>
		<comments>http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 13:16:12 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1660</guid>
		<description><![CDATA[Beispiel für ein Plugin, das das Layout des Backends ändert. Mit ausführlich kommentiertem und verlinktem Quellcode und natürlich einem Download.]]></description>
			<content:encoded><![CDATA[<p>Zwar läßt sich das WordPress-Backend ganz gut per <a href="http://toscho.de/2010/css-mein-userstylesheet/">Userstylesheet</a> über den Selektor <code>body.wp-admin</code> ansprechen – doch technisch unbedarften Leuten hilft das eher wenig. Für eine Freundin, die ebenso wie ich eine Navigation lieber rechts oder oben sieht, habe ich deshalb mal fix ein kleines Plugin erstellt.</p>
<p>Es ist ganz einfach, spricht aber ein paar Dinge an, die ich im <a href="http://toscho.de/2010/wordpress-tutorial-ein-framebreaker-plugin-schreiben/">Framebreaker-Tutorial</a> nicht berührt habe. So mag es sich vielleicht als Lehrstück eignen. Ich verkneife mir heute einen langen Text; stattdessen habe ich alles ausführlich kommentiert und verlinkt.</p>
<p class="wideimg"><img src="http://toscho.de/wp-content/uploads/2010/04/backend-enhancements.png" alt="Screenshot Backend Enhancements" width="500" height="391" class="alignnone size-full wp-image-1661" /></p>
<p>Das Stylesheet selbst setzt die Navigation nach rechts, gibt Links bei <code>:hover</code> einen Unterstrich und entsorgt <i>Lucida Grande</i> und <i>Verdana,</i> die ich beide nicht mehr sehen mag. Außerdem repariert es ein paar Breitenangaben – die Entwickler konnten sich wohl nicht vorstellen, daß jemand 14px als <a href="http://toscho.de/2009/mythos-font-size-62dot5-prozent/">Mindestschriftgröße</a> setzt. Das muß man leider als Massenpsychose diagnostizieren.</p>
<p>Im Ganzen sei es bitte nur als <em>Beispiel</em> dafür gesehen, was man ändern kann.</p>
<pre class="notranslate">&lt;?php
<i>/*
Plugin Name: Backend Style Enhancements
Plugin URI:  http://toscho.de/p1660
Description: Some minor fixes for the WP backend.
Version:     1.0
Author:      Thomas Scholz
Author URI:  <a href="http://toscho.de">http://toscho.de</a>
Created:     22.04.2010
*/</i>

<i>/**
 * We need just the constructor.
 */</i>
new Toscho_Backend_Style;

<i>/**
 * Adds a stylesheet to the WordPress backend.
 *
 * @version 1.0
 */</i>
class Toscho_Backend_Style
{
    <i id="query_arg">/**
     * The address for our stylesheet.
     * Should match [0-9a-z-].
     *
     * @see #<a href="#add_query_arg">add_query_arg()</a>
     * @see #<a href="#print_link_element">print_link_element()</a>
     * @var string
     */</i>
    protected <var>$query_arg</var> = '<code class="string">tbecss</code>';

    <i>/**
     * Constructor
     */</i>
    public function __construct()
    {
        <i>/* Register the query argument. */</i>
        <a href="http://codex.wordpress.org/Function_Reference/add_filter">add_filter</a>('<code class="string">query_vars</code>', array ( <var>$this</var>, '<a href="#add_query_arg"><code class="string">add_query_arg</code></a>') );

        <i>/* What should happen, if we find the query? */</i>
        <a href="http://codex.wordpress.org/Function_Reference/add_action">add_action</a>('<code class="string">template_redirect</code>', array ( <var>$this</var>, '<a href="#print_css"><code class="string">print_css</code></a>') );

        <i>/* Like wp_head, just for the backend. */</i>
        add_action('<code class="string">admin_head</code>', array ( <var>$this</var>, '<a href="#print_link_element"><code class="string">print_link_element</code></a>') );

        <i>/* Since this plugin isn’t listed on
         * http://wordpress.org/extend/plugins/
         * we won’t waste the user’s time.
         */</i>
        add_filter('<code class="string">http_request_args</code>',
            array ( <var>$this</var>, '<a href="#prevent_plugin_upgrade_check"><code class="string">prevent_plugin_upgrade_check</code></a>' ), 5, 2);

        return;
    }

    <i id="add_query_arg">/**
     * Registers the query arg in WordPress
     *
     * @param  array <var>$vars</var> Already registered query args.
     * @return array
     */</i>
    public function add_query_arg( array <var>$vars</var> )
    {
        return <a href="http://php.net/array-merge">array_merge</a>( <var>$vars</var>, array ( <var>$this</var>-&gt;<a href="#query_arg">query_arg</a> ) );
    }

    <i id="print_css">/**
     * Prints the CSS content.
     *
     * @return void
     */</i>
    public function print_css()
    {
        if ( ! isset ( <var>$_GET</var>[<var>$this</var>-&gt;<a href="#query_arg">query_arg</a>] ) )
        {
            return;
        }

        <i>// Don’t waste time in wp-includes/template-loader.php</i>
        define('<code class="string">WP_USE_THEMES</code>', FALSE);

        <a href="http://php.net/header">header</a>('<code class="string">Content-Type: text/css;charset=utf-8</code>', TRUE);

?&gt;<code style="color:#059">@charset "utf-8";
.wrap a:hover
{
    text-decoration:    underline       !important;
}
.wrap a.button:hover
{
    text-decoration:    none            !important;
}
body,
td,
input,
select,
#adminmenu *
{
    font-family:        Calibri         !important;
}
textarea, [type="text"]
{
    font-family:        Consolas        !important;
}
body,
#wpbody,
.form-table .pre
{
    color:              #000            !important;
}
td
{
    vertical-align:     top             !important;
    line-height:        1.4             !important;
}
#adminmenu
{
    float:              right           !important;
    margin:             5px -150px 0 0 !important;
}
#adminmenu .wp-submenu li
{
    width:              151px           !important;
}
#wpbody-content
{
    float:              right           !important;
    width:              100%;
}
#wpbody
{
    margin-left:        0               !important;
    margin-right:       170px           !important;

}</code>
&lt;?php
        <i>/* Ugly, yes. But if we just return, WP will
         * proceed and append the default page. */</i>
        exit;
    }

    <i id="print_link_element">/**
     * Prints the link element into the admin head.
     *
     * @return void
     */</i>
    public function print_link_element()
    {
        <var>$url</var> = <a href="http://codex.wordpress.org/Function_Reference/get_option">get_option</a>('<code class="string">siteurl</code>') . '/?' . <var>$this</var>-&gt;<a href="#query_arg">query_arg</a>;
        print "<code class="string">&lt;link rel='stylesheet' href='<var>$url</var>' /&gt;</code>";

        return;
    }

    <i id="prevent_plugin_upgrade_check">/**
     * Blocks update checks for this plugin.
     *
     * @author Mark Jaquith <a href="http://markjaquith.wordpress.com">http://markjaquith.wordpress.com</a>
     * @see    <a href="http://wp.me/p56-65">http://wp.me/p56-65</a>
     * @param  array <var>$r</var> Request information
     * @param  string <var>$url</var>
     * @return array
     */</i>
    public function prevent_plugin_upgrade_check(<var>$r</var>, <var>$url</var>)
    {
        if ( 0 !== <a href="http://php.net/strpos">strpos</a>(<var>$url</var>,
             '<code class="string">http://api.wordpress.org/plugins/update-check</code>') )
        { <i>// Not a plugin update request. Bail immediately.</i>
            return <var>$r</var>;
        }

        <var>$plugins</var> = <a href="http://php.net/unserialize">unserialize</a>( <var>$r</var>['<code class="string">body</code>']['<code class="string">plugins</code>'] );
        <var>$p_base</var>  = <a href="http://codex.wordpress.org/Function_Reference/plugin_basename">plugin_basename</a>( __FILE__ );

        unset (
            <var>$plugins</var>-&gt;plugins[<var>$p_base</var>],
            <var>$plugins</var>-&gt;active[<a href="http://php.net/array_search">array_search</a>(<var>$p_base</var>, <var>$plugins</var>-&gt;active)]
        );

        <var>$r</var>['<code class="string">body</code>']['<code class="string">plugins</code>'] = <a href="http://php.net/serialize">serialize</a>(<var>$plugins</var>);

        return <var>$r</var>;
    }
}</pre>
<p>Als Lohn für das <del datetime="2010-04-22T23:06:17+00:00">geduldige Lesen</del> schnelle Herunterscrollen:</p>
<p class="downloadlink"><a href="http://f.toscho.de/php-skripte/backend-style.zip">Download Plugin Backend Style Enhancements</a></p>
<p>Meine Kommentare ersetzen natürlich nicht eure Fragen. Also stellt sie bitte!</p>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/wordpress-plugin-backend-style-enhancements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Typographie: Blocksatz vermeiden</title>
		<link>http://toscho.de/2010/typographie-blocksatz-vermeiden/</link>
		<comments>http://toscho.de/2010/typographie-blocksatz-vermeiden/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 11:25:37 +0000</pubDate>
		<dc:creator>Thomas Scholz</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Typographie]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://toscho.de/?p=1651</guid>
		<description><![CDATA[Warum man als Designer mit Blocksatz sehr vorsichtig umgehen sollte. Über die Unterschiede zwischen Druck und Web und die eigentliche Frage hinter der typographischen Entscheidung.]]></description>
			<content:encoded><![CDATA[<p>Ich habe Lesen ganz unsystematisch <a href="http://toscho.de/2009/stirbt-die-handschrift/">gelernt</a>, ohne den Einsatz des Zeigefingers oder kleiner Schmuckbildchen. Und so lese ich heute, wenn ich einmal in Fahrt gekommen bin, immer zwei Zeilen auf einmal: Die obere Zeile entschlüssele ich, während ich mir von der darunterliegenden einen ›Schnappschuß‹ erstelle. Wenn ich es so hinschreibe, klingt das ganz umständlich, aber ich schaffe doch 100—150 Seiten pro Stunde.</p>
<p>Wenn der Rhythmus stimmt.</p>
<div id="attachment_1652" class="wp-caption alignnone" style="width: 498px"><a href="http://www.yaml.de/de/overview.html"><img src="http://toscho.de/wp-content/uploads/2010/04/yaml-blocksatz.png" alt="" title="Blocksatz in der YAML-Dokumentation" width="488" height="345" class="size-full wp-image-1652 border" /></a><p class="wp-caption-text">Blocksatz in der YAML-Dokumentation</p></div>
<p>Damit meine ich nicht allein den Rhythmus der Sprache – bei dem Tempo spreche ich innerlich ohnehin nicht mehr mit – sondern den visuellen Eindruck. Viele kleine Absätze mit großem Abstand behindern meine Technik ebenso wie ein sehr hoher Zeilenabstand. Aber am schlimmsten finde ich schlechten Blocksatz.</p>
<p><strong>Guter Blocksatz fällt nicht auf.</strong> Daran erkennt man gelungene Typographie: Der Abstand zwischen den einzelnen Zeichen (<a href="http://www.typolexikon.de/k/kerning.html">Kerning</a>) paßt zu den <a href="http://www.typolexikon.de/w/wortzwischenraum.html">Wortzwischenräumen</a> und bleibt über viele Zeilen hinweg sehr konsistent. Ein geübter Setzer stimmt also Zeichen-, Wort- und Zeilenabstände aufeinander ab.<br />
Im Ergebnis paßt der <a href="http://www.typolexikon.de/g/grauwert.html">Grauwert</a> am rechten Rand zu dem des übrigen Textes.</p>
<p><strong>Schlechter Blocksatz kriegt nur den rechten Rand hin und zerstört den Rest.</strong> Zwischen den einzelnen Worten entstehen Abstände, die manchmal den größten Raum der Zeile beanspruchen und untereinander einen <i lang="en">River of White Space</i> bilden; Anfang und Ende eines Satzes muß der Leser suchen, weil das visuelle Signal (langer Abstand) dem Inhalt (der Satz geht weiter) widerspricht.</p>
<p>In der Ausgabe am Bildschirm haben wir als Autoren oft keinen oder wenig Einfluß auf die <a href="http://www.rorkvell.de/news/2009/Minischriften">tatsächlich verwendete Schriftgröße</a>. Eine zuverlässige automatische Silbentrennung können wir auch nicht benutzen, und ein Kerning, das für jede Zeile paßt, können wir uns ganz aus dem Kopf schlagen.</p>
<p><strong>Guter Blocksatz ist in HTML und CSS nicht möglich.</strong> <a href="http://fontfeed.com/archives/ipad-typography/">Selbst in E-Books</a> wird er sehr, sehr schwer.</p>
<p>Aber ich kann doch … </p>
<p>… eine feste Breite und Schriftgröße vorgeben, Umbrüche und Trennstriche manuell setzen und so einen akzeptablen Blocksatz erreichen?</p>
<p>Glücklicherweise nicht. Die Schriftgröße des Lesers ist <a href="http://toscho.de/2009/mythos-font-size-62dot5-prozent/">unbekannt</a>. Ebenso die verwendete Schrift. Wer HTML und CSS benutzt, der hat <em>automatisch Koautoren;</em> das ist eingebaut. Noch gibt es ein paar ›Designer‹, die sagen: »Selber schuld! Wer meine Vorgaben überschreibt, darf sich nicht beschweren.«<br />
Als Physiker ignorierten die vermutlich auch die Schwerkraft, und als Lehrer die jugendliche Neugier.</p>
<p>… <a href="http://www.bramstein.com/projects/typeset/">Javascript und Canvas benutzen</a>?</p>
<p>Das scheitert an Browsern, die kein Canvas unterstützen, an abgeschaltetem Javascript und an der sehr <a href="http://www.paciellogroup.com/blog/?p=362">schlechten Zugänglichkeit</a> in <code>&lt;canvas&gt;</code> eingebetteter Texte.</p>
<p>Worauf ich hinaus will, ist aber <em>keine typographische</em> Frage, sondern: <em>Für wen schreibe ich eigentlich?</em> Für den willenlosen Leser ohne eigene Ansichten und Präferenzen? Oder für einen mündigen Leser, der beides eben hat und darum auch von meiner Ansicht überzeugt werden kann – oder ihr ein spannendes Argument entgegensetzt?<br />
Für den ersten brauche ich gar nicht zu schreiben; das lohnt sich nicht. Und den zweiten sollte ich besser nie mit Blocksatz ärgern.</p>
<h2>Lektüre</h2>
<ul>
<li>Jukka "Yucca" Korpela: <a hreflang="en" href="http://www.cs.tut.fi/~jkorpela/www/justify.html">How do I justify text on both sides on Web pages?</a></li>
<li>Ilene Strizver: <a hreflang="en" href="http://www.fonts.com/AboutFonts/Articles/fyti/JustifiedType.htm">Justified Type</a></li>
<li><a href="http://www.typolexikon.de/b/blocksatz.html">Typolexikon: Blocksatz</a></li>
<li>Fritz Weisshart: <a href="http://quickblog.weisshart.info/blocksatz-silbentrennung-und-screen-reader">Blocksatz, Silbentrennung und die Screen Reader</a> (nachgetragen am 20. 10. 2010)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://toscho.de/2010/typographie-blocksatz-vermeiden/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Database Caching using disk: basic
Object Caching 610/744 objects using disk: basic

Served from: toscho.de @ 2012-02-04 12:23:24 -->
