Pagina 1 van 2

[BETA] Begrippenvervanging 0.2.0

Geplaatst: 15 mar 2008, 16:32
door Ger
Mod Title: Automatische begrippenvervanging
MOD version: BETA 0.2.0
MOD Description: Vervangt ingevoerde woorden/afkortingen door hetzelfde woord met uitleg (tooltip) en maakt het herkenbaar als zijnde een woord met uitleg. Zie screenshot.
Afbeelding
(tooltip verschijnt als je boven een begrip hangt, dat aangegeven is met cursief en onderstippelde tekst)
phpBB version: 3.0.0
Spoiler: bekijk
CREATE NEW FILE
./definities.php

Add

Code: Selecteer alles

<?php
$begrip = array(
	'hamon' => 'Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting',
	'kassaki' => 'punt',
	'PC pk' => 'Practical katana van Paul Chen',
	'saya' => 'schede',  
	'tsuba' => 'Scheidt handvat van blad en voorkomt dat de hand langs het blad glijdt',
);
$message = preg_replace( 
    '/(?<=[>\s(?]|^)(' 
        . implode( 
            '|', 
            array_map( 
                create_function( 
                    '$s', 
                    'return preg_quote($s, "/");' 
                ), 
                array_keys( 
                    $begrip 
                ) 
            ) 
        ) 
        . ')(?=[\s.,<)?]|$)/ie', 
    '\'<dfn title="\' . htmlspecialchars(\$begrip[ucfirst(strtolower(\'$0\'))]) . \'">$0</dfn>\'', 
    $message 
);
?>
Opmerking: begrippen kunnen natuurlijk door van alles vervangen worden en uitgebreid worden

OPEN
./viewtopic.php

FIND

Code: Selecteer alles

$message = bbcode_nl2br($message);
AFTER, ADD

Code: Selecteer alles

//Start SFB MOD definitielijst
include($phpbb_root_path . 'definities.' . $phpEx);
//Einde SFB MOD definitielijst
OPEN
./includes/ucp/ucp_pm_viewmessage.php

FIND

Code: Selecteer alles

$message = bbcode_nl2br($message);
AFTER, ADD

Code: Selecteer alles

//Start SFB MOD definitielijst
include($phpbb_root_path . 'definities.' . $phpEx);
//Einde SFB MOD definitielijst
//Onderstaande is alleen gedaan tbv het onderscheid met cursieve tekst, dit is natuurlijk vrij naar inzicht te wijzigen:

OPEN
./styles/subsilver2/theme/stylesheet.css

FIND

Code: Selecteer alles

/* Misc
 ------------ */
AFTER, ADD

Code: Selecteer alles

dfn { 
   border-bottom: 1px dotted; 
}
En voor ProSilver is dat:

OPEN
./styles/prosilver/theme/common.css

FIND

Code: Selecteer alles

/* Miscellaneous styles
---------------------------------------- */
AFTER, ADD

Code: Selecteer alles

dfn { 
   border-bottom: 1px dotted; 
}

Gewijzigd in versie 0.2.0:
  • Als in een uitleg ook een ander begrip genoemd wordt, gaf dit grote lelijkheid in de berichten. Fixed.
  • Begrippen die een deel van een ander begrip in zich hadden (bijv. "hamon" en "ha") gaven ook grote lelijkheid. Dmv kijken wat er omheen staat ook opgelost.
  • Speciale tekens (incl. quotes) worden nu ook goed geparsed dmv specialchars.
Wijziging: Vragen zijn opgelost, dus de codes gewijzigd en de vragen weggehaald.

Re: [DEV] Definitielijst

Geplaatst: 15 mar 2008, 16:59
door Salomon
strtolower kan je gebruiken... En wat je misschien kan doen, is een BBCode aanmaken ofzo, en dan woordcensuur zetten.

Re: [DEV] Definitielijst

Geplaatst: 15 mar 2008, 18:28
door Ger
BBcode gaat niet, want dat wordt geparsed voordat de censuur gedaan wordt. Als ik dan A wil vervangen door B, en dat met BBcode van definities wil voorzien gaat dat mis. Bovendien kan ik het dan niet buiten phpBB gebruiken.

strtolower gaat ook niet, want dan is de ouput altijd kleine letters. Wat ik wil is eigenlijk dat hoe dan ook, de input (bijv. "HamOn") met exact dezelfde hoofdletters of kleine letters gereturned wordt. Beste is dan om de variabele $begrip zelf te gebruiken, maar dan wordt die nogmaals door de replace gehaald.

Edit: Hah! Ik heb gevonden hoe includen hier werkt:
include($phpbb_root_path . 'definities.' . $phpEx);
Eerste vraag is dus opgelost. :)

Re: [DEV] Definitielijst

Geplaatst: 15 mar 2008, 18:40
door Salomon

Code: Selecteer alles

