Exemplo n.º 1
0
<?php

/**
 * TEXY! USER SYNTAX DEMO
 */
// include Texy!
require_once __DIR__ . '/../../src/texy.php';
$texy = new Texy();
// disable *** and ** and * phrases
$texy->allowed['phrase/strong+em'] = FALSE;
$texy->allowed['phrase/strong'] = FALSE;
$texy->allowed['phrase/em-alt'] = FALSE;
$texy->allowed['phrase/em-alt2'] = FALSE;
// register my syntaxes:
// add new syntax: *bold*
$texy->registerLinePattern('userInlineHandler', '#(?<!\\*)\\*(?!\\ |\\*)(.+)' . Texy\Patterns::MODIFIER . '?(?<!\\ |\\*)\\*(?!\\*)()#U', 'myInlineSyntax1');
// add new syntax: _italic_
$texy->registerLinePattern('userInlineHandler', '#(?<!_)_(?!\\ |_)(.+)' . Texy\Patterns::MODIFIER . '?(?<!\\ |_)_(?!_)()#U', 'myInlineSyntax2');
// add new syntax: .h1 ...
$texy->registerBlockPattern('userBlockHandler', '#^\\.([a-z0-9]+)\\n(.+)$#m', 'myBlockSyntax1');
/**
 * Pattern handler for inline syntaxes
 *
 * @param Texy\LineParser
 * @param array   reg-exp matches
 * @param string  pattern name (myInlineSyntax1 or myInlineSyntax2)
 * @return Texy\HtmlElement|string
 */
