Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 21
Wikitext
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
56
0.00% covered (danger)
0.00%
0 / 21
 preprocess
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 10
 pst
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 11
<?php
declare( strict_types = 1 );
namespace Wikimedia\Parsoid\Wikitext;
use Wikimedia\Parsoid\Config\Env;
use Wikimedia\Parsoid\Tokens\Token;
use Wikimedia\Parsoid\Wt2Html\PegTokenizer;
/**
 * This class represents core wikitext concepts that are currently represented
 * as methods of Parser.php (in core) OR Parsoid.php (here) or other classes.
 * Care should be taken to have this class represent first-class wikitext
 * concepts and operations and not so much implementation concepts, but that is
 * understandably a hard line to draw. Given that, this suggestion is more of a
 * guideline to help with code hygiene.
 */
class Wikitext {
    /**
     * Equivalent of 'preprocessWikitext' from Parser.php in core.
     * - expands templates
     * - replaces magic variables
     *
     * Notably, this doesn't support replacing template args from a frame,
     * i.e. the preprocessing here is of *standalone wikitext*, not in
     * reference to something else which is where a frame would be used.
     *
     * This does not run any Parser hooks either, but support for which
     * could eventually be added that is triggered by input options.
     *
     * This also updates resource usage and returns an error if limits
     * are breached.
     *
     * @param Env $env
     * @param string $wt
     * @return array
     *  - 'error' did we hit resource limits?
     *  - 'src' expanded wikitext OR error message to print
     *     FIXME: Maybe error message should be localizable
     */
    public static function preprocess( Env $env, string $wt ): array {
        $start = microtime( true );
        $ret = $env->getDataAccess()->preprocessWikitext( $env->getPageConfig(), $env->getMetadata(), $wt );
        // FIXME: Should this bump be len($ret) - len($wt)?
        // I could argue both ways.
        if ( !$env->bumpWt2HtmlResourceUse( 'wikitextSize', strlen( $ret ) ) ) {
            return [
                'error' => true,
                'src' => "wt2html: wikitextSize limit exceeded",
            ];
        }
        if ( $env->profiling() ) {
            $profile = $env->getCurrentProfile();
            $profile->bumpMWTime( "Template", 1000 * ( microtime( true ) - $start ), "api" );
            $profile->bumpCount( "Template" );
        }
        return [
            'error' => false,
            'src' => $ret,
        ];
    }
    /**
     * Perform pre-save transformations
     *
     * @param Env $env
     * @param string $wt
     * @param bool $substTLTemplates Prefix each top-level template with 'subst'
     * @return string
     */
    public static function pst( Env $env, string $wt, bool $substTLTemplates = false ) {
        if ( $substTLTemplates ) {
            // To make sure we do this for the correct templates, tokenize the
            // starting wikitext and use that to detect top-level templates.
            // Then, substitute each starting '{{' with '{{subst' using the
            // template token's tsr.
            $tokenizer = new PegTokenizer( $env );
            $tokens = $tokenizer->tokenizeSync( $wt );
            $tsrIncr = 0;
            foreach ( $tokens as $token ) {
                /** @var Token $token */
                if ( $token->getName() === 'template' ) {
                    $tsr = $token->dataAttribs->tsr;
                    $wt = substr( $wt, 0, $tsr->start + $tsrIncr )
                        . '{{subst:' . substr( $wt, $tsr->start + $tsrIncr + 2 );
                    $tsrIncr += 6;
                }
            }
        }
        return $env->getDataAccess()->doPst( $env->getPageConfig(), $wt );
    }
}