$orig = $begrip;
$begrip = strtolower($begrip);
// Doe wat je wilt
$begrip = $orig; 

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 09:33
door Ger
Die ken ik, maar dan zet je alles dus in kleine letters en da's dus precies wat ik niet wil. Ik weet wel hoe ik kan zorgen dat de herkenning niet hoofdlettergevoelig is (str_ireplace) maar het gaat me erom dat hetgeen dat ingevoerd is in het bericht met exact dezelfde letters (hoofd of klein) wordt gereturned.

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 10:23
door Salomon
Je kan toch het originele returnen? Je moet dan niet replacen...

Code: Selecteer alles

$msg = '<blabla' . $title . '>'. $orig . '</blabla>

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 15:43
door Ger
Dat kan natuurlijk, maar hoe krijg ik die vervanging dat terug in de $message? Dan zal ik toch met een replace moeten gaan werken.

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 15:55
door Coen
Ger schreef:Dat kan natuurlijk, maar hoe krijg ik die vervanging dat terug in de $message? Dan zal ik toch met een replace moeten gaan werken.
Even zonder in code te denken (dat werkt vaak beter).

Salomon is een eind in de goede richting, maar legt het misschien wat onduidelijk uit. Wat je moet doen, is de begrippen in kleine letters opslaan in de array met alle tekstjes. Vervolgens haal je de (in kleine letters geschreven) woorden door je filters en controleer je dus of er een description bij moet komen. Je behoudt echter het orgineel wat je later kunt retourneren.

Toch maar een code voorbeeldje;

Code: Selecteer alles

$orgineel = $invoer;
$invoer = strtolower($invoer);

foreach($begrip as $invoer => $uitleg) {
         $uitleg = '<dfn title="'.$uitleg.'">'.$orgineel.'</dfn>';

         $message = str_replace($orgineel, $uitleg, $message);
}
Wat ik hier doe, is een afgeleide van de term (in kleine letters) door de routine halen, maar uiteindelijk wel het orgineel laten zien. Het zou zo moeten werken! ;)

FIXJE: We moeten natuurlijk wel het orgineel (eventueel met hoofdletters e.d.) str_replacen aan het einde, niet de afgeleide met kleine letters! Code klopt nu volgens mij. :)

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 19:02
door Ger
Dat gaat dus niet. Kijk, als ik $origineel gelijkstel aan $invoer dan is dat op dat moment al in kleine letters. Immers, de array waar $invoer in staat, is in kleine letters.

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 19:51
door Coen
Ger schreef:Dat gaat dus niet. Kijk, als ik $origineel gelijkstel aan $invoer dan is dat op dat moment al in kleine letters. Immers, de array waar $invoer in staat, is in kleine letters.
Ik zie niet waar dit gedaan wordt?

Ik maak eerst $orgineel aan, daarna pas ik pas strtolower toe! ;)

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 21:21
door Ger
Ik ook. Kijk, het script ziet er nu zo uit:

Code: Selecteer alles

<?php
$begrip['saya']		= 'Schede'; 
$begrip['kassiki']	= 'Punt van de katana';
$begrip['hamon']	= 'Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting';
$begrip['tsuba']	= 'Scheidt het handvat van het blad, voorkomt tevens dat het zwaard wegglijdt en de hand langs het blad glijdt';

foreach($begrip as $invoer => $uitleg) {
		$orgineel = $invoer;
		$invoer = strtolower($invoer);
		$uitleg = '<dfn title="'.$uitleg.'">'.$orgineel.'</dfn>';
		$message = str_replace($orgineel, $uitleg, $message);
		}
?>
(de gelijkstelling en strtolower moet pas na foreach, anders bestaan de variabelen in kwestie nog niet)

Dat begint dus met de array. Alles kleine letters.
Vervolgens benoem ik de key tot $invoer. Nog steeds kleine letters.
Dan zeg ik dat $origineel hetzelfde is als $invoer. En dat zijn dus nog steeds dezelfde kleine letters. Dat klopt ook, wat op dit moment is er nog niet eens naar het origineel gekeken. Op dat moment is $origneel dus opgeslagen als iets met alleen maar kleine letters.
Probeer maar eens na $origineel = $invoer $origineel te echoën. Je krijgt dan vrolijk allemaal kleine lettertjes.

Dan kan ik daarna wel met $invoer gaan replacen, die inderdaad altijd door str_replace herkend zal worden, maar da's gewoon een moeilijke manier van str_[b]i[/b]replace laten uitvoeren. Het resultaat waar ik op hoopte is er nog niet; namelijk dat het uiteindelijke origineel terugkomt in $uitleg.

Re: [DEV] Definitielijst

Geplaatst: 17 mar 2008, 22:27
door Ger
Ik heb het! Dit is de code geworden:

Code: Selecteer alles

