Samwilson has uploaded a new change for review. https://gerrit.wikimedia.org/r/321210
Change subject: New extension registration system ...................................................................... New extension registration system Change-Id: I65cc461886956d3549dfdb09200509baa05b0285 --- A .gitignore D Genealogy.php M README.md M composer.json A extension.json R src/Person.php A src/Special.php R src/Traverser.php R src/Tree.php R src/Util.php 10 files changed, 99 insertions(+), 87 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Genealogy refs/changes/10/321210/1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fcac4a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor + diff --git a/Genealogy.php b/Genealogy.php deleted file mode 100644 index 9ca5711..0000000 --- a/Genealogy.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php - -/** - * Prevent direct execution of this script. - */ -if (!defined('MEDIAWIKI')) die(1); - -/** - * Explicit global declarations, for when this is autoloaded by Composer - */ -global $wgExtensionCredits, - $wgExtensionMessagesFiles, - $wgAutoloadClasses, - $wgSpecialPages, - $wgHooks; - -/** - * Extension metadata - */ -$wgExtensionCredits['parserhook'][] = array( - 'path' => __FILE__, - 'name' => 'Genealogy', - 'author' => "Sam Wilson <[mailto:s...@samwilson.id.au s...@samwilson.id.au]>", - 'url' => "http://www.mediawiki.org/wiki/Extension:Genealogy", - 'descriptionmsg' => 'genealogy-desc', - 'license-name' => 'GPL-3.0+', - 'version' => '0.2.0', -); - -/** - * Messages - */ -$wgExtensionMessagesFiles['Genealogy'] = __DIR__ . '/Genealogy.i18n.php'; -$wgExtensionMessagesFiles['GenealogyMagic'] = __DIR__ . '/Genealogy.i18n.magic.php'; - -/** - * Class loading - */ -$wgAutoloadClasses['GenealogyPerson'] = __DIR__ . '/Person.php'; -$wgAutoloadClasses['GenealogySpecial'] = __DIR__ . '/Special.php'; -$wgAutoloadClasses['GenealogyCore'] = __DIR__ . '/Core.php'; -$wgAutoloadClasses['GenealogyTree'] = __DIR__ . '/Tree.php'; -$wgAutoloadClasses['GenealogyTraverser'] = __DIR__ . '/Traverser.php'; - -/** - * Hooks - */ -$wgHooks['ParserFirstCallInit'][] = 'GenealogyCore::onParserFirstCallInit'; -$wgHooks['UnitTestsList'][] = 'GenealogyCore::onUnitTestsList'; diff --git a/README.md b/README.md index e3d98e1..0f982f2 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ ## Usage There is only one parser function, `{{#genealogy:}}`. -Its first two parameters are unnamed (i.e. don't have equals signs), but all -others must be (dates, etc.). +Its first two parameters are unnamed (i.e. don't have equals signs), +but all others must be (dates, etc.). The following functions are supported, three for defining data and four for reporting data: diff --git a/composer.json b/composer.json index 8eab5b5..16b7334 100644 --- a/composer.json +++ b/composer.json @@ -16,11 +16,9 @@ "irc": "irc://irc.freenode.net/mediawiki", "source": "https://github.com/samwilson/Genealogy" }, - "require": { - }, "autoload": { - "files" : [ - "Genealogy.php" - ] + "psr-4": { + "Samwilson\\Genealogy\\": "src/" + } } } diff --git a/extension.json b/extension.json new file mode 100644 index 0000000..4ee70c5 --- /dev/null +++ b/extension.json @@ -0,0 +1,23 @@ +{ + "name": "Genealogy", + "namemsg": "desc-genealogy", + "author": [ + "Sam Wilson" + ], + "url": "https://www.mediawiki.org/wiki/Extension:Genealogy", + "descriptionmsg": "genealogy-extension-desc", + "license-name": "GPL-3.0+", + "type": "extension", + "ExtensionMessagesFiles": { + "Genealogy": "Genealogy.i18n.php", + "GenealogyMagic": "Genealogy.i18n.magic.php" + }, + "AutoloadClasses": { + "\\Samwilson\\Genealogy\\Genealogy": "Genealogy.php" + }, + "Hooks": { + "ParserFirstCallInit": "\\Samwilson\\Genealogy\\Util::onParserFirstCallInit", + "UnitTestsList": "Samwilson\\Genealogy\\Util::onUnitTestsList" + }, + "manifest_version": 2 +} diff --git a/Person.php b/src/Person.php similarity index 87% rename from Person.php rename to src/Person.php index 3f21c80..34e338a 100644 --- a/Person.php +++ b/src/Person.php @@ -1,6 +1,11 @@ <?php -class GenealogyPerson { +namespace Samwilson\Genealogy; + +use MagicWord; +use Title; + +class Person { /** @var Title */ private $title; @@ -102,7 +107,7 @@ /** * Get all parents. * - * @return array|GenealogyPerson An array of parents, possibly empty. + * @return Person[] An array of parents, possibly empty. */ public function getParents() { if (is_array($this->parents)) { @@ -115,7 +120,7 @@ /** * Get all siblings. * - * @return array|GenealogyPerson An array of siblings, possibly empty. + * @return Person[] An array of siblings, possibly empty. */ public function getSiblings() { if (is_array($this->siblings)) { @@ -133,7 +138,7 @@ /** * Get all partners. * - * @return array|GenealogyPerson An array of partners, possibly empty. + * @return Person[] An array of partners, possibly empty. */ public function getPartners() { if (is_array($this->partners)) { @@ -150,7 +155,7 @@ /** * Get all children. * - * @return array|GenealogyPerson An array of children, possibly empty. + * @return Person[] An array of children, possibly empty. */ public function getChildren() { if (is_array($this->children)) { @@ -177,7 +182,7 @@ ); foreach ($results as $res) { $title = Title::newFromText($res->page_title); - $out[$title->getPrefixedDBkey()] = new GenealogyPerson($title); + $out[$title->getPrefixedDBkey()] = new Person($title); } return $out; } @@ -195,6 +200,11 @@ ); } + /** + * Get a multi-valued relationship property of this Person. + * @param string $type The property name ('genealogy ' will be prepended). + * @return Person[] The related people. + */ private function getPropMulti($type) { $out = array(); $dbr = wfGetDB(DB_SLAVE); @@ -209,7 +219,7 @@ ); foreach ($results as $result) { $title = Title::newFromText($result->pp_value); - $out[$title->getPrefixedDBkey()] = new GenealogyPerson($title); + $out[$title->getPrefixedDBkey()] = new Person($title); } return $out; } diff --git a/src/Special.php b/src/Special.php new file mode 100755 index 0000000..1068693 --- /dev/null +++ b/src/Special.php @@ -0,0 +1,11 @@ +<?php + +namespace Samwilson\Genealogy; + +class Special extends SpecialPage { + + function __construct() { + parent::__construct('Genealogy'); + } + +} diff --git a/Traverser.php b/src/Traverser.php similarity index 82% rename from Traverser.php rename to src/Traverser.php index 7d06ff4..e4f2ad6 100644 --- a/Traverser.php +++ b/src/Traverser.php @@ -1,6 +1,8 @@ <?php -class GenealogyTraverser { +namespace Samwilson\Genealogy; + +class Traverser { private $callbacks; @@ -17,7 +19,7 @@ $this->callbacks[] = $callback; } - public function ancestors(GenealogyPerson $person, $depth = null) { + public function ancestors(Person $person, $depth = null) { $this->visit($person); if ($this->ancestor_depth > $depth) { return; @@ -28,7 +30,7 @@ $this->ancestor_depth++; } - public function descendants(GenealogyPerson $person, $depth = null) { + public function descendants(Person $person, $depth = null) { $this->visit($person); if ($this->descendant_depth > $depth) { return; diff --git a/Tree.php b/src/Tree.php similarity index 86% rename from Tree.php rename to src/Tree.php index 3b0dadd..b670071 100644 --- a/Tree.php +++ b/src/Tree.php @@ -1,7 +1,15 @@ <?php -class GenealogyTree { +namespace Samwilson\Genealogy; +use Title; + +class Tree { + + /** + * The 'Dot source' is built up, line by line, + * @var string[] + */ private $dot_source; private $ancestors = array(); @@ -31,8 +39,8 @@ private function addAncestorsOrDescendants($type, $list) { foreach ($list as $a) { $title = Title::newFromText($a); - if ($title and $title->exists()) { - $person = new GenealogyPerson($title); + if ($title) { + $person = new Person($title); $this->{$type}[] = $person; } } @@ -43,7 +51,7 @@ $this->out('top', 'graph [rankdir=LR, splines=ortho]'); $this->out('top', 'edge [arrowhead=none]'); - $traverser = new GenealogyTraverser(); + $traverser = new Traverser(); $traverser->register(array($this, 'visit')); foreach ($this->ancestors as $ancestor) { @@ -56,7 +64,7 @@ // Do nothing if there are no people listed. if (!isset($this->dot_source['person'])) { - return 'No people found'; + return '<span class="error">No people found</span>'; } // Combine all parts of the graph output. @@ -66,9 +74,9 @@ .join("\n", $this->dot_source['child']) . "\n}"; } - public function visit(GenealogyPerson $person) { - $birthYear = $person->getBirthDate('Y'); - $deathYear = $person->getDeathDate('Y'); + public function visit(Person $person) { + $birthYear = $person->getBirthDate(); + $deathYear = $person->getDeathDate(); if (!empty($birthYear) && !empty($deathYear)) { $date = '\n'.$birthYear.' – '.$deathYear; } elseif (!empty($birthYear)) { @@ -104,7 +112,7 @@ } private function esc($title) { - return strtr($title, '( )', '___'); + return strtr($title, '( )-', '____'); } } diff --git a/Core.php b/src/Util.php similarity index 82% rename from Core.php rename to src/Util.php index cdb039b..c730851 100644 --- a/Core.php +++ b/src/Util.php @@ -1,20 +1,25 @@ <?php -class GenealogyCore { +namespace Samwilson\Genealogy; + +use Parser; +use Title; + +class Util { /** * Hooked to ParserFirstCallInit. * @param Parser $parser * @return boolean */ - static function onParserFirstCallInit(Parser &$parser) { - $parser->setFunctionHook('genealogy', 'GenealogyCore::RenderParserFunction'); + public static function onParserFirstCallInit(Parser &$parser) { + $parser->setFunctionHook('genealogy', self::class.'::RenderParserFunction'); return true; } /** * Hooked to UnitTestsList. - * @param array|String $files + * @param String[] $files * @return boolean */ static function onUnitTestsList(&$files) { @@ -63,7 +68,7 @@ case 'parent': $parentTitle = Title::newFromText($params[0]); if ($parentTitle and $parentTitle->exists()) { - $person = new GenealogyPerson($parentTitle); + $person = new Person($parentTitle); $out .= $person->getWikiLink(); } else { $out .= "[[" . $params[0] . "]]"; @@ -71,7 +76,7 @@ self::SaveProp($parser, 'parent', $params[0]); break; case 'siblings': - $person = new GenealogyPerson($parser->getTitle()); + $person = new Person($parser->getTitle()); $out .= self::PeopleList($person->getSiblings()); break; case 'partner': @@ -79,15 +84,15 @@ self::SaveProp($parser, 'partner', $params[0]); break; case 'partners': - $person = new GenealogyPerson($parser->getTitle()); + $person = new Person($parser->getTitle()); $out .= self::PeopleList($person->getPartners()); break; case 'children': - $person = new GenealogyPerson($parser->getTitle()); + $person = new Person($parser->getTitle()); $out .= self::PeopleList($person->getChildren()); break; case 'tree': - $tree = new GenealogyTree(); + $tree = new Tree(); if (isset($params['ancestors'])) { $tree->addAncestors(explode("\n", $params['ancestors'])); } @@ -97,7 +102,9 @@ } //$tree->setDescendantDepth($params['descendant depth']); $graphviz = $tree->getGraphviz(); - $out .= $parser->recursiveTagParse("<graphviz>\n$graphviz\n</graphviz>"); + $parser->getOutput()->updateCacheExpiry(30); + $out .= $parser->recursiveTagParse( "<graphviz>\n$graphviz\n</graphviz>" ); + $out .= '<pre>'.$graphviz.'</pre>'; break; default: $out .= '<span class="error">' @@ -124,8 +131,8 @@ /** * Get a wikitext list of people. * @todo Replace with a proper templating system. - * @param array|GenealogyPerson $people - * @return string + * @param Person[] $people + * @return string Wikitext list of people. */ static function PeopleList($people) { $out = ''; -- To view, visit https://gerrit.wikimedia.org/r/321210 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I65cc461886956d3549dfdb09200509baa05b0285 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Genealogy Gerrit-Branch: master Gerrit-Owner: Samwilson <s...@samwilson.id.au> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits