Smarty Forum Index Smarty
The discussions here are for Smarty, a template engine for the PHP programming language.

ImproveTypo-Plugin

 
Post new topic   Reply to topic    Smarty Forum Index -> Language: German
View previous topic :: View next topic  
Author Message
McSodbrenner
Smarty Pro


Joined: 19 Sep 2004
Posts: 101
Location: Hamburg, Germany

PostPosted: Sun Sep 19, 2004 8:38 am    Post subject: ImproveTypo-Plugin Reply with quote

Dieses Plugin verbessert die Typografie nach deutscher Rechtschreibung. Ist also für die Leute, die nicht nur gern eine funktionierende Seite haben wollen, sondern auch eine typografisch korrekte. Für Vorschläge bin ich immer offen!

Das Plugin kann zur Zeit folgendes:

  • Zollzeichen werden zu Anführungszeichen umgewandelt
  • Falsch gesetzte Bindestriche werden zu Gedankenstrichen
  • Falsche drei Punkte werden zum Ellipsenzeichen (Auslassungszeichen)
  • Ein falsches Zeichen als Apostroph wird durch das richtige ersetzt
  • EURO wird durch das Euro-Zeichen ersetzt
  • Der falsche Bindestrich bei Preisangaben wird durch den langen Gedankenstrich ersetzt
  • Eine falsche Schreibweise des Wortes "E-Mail" wird korrigiert
  • Die falsche Benutzung des ß in Versalien (Großbuchstaben) wird korrigiert


Das Ding wird folgendermaßen verwendet

Code:
{improvetypo}
Text
{/improvetypo}

Setzt man diff auf 1, wird einem angezeigt, was korrigiert wurde.


[php:1:59697bbd3b]<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* File: block.improvetypo.php
* Type: block
* Name: improvetypo
* Purpose: improve typo for better site appearance
* Comments will not be edited, so use them to prevent javascript- and css-sections
*
* Author: Christoph Erdmann <mail@cerdmann.com>
* Version: 09.09.2004
* Internet: http://www.cerdmann.com
* -------------------------------------------------------------
*/

function smarty_block_improvetypo($params, $content, &$smarty)
{
// Options
$diff = 0;


if (is_null($content)) {
return;
}

// set time (microtime(1) only works with PHP 5)
$time['start'] = microtime(1);

$source = $content;

// If not exists, a function called "show_diff" is created to show the replacements in Source
if (!function_exists(show_diff))
{
function show_diff ($string,$use)
{
if ($use)
{
return '<span style="background-color: yellow">'.$string.'</span>';
}
else
{
return $string;
}
}
}

// Replace "string" with &string&
$what = '"';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("{QUOTE}",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/ieS", $then, $source);

// Now replace ...
$source = preg_replace('/\{QUOTE\}(.*?)\{QUOTE\}/sS', "&$1&", $source);

// Re-replace lonely {QUOTE}s
$source = str_replace('{QUOTE}', "\"", $source);


// Replace - with &
$what = ' - ';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff(" & ",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);

// Replace ... with &
$what = '\.{2,}';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff(" & ",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);


// Correct incorrect use of apostroph
$what = '([a-z])(\'|´)s ';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("$3s ",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/ieS", $then, $source);

// Replace the other correct apostrophes with the correct symbol
$what = '\'|´';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("&",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);


// Replace EUR/O with &
$what = 'EURO([^A-Z])';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("&$3",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);

// Replace false extension of prices
$what = '([0-9]),-';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("$3,&",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);

// Replace Telefon: or Tel: with Tel.:
/*$what = 'Telefon:|[^a-z]Tel:';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("Tel.:",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/ieS", $then, $source);*/

// Replace false E-Mail-Writing
$what = 'e-?[mM]ail([^a-zA-Z])';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("E-Mail$3",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);

// Replace false use of ß in majuscules
$what = '([A-Z])ß([A-Z])';
$then = '"$2"=="$1"? stripslashes("$1"): show_diff("$3SS$4",$diff)';
$source = preg_replace("/((<[^>]*)|$what)/eS", $then, $source);




$time['end'] = microtime(1);
$time = round($time['end'] - $time['start'],2);

if (isset($params['escape']) && $params['escape'] == true)
{
$source = str_replace('<','&',$source);
$source = str_replace('>','&',$source);
}

if (isset($params['nl2br']) && $params['nl2br'] == true)
{
$source = preg_replace("(\r\n|\r|\n)","<br />",$source);
}

return "\n<!-- start typo-improving -->\n".$source."\n<!-- improved typo in $time sec -->\n";
}

?>
[/php:1:59697bbd3b]
Back to top
View user's profile Send private message Visit poster's website
McSodbrenner
Smarty Pro


Joined: 19 Sep 2004
Posts: 101
Location: Hamburg, Germany

PostPosted: Sun Sep 19, 2004 5:15 pm    Post subject: Reply with quote

Hab gerade gesehen, dass die Codierung mit [php] nicht darauf achtet, dass Entities kodiert werden. Die Anzeige des Codes oben ist also nicht ganz richtig.
Also, falls jemand das Script haben möchte, einfach Bescheid sagen.
Back to top
View user's profile Send private message Visit poster's website
kills
Smarty Elite


Joined: 28 May 2004
Posts: 493

PostPosted: Mon Sep 20, 2004 6:42 am    Post subject: Reply with quote

ich denke es wäre sinnvoller deine block function als Modifier anzulegen, anstatt der block function.

man könnte dann beim einfügen in die db einfach mit |correctTypo o.ä. die rechtschreibung checken

könntest du auch die korrigierte version des Plugins nochmal posten?

Danke und Gruß,
kills
Back to top
View user's profile Send private message
McSodbrenner
Smarty Pro


Joined: 19 Sep 2004
Posts: 101
Location: Hamburg, Germany

PostPosted: Mon Sep 20, 2004 11:53 am    Post subject: Reply with quote

Hi,
ursprünglich war es auch ein Modifier. Aber ich hatte Gründe, das zu ändern.

1) Meine Kollegen achten nicht so auf die Rechtschreibung in den Templates. Somit konnte ich durch simples Setzen der Blockfunktion alles wieder heile machen.
2) Manchmal bin ich auch zu faul, in den Templates auf saubere Rechtschreibung zu achten.
3) Braucht man es wirklich nur als Modifier, kann man ja einfach den Block herumsetzen.