<?php
$begrip = array(
	'hamon' => 'Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting',
	'kassaki' => 'punt',
	'PC pk' => 'Practical katana van Paul Chen',
	'saya' => 'schede',  
	'tsuba' => 'Scheidt handvat van blad en voorkomt dat de hand langs het blad glijdt',
);
foreach($begrip as $invoer => $uitleg) {
	$uitleg = '<dfn title="'.$uitleg.'">\1</dfn>';
	$message = preg_replace("/($invoer)/i", $uitleg, $message);
}
?>
Volgens Tweakers is wat ik wilde totaal niet mogelijk met str_replace, maar dus wel met preg_replace.

Nu kan ik dit fijntjes gaan uitbreiden en includen daar waar ik er zin in heb. :)

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 17 mar 2008, 23:21
door Coen
Geweldig! Dit is een erg leuke MOD om uit te brengen! :)

Succes er verder mee!

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 18 mar 2008, 18:27
door Johan
Super, ga je later ook nog een functie maken dat het aanmaakbaar is in je ACP, en dus niet steeds de codes inhoeft? ;)

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 18 mar 2008, 18:50
door Ger
Als iemand me verteld hoe.... :roll:
Ik zou dat namelijk echt niet weten. Het zal vast kunnen hoor, daar niet van, maar daarvoor is mijn kennis gewoon te beperkt. En op deze manier is het toch ook vrij simpel, je hebt 1 bestand die begint met de array met begrippen. En die heeft toch een vrij simpele structuur ('begrip' => 'uitleg',). Of je dat nou via een interface in de ACP doet of via dat bestand, dat maakt natuurlijk weinig uit.

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 18 mar 2008, 19:00
door BetaDevil
Het is natuurlijk wel te maken maar daar heb je zeker wat PHP-kennis voor nodig (ACP-module schrijven is niet zo simpel...).

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 18 mar 2008, 19:03
door Johan
Ger schreef:Als iemand me verteld hoe.... :roll:
Ik zou dat namelijk echt niet weten. Het zal vast kunnen hoor, daar niet van, maar daarvoor is mijn kennis gewoon te beperkt. En op deze manier is het toch ook vrij simpel, je hebt 1 bestand die begint met de array met begrippen. En die heeft toch een vrij simpele structuur ('begrip' => 'uitleg',). Of je dat nou via een interface in de ACP doet of via dat bestand, dat maakt natuurlijk weinig uit.
Ik hb er geen problemen mee om het gewoon in de bestanden te veranderen, maar er kunnen best mensen zijn die daar foutjes in maken (bijv. een ' perongeluk verwijderen :oops: )

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 19 mar 2008, 22:54
door Ger
Vraagje: ik heb ook al een tijdje een custom bbcode voor begrippenuitleg. Ik zie dat als men nu bij een woord dat in de begrippenlijst staat zelf ook een uitleg ingeeft, het er dan zo uit komt te zien:

Code: Selecteer alles

<dfn title="eigen uitleg"><dfn title="uitleg van de mod">begrip</dfn></dfn>
De uitleg van de mod wordt dan getoond. Liefst heb ik dat andersom, zodat men ook een eigen uitleg kan geven. Waarschijnlijk moet ik de include van de mod dan verplaatsen, maar wat is dan je juiste plaats?

Re: [BETA] Begrippenvervanging 0.1.0

Geplaatst: 21 mar 2008, 09:56
door Ger
Ger schreef:Vraagje: ik heb ook al een tijdje een custom bbcode voor begrippenuitleg. Ik zie dat als men nu bij een woord dat in de begrippenlijst staat zelf ook een uitleg ingeeft, het er dan zo uit komt te zien:

Code: Selecteer alles

<dfn title="eigen uitleg"><dfn title="uitleg van de mod">begrip</dfn></dfn>
De uitleg van de mod wordt dan getoond. Liefst heb ik dat andersom, zodat men ook een eigen uitleg kan geven. Waarschijnlijk moet ik de include van de mod dan verplaatsen, maar wat is dan je juiste plaats?
Nevermind, dit zal altijd zo blijven. Misschien kan ik eens kijken naar omringende tags. Dat kan met JS, ik weet niet of PHP daar ook iets van heeft.

Re: [BETA] Begrippenvervanging 0.2.0

Geplaatst: 22 mar 2008, 12:17
door Ger
Flinke verbeterslag gemaakt, gepromoveerd naar versie 0.2.0:
Gewijzigd in versie 0.2.0:
  • Als in een uitleg ook een ander begrip genoemd wordt, gaf dit grote lelijkheid in de berichten. Fixed.
  • Begrippen die een deel van een ander begrip in zich hadden (bijv. "hamon" en "ha") gaven ook grote lelijkheid. Dmv kijken wat er omheen staat ook opgelost.
  • Speciale tekens (incl. quotes) worden nu ook goed geparsed dmv specialchars.