From 5f16307582fe3fc61d4f369d340134e00b40fd56 Mon Sep 17 00:00:00 2001 From: physikerwelt Date: Tue, 9 Feb 2016 20:53:51 +0100 Subject: [PATCH] RDF Formatter for Math data type Bug: T126349 Change-Id: I15fbeec282868b4267a3e3d15740f2c3ff37ea48 --- MathMLRdfBuilder.php | 35 +++++++++++++++++ MathWikidataHook.php | 13 ++++++ extension.json | 3 +- tests/MathMLRdfBuilderTest.php | 72 ++++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 MathMLRdfBuilder.php create mode 100644 tests/MathMLRdfBuilderTest.php diff --git a/MathMLRdfBuilder.php b/MathMLRdfBuilder.php new file mode 100644 index 0000000..efc5543 --- /dev/null +++ b/MathMLRdfBuilder.php @@ -0,0 +1,35 @@ +getDataValue()->getValue() ); + if ( $renderer->checkTeX() && $renderer->render() ) { + $mml = $renderer->getMathml(); + } else { + $err = $renderer->getLastError(); + $mml = "$err"; + } + $writer->say( $propertyValueNamespace, $propertyValueLName ) + ->value( $mml, 'http://www.w3.org/1998/Math/MathML' ); + } +} diff --git a/MathWikidataHook.php b/MathWikidataHook.php index 62183de..145dd1b 100644 --- a/MathWikidataHook.php +++ b/MathWikidataHook.php @@ -2,8 +2,12 @@ use ValueFormatters\FormatterOptions; use ValueParsers\StringParser; +use Wikibase\Rdf\DedupeBag; +use Wikibase\Rdf\EntityMentionListener; +use Wikibase\Rdf\RdfVocabulary; use Wikibase\Repo\Parsers\WikibaseStringValueNormalizer; use Wikibase\Repo\WikibaseRepo; +use Wikimedia\Purtle\RdfWriter; class MathWikidataHook { @@ -41,6 +45,15 @@ class MathWikidataHook { $wgOut->addModuleStyles( $styles ); return new MathFormatter( $format ); }, + 'rdf-builder-factory-callback' => function ( + $mode, + RdfVocabulary $vocab, + RdfWriter $writer, + EntityMentionListener $tracker, + DedupeBag $dedupe + ) { + return new MathMLRdfBuilder(); + }, ); } diff --git a/extension.json b/extension.json index 9a00606..edc8732 100644 --- a/extension.json +++ b/extension.json @@ -28,7 +28,8 @@ "SpecialMathStatus": "SpecialMathStatus.php", "MathValidator": "MathValidator.php", "MathFormatter": "MathFormatter.php", - "MathWikidataHook": "MathWikidataHook.php" + "MathWikidataHook": "MathWikidataHook.php", + "MathMLRdfBuilder": "MathMLRdfBuilder.php" }, "DefaultUserOptions": { "math": "png" diff --git a/tests/MathMLRdfBuilderTest.php b/tests/MathMLRdfBuilderTest.php new file mode 100644 index 0000000..4b6c54b --- /dev/null +++ b/tests/MathMLRdfBuilderTest.php @@ -0,0 +1,72 @@ +checkBackend( true ); + } + + /** + * Sets up the fixture, for example, opens a network connection. + * This method is called before a test is executed. + */ + protected function setUp() { + parent::setUp(); + if ( !self::$hasRestbase ) { + $this->markTestSkipped( "Can not connect to Restbase Math interface." ); + } + } + + /** + * + * @param string $test + * @return string + */ + private function makeCase( $test ) { + $builder = new MathMLRdfBuilder(); + $writer = new NTriplesRdfWriter(); + $writer->prefix( 'www', "http://www/" ); + $writer->prefix( 'acme', self::ACME_PREFIX_URL ); + + $writer->start(); + $writer->about( 'www', 'Q1' ); + + $snak = new PropertyValueSnak( new PropertyId( 'P1' ), new StringValue( $test ) ); + $builder->addValue( $writer, 'acme', self::ACME_REF, 'DUMMY', $snak ); + + return trim( $writer->drain() ); + } + + public function testValidInput() { + $triples = $this->makeCase( 'a^2' ); + $this->assertContains( self::ACME_PREFIX_URL . self::ACME_REF . '> "assertContains( 'a\n', $triples ); + $this->assertContains( '2\n', $triples ); + $this->assertContains( 'a^{2}', $triples ); + $this->assertContains( '^^ .', $triples ); + } + + public function testInvalidInput() { + $triples = $this->makeCase( '\notExists' ); + $this->assertContains( 'assertContains( 'unknown function', $triples ); + $this->assertContains( 'notExists', $triples ); + $this->assertContains( '^^ .', $triples ); + } +}