25 public function __construct() {
26 parent::__construct();
27 $this->addDescription(
'Creates graphml xml file of language fallbacks.' );
30 public function execute() {
33 <?xml version=
"1.0" encoding=
"UTF-8"?>
35 xmlns=
"http://graphml.graphdrawing.org/xmlns"
36 xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
37 xsi:schemaLocation=
"http://graphml.graphdrawing.org/xmlns
38 http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"
39 xmlns:y=
"http://www.yworks.com/xml/graphml">
41 <key
id=
"code" for=
"node" yfiles.type=
"nodegraphics"/>
42 <graph
id=
"G" edgedefault=
"directed">
49 $services = MediaWikiServices::getInstance();
51 ->getLanguageNameUtils()
53 $languageFallback = $services->getLanguageFallback();
55 foreach ( $langs as $code => $name ) {
56 $fallbacks = $languageFallback->getAll( $code, LanguageFallback::STRICT );
57 if ( $fallbacks === [] ) {
61 $nodes[$code] = $this->createNode( $code );
64 foreach ( $fallbacks as $fb ) {
65 $nodes[$fb] = $this->createNode( $fb );
66 $edges[$fb . $prev] = Xml::element(
'edge', [
'source' => $prev,
'target' => $fb ] );
71 $output = array_merge( $nodes, $edges );
72 $output =
"\t\t" . implode(
"\n\t\t", $output );
73 echo str_replace(
'$1', $output, $template );
76 protected function createNode( $code ) {
77 return Xml::openElement(
'node', [
'id' => $code ] )
78 . Xml::openElement(
'data', [
'key' =>
'code' ] )
79 . Xml::openElement(
'y:Shapenode' )
82 [
'height' => 40,
'width' => max( 40, 20 * strlen( $code ) ) ],
85 . Xml::element(
'y:NodeLabel', [
'fontSize' =>
'24' ], $code )
86 . Xml::element(
'y:BorderStyle', [
'hasColor' =>
'false' ],
'' )
87 . Xml::element(
'y:Fill', [
'hasColor' =>
'false' ],
'' )
88 . Xml::closeElement(
'y:Shapenode' )
89 . Xml::closeElement(
'data' )
90 . Xml::closeElement(
'node' );