Schrift
[thread]4933[/thread]

In Text Smilies durch Bilder ersetzen (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
pKai
 2005-04-12 16:25
#43469 #43469
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=Froschpopo,12.April.2005, 11:51]ich bräuchte irgendwie sowas wie split(/exists($emotions{(.*)})/,$txt);... sowas in der art..[/quote]
Interessant das "zu Fuß" zu machen.
Falls es jemand gebrauchen kann:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;
use warnings;
use Data::Dumper;

my %hash = (':-)' => 'lachen.gif', ';-)' => 'zwinker.gif');
my $string = "Dies;-) ist ein Test :-);\na :- b";

my $smile1;
{ # Zeichen sammeln, mit denen Smilies beginnen können
my %sc = map {$_, 1} map {substr($_, 0, 1)} keys %hash;
$smile1 = join ('', map {quotemeta} sort keys %sc);
}
# smilies (regexp-safe) in alphabetisch absteigender Reihenfolge (get longest match)
my @smiler = map {quotemeta} sort {-($a cmp $b)} keys %hash;

my @splitted;
push (@splitted, $1) if $string =~ /\G([^$smile1]+)/ogc; # bis zum ersten (möglichen) Smilie-Start
LOOP: {
foreach my $s (@smiler) {
push (@splitted, [$1]), redo LOOP if $string =~ /\G($s)/gc; # eins gefunden -> redo LOOP
}
push (@splitted, $1), redo LOOP if $string =~ /\G(.[^$smile1]*)/ogc; # ein Zeichen und dann bis nächstem möglichen Start
}

print Dumper(\@splitted);

Habe hier die Smilies, zwecks leichterer Wiedererkennbarkeit in ARRAY-refs gepackt.
Ausgabe des Test-Skripts:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$VAR1 = [
'Dies',
[
';-)'
],
' ist ein Test ',
[
':-)'
],
';
a ',
':- b'
];
I sense a soul in search of answers.
Crian
 2005-04-12 18:27
#43470 #43470
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Hmmm, das scheint mir etwas zu einfach, oder ich hab es mir viel zu kompliziert gemacht.
Ich ermittel im untersuchten Abschnitt des Dokuments:
- zunächst alle Treffer der Emoticon-Kurzworte
- Ich trage von diesen den am weitesten vorn liegenden und von diesen den längesten in ein Array ein (bei mir gibt es z.B. ':-)' und ':-' ) und ersetze den getroffenen Text in einer Kopie des Textes durch '#'-Zeichen in der entsprechenden Anzahl
- Das mache ich so lange, bis ich keine weiteren Treffer mehr erhalte.
- Dann gehe ich den Originaltextabschnitt von vorn nach hinten durch, wobei ich dann jeweils den Teil vor dem Treffer als normalen Text in mein Textwidget einfüge und danach die Emoticon-Grafik
- am Ende füg ich noch den Rest hinzu.

Das Programm wird ein kleines Tk-Tool, in dem man Forentext schreiben kann und "on the fly" (in Tipppausen) die Vorschau in einem ROText-Feld angezeigt bekommt mit Umsetzungen der entsprechenden Tags und Emoticons.

Falls das hier irgendwie interessant ist, kann ich die entsprechende Funktion posten, ansonsten stelle ich es bestimmt vor, wenn es fertiger ist. Allerdings ruht zur Zeit die Entwicklung.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pKai
 2005-04-12 22:46
#43471 #43471
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,12.April.2005, 16:27]Hmmm, das scheint mir etwas zu einfach, ...[/quote]
?

Mein Skript durchläuft den String einmal, mittels /\G../gc matches (perldoc perlop (#Regexp Quote-Like Operators)) in einer Schleife, um:
1) Alle Zeichen die kein Anfang eines Smiles sein können
2) und dann das längste Smilie was dort möglich ist
aufzusammeln.

