예제 #1
0
 function __construct($conf)
 {
     if (!isset($conf['parsers'])) {
         throw new MWException(__METHOD__ . ': no parsers specified');
     }
     $this->conf = $conf;
     $this->dtUniqPrefix = "UNIQ" . Parser::getRandomString();
 }
예제 #2
0
 /**
  * Merge another StripState object into this one. The strip marker keys
  * will not be preserved. The strings in the $texts array will have their
  * strip markers rewritten, the resulting array of strings will be returned.
  *
  * @param $otherState StripState
  * @param $texts Array
  * @return Array
  */
 function merge($otherState, $texts)
 {
     $mergePrefix = Parser::getRandomString();
     foreach ($otherState->data as $type => $items) {
         foreach ($items as $key => $value) {
             $this->data[$type]["{$mergePrefix}-{$key}"] = $value;
         }
     }
     $this->tempMergePrefix = $mergePrefix;
     $texts = preg_replace_callback($otherState->regex, array($this, 'mergeCallback'), $texts);
     $this->tempMergePrefix = null;
     return $texts;
 }
예제 #3
0
 /**
  * Clear Parser state
  *
  * @private
  */
 function clearState()
 {
     wfProfileIn(__METHOD__);
     if ($this->mFirstCall) {
         $this->firstCallInit();
     }
     $this->mOutput = new ParserOutput();
     $this->mAutonumber = 0;
     $this->mLastSection = '';
     $this->mDTopen = false;
     $this->mIncludeCount = array();
     $this->mStripState = new StripState();
     $this->mArgStack = false;
     $this->mInPre = false;
     $this->mInterwikiLinkHolders = array('texts' => array(), 'titles' => array());
     $this->mLinkHolders = array('namespaces' => array(), 'dbkeys' => array(), 'queries' => array(), 'texts' => array(), 'titles' => array());
     $this->mRevisionTimestamp = $this->mRevisionId = null;
     /**
      * Prefix for temporary replacement strings for the multipass parser.
      * \x07 should never appear in input as it's disallowed in XML.
      * Using it at the front also gives us a little extra robustness
      * since it shouldn't match when butted up against identifier-like
      * string constructs.
      *
      * Must not consist of all title characters, or else it will change 
      * the behaviour of <nowiki> in a link.
      */
     #$this->mUniqPrefix = "\x07UNIQ" . Parser::getRandomString();
     # Changed to \x7f to allow XML double-parsing -- TS
     $this->mUniqPrefix = "UNIQ" . Parser::getRandomString();
     # Clear these on every parse, bug 4549
     $this->mTplExpandCache = $this->mTplRedirCache = $this->mTplDomCache = array();
     $this->mShowToc = true;
     $this->mForceTocPosition = false;
     $this->mIncludeSizes = array('post-expand' => 0, 'arg' => 0);
     $this->mPPNodeCount = 0;
     $this->mDefaultSort = false;
     $this->mHeadings = array();
     # Fix cloning
     if (isset($this->mPreprocessor) && $this->mPreprocessor->parser !== $this) {
         $this->mPreprocessor = null;
     }
     wfRunHooks('ParserClearState', array(&$this));
     wfProfileOut(__METHOD__);
 }
예제 #4
0
 /**
  * Add an item to the strip state
  * Returns the unique tag which must be inserted into the stripped text
  * The tag will be replaced with the original text in unstrip()
  *
  * @private
  */
 function insertStripItem($text, &$state)
 {
     $rnd = $this->mUniqPrefix . '-item' . Parser::getRandomString();
     if (!$state) {
         $state = array();
     }
     $state['general'][$rnd] = $text;
     return $rnd;
 }
예제 #5
0
 /**
  * Add an item to the strip state
  * Returns the unique tag which must be inserted into the stripped text
  * The tag will be replaced with the original text in unstrip()
  *
  * @private
  */
 function insertStripItem($text, &$state)
 {
     $rnd = $this->mUniqPrefix . '-item' . Parser::getRandomString();
     $state->general->setPair($rnd, $text);
     return $rnd;
 }
 /**
  * Parse the form definition and return it
  */
 public static function getFormDefinition(Parser $parser, $form_def = null, $form_id = null)
 {
     if ($form_id !== null) {
         $cachedDef = self::getFormDefinitionFromCache($form_id, $parser);
         if ($cachedDef !== null) {
             return $cachedDef;
         }
     }
     if ($form_id !== null) {
         $form_title = Title::newFromID($form_id);
         $form_def = SFUtils::getPageText($form_title);
     } elseif ($form_def == null) {
         // No id, no text -> nothing to do
         return '';
     }
     // Remove <noinclude> sections and <includeonly> tags from form definition
     $form_def = StringUtils::delimiterReplace('<noinclude>', '</noinclude>', '', $form_def);
     $form_def = strtr($form_def, array('<includeonly>' => '', '</includeonly>' => ''));
     // We need to replace all SF tags in the form definition by strip items. But we can not just use
     // the Parser strip state because the Parser would during parsing replace all strip items and then
     // mangle them into HTML code. So we have to use our own. Which means we also can not just use
     // Parser::insertStripItem() (see below).
     $prefix = "UNIQ" . Parser::getRandomString();
     $stripState = new StripState($prefix);
     // This regexp will find any SF triple braced tags (including correct handling of contained braces), i.e.
     // {{{field|foo|default={{Bar}}}}} is not a problem. When used with preg_match and friends, $matches[0] will
     // contain the whole SF tag, $matches[1] will contain the tag without the enclosing triple braces.
     $regexp = '#\\{\\{\\{((?>[^\\{\\}]+)|(\\{((?>[^\\{\\}]+)|(?-2))*\\}))*\\}\\}\\}#';
     // replace all SF tags by strip markers
     $form_def = preg_replace_callback($regexp, function (array $matches) use($stripState, $prefix) {
         static $markerIndex = 0;
         $rnd = "{$prefix}-item-{$markerIndex}-" . Parser::MARKER_SUFFIX;
         $markerIndex++;
         $stripState->addGeneral($rnd, $matches[0]);
         return $rnd;
     }, $form_def);
     $title = is_object($parser->getTitle()) ? $parser->getTitle() : new Title();
     // parse wiki-text
     $output = $parser->parse($form_def, $title, $parser->getOptions());
     $form_def = $stripState->unstripGeneral($output->getText());
     if ($output->getCacheTime() == -1) {
         $form_article = Article::newFromID($form_id);
         self::purgeCache($form_article);
         wfDebug("Caching disabled for form definition {$form_id}\n");
     } elseif ($form_id !== null) {
         self::cacheFormDefinition($form_id, $form_def, $parser);
     }
     return $form_def;
 }