-
Notifications
You must be signed in to change notification settings - Fork 0
/
CategoryStack_body.php
135 lines (110 loc) · 4.58 KB
/
CategoryStack_body.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
class CategoryStack extends SpecialPage
{
function CategoryStack() {
parent::__construct( "CategoryStack" );
wfLoadExtensionMessages( 'CategoryStack' );
}
function execute( $par ) {
global $wgRequest, $wgOut;
# required for special pages
$this->setHeaders();
# load css and js
$wgOut->addHTML(self::loadJsAndCss());
return true;
}
/**
*
* @param mixed $text
*/
public function loadJsAndCss()
{
global $wgArticle, $wgJsMimeType;
# instantiate variables
$extensionName = 'CategoryStack';
$docsStyleVersion = 1;
# prepare path for css and js
$extensionPath = htmlspecialchars( "/extensions/$extensionName/includes" );
$encCssFile = htmlspecialchars( "$extensionPath/$extensionName.css?$docsStyleVersion" );
$encJsFile = htmlspecialchars( "$extensionPath/$extensionName.js?$docsStyleVersion" );
$jQueryPath = htmlspecialchars( "$extensionPath/jquery-1.6.4.min.js" );
# add css and javascript
$text = <<<EOT
<link href="$encCssFile" rel="stylesheet" type="text/css">
<script type="$wgJsMimeType" src="$jQueryPath"></script>
<script type="$wgJsMimeType" src="$encJsFile"></script>
EOT;
return $text;
}
public static function efExampleParserFunction_Setup( &$parser ) {
# Set a function hook associating the "example" magic word with our function
$parser->setFunctionHook( 'CategoryStack', 'CategoryStack::efExampleParserFunction_Render' );
return true;
}
public static function efExampleParserFunction_Magic( &$magicWords, $langCode ) {
# Add the magic word
# The first array element is whether to be case sensitive, in this case (0) it is not case sensitive, 1 would be sensitive
# All remaining elements are synonyms for our parser function
$magicWords['CategoryStack'] = array( 1, 'CategoryStack' );
# unless we return true, other parser functions extensions won't get loaded.
return true;
}
/**
* param2 can be used to remove a pre-pended string
*/
public static function efExampleParserFunction_Render( $parser, $parentCategory = '', $removeThisFromTextStart = ':Category:' ) {
# which namespaces to worry about
$myNamespaces = array (NS_MAIN, NS_CATEGORY);
# get titles of children
foreach ($myNamespaces as $myNamespace) {
$sql = self::getCategoryChildren($parentCategory, $myNamespace);
$res[$myNamespace] = self::sqlReader($sql);
}
# prepare to keep all records for sorting
$allLinks = array();
foreach ($res as $namespace => $resObj) {
# ensure category is pre-pended to link
$prependText = '';
if ($namespace == NS_CATEGORY) {
$prependText = ':Category:';
}
# output items
foreach ($resObj as $category) {
$title = $linkText = $prependText . $category->page_title;
if (stripos($title, $removeThisFromTextStart) === 0) {
$linkText = substr($title, stripos($title, $removeThisFromTextStart)+strlen($removeThisFromTextStart));
}
$allLinks[$linkText] = sprintf('[[%s|%s]]', $title, $linkText );
}
}
natcasesort($allLinks); # sort all links in alphabetical order, ignoring case sensitivity
# show all links
$output = '<br /><br /><center><div style="width:800;">';
$output .= implode(' | ', $allLinks);
$output .= '</div></center>';
return $output;
}
public static function getCategoryChildren($category, $namespace) {
$sql = 'SELECT page.page_title'
. ' FROM page'
. ' INNER JOIN categorylinks on categorylinks.cl_from=page.page_id'
. ' WHERE categorylinks.cl_to="' . $category . '"'
. ' AND page.page_namespace="' . $namespace . '";';
return $sql;
}
public static function sqlReader($sql) {
global $dbr;
# get list of pages that are marked for deletion
if (!$dbr)
$dbr =& wfGetDB( DB_SLAVE ); # if necessary, obtains read-only connection to DB with MediaWiki API
# obtain and execute query
$res = $dbr->query($sql);
# handle db results
foreach ($res as $result) {
$dbResult[] = $result;
}
$dbr->freeResult($res); # free result
if (isset($dbResult))
return $dbResult;
}
}