Skip to content
This repository has been archived by the owner on Aug 24, 2020. It is now read-only.

Commit

Permalink
Merge pull request #1 from JanZerebecki/master
Browse files Browse the repository at this point in the history
further implementation
  • Loading branch information
JeroenDeDauw committed Sep 11, 2014
2 parents 6404a65 + ce00fdc commit d06ad40
Show file tree
Hide file tree
Showing 18 changed files with 827 additions and 26 deletions.
21 changes: 17 additions & 4 deletions src/Serializers/Description/AnyValueSerializer.php
Expand Up @@ -2,20 +2,33 @@

namespace Ask\Wikitext\Serializers\Description;

use Serializers\Serializer;
use Serializers\DispatchableSerializer;
use Ask\Language\Description\AnyValue;
use InvalidArgumentException;

/**
* @licence GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class AnyValueSerializer implements Serializer {
class AnyValueSerializer implements DispatchableSerializer {

/**
* @see DispatchableSerializer::isSerializerFor
*/
public function isSerializerFor( $object ) {
return ( $object instanceof AnyValue );
}

/**
* @see Serializer::serialize
*/
public function serialize( $object ) {
return '+';
if ( $this->isSerializerFor( $object ) ) {
return '+';
}

throw new InvalidArgumentException( 'Can only serialize instances of AnyValue' );
}

}
}
54 changes: 54 additions & 0 deletions src/Serializers/Description/ConjunctionSerializer.php
@@ -0,0 +1,54 @@
<?php

namespace Ask\Wikitext\Serializers\Description;

use Serializers\DispatchableSerializer;
use Ask\Language\Description\Conjunction;
use Ask\Language\Description\Description;
use InvalidArgumentException;
use Ask\Wikitext\Serializers\Description\DescriptionCollectionSerializer;

/**
* @licence GNU GPL v2+
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class ConjunctionSerializer implements DispatchableSerializer {

/**
* @var DescriptionCollectionSerializer
*/
private $collectionSerializer = null;

/**
* @see DispatchableSerializer::isSerializerFor
*/
public function isSerializerFor( $object ) {
return ( $object instanceof Conjunction );
}

/**
* @see Serializer::serialize
*/
public function serialize( $object ) {
if ( $this->isSerializerFor( $object ) ) {
return $this->serializeConjunction( $object );
}

throw new InvalidArgumentException( 'Can only serialize instances of Conjunction' );
}

/**
* @return DescriptionCollectionSerializer
*/
private function serializer() {
if (is_null($this->collectionSerializer)) {
$this->collectionSerializer = new DescriptionCollectionSerializer(' ');
}
return $this->collectionSerializer;
}

private function serializeConjunction( Conjunction $conjunction ) {
return $this->serializer()->serialize( $conjunction );
}

}
82 changes: 82 additions & 0 deletions src/Serializers/Description/DescriptionCollectionSerializer.php
@@ -0,0 +1,82 @@
<?php

namespace Ask\Wikitext\Serializers\Description;

use Serializers\DispatchableSerializer;
use Ask\Language\Description\DescriptionCollection;
use Ask\Language\Description\Description;
use InvalidArgumentException;
use Ask\Wikitext\Serializers\Factory;
use Serializers\DispatchingSerializer;

/**
* @licence GNU GPL v2+
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class DescriptionCollectionSerializer implements DispatchableSerializer {

/**
* @var String
*/
private $operator = '';

/**
* @var DispatchingSerializer
*/
private $descriptionSerializer = null;

/**
* @param string $operator used to concatenate the parts
*/
public function __construct($operator) {
$this->operator = $operator;
}

/**
* @see DispatchableSerializer::isSerializerFor
*/
public function isSerializerFor( $object ) {
return ( $object instanceof DescriptionCollection );
}

/**
* @see Serializer::serialize
*/
public function serialize( $object ) {
if ( $this->isSerializerFor( $object ) ) {
return $this->serializeCollection( $object );
}

throw new InvalidArgumentException( 'Can only serialize instances of DescriptionCollection.' );
}

private function serializeCollection( DescriptionCollection $collection ) {
$result = '';
$firstItem = true;
foreach ( $collection->getDescriptions() as $description) {
if (!$firstItem) {
$result .= $this->operator;
} else {
$firstItem = false;
}
$result .= $this->serializeDescription( $description );
}
return $result;
}

/**
* @return DispatchingSerializer
*/
private function serializer() {
if (is_null($this->descriptionSerializer)) {
$factory = new Factory();
$this->descriptionSerializer = $factory->createDescriptionSerializer();
}
return $this->descriptionSerializer;
}

private function serializeDescription( Description $description ) {
return $this->serializer()->serialize( $description );
}

}
54 changes: 54 additions & 0 deletions src/Serializers/Description/DisjunctionSerializer.php
@@ -0,0 +1,54 @@
<?php

namespace Ask\Wikitext\Serializers\Description;

use Serializers\DispatchableSerializer;
use Ask\Language\Description\Disjunction;
use Ask\Language\Description\Description;
use InvalidArgumentException;
use Ask\Wikitext\Serializers\Description\DescriptionCollectionSerializer;

/**
* @licence GNU GPL v2+
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class DisjunctionSerializer implements DispatchableSerializer {

/**
* @var DescriptionCollectionSerializer
*/
private $collectionSerializer = null;

