Oznámení

Provoz fóra byl ukončen

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);
}
?>