Making WordPress.org


Ignore:
Timestamp:
06/19/2016 08:40:01 PM (8 years ago)
Author:
obenland
Message:

Plugin Directory: Move readme classes into their own namespace.

See #1584.

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/readme
Files:
1 added
1 moved

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/readme/class-parser.php

    r3476 r3477  
    11<?php
    2 namespace WordPressdotorg\Plugin_Directory;
     2namespace WordPressdotorg\Plugin_Directory\Readme;
     3use WordPressdotorg\Plugin_Directory\Markdown;
    34
    45/**
     
    78 * Based on Baikonur_ReadmeParser from https://github.com/rmccue/WordPress-Readme-Parser
    89 *
    9  * @package WordPressdotorg\Plugin_Directory
     10 * @package WordPressdotorg\Plugin_Directory\Readme
    1011 */
    11 class Readme_Parser {
    12     public $name              = '';
    13     public $tags              = array();
    14     public $requires          = '';
    15     public $tested            = '';
    16     public $contributors      = array();
    17     public $stable_tag        = '';
    18     public $donate_link       = '';
     12class Parser {
     13
     14    /**
     15     * @var string
     16     */
     17    public $name = '';
     18
     19    /**
     20     * @var array
     21     */
     22    public $tags = array();
     23
     24    /**
     25     * @var string
     26     */
     27    public $requires = '';
     28
     29    /**
     30     * @var string
     31     */
     32    public $tested = '';
     33
     34    /**
     35     * @var array
     36     */
     37    public $contributors = array();
     38
     39    /**
     40     * @var string
     41     */
     42    public $stable_tag = '';
     43
     44    /**
     45     * @var string
     46     */
     47    public $donate_link = '';
     48
     49    /**
     50     * @var string
     51     */
    1952    public $short_description = '';
    20     public $sections          = array();
    21     public $upgrade_notice    = array();
    22     public $screenshots       = array();
    23 
    24     // These are the readme sections which we expect
     53
     54    /**
     55     * @var array
     56     */
     57    public $sections = array();
     58
     59    /**
     60     * @var array
     61     */
     62    public $upgrade_notice = array();
     63
     64    /**
     65     * @var array
     66     */
     67    public $screenshots = array();
     68
     69    /**
     70     * These are the readme sections that we expect.
     71     *
     72     * @var array
     73     */
    2574    private $expected_sections = array(
    2675        'description',
     
    3382    );
    3483
    35     // We alias these sections, from => to
     84    /**
     85     * We alias these sections, from => to
     86     *
     87     * @var array
     88     */
    3689    private $alias_sections = array(
    3790        'frequently_asked_questions' => 'faq',
    38         'change_log' => 'changelog',
    39         'screenshot' => 'screenshots',
     91        'change_log'                 => 'changelog',
     92        'screenshot'                 => 'screenshots',
    4093    );
    4194
    42     // These are the valid header mappings for the header
     95    /**
     96     * These are the valid header mappings for the header.
     97     *
     98     * @var array
     99     */
    43100    private $valid_headers = array(
    44101        'tested'            => 'tested',
     
    52109    );
    53110
     111    /**
     112     * Parser constructor.
     113     *
     114     * @param string $file
     115     */
    54116    public function __construct( $file ) {
    55117        if ( $file ) {
     
    58120    }
    59121
     122    /**
     123     * @param string $file
     124     * @return bool
     125     */
    60126    protected function parse_readme( $file ) {
    61127        $contents = file_get_contents( $file );
    62128        $contents = preg_split( '!\R!', $contents );
    63 
    64129        $contents = array_map( array( $this, 'strip_newlines' ), $contents );
    65130
    66         // Strip UTF8 BOM if present
    67         if ( strpos( $contents[0], "\xEF\xBB\xBF" ) === 0 ) {
     131        // Strip UTF8 BOM if present.
     132        if ( 0 === strpos( $contents[0], "\xEF\xBB\xBF" ) ) {
    68133            $contents[0] = substr( $contents[0], 3 );
    69134        }
    70135
    71         // Convert UTF-16 files
    72         if ( strpos( $contents[0], "\xFF\xFE" ) === 0 ) {
     136        // Convert UTF-16 files.
     137        if ( 0 === strpos( $contents[0], "\xFF\xFE" ) ) {
    73138            foreach ( $contents as $i => $line ) {
    74                 $contents[$i] = mb_convert_encoding( $line, 'UTF-8', 'UTF-16' );
     139                $contents[ $i ] = mb_convert_encoding( $line, 'UTF-8', 'UTF-16' );
    75140            }
    76141        }
     
    79144        $this->name = $this->sanitize_text( trim( $line, "#= \t\0\x0B" ) );
    80145
    81         // Strip Github style header\n==== underlines
    82         if ( '' === trim( $contents[0], '=-' ) ) {
     146        // Strip Github style header\n==== underlines.
     147        if ( ! empty( $contents ) && '' === trim( $contents[0], '=-' ) ) {
    83148            array_shift( $contents );
    84149        }
     
    87152        if ( 'plugin name' == strtolower( $this->name ) ) {
    88153            $this->name = $line = $this->get_first_nonwhitespace( $contents );
    89             // Ensure that the line read wasn't an actual header or description
     154
     155            // Ensure that the line read wasn't an actual header or description.
    90156            if ( strlen( $line ) > 50 || preg_match( '~^(' . implode( '|', array_keys( $this->valid_headers ) ) . ')\s*:~i', $line ) ) {
    91157                $this->name = false;
     
    94160        }
    95161
    96         // Parse headers
     162        // Parse headers.
    97163        $headers = array();
    98164
     
    100166        do {
    101167            $value = null;
    102             if ( strpos( $line, ':' ) === false ) {
     168            if ( false === strpos( $line, ':' ) ) {
     169
    103170                // Some plugins have line-breaks within the headers.
    104171                if ( ! empty( $line ) ) {
     
    140207        }
    141208
    142         // Parse the short description
     209        // Parse the short description.
    143210        while ( ( $line = array_shift( $contents ) ) !== null ) {
    144211            $trimmed = trim( $line );
     
    148215            }
    149216            if ( ( '=' === $trimmed[0] && isset( $trimmed[1] ) && '=' === $trimmed[1] ) ||
    150                  ( '#' === $trimmed[0] && isset( $trimmed[1] ) && '#' === $trimmed[1] ) ) { // Stop after any Markdown heading
     217                 ( '#' === $trimmed[0] && isset( $trimmed[1] ) && '#' === $trimmed[1] )
     218            ) {
     219
     220                // Stop after any Markdown heading.
    151221                array_unshift( $contents, $line );
    152222                break;
     
    157227        $this->short_description = trim( $this->short_description );
    158228
    159         // Parse the rest of the body
    160         // Prefill the sections, we'll filter out empty sections later.
     229        /*
     230         * Parse the rest of the body.
     231         * Pre-fill the sections, we'll filter out empty sections later.
     232         */
    161233        $this->sections = array_fill_keys( $this->expected_sections, '' );
    162         $current = $section_name = $section_title = '';
     234        $current        = $section_name = $section_title = '';
    163235        while ( ( $line = array_shift( $contents ) ) !== null ) {
    164236            $trimmed = trim( $line );
     
    168240            }
    169241
     242            // Stop only after a ## Markdown header, not a ###.
    170243            if ( ( '=' === $trimmed[0] && isset( $trimmed[1] ) && '=' === $trimmed[1] ) ||
    171                  ( '#' === $trimmed[0] && isset( $trimmed[1] ) && '#' === $trimmed[1] && isset( $trimmed[2] ) && '#' !== $trimmed[2] ) ) { // Stop only after a ## Markdown header, not a ###.
     244                 ( '#' === $trimmed[0] && isset( $trimmed[1] ) && '#' === $trimmed[1] && isset( $trimmed[2] ) && '#' !== $trimmed[2] )
     245            ) {
     246
    172247                if ( ! empty( $section_name ) ) {
    173248                    $this->sections[ $section_name ] .= trim( $current );
     
    210285        }
    211286
    212         // Parse out the Upgrade Notice section into it's own data
     287        // Parse out the Upgrade Notice section into it's own data.
    213288        if ( isset( $this->sections['upgrade_notice'] ) ) {
    214             $lines = explode( "\n", $this->sections['upgrade_notice'] );
     289            $lines   = explode( "\n", $this->sections['upgrade_notice'] );
    215290            $version = null;
    216291            $current = '';
     
    240315
    241316        // Markdownify!
    242         $this->sections          = array_map( array( $this, 'parse_markdown' ), $this->sections );
    243         $this->upgrade_notice    = array_map( array( $this, 'parse_markdown' ), $this->upgrade_notice );
    244 
    245         // Sanitize and trim the short_description to match requirements
     317        $this->sections       = array_map( array( $this, 'parse_markdown' ), $this->sections );
     318        $this->upgrade_notice = array_map( array( $this, 'parse_markdown' ), $this->upgrade_notice );
     319
     320        // Sanitize and trim the short_description to match requirements.
    246321        $this->short_description = $this->sanitize_text( $this->short_description );
    247322        $this->short_description = $this->trim_length( $this->short_description, 150 );
     
    252327            preg_match_all( '#<li>(.*?)</li>#is', $this->sections['screenshots'], $screenshots, PREG_SET_ORDER );
    253328            if ( $screenshots ) {
    254                 $i = 1; // Screenshots start from 1
     329                $i = 1; // Screenshots start from 1.
    255330                foreach ( $screenshots as $ss ) {
    256331                    $this->screenshots[ $i++ ] = $this->filter_text( $ss[1] );
     
    260335        }
    261336
    262         // Filter the HTML
     337        // Filter the HTML.
    263338        $this->sections = array_map( array( $this, 'filter_text' ), $this->sections );
    264339
     
    266341    }
    267342
     343    /**
     344     * @access protected
     345     *
     346     * @param string $contents
     347     * @return string
     348     */
    268349    protected function get_first_nonwhitespace( &$contents ) {
    269350        while ( ( $line = array_shift( $contents ) ) !== null ) {
     
    277358    }
    278359
     360    /**
     361     * @access protected
     362     *
     363     * @param string $line
     364     * @return string
     365     */
    279366    protected function strip_newlines( $line ) {
    280367        return rtrim( $line, "\r\n" );
    281368    }
    282369
     370    /**
     371     * @access protected
     372     *
     373     * @param string $desc
     374     * @param int    $length
     375     * @return string
     376     */
    283377    protected function trim_length( $desc, $length = 150 ) {
    284378        if ( mb_strlen( $desc ) > $length ) {
     
    362456        foreach ( $users as $i => $name ) {
    363457            if ( $user = get_user_by( 'login', $name ) ) {
     458
    364459                // Check the case of the user login matches.
    365460                if ( $name !== $user->user_login ) {
     
    367462                }
    368463            } elseif ( false !== ( $user = get_user_by( 'slug', $name ) ) ) {
    369                 // Overwrite the nicename with the user_login
     464
     465                // Overwrite the nicename with the user_login.
    370466                $users[ $i ] = $user->user_login;
    371467            } else {
    372                 // Unknown user, we'll skip these entirely to encourage correct readmes
     468
     469                // Unknown user, we'll skip these entirely to encourage correct readme files.
    373470                unset( $users[ $i ] );
    374471            }
    375472        }
     473
    376474        return $users;
    377475    }
     
    385483    protected function sanitize_stable_tag( $stable_tag ) {
    386484        $stable_tag = trim( $stable_tag );
    387         $stable_tag = trim( $stable_tag, '"\'' ); // "trunk"
     485        $stable_tag = trim( $stable_tag, '"\'' ); // "trunk"
    388486        $stable_tag = preg_replace( '!^/?tags/!i', '', $stable_tag ); // "tags/1.2.3"
    389487        $stable_tag = preg_replace( '![^a-z0-9_.-]!i', '', $stable_tag );
    390488
    391         // If the stable_tag begins with a ., we treat it as 0.blah
     489        // If the stable_tag begins with a ., we treat it as 0.blah.
    392490        if ( '.' == substr( $stable_tag, 0, 1 ) ) {
    393491            $stable_tag = "0{$stable_tag}";
     
    397495    }
    398496
     497    /**
     498     * @param string $text
     499     * @return string
     500     */
    399501    protected function parse_markdown( $text ) {
    400502        static $markdown = null;
     503
    401504        if ( is_null( $markdown ) ) {
    402505            $markdown = new Markdown();
     
    405508        return $markdown->transform( $text );
    406509    }
    407 
    408510}
Note: See TracChangeset for help on using the changeset viewer.