mirror of
https://github.com/Universal-Omega/DynamicPageList3
synced 2024-11-30 19:04:32 +00:00
402 lines
11 KiB
PHP
402 lines
11 KiB
PHP
<?php
|
||
/**
|
||
* DynamicPageList3
|
||
* DPL Article Class
|
||
*
|
||
* @author IlyaHaykinson, Unendlich, Dangerville, Algorithmix, Theaitetos, Alexia E. Smith, Universal Omega
|
||
* @license GPL-2.0-or-later
|
||
* @package DynamicPageList3
|
||
*
|
||
*/
|
||
|
||
namespace DPL;
|
||
|
||
use MediaWiki\MediaWikiServices;
|
||
use User;
|
||
|
||
class Article {
|
||
/**
|
||
* Title
|
||
*
|
||
* @var object
|
||
*/
|
||
public $mTitle = null;
|
||
|
||
/**
|
||
* Namespace ID
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mNamespace = -1;
|
||
|
||
/**
|
||
* Page ID
|
||
*
|
||
* @var int
|
||
*/
|
||
public $mID = 0;
|
||
|
||
/**
|
||
* Selected title of initial page.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mSelTitle = null;
|
||
|
||
/**
|
||
* Selected namespace ID of initial page.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mSelNamespace = -1;
|
||
|
||
/**
|
||
* Selected title of image.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mImageSelTitle = null;
|
||
|
||
/**
|
||
* HTML link to page.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mLink = '';
|
||
|
||
/**
|
||
* External link on the page.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mExternalLink = null;
|
||
|
||
/**
|
||
* First character of the page title.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mStartChar = null;
|
||
|
||
/**
|
||
* Heading (link to the associated page) that page belongs to in the list (default '' means no heading)
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mParentHLink = ''; // heading (link to the associated page) that page belongs to in the list (default '' means no heading)
|
||
|
||
/**
|
||
* Category links on the page.
|
||
*
|
||
* @var array
|
||
*/
|
||
public $mCategoryLinks = [];
|
||
|
||
/**
|
||
* Category names (without link) in the page.
|
||
*
|
||
* @var array
|
||
*/
|
||
public $mCategoryTexts = [];
|
||
|
||
/**
|
||
* Number of times this page has been viewed.
|
||
*
|
||
* @var int
|
||
*/
|
||
public $mCounter = null;
|
||
|
||
/**
|
||
* Article length in bytes of wiki text
|
||
*
|
||
* @var int
|
||
*/
|
||
public $mSize = null;
|
||
|
||
/**
|
||
* Timestamp depending on the user's request (can be first/last edit, page_touched, ...)
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mDate = null;
|
||
|
||
/**
|
||
* Timestamp depending on the user's request, based on user format definition.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $myDate = null;
|
||
|
||
/**
|
||
* Revision ID
|
||
*
|
||
* @var int
|
||
*/
|
||
public $mRevision = null;
|
||
|
||
/**
|
||
* Link to editor (first/last, depending on user's request) 's page or contributions if not registered.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mUserLink = null;
|
||
|
||
/**
|
||
* Name of editor (first/last, depending on user's request) or contributions if not registered.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mUser = null;
|
||
|
||
/**
|
||
* Edit Summary(Revision Comment)
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mComment = null;
|
||
|
||
/**
|
||
* Number of bytes changed.
|
||
*
|
||
* @var int
|
||
*/
|
||
public $mContribution = 0;
|
||
|
||
/**
|
||
* Short string indicating the size of a contribution.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mContrib = '';
|
||
|
||
/**
|
||
* User text of who made the changes.
|
||
*
|
||
* @var string
|
||
*/
|
||
public $mContributor = null;
|
||
|
||
/**
|
||
* Article Headings - Maps heading to count (# of pages under each heading).
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $headings = [];
|
||
|
||
/**
|
||
* Main Constructor
|
||
*
|
||
* @access public
|
||
* @param string Title
|
||
* @param integer Namespace
|
||
* @return void
|
||
*/
|
||
public function __construct( $title, $namespace ) {
|
||
$this->mTitle = $title;
|
||
$this->mNamespace = $namespace;
|
||
}
|
||
|
||
/**
|
||
* Initialize a new instance from a database row.
|
||
*
|
||
* @access public
|
||
* @param array Database Row
|
||
* @param object \DPL\Parameters Object
|
||
* @param object Mediawiki Title Object
|
||
* @param integer Page Namespace ID
|
||
* @param string Page Title as Selected from Query
|
||
* @return object \DPL\Article Object
|
||
*/
|
||
public static function newFromRow( $row, Parameters $parameters, \Title $title, $pageNamespace, $pageTitle ) {
|
||
global $wgLang;
|
||
|
||
$article = new Article( $title, $pageNamespace );
|
||
|
||
$revActorName = null;
|
||
if ( isset( $row['revactor_actor'] ) ) {
|
||
$revActorName = User::newFromActorId( $row['revactor_actor'] )->getName();
|
||
}
|
||
|
||
$titleText = $title->getText();
|
||
if ( $parameters->getParameter( 'shownamespace' ) === true ) {
|
||
$titleText = $title->getPrefixedText();
|
||
}
|
||
$replaceInTitle = $parameters->getParameter( 'replaceintitle' );
|
||
if ( is_array( $replaceInTitle ) && count( $replaceInTitle ) === 2 ) {
|
||
$titleText = preg_replace( $replaceInTitle[0], $replaceInTitle[1], $titleText );
|
||
}
|
||
|
||
//Chop off title if longer than the 'titlemaxlen' parameter.
|
||
if ( $parameters->getParameter( 'titlemaxlen' ) !== null && strlen( $titleText ) > $parameters->getParameter( 'titlemaxlen' ) ) {
|
||
$titleText = substr( $titleText, 0, $parameters->getParameter( 'titlemaxlen' ) ) . '...';
|
||
}
|
||
if ( $parameters->getParameter( 'showcurid' ) === true && isset( $row['page_id'] ) ) {
|
||
$articleLink = '[' . $title->getLinkURL( [ 'curid' => $row['page_id'] ] ) . ' ' . htmlspecialchars( $titleText ) . ']';
|
||
} else {
|
||
$articleLink = '[[' . ( $parameters->getParameter( 'escapelinks' ) && ( $pageNamespace == NS_CATEGORY || $pageNamespace == NS_FILE ) ? ':' : '' ) . $title->getFullText() . '|' . htmlspecialchars( $titleText ) . ']]';
|
||
}
|
||
|
||
$article->mLink = $articleLink;
|
||
$contLang = MediaWikiServices::getInstance()->getContentLanguage();
|
||
|
||
//get first char used for category-style output
|
||
if ( isset( $row['sortkey'] ) ) {
|
||
$article->mStartChar = $contLang->convert( $contLang->firstChar( $row['sortkey'] ) );
|
||
} else {
|
||
$article->mStartChar = $contLang->convert( $contLang->firstChar( $pageTitle ) );
|
||
}
|
||
|
||
$article->mID = intval( $row['page_id'] );
|
||
|
||
//External link
|
||
if ( isset( $row['el_to'] ) ) {
|
||
$article->mExternalLink = $row['el_to'];
|
||
}
|
||
|
||
//SHOW PAGE_COUNTER
|
||
if ( isset( $row['page_counter'] ) ) {
|
||
$article->mCounter = intval( $row['page_counter'] );
|
||
}
|
||
|
||
//SHOW PAGE_SIZE
|
||
if ( isset( $row['page_len'] ) ) {
|
||
$article->mSize = intval( $row['page_len'] );
|
||
}
|
||
//STORE initially selected PAGE
|
||
if ( is_array( $parameters->getParameter( 'linksto' ) ) && ( count( $parameters->getParameter( 'linksto' ) ) || count( $parameters->getParameter( 'linksfrom' ) ) ) ) {
|
||
if ( !isset( $row['sel_title'] ) ) {
|
||
$article->mSelTitle = 'unknown page';
|
||
$article->mSelNamespace = 0;
|
||
} else {
|
||
$article->mSelTitle = $row['sel_title'];
|
||
$article->mSelNamespace = $row['sel_ns'];
|
||
}
|
||
}
|
||
|
||
//STORE selected image
|
||
if ( is_array( $parameters->getParameter( 'imageused' ) ) && count( $parameters->getParameter( 'imageused' ) ) > 0 ) {
|
||
if ( !isset( $row['image_sel_title'] ) ) {
|
||
$article->mImageSelTitle = 'unknown image';
|
||
} else {
|
||
$article->mImageSelTitle = $row['image_sel_title'];
|
||
}
|
||
}
|
||
|
||
if ( $parameters->getParameter( 'goal' ) != 'categories' ) {
|
||
//REVISION SPECIFIED
|
||
if ( $parameters->getParameter( 'lastrevisionbefore' ) || $parameters->getParameter( 'allrevisionsbefore' ) || $parameters->getParameter( 'firstrevisionsince' ) || $parameters->getParameter( 'allrevisionssince' ) ) {
|
||
$article->mRevision = $row['revactor_rev'];
|
||
$article->mUser = $revActorName;
|
||
$article->mDate = $row['revactor_timestamp'];
|
||
}
|
||
|
||
//SHOW "PAGE_TOUCHED" DATE, "FIRSTCATEGORYDATE" OR (FIRST/LAST) EDIT DATE
|
||
if ( $parameters->getParameter( 'addpagetoucheddate' ) ) {
|
||
$article->mDate = $row['page_touched'];
|
||
} elseif ( $parameters->getParameter( 'addfirstcategorydate' ) ) {
|
||
$article->mDate = $row['cl_timestamp'];
|
||
} elseif ( $parameters->getParameter( 'addeditdate' ) && isset( $row['revactor_timestamp'] ) ) {
|
||
$article->mDate = $row['revactor_timestamp'];
|
||
} elseif ( $parameters->getParameter( 'addeditdate' ) && isset( $row['page_touched'] ) ) {
|
||
$article->mDate = $row['page_touched'];
|
||
}
|
||
|
||
//Time zone adjustment
|
||
if ( $article->mDate ) {
|
||
$article->mDate = $wgLang->userAdjust( $article->mDate );
|
||
}
|
||
|
||
if ( $article->mDate && $parameters->getParameter( 'userdateformat' ) ) {
|
||
//Apply the userdateformat
|
||
$article->myDate = gmdate( $parameters->getParameter( 'userdateformat' ), wfTimeStamp( TS_UNIX, $article->mDate ) );
|
||
}
|
||
// CONTRIBUTION, CONTRIBUTOR
|
||
if ( $parameters->getParameter( 'addcontribution' ) ) {
|
||
$article->mContribution = $row['contribution'];
|
||
$article->mContributor = User::newFromActorId( $row['contributor'] )->getName();
|
||
$article->mContrib = substr( '*****************', 0, (int)round( log( $row['contribution'] ) ) );
|
||
}
|
||
|
||
//USER/AUTHOR(S)
|
||
// because we are going to do a recursive parse at the end of the output phase
|
||
// we have to generate wiki syntax for linking to a user´s homepage
|
||
if ( $parameters->getParameter( 'adduser' ) || $parameters->getParameter( 'addauthor' ) || $parameters->getParameter( 'addlasteditor' ) ) {
|
||
$article->mUserLink = '[[User:' . $revActorName . '|' . $revActorName . ']]';
|
||
$article->mUser = $revActorName;
|
||
}
|
||
|
||
//CATEGORY LINKS FROM CURRENT PAGE
|
||
if ( $parameters->getParameter( 'addcategories' ) && ( $row['cats'] ) ) {
|
||
$artCatNames = explode( ' | ', $row['cats'] );
|
||
foreach ( $artCatNames as $artCatName ) {
|
||
$article->mCategoryLinks[] = '[[:Category:' . $artCatName . '|' . str_replace( '_', ' ', $artCatName ) . ']]';
|
||
$article->mCategoryTexts[] = str_replace( '_', ' ', $artCatName );
|
||
}
|
||
}
|
||
// PARENT HEADING (category of the page, editor (user) of the page, etc. Depends on ordermethod param)
|
||
if ( $parameters->getParameter( 'headingmode' ) != 'none' ) {
|
||
switch ( $parameters->getParameter( 'ordermethod' )[0] ) {
|
||
case 'category':
|
||
//Count one more page in this heading
|
||
self::$headings[$row['cl_to']] = ( isset( self::$headings[$row['cl_to']] ) ? self::$headings[$row['cl_to']] + 1 : 1 );
|
||
if ( $row['cl_to'] == '' ) {
|
||
//uncategorized page (used if ordermethod=category,...)
|
||
$article->mParentHLink = '[[:Special:Uncategorizedpages|' . wfMessage( 'uncategorizedpages' ) . ']]';
|
||
} else {
|
||
$article->mParentHLink = '[[:Category:' . $row['cl_to'] . '|' . str_replace( '_', ' ', $row['cl_to'] ) . ']]';
|
||
}
|
||
break;
|
||
case 'user':
|
||
self::$headings[$revActorName] = ( isset( self::$headings[$revActorName] ) ? self::$headings[$revActorName] + 1 : 1 );
|
||
if ( $row['revactor_actor'] == 0 ) { //anonymous user
|
||
$article->mParentHLink = '[[User:' . $revActorName . '|' . $revActorName . ']]';
|
||
} else {
|
||
$article->mParentHLink = '[[User:' . $revActorName . '|' . $revActorName . ']]';
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return $article;
|
||
}
|
||
|
||
/**
|
||
* Returns all heading information processed from all newly instantiated article objects.
|
||
*
|
||
* @access public
|
||
* @return array Headings
|
||
*/
|
||
public static function getHeadings() {
|
||
return self::$headings;
|
||
}
|
||
|
||
/**
|
||
* Reset the headings to their initial state.
|
||
* Ideally this Article class should not exist and be handled by the built in MediaWiki class.
|
||
* Bug: https://jira/browse/HYD-913
|
||
*
|
||
* @access public
|
||
* @return void
|
||
*/
|
||
public static function resetHeadings() {
|
||
self::$headings = [];
|
||
}
|
||
|
||
/**
|
||
* Get the formatted date for this article if available.
|
||
*
|
||
* @access public
|
||
* @return mixed Formatted string or null for none set.
|
||
*/
|
||
public function getDate() {
|
||
global $wgLang;
|
||
if ( $this->myDate !== null ) {
|
||
return $this->myDate;
|
||
} elseif ( $this->mDate !== null ) {
|
||
return $wgLang->timeanddate( $article->mDate, true );
|
||
}
|
||
return null;
|
||
}
|
||
}
|