function userInlineHandler(Texy\LineParser $parser, array $matches, $name)
{
    list(, $mContent, $mMod) = $matches;
Exemplo n.º 2
0
 /**
  * Метод создания объекта Texy:
  */
 private static function createTexyObject($post_link = true, $board = null)
 {
     $texy = new Texy();
     $texy->mergeLines = false;
     $texy->htmlOutputModule->baseIndent = 6;
     $texy->typographyModule->locale = 'fr';
     $texy->registerLinePattern(array('TexyHelper', 'trollface'), '/:trollface:/', 'TexyHelper_trollface');
     $texy->registerLinePattern(array('TexyHelper', 'coolface'), '/:coolface:/', 'TexyHelper_coolface');
     $texy->registerLinePattern(array('TexyHelper', 'sobak'), '/:sobak:/', 'TexyHelper_sobak');
     $texy->registerLinePattern(array('TexyHelper', 'desu'), '/:desu:/', 'TexyHelper_desu');
     $texy->registerLinePattern(array('TexyHelper', 'rage'), '/:rage:/', 'TexyHelper_rage');
     $texy->registerLinePattern(array('TexyHelper', 'ffuu'), '/:f+u+:/', 'TexyHelper_ffuu');
     $texy->registerLinePattern(array('TexyHelper', 'okay'), '/:okay:/', 'TexyHelper_okay');
     /*
     		$texy->registerLinePattern(
     			array('TexyHelper', 'omsk'),
     			'/:omsk:/',
     			'TexyHelper_omsk'
     		);
     */
     $texy->registerLinePattern(array('TexyHelper', 'awesome'), '/:awesome:/', 'TexyHelper_awesome');
     $texy->registerLinePattern(array('TexyHelper', 'nyan'), '/:nyan:/', 'TexyHelper_nyan');
     $texy->registerLinePattern(array('TexyHelper', 'spoiler'), '/%%(([^%]|%[^%])+)%%/', 'TexyHelper_spoiler');
     /*
     		$texy->registerLinePattern(
     			array('TexyHelper', 'redline'),
     			'/\$\$(([^\$]|\$[^\$])+)\$\$/',
     			'TexyHelper_redline'
     		);
     */
     if ($board == null) {
         $texy->registerLinePattern(array('TexyHelper', 'rghost'), '/\\[:(\\d+):\\]/', 'TexyHelper_rghost');
         /*
         			$texy->registerLinePattern(
         				array('TexyHelper', 'youtube'),
         				'/\[youtube:([^\]]+)\]/',
         				'TexyHelper__youtube'
         			);
         */
         $texy->registerLinePattern(array('TexyHelper', 'images'), '/\\[([^\\]]+)\\]/', 'TexyHelper__images');
         if ($post_link) {
             $texy->registerLinePattern(array('TexyHelper', 'postlink'), '/>>(\\d+)/', 'TexyHelper_postlink');
             $texy->registerLinePattern(array('TexyHelper', 'boardpostlink2'), '/>>([^\\/]+)\\/(\\d+)/', 'boardlink');
         }
     } else {
         $texy->registerLinePattern(array('TexyHelper', 'boardpostlink'), '/>>(\\d+)/', 'boardlink_' . $board);
         $texy->registerLinePattern(array('TexyHelper', 'boardpostlink2'), '/>>([^\\/]+)\\/(\\d+)/', 'boardlink');
     }
     return $texy;
 }
Exemplo n.º 3
0
 /**
  * Creates template.
  *
  * @param \ApiGen\Generator $generator
  */
 public function __construct(Generator $generator)
 {
     $this->generator = $generator;
     $this->config = $generator->getConfig();
     $that = $this;
     // Output in HTML5
     Nette\Utils\Html::$xhtml = false;
     // FSHL
     $fshl = new FSHL\Highlighter(new FSHL\Output\Html());
     $fshl->setLexer(new FSHL\Lexer\Php());
     // Texy
     $this->texy = new \Texy();
     $this->texy->allowedTags = array_flip($this->config->allowedHtml);
     $this->texy->allowed['list/definition'] = false;
     $this->texy->allowed['phrase/em-alt'] = false;
     $this->texy->allowed['longwords'] = false;
     $this->texy->allowed['typography'] = false;
     $this->texy->linkModule->shorten = false;
     // Highlighting <code>, <pre>
     $this->texy->addHandler('beforeParse', function ($texy, &$text, $singleLine) {
         $text = preg_replace('~<code>(.+?)</code>~', '#code#\\1#/code#', $text);
     });
     $this->texy->registerLinePattern(function ($parser, $matches, $name) use($fshl) {
         return \TexyHtml::el('code', $fshl->highlight($matches[1]));
     }, '~#code#(.+?)#/code#~', 'codeInlineSyntax');
     $this->texy->registerBlockPattern(function ($parser, $matches, $name) use($fshl) {
         if ('code' === $matches[1]) {
             $lines = array_filter(explode("\n", $matches[2]));
             if (!empty($lines)) {
                 $firstLine = array_shift($lines);
                 $indent = '';
                 $li = 0;
                 while (isset($firstLine[$li]) && preg_match('~\\s~', $firstLine[$li])) {
                     foreach ($lines as $line) {
                         if (!isset($line[$li]) || $firstLine[$li] !== $line[$li]) {
                             break 2;
                         }
                     }
                     $indent .= $firstLine[$li++];
                 }
                 if (!empty($indent)) {
                     $matches[2] = str_replace("\n" . $indent, "\n", 0 === strpos($matches[2], $indent) ? substr($matches[2], $li) : $matches[2]);
                 }
             }
             $content = $fshl->highlight($matches[2]);
         } else {
             $content = htmlspecialchars($matches[2]);
         }
         $content = $parser->getTexy()->protect($content, \Texy::CONTENT_BLOCK);
         return \TexyHtml::el('pre', $content);
     }, '~<(code|pre)>(.+?)</\\1>~s', 'codeBlockSyntax');
     // Common operations
     $this->registerHelperLoader('Nette\\Templating\\Helpers::loader');
     // PHP source highlight
     $this->registerHelper('highlightPHP', function ($source, $context) use($that, $fshl) {
         return $that->resolveLink($that->getTypeName($source), $context) ?: $fshl->highlight((string) $source);
     });
     $this->registerHelper('highlightValue', function ($definition, $context) use($that) {
         return $that->highlightPHP(preg_replace('~^(?:[ ]{4}|\\t)~m', '', $definition), $context);
     });
     // Urls
     $this->registerHelper('packageUrl', new Nette\Callback($this, 'getPackageUrl'));
     $this->registerHelper('namespaceUrl', new Nette\Callback($this, 'getNamespaceUrl'));
     $this->registerHelper('groupUrl', new Nette\Callback($this, 'getGroupUrl'));
     $this->registerHelper('classUrl', new Nette\Callback($this, 'getClassUrl'));
     $this->registerHelper('methodUrl', new Nette\Callback($this, 'getMethodUrl'));
     $this->registerHelper('propertyUrl', new Nette\Callback($this, 'getPropertyUrl'));
     $this->registerHelper('constantUrl', new Nette\Callback($this, 'getConstantUrl'));
     $this->registerHelper('functionUrl', new Nette\Callback($this, 'getFunctionUrl'));
     $this->registerHelper('elementUrl', new Nette\Callback($this, 'getElementUrl'));
     $this->registerHelper('sourceUrl', new Nette\Callback($this, 'getSourceUrl'));
     $this->registerHelper('manualUrl', new Nette\Callback($this, 'getManualUrl'));
     // Packages & namespaces
     $this->registerHelper('packageLinks', new Nette\Callback($this, 'getPackageLinks'));
     $this->registerHelper('namespaceLinks', new Nette\Callback($this, 'getNamespaceLinks'));
     $this->registerHelper('subgroupName', function ($groupName) {
         if ($pos = strrpos($groupName, '\\')) {
             return substr($groupName, $pos + 1);
         }
         return $groupName;
     });
     // Types
     $this->registerHelper('typeLinks', new Nette\Callback($this, 'getTypeLinks'));
     // Docblock descriptions
     $this->registerHelper('description', function ($annotation, $context) use($that) {
         $description = trim(strpbrk($annotation, "\n\r\t \$"));
         if ($context instanceof ReflectionParameter) {
             $description = preg_replace('~^(\\$' . $context->getName() . '(?:,\\.{3})?)(\\s+|$)~i', '\\2', $description, 1);
             $context = $context->getDeclaringFunction();
         }
         return $that->doc($description, $context);
     });
     $this->registerHelper('shortDescription', function ($element, $block = false) use($that) {
         return $that->doc($element->getShortDescription(), $element, $block);
     });
     $this->registerHelper('longDescription', function ($element) use($that) {
         $long = $element->getLongDescription();
         // Merge lines
         $long = preg_replace_callback('~(?:<(code|pre)>.+?</\\1>)|([^<]*)~s', function ($matches) {
             return !empty($matches[2]) ? preg_replace('~\\n(?:\\t|[ ])+~', ' ', $matches[2]) : $matches[0];
         }, $long);
         return $that->doc($long, $element, true);
     });
     // Individual annotations processing
     $this->registerHelper('annotation', function ($value, $name, $context) use($that, $generator) {
         switch ($name) {
             case 'param':
             case 'return':
             case 'throws':
                 $description = $that->description($value, $context);
                 return sprintf('<code>%s</code>%s', $that->getTypeLinks($value, $context), $description ? '<br>' . $description : '');
             case 'license':
                 list($url, $description) = $that->split($value);
                 return $that->link($url, $description ?: $url);
             case 'link':
                 list($url, $description) = $that->split($value);
                 if (Nette\Utils\Validators::isUrl($url)) {
                     return $that->link($url, $description ?: $url);
                 }
                 break;
             case 'see':
                 $doc = array();
                 foreach (preg_split('~\\s*,\\s*~', $value) as $link) {
                     if (null !== $generator->resolveElement($link, $context)) {
                         $doc[] = sprintf('<code>%s</code>', $that->getTypeLinks($link, $context));
                     } else {
                         $doc[] = $that->doc($link, $context);
                     }
                 }
                 return implode(', ', $doc);
             case 'uses':
             case 'usedby':
                 list($link, $description) = $that->split($value);
                 $separator = $context instanceof ReflectionClass || !$description ? ' ' : '<br>';
                 if (null !== $generator->resolveElement($link, $context)) {
                     return sprintf('<code>%s</code>%s%s', $that->getTypeLinks($link, $context), $separator, $description);
                 }
                 break;
             default:
                 break;
         }
         // Default
         return $that->doc($value, $context);
     });
     $todo = $this->config->todo;
     $internal = $this->config->internal;
     $this->registerHelper('annotationFilter', function (array $annotations, array $filter = array()) use($todo, $internal) {
         // Filtered, unsupported or deprecated annotations
         static $filtered = array('package', 'subpackage', 'property', 'property-read', 'property-write', 'method', 'abstract', 'access', 'final', 'filesource', 'global', 'name', 'static', 'staticvar');
         foreach ($filtered as $annotation) {
             unset($annotations[$annotation]);
         }
         // Custom filter
         foreach ($filter as $annotation) {
             unset($annotations[$annotation]);
         }
         // Show/hide internal
         if (!$internal) {
             unset($annotations['internal']);
         }
         // Show/hide tasks
         if (!$todo) {
             unset($annotations['todo']);
         }
         return $annotations;
     });
     $this->registerHelper('annotationSort', function (array $annotations) {
         uksort($annotations, function ($one, $two) {
             static $order = array('deprecated' => 0, 'category' => 1, 'copyright' => 2, 'license' => 3, 'author' => 4, 'version' => 5, 'since' => 6, 'see' => 7, 'uses' => 8, 'usedby' => 9, 'link' => 10, 'internal' => 11, 'example' => 12, 'tutorial' => 13, 'todo' => 14);
             if (isset($order[$one], $order[$two])) {
                 return $order[$one] - $order[$two];
             } elseif (isset($order[$one])) {
                 return -1;
             } elseif (isset($order[$two])) {
                 return 1;
             } else {
                 return strcasecmp($one, $two);
             }
         });
         return $annotations;
     });
     $this->registerHelper('annotationBeautify', function ($annotation) {
         static $names = array('usedby' => 'Used by');
         if (isset($names[$annotation])) {
             return $names[$annotation];
         }
         return Nette\Utils\Strings::firstUpper($annotation);
     });
     // Static files versioning
     $destination = $this->config->destination;
     $this->registerHelper('staticFile', function ($name) use($destination) {
         static $versions = array();
         $filename = $destination . DIRECTORY_SEPARATOR . $name;
         if (!isset($versions[$filename]) && is_file($filename)) {
             $versions[$filename] = sprintf('%u', crc32(file_get_contents($filename)));
         }
         if (isset($versions[$filename])) {
             $name .= '?' . $versions[$filename];
         }
         return $name;
     });
     // Source anchors
     $this->registerHelper('sourceAnchors', function ($source) {
         // Classes, interfaces, traits and exceptions
         $source = preg_replace_callback('~(<span\\s+class="php-keyword1">(?:class|interface|trait)</span>\\s+)(\\w+)~i', function ($matches) {
             $link = sprintf('<a id="%1$s" href="#%1$s">%1$s</a>', $matches[2]);
             return $matches[1] . $link;
         }, $source);
         // Methods and functions
         $source = preg_replace_callback('~(<span\\s+class="php-keyword1">function</span>\\s+)(\\w+)~i', function ($matches) {
             $link = sprintf('<a id="_%1$s" href="#_%1$s">%1$s</a>', $matches[2]);
             return $matches[1] . $link;
         }, $source);
         // Constants
         $source = preg_replace_callback('~(<span class="php-keyword1">const</span>)(.*?)(;)~is', function ($matches) {
             $links = preg_replace_callback('~(\\s|,)([A-Z_]+)(\\s+=)~', function ($matches) {
                 return $matches[1] . sprintf('<a id="%1$s" href="#%1$s">%1$s</a>', $matches[2]) . $matches[3];
             }, $matches[2]);
             return $matches[1] . $links . $matches[3];
         }, $source);
         // Properties
         $source = preg_replace_callback('~(<span\\s+class="php-keyword1">(?:private|protected|public|var|static)</span>\\s+)(<span\\s+class="php-var">.*?)(;)~is', function ($matches) {
             $links = preg_replace_callback('~(<span\\s+class="php-var">)(\\$\\w+)~i', function ($matches) {
                 return $matches[1] . sprintf('<a id="%1$s" href="#%1$s">%1$s</a>', $matches[2]);
             }, $matches[2]);
             return $matches[1] . $links . $matches[3];
         }, $source);
         return $source;
     });
     $this->registerHelper('urlize', array($this, 'urlize'));
     $this->registerHelper('relativePath', array($generator, 'getRelativePath'));
     $this->registerHelper('resolveElement', array($generator, 'resolveElement'));
     $this->registerHelper('getClass', array($generator, 'getClass'));
 }
Exemplo n.º 4
0
if (!@file_exists(dirname(__FILE__) . '/wikdata') || !@is_writable(dirname(__FILE__) . '/wikdata')) {
    $ok = @mkdir(dirname(__FILE__) . '/wikdata');
    if (!$ok) {
        die('WikWiki cannot access the data directory ./wikdata/.
			 Please create the directory and make it writeable by PHP.');
    }
}
$msg = '';
// Instantiate Texy parser.
require dirname(__FILE__) . '/texy.min.php';
$texy = new Texy();
$texy->encoding = 'utf-8';
$texy->headingModule->top = 2;
$texy->headingModule->generateID = true;
$texy->allowed['image'] = FALSE;
$texy->registerLinePattern('parseWikiLinks', '~\\[([^|\\]]+)(?:\\s*\\|\\s*([^\\]]+)\\s*)?\\]~', 'wikilinks');
// init path
$page = parseQueryString($_SERVER['QUERY_STRING']);
if (empty($_GET)) {
    $page = titleToId(BASE_PAGE);
}
// Save content.
if (!empty($_POST)) {
    if (file_exists('captcha_codes.php')) {
        $resp = recaptcha_check_answer(get_private_recaptcha_key(), $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
        $accepted = $resp->is_valid;
    } else {
        $accepted = 1;
    }
    if (!$accepted) {
        $msg = "Not a correct reCaptcha.";