/**
* @see DispatchableSerializer::isSerializerFor
*/
public function isSerializerFor( $object ) {
return ( $object instanceof Disjunction );
}

/**
* @see Serializer::serialize
*/
public function serialize( $object ) {
if ( $this->isSerializerFor( $object ) ) {
return $this->serializeDisjunction( $object );
}

throw new InvalidArgumentException( 'Can only serialize instances of Disjunction' );
}

/**
* @return DescriptionCollectionSerializer
*/
private function serializer() {
if (is_null($this->collectionSerializer)) {
$this->collectionSerializer = new DescriptionCollectionSerializer(' OR ');
}
return $this->collectionSerializer;
}

private function serializeDisjunction( Disjunction $disjunction ) {
return $this->serializer()->serialize( $disjunction );
}

}
40 changes: 34 additions & 6 deletions src/Serializers/Description/SomePropertySerializer.php
Expand Up @@ -2,21 +2,49 @@

namespace Ask\Wikitext\Serializers\Description;

use Serializers\Serializer;
use Serializers\DispatchableSerializer;
use InvalidArgumentException;
use Ask\Language\Description\SomeProperty;
use Ask\Wikitext\Serializers\Factory;

/**
* @licence GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class SomePropertySerializer implements Serializer {
class SomePropertySerializer implements DispatchableSerializer {

/**
* @see DispatchableSerializer::isSerializerFor
*/
public function isSerializerFor( $object ) {
return ( $object instanceof SomeProperty );
}

/**
* @see Serializer::serialize
*/
public function serialize( $object ) {
$formatter = new AnyValueSerializer();
return '[[' . $object->getPropertyId()->getValue() . '::' . $formatter->serialize( $object->getSubDescription() ) . ']]';
public function serialize( $someProperty ) {
if ( $this->isSerializerFor( $someProperty ) ) {
return $this->serializeSomeProperty( $someProperty );
}

throw new InvalidArgumentException( 'Can only serialize instances of SomeProperty' );
}

private function serializeSomeProperty( SomeProperty $someProperty ) {
return '[[' . $someProperty->getPropertyId()->getValue() .
'::' . $this->serializeSubDescription( $someProperty ) . ']]';
}

}
private function serializeSubDescription( SomeProperty $someProperty ) {
$factory = new Factory();
$serializer = $factory->createDescriptionSerializer();
$subDescription = $someProperty->getSubDescription();
$serialized = $serializer->serialize( $subDescription );
if ( $serialized[0] !== '[' ) {
return $serialized;
}
return '<q>'.$serialized.'</q>';
}
}
24 changes: 19 additions & 5 deletions src/Serializers/Description/ValueDescriptionSerializer.php
Expand Up @@ -4,20 +4,28 @@

use Ask\Language\Description\ValueDescription;
use InvalidArgumentException;
use Serializers\Serializer;
use Serializers\DispatchableSerializer;

/**
* @licence GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class ValueDescriptionSerializer implements Serializer {
class ValueDescriptionSerializer implements DispatchableSerializer {

/**
* @see DispatchableSerializer::isSerializerFor
*/
public function isSerializerFor( $object ) {
return ( $object instanceof ValueDescription );
}


/**
* @see Serializer::serialize
*/
public function serialize( $valueDescription ) {
if ( $valueDescription instanceof ValueDescription ) {
if ( $this->isSerializerFor( $valueDescription ) ) {
return $this->serializeValueDescription( $valueDescription );
}

Expand All @@ -32,10 +40,16 @@ private function serializeValueDescription( ValueDescription $valueDescription )
private function getComparatorSerialization( $comparator ) {
$comparators = array(
ValueDescription::COMP_EQUAL => '',
ValueDescription::COMP_GREATER => '>',
ValueDescription::COMP_LEQ => '≤',
ValueDescription::COMP_GEQ => '≥',
ValueDescription::COMP_NEQ => '!',
ValueDescription::COMP_LIKE => '~',
ValueDescription::COMP_NLIKE => '!~',
ValueDescription::COMP_LESS => '<<',
ValueDescription::COMP_GREATER => '>>',
);

return $comparators[$comparator];
}

}
}
26 changes: 26 additions & 0 deletions src/Serializers/Factory.php
@@ -0,0 +1,26 @@
<?php

namespace Ask\Wikitext\Serializers;

use Serializers\DispatchingSerializer;

/**
* @licence GNU GPL v2+
* @author Jan Zerebecki < jan.wikimedia@zerebecki.de >
*/
class Factory {

/**
* @return DispatchingSerializer
*/
public function createDescriptionSerializer() {
$serializer = new DispatchingSerializer();
$serializer->addSerializer( new \Ask\Wikitext\Serializers\Description\AnyValueSerializer() );
$serializer->addSerializer( new \Ask\Wikitext\Serializers\Description\SomePropertySerializer() );
$serializer->addSerializer( new \Ask\Wikitext\Serializers\Description\ValueDescriptionSerializer() );
$serializer->addSerializer( new \Ask\Wikitext\Serializers\Description\ConjunctionSerializer() );
$serializer->addSerializer( new \Ask\Wikitext\Serializers\Description\DisjunctionSerializer() );
return $serializer;
}

}

0 comments on commit d06ad40

Please sign in to comment.