Statt die gefundenen Teile in ein Array zu pushen, kann man sie natürlich auch sofort sequentiell verarbeiten, wenn gewünscht.
---
Edit: Die Zeile vor dem LOOP: kann algorithmisch gesehen ersatzlos entfallen. Sie war nur der Tatsache geschuldet, dass ich diese Suche nach dem ersten möglichem Smilie-Anfang ganz zuerst in dem LOOP-Block hatte.
Was dann da steht finde ich persönlich ästhetisch ansprechender, da es dann nur noch eine Verarbeitungsstelle für Smilies und eine für nicht-Smilie-Strings gibt.
---
Das mit dem On-the-Fly-Preview von Eingabetext mit Smilies und Tag-Paaren finde ich interessant.
In meinen CGI-Skripten wo ich Tags bearbeite matche ich immer so, dass nur zusammengehörige Start-Ende-Paare angefasst werden. Wenn man einen Preview eines noch nicht fertigen Eingabetextes macht, würde man dann schon mit dem Start-Tag eine ungefähre optische Umsetzung anfangen? Also man schreibt [.code] und es wird ein Kasten aufgemacht in den man dann in Monospace-Schrift weiterschreibt, bis man [/code] eintippt?
Man kann das Skript ganz zwanglos auch um Tag-Erkennung erweitern (innerhalb desselben "LOOP"!). Die Verarbeitung der Tags ist dann natürlich gegenüber den Smilies nicht mehr zustandslos, da man sich merken muss, welchen Tag in welchen geschachtelt man gerade vor sich hat; aber insgesamt nicht komplizierter, als was man mit anderem Vorgehen nicht auch benötigt.\n\n

<!--EDIT|pKai|1113347469-->
I sense a soul in search of answers.
Crian
 2005-04-13 17:34
#43472 #43472
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Bei Dir fehlt auf jeden Fall das Eintragen in das Tk::Text-Objekt. Das findet bei mir übrigens auch nur an einem Ort statt, vorher erzeuge ich Strukturen, die wissen, ob sie Text- oder Grafikelemente beherbergen. Am Ende werden diese dann nur noch in einer Schleife abgearbeitet und etweder der Text eingefügt oder eine entsprechende Grafik eingefügt.

Bei mir ist es ein mehrstufiger Prozess, da ich zunächst den Text stark zerhäcksle, um alle Foren-Tags zu fangen, dann werden Textstücke mit den gleichen Tk-Tags wieder zusammengefasst, dann werden im Text Smilies gesucht.
Ganz am Ende wird das Ergebnisarray wie oben beschrieben ausgegeben.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pKai
 2005-04-13 18:41
#43473 #43473
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,13.April.2005, 15:34]Bei Dir fehlt auf jeden Fall das Eintragen in das Tk::Text-Objekt. ...[/quote]
Nö, ;) hab ja nie behauptet sowas machen zu wollen. Hab auch keine Ahnung von Tk, und weiß nicht was da zu tun wäre. Ich habe lediglich demonstriert, wie man relativ leicht in einem Text die Smilies findet (und behauptet, dass man das relativ leicht auf Tags ausweiten kann (und dazu stehe ich 8)) ...
I sense a soul in search of answers.
Crian
 2005-04-13 20:05
#43474 #43474
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Naja, meine Lösung ist fertig und dazu ziemlich stabil von ihrem Aufbau her. Es fehlt nur noch ein bischen was drum herum.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Froschpopo
 2005-04-25 21:29
#43475 #43475
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
@crian, wie siehts aus mit deinem Script ? ist da schon was fertig ? Oder kann mir jemand ein Beispiel zeigen wie man in ein Label zwei Dinge einbaut?

Was cool wäre wenn sowas möglich wäre wie:
Code: (dl )
1
2
3
4
5
$mw->Laben(
-text => "Und jetzt kommt ein Bild:
-image => $file,
-text => "und wieder text"
);
ptk
 2005-04-25 23:16
#43476 #43476
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Siehe Tk::Compound.
Crian
 2005-04-27 17:45
#43477 #43477
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Mein Skript ist (relativ) fertig, ja. Allerdings baue ich die Dinge nicht in Label, sondern in Text-Widgets ein.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Froschpopo
 2005-04-27 20:58
#43478 #43478
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Oki ich hab ja ein Bookmark zu deiner seite ;-)
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2005-04-12 01:17.