Samwilson has uploaded a new change for review.
https://gerrit.wikimedia.org/r/321223
Change subject: Templates for list items
......................................................................
Templates for list items
Change-Id: I7197fc93abad50dc2fc7309bc32a96be52cc47e2
---
M Genealogy.i18n.php
M README.md
M src/Hooks.php
M src/Person.php
M tests/phpunit/PersonTest.php
5 files changed, 105 insertions(+), 34 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Genealogy
refs/changes/23/321223/1
diff --git a/Genealogy.i18n.php b/Genealogy.i18n.php
index 9df2339..9d63d97 100644
--- a/Genealogy.i18n.php
+++ b/Genealogy.i18n.php
@@ -25,4 +25,5 @@
'genealogy-parser-function-not-found' => 'Genealogy parser function
type not recognised: $1',
'genealogy-existing-partners' => 'This person already has the following
'
.'{{PLURAL:$1|partner|partners}}: ',
+ 'genealogy-person-list-item' => 'Person/list-item'
];
diff --git a/README.md b/README.md
index 131e546..c86cfd7 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,7 @@
All details:
[mediawiki.org/wiki/Extension:Genealogy](https://mediawiki.org/wiki/Extension:Genealogy)
+
## Usage summary
This extension creates one parser function: `{{#genealogy: … }}`.
@@ -25,6 +26,7 @@
`{{#genealogy:tree|ancestors=List|descendants=List}}`<br />
where each `List` is a newline-separated list of page titles.
+
## Templates
**Example:**
@@ -35,20 +37,40 @@
When this extension creates a link to a page that doesn't yet exist,
the text of `[[Template:Person/preload]]` is preloaded.
The location of this preload text can be customised
-by modifying the `[[MediaWiki:genealogy-person-preload]]` system message.
+by modifying the `genealogy-person-preload` system message.
+
+**Person list-item:**
+Three types of lists of people can be generated: `siblings`, `partners`, and
`children`.
+The default behaviour is a simple bulleted list,
+but this can be overridden by a template, `Template:Person/list-item`
+(the template name is specified by the `genealogy-person-list-item` system
message).
+For example, to get a comma-separated one-line list of people, the following
template code could be used:
+
+```
+{{{link}}}{{#ifeq:{{{index}}}|{{{count}}}|.|,}}
+```
+
+There are four parameters that are available for use in the list-item template:
+* `link` — A wikitext link.
+* `title` — The page title.
+* `index` — The index of this list-item in the full list, starting from 1.
+* `count` — The total number of items in the full list.
## Installation
-1. Clone into your extensions directory:
+1. Clone the *Genealogy* and *GraphViz* extensions into your extensions
directory:
```
$ cd extensions
$ git clone https://github.com/samwilson/Genealogy.git
+ $ git clone
https://gerrit.wikimedia.org/r/p/mediawiki/extensions/GraphViz.git
```
-2. Enable it in your `LocalSettings.php` file:
+2. Enable them in your `LocalSettings.php` file:
```
wfLoadExtension( 'Genealogy' );
+ wfLoadExtension( 'GraphViz' );
```
+
## Development
The *Genealogy* extension is developed by Sam Wilson and released under version
diff --git a/src/Hooks.php b/src/Hooks.php
index 9c2e888..f7d7e88 100644
--- a/src/Hooks.php
+++ b/src/Hooks.php
@@ -84,7 +84,7 @@
$params[] = $arg;
}
}
- $out = ''; // "<pre>".print_r($params, true)."</pre>";
+ $out = '';
$isHtml = false;
switch ( $type ) {
case 'person':
@@ -99,30 +99,31 @@
break;
case 'parent':
$parentTitle = Title::newFromText( $params[0] );
- if ( $parentTitle && $parentTitle->exists() ) {
- $parent = new Person( $parentTitle );
- $out .= $parent->getWikiLink();
- } else {
- $query = [ 'preload' => wfMessage(
'genealogy-person-preload' ) ];
- $out .= Linker::link( $parentTitle,
null, [], $query );
- $isHtml = true;
- }
+ $parent = new Person( $parentTitle );
+ $out .= $parent->getWikiLink();
+// if ( $parentTitle && $parentTitle->exists() ) {
+// $out .= $parent->getWikiLink();
+// } else {
+// $query = [ 'preload' => wfMessage(
'genealogy-person-preload' ) ];
+// $out .= Linker::link( $parentTitle,
null, [], $query );
+// $isHtml = true;
+// }
self::saveProp( $parser, 'parent', $params[0] );
break;
case 'siblings':
$person = new Person( $parser->getTitle() );
- $out .= self::peopleList(
$person->getSiblings() );
+ $out .= self::peopleList( $parser,
$person->getSiblings() );
break;
case 'partner':
self::saveProp( $parser, 'partner', $params[0]
);
break;
case 'partners':
$person = new Person( $parser->getTitle() );
- $out .= self::peopleList(
$person->getPartners() );
+ $out .= self::peopleList( $parser,
$person->getPartners() );
break;
case 'children':
$person = new Person( $parser->getTitle() );
- $out .= self::peopleList(
$person->getChildren() );
+ $out .= self::peopleList( $parser,
$person->getChildren() );
break;
case 'tree':
$tree = new Tree();
@@ -154,7 +155,7 @@
/**
* Save a page property.
* @param Parser $parser The parser object.
- * @param string $prop The property name; it will be prefxed with
'genealogy '.
+ * @param string $prop The property name; it will be prefixed with
'genealogy '.
* @param string $val The property value.
* @param boolean $multi Whether this property can have multiple values
(will be stored as
* multiple properties, with an integer appended to their name.
@@ -178,15 +179,30 @@
}
/**
- * Get a wikitext list of people.
- * @todo Replace with a proper templating system.
+ * Get a wikitext list of siblings, partners, or children.
+ * @param Parser $parser The parser to use to render each line.
* @param Person[] $people
* @return string Wikitext list of people.
*/
- public static function peopleList( $people ) {
+ public static function peopleList( Parser $parser, $people ) {
+ $templateName = wfMessage( 'genealogy-person-list-item' );
$out = '';
+ $index = 1;
+ $peopleCount = count( $people );
foreach ( $people as $person ) {
- $out .= "* " . $person->getWikiLink() . "\n";
+ $exists = Title::newFromText( 'Template:' .
$templateName->toString() )->exists();
+ if ( $exists ) {
+ $template = '{{' . $templateName
+ . '|title=' .
$person->getTitle()->getFullText()
+ . '|link=' . $person->getWikiLink()
+ . '|index=' . $index
+ . '|count=' . $peopleCount
+ . '}}';
+ $out .= $parser->recursivePreprocess( $template
);
+ $index ++;
+ } else {
+ $out .= "* " . $person->getWikiLink() . "\n";
+ }
}
return $out;
}
diff --git a/src/Person.php b/src/Person.php
index 5e58f38..b22dbdb 100644
--- a/src/Person.php
+++ b/src/Person.php
@@ -60,12 +60,13 @@
/**
* Get all Titles that refer to this Person (i.e. all redirects both
inward and outward, and
* the actual Title).
- * @return Title[] The Titles, some of which might not actually exist.
+ * @return Title[] An array of the Titles, some of which might not
actually exist, keyed by the
+ * prefixed DB key.
*/
public function getTitles() {
- $page = WikiPage::factory( $this->title );
$titles = [ $this->title->getPrefixedDBkey() => $this->title ];
// Find all the outgoing redirects that leave from here.
+ $page = WikiPage::factory( $this->title );
while ( $page->isRedirect() ) {
$title = $page->getRedirectTarget();
$titles[$title->getPrefixedDBkey()] = $title;
@@ -78,6 +79,11 @@
return $titles;
}
+ /**
+ * Get wikitext for a link to this Person; non-existant people will
have the preload
+ * parameter added.
+ * @return string The wikitext.
+ */
public function getWikiLink() {
$birthYear = $this->getDateYear( $this->getBirthDate() );
$deathYear = $this->getDateYear( $this->getDeathDate() );
@@ -90,7 +96,16 @@
$dateString = "(".wfMessage( 'genealogy-died'
)." $deathYear)";
}
$date = ( $this->hasDates() ) ? " $dateString" : "";
- return "[[" . $this->getTitle()->getPrefixedText() . "]]$date";
+ if ( $this->getTitle()->exists() ) {
+ return "[[" . $this->getTitle()->getFullText() .
"]]$date";
+ } else {
+ $query = [
+ 'action' => 'edit',
+ 'preload' => wfMessage(
'genealogy-person-preload' ),
+ ];
+ $url = $this->getTitle()->getFullURL( $query );
+ return '[' . $url . ' ' .
$this->getTitle()->getFullText() . ']';
+ }
}
/**
@@ -188,21 +203,23 @@
/**
* Get all children.
- *
- * @return Person[] An array of children, possibly empty.
+ * @return Person[] An array of children, possibly empty, keyed by the
prefixed DB key.
*/
public function getChildren() {
- if ( is_array( $this->children ) ) {
- return $this->children;
- }
$this->children = $this->getPropInbound( 'parent' );
return $this->children;
}
+ /**
+ * Find people with properties that are equal to one of this page's
titles.
+ * @param string $type
+ * @return Person[] Keyed by the prefixed DB key.
+ */
protected function getPropInbound( $type ) {
$dbr = wfGetDB( DB_SLAVE );
$tables = [ 'pp'=>'page_props', 'p'=>'page' ];
$columns = [ 'pp_value', 'page_title' ];
+
$where = [
'pp_value' => $this->getTitles(),
"pp_propname LIKE 'genealogy $type %'",
diff --git a/tests/phpunit/PersonTest.php b/tests/phpunit/PersonTest.php
index d214556..cb6cde6 100644
--- a/tests/phpunit/PersonTest.php
+++ b/tests/phpunit/PersonTest.php
@@ -24,16 +24,31 @@
public function testCreatePerson() {
$charlesTitle = Title::newFromText( 'Charles' );
- $page = new WikiPage( $charlesTitle );
- $wikiText =
'{{#genealogy:parent|Elizabeth}}{{#genealogy:partner|Dianna}}';
- $page->doEditContent( new WikitextContent( $wikiText ), '' );
+ $wikiText1 =
'{{#genealogy:parent|Elizabeth}}{{#genealogy:partner|Dianna}}';
+ $this->setPageContent( 'Charles', $wikiText1 );
$charles = new Person( $charlesTitle );
$this->assertCount( 1, $charles->getPartners() );
+
+ // Create the partner page, and check that all's as it should
be.
+ $this->setPageContent( 'Dianna', 'Lorem' );
+ $dianna = new Person( Title::newFromText( 'Dianna' ) );
+ $this->assertEquals( [ 'Charles' ], array_keys(
$dianna->getPartners() ) );
+ $elizabeth = new Person( Title::newFromText( 'Elizabeth' ) );
+ $this->assertEquals( [ 'Charles' ], array_keys(
$elizabeth->getChildren() ) );
+
+ // Then edit the first page to remove the partner.
+ $wikiText2 =
'{{#genealogy:parent|Elizabeth}}{{#genealogy:partner|Bob}}';
+ $this->setPageContent( 'Charles', $wikiText2 );
+ $this->assertEquals( [ 'Bob' ], array_keys(
$charles->getPartners() ) );
+ $this->assertEmpty( $dianna->getPartners() );
}
- public function testName() {
- $person = new Person( Title::newFromText( 'Will' ) );
- $this->assertEquals( 'Will', $person->getTitle() );
+ public function testChildren() {
+ $wikiText = '{{#genealogy:parent|Alice}}';
+ $this->setPageContent( 'Bob', $wikiText );
+ $this->setPageContent( 'Carly', $wikiText );
+ $alice = new Person( Title::newFromText( 'Alice' ) );
+ $this->assertEquals( ['Bob', 'Carly'], array_keys(
$alice->getChildren() ) );
}
public function testDates() {
--
To view, visit https://gerrit.wikimedia.org/r/321223
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7197fc93abad50dc2fc7309bc32a96be52cc47e2
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Genealogy
Gerrit-Branch: master
Gerrit-Owner: Samwilson <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits