Oznámení
PunBB fórum s integrovaným Texy!
před 12 lety
- juneau
- Člen | 166
Hodlám používat PunBB a rád bych do něj integroval Texy! syntaxi – bude to velký problém? Požádat tě přímo o soubory zdejšího fóra mi přijde poněkud drzé, ale určitě bych to ocenil ;)
před 12 lety
- David Grudl
- Nette Core | 6806
V souboru parser.php jsem ve funkcích parse_message() a parse_signature() prohnal vstupní parametr $text přes Texy a vrátil ven. Nic víc. Jo, a pak kdesi do šablon přidal „Zde formátuje Texy“.
před 12 lety
- krteczek
- Člen | 13
Juneau: http://punbb.jaknato.com/index.php i s texylou ;-) ale bylo mi řečeno že je to blbost :-(
před 12 lety
- David Grudl
- Nette Core | 6806
Zkusil jsem sem Texylu implementovat, věřím že se osvědčí.
před 12 lety
- Honza M.
- Člen | 1674
Dík. Všiml jsem si, že ti v náhledu nefunguje trojtečka a . Krteczek ví proč. Prý jsi v souboru texyla.php v ajaxu zrušil utf-8 kde jsi neměl.
před 12 lety
- krteczek
- Člen | 13
Ahoj,
hlásím Ti bugreport:
pravděpodobně jsi upravoval i soubor texyla.php, a zřejmě jsi odstranil
parametr ‚utf-8‘ z volání funkce texyla, nedělej to, javascript pracuje
v utf-8 (je to ověřeno) a ani není třeba překodovávat zdroják do jiné
znakové sady (taky vyzkoušeno).
Texyla je napsána tak aby do ní nebylo nutno zasahovat (snad jen kromě
configu)
před 12 lety
- David Grudl
- Nette Core | 6806
Ano, to UTF-8 mi vypadlo, fixed.
před 12 lety
- Speedi
- Člen | 1
David Grudl napsal(a): V souboru parser.php jsem ve funkcích parse_message() a parse_signature() prohnal vstupní parametr $text přes Texy a vrátil ven.
Mohl by mi to někdo prosím konkrétněji vysvětlit?
před 12 lety
- David Grudl
- Nette Core | 6806
Tak konkrétně:
soubor parser.php
, funkce parse_message
:
function parse_message($text, $hide_smilies)
{
global $pun_config, $lang_common, $pun_user;
if ($pun_config['o_censoring'] == '1')
$text = censor_words($text);
$texy = new ForumTexy();
return $texy->process($text);
}
soubor parser.php
, funkce parse_signature
:
function parse_signature($text)
{
global $pun_config, $lang_common, $pun_user;
if ($pun_config['o_censoring'] == '1')
$text = censor_words($text);
$texy = new ForumTexy();
return $texy->process($text);
}
A nakonec zbyva vytvořit třídu ForumTexy:
require_once LIBS_DIR.'texy.compact.php';
require_once LIBS_DIR.'fshl/fshl.php';
class ForumTexy extends Texy
{
function __construct()
{
parent::__construct();
// nastavime nejake CSS tridy a cesty
$this->linkModule->root = '';
$this->alignClasses['left'] = 'left';
$this->alignClasses['right'] = 'right';
// emotikony
$this->allowed['emoticon'] = TRUE;
$this->emoticonModule->root = '../images/smilies/';
$this->emoticonModule->class = 'smiley';
// safe mode
TexyConfigurator::safeMode($this);
$this->headingModule->top = 4;
// povolime JEN znacky ins a del
$this->allowedTags = array(
'ins' => FALSE,
'del' => FALSE,
);
// povolime zvyraznovani kodu (to ma smysl jen na webovych forech)
$this->addHandler('block', array($this, 'blockHandler'));
// pridame auto-link na www.php.net, opet ma to smysl jen na forech o PHP
$link = new TexyLink('http://php.net/%s');
$this->linkModule->addReference('php', $link);
}
/**
* User handler for code block
*
* @param TexyHandlerInvocation handler invocation
* @param string block type
* @param string text to highlight
* @param string language
* @param TexyModifier modifier
* @return TexyHtml
*/
function blockHandler($invocation, $blocktype, $content, $lang, $modifier)
{
if ($blocktype !== 'block/code') {
return $invocation->proceed();
}
$lang = strtoupper($lang);
if ($lang == 'JAVASCRIPT') $lang = 'JS';
$fshl = new fshlParser('HTML_UTF8', P_TAB_INDENT);
if (!$fshl->isLanguage($lang)) {
return $invocation->proceed();
}
$content = Texy::outdent($content);
$content = $fshl->highlightString($lang, $content);
$content = $this->protect($content, Texy::CONTENT_BLOCK);
$elPre = TexyHtml::el('pre');
if ($modifier) $modifier->decorate($this, $elPre);
$elPre->attrs['class'] = strtolower($lang);
$elCode = $elPre->create('code', $content);
return $elPre;
}
}
před 11 lety
- David Grudl
- Nette Core | 6806
Další možné rozšíření třídy ForumTexy, aby bylo možné PHP kód
zapisovat prostým vložením mezi značky <?php a ?>
:
class ForumTexy extends Texy
{
function __construct()
{
...
// add new syntax: <?php ... ? >
$this->registerBlockPattern(
array($this, 'codeBlockHandler'),
'#^<\\?php\n.+\n\\?>$#ms', // block patterns must be multiline and line-anchored
'phpBlockSyntax'
);
}
...
/**
* Pattern handler for PHP & JavaScript block syntaxes
*
* @param TexyBlockParser
* @param array regexp matches
* @param string pattern name
* @return TexyHtml|string|FALSE
*/
function codeBlockHandler($parser, $matches, $name)
{
list($content) = $matches;
$lang = $name === 'phpBlockSyntax' ? 'PHP' : 'HTML';
$fshl = new fshlParser('HTML_UTF8', P_TAB_INDENT);
$content = $fshl->highlightString($lang, $content);
$content = $this->protect($content, Texy::CONTENT_BLOCK);
$elPre = TexyHtml::el('pre');
$elPre->attrs['class'] = strtolower($lang);
$elCode = $elPre->create('code', $content);
return $elPre;
}
...
}
před 10 lety
- Cifro
- Člen | 245
Som tak rozmyšľal, že keď je teraz v parse_message
vytvaranie Texy objektu tak nebolo by lepšie použiť singleton? Keďže sa
teraz v cykle vytvorí toľko inštancii koľko je nastavených postov na jednu
stránku a ulohou inštancii je len prehnať vstupný text metodou
process()
. Všetky nastavenia ostávaju len sa mení vstup. Preto
som myslel že by bol vhodnejší singleton, ale…
Fatal error: Access level to AdminTexy::__construct() must be public (as in class Texy)
in ......\texyla\php\admin.cfg.php on line 7
Pri singletone by mal byť konštruktor privatný ale Texy mi to nedovolí v zdedenej triede :/ Čo s tým alebo ako na to aby som nemusel vytvarať v cykle toľko inštancii? A prečo to chcem? Kvoli performance…
Editoval Cifro (27. 10. 2009 15:19)
před 10 lety
- LastHunter
- Člen | 1539
Já to dělám v Nette aplikaci takto:
<?php
class Factories extends Object {
private static $adminTexy;
private static $publicTexy;
public static function getAdminTexy() {
if (self::$adminTexy == null) {
self::$adminTexy = new AdminTexy;
}
return self::$adminTexy;
}
public static function getPublicTexy() {
if (self::$publicTexy == null) {
self::$publicTexy = new PublicTexy;
}
return self::$publicTexy;
}
}
A AdminTexy i PublicTexy jsou normálně poděděné třídy s public konstruktorem.
před 10 lety
- Cifro
- Člen | 245
Diki, pomohlo mi to. Nakoniec to vyzerá takto:
<?php
require_once dirname(__FILE__) . '/../texyla/php/admin.cfg.php';
require_once dirname(__FILE__) . '/../texyla/php/TexylaFactory.php';
...
...
...
function parse_message($text, $hide_smilies)
{
global $forum_config, $lang_common, $forum_user;
if ($forum_config['o_censoring'] == '1')
$text = censor_words($text);
return TexylaFactory::getAdminTexy()->process($text);
}
?>