Weißt du zufällig, wie man es hinbekommt, dass Entities nicht gekillt werden?

Grüzi, Smile
Christoph
Back to top
View user's profile Send private message Visit poster's website
kills
Smarty Elite


Joined: 28 May 2004
Posts: 493

PostPosted: Mon Sep 20, 2004 12:09 pm    Post subject: Reply with quote

Was meinst du damit, dass du die Templates unsauber schreibst?

Baust du diesen Block um das Komplette Teamplate aussen herum oder nur um die Eingaben der user?

Was verstehst du unter Entities?
Back to top
View user's profile Send private message
McSodbrenner
Smarty Pro


Joined: 19 Sep 2004
Posts: 101
Location: Hamburg, Germany

PostPosted: Mon Sep 20, 2004 3:16 pm    Post subject: Reply with quote

kills wrote:
Was meinst du damit, dass du die Templates unsauber schreibst?

Na, dass ich nicht immer auf die korrekte Rechtschreibung achte, z.B. mal - statt & verwende oder "Test" statt &Test&

kills wrote:
Baust du diesen Block um das Komplette Teamplate aussen herum oder nur um die Eingaben der user?

Ich bau das Ding meistens um den Bereich herum, der den Content enthält. Der Rest ändert sich ja so gut wie nie.

kills wrote:
Was verstehst du unter Entities?

Na, die lustigen Sonderzeichen, die mit einem & maskiert werden... die werden irgendwie verschluckt...
hat er in diesem Post übrigens wieder gemacht! Rolling Eyes
Aber jetzt weißt du ja, dass es mir z.B. um die Maskierung von typografischen Zeichen geht.
_________________
Grüzi, Smile
Christoph

My sweet home: www.webboarder.de
Do not visit!! It is private!! And it's mine!
Back to top
View user's profile Send private message Visit poster's website
messju
Administrator


Joined: 16 Apr 2003
Posts: 3336
Location: Oldenburg, Germany

PostPosted: Mon Sep 20, 2004 4:10 pm    Post subject: Reply with quote

das plugin finde ich sehr interessant. schade das dieses phpbb zu doof ist mit den entities umzugehen. wenn du magst, paste das plugin ins smarty wiki: http://smarty.incutio.com/?page=SmartyPlugins das sollte das abkönnen.

ob nun ein modifier oder ein block besser ist ist wohl geschmacksache. ich würde die eigentliche formatierfunktion als shared-funktion kapseln. dann kann ein block-plugin diese shared-function laden und benutzen und ebenso kann ein modifier sie laden und benutzen. ausserdem kann man die funktion dann evtl. von php direkt aus ansprechen.

in der smarty-distribution gibt es ein beispiel: libs/plugins/shared.escape_special_chars.php diese function wird von verschiedenen anderen plugins (html_image, html_option u. a.) verwendet.

ebenso könnte man mit einer shared.improvetypo.php verfahren und sie mit block.improvetypo.php aber auch anderem verwenden.

ist nur eine idee Smile
gruß
messju
Back to top
View user's profile Send private message Send e-mail Visit poster's website
McSodbrenner
Smarty Pro


Joined: 19 Sep 2004
Posts: 101
Location: Hamburg, Germany

PostPosted: Tue Sep 21, 2004 7:23 am    Post subject: Reply with quote

Jetzt hab ich die Lösung!
Eine Sache hatte ich nämlich verschwiegen: Die Funktion kann durch die ganzen RegEx verdammt lange brauchen (bei großen Texten auch mal im Sekunden-Bereich). Shocked

Deshalb jetzt meine Idee:
Die Funktion einmal als pre-Filter anlegen (post-Filter wäre mehr zu parsen), dann hat man schon gesäuberte PHP-Dateien, die halt nur bei geänderten Templates neu erstellt werden. Wäre gut für die Performance.
Für Variablen von außen könnte man das Ding ja zusätzlich noch als Modifikator anlegen.

Deine Idee als shared-Funktion kann man natürlich trotzdem nutzen...

Was haltet ihr von dieser Idee?
Mir gehts zur Zeit ziemlich um die Performance, arbeite gerade an einer bald stark frequentierten Seite.
Ins Wiki hab ich die Datei bisher nicht gestellt, weil die halt für Nicht-Deutsche völlig unbrauchbar ist und somit für die meisten überflüssig ist.


Wo wir gerade dabei sind... wo ist eigentlich der Flaschenhals bei Smarty, was kostet am meisten Performance?
Macht es Sinn, aufgrund der Performance Templates und Kompilate in eine DB zu stecken?
_________________
Grüzi, Smile
Christoph

My sweet home: www.webboarder.de
Do not visit!! It is private!! And it's mine!
Back to top
View user's profile Send private message Visit poster's website
messju
Administrator


Joined: 16 Apr 2003
Posts: 3336
Location: Oldenburg, Germany

PostPosted: Tue Sep 21, 2004 9:14 am    Post subject: Reply with quote

McSodbrenner wrote:
Was haltet ihr von dieser Idee?
Mir gehts zur Zeit ziemlich um die Performance, arbeite gerade an einer bald stark frequentierten Seite.


ich finde die idee sehr gut.

Quote:
Wo wir gerade dabei sind... wo ist eigentlich der Flaschenhals bei Smarty, was kostet am meisten Performance?


das kann man so pauschal nicht sagen. für viele ist der größte flaschenhals schon das laden+parsen von Smarty.class.php . das kann man aber gut mit apc oder turck-mmcache kompensieren.

Quote:
Macht es Sinn, aufgrund der Performance Templates und Kompilate in eine DB zu stecken?


nicht wirklich.

die templates werden ja nur einmal zum kompilieren gelesen, und dann nie wieder. es sollte also nichts ausmachen, wenn die templates auf einem langsamen medium liegen.

die kompilate sollten auf keinen fall in einer DB stecken, da include() und caches wie apc oder turck-mmcache damit nicht funtionieren.

ob gecachete seiten besser im filesystem oder in der datenbank aufgehoben sind, hängt von der jeweiligen situation ab.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
McSodbrenner
Smarty Pro


Joined: 19 Sep 2004
Posts: 101
Location: Hamburg, Germany

PostPosted: Fri Sep 24, 2004 7:51 am    Post subject: Reply with quote

So, die Kombination aus prefilter und modifier steht jetzt im Wiki. Einfach ausprobieren, $diff in den Options auf 1 stellen und wundern, was man so alles falsch schreibt. Smile
Für Erweiterungsvorschläge bin ich immer dankbar.
_________________
Grüzi, Smile
Christoph

My sweet home: www.webboarder.de
Do not visit!! It is private!! And it's mine!
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Smarty Forum Index -> Language: German All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP