Skip to content
This repository was archived by the owner on Nov 21, 2019. It is now read-only.

Commit ace28ce

Browse files
nlisgothewilkybarkid
authored andcommitted
Bold text (#36)
* update patterns * Add BoldVisitor to JatsContentBundle * Add BoldVisitor to LiberoContentBundle * amend test to cover bold * Revert changes * Address feedback * Refactor expected * Libero bold should match schema
1 parent 621643b commit ace28ce

File tree

15 files changed

+477
-2
lines changed

15 files changed

+477
-2
lines changed

vendor-extra/JatsContentBundle/src/Resources/config/services.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
<tag name="libero.view_converter"/>
3333
</service>
3434

35+
<service id="Libero\JatsContentBundle\ViewConverter\BoldVisitor"
36+
class="Libero\JatsContentBundle\ViewConverter\BoldVisitor">
37+
<argument type="service" id="Libero\ViewsBundle\Views\ViewConverter"/>
38+
<tag name="libero.view_converter"/>
39+
</service>
40+
3541
</services>
3642

3743
</container>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Libero\JatsContentBundle\ViewConverter;
6+
7+
use FluentDOM\DOM\Element;
8+
use Libero\ViewsBundle\Views\ConvertsChildren;
9+
use Libero\ViewsBundle\Views\SimplifiedChildVisitor;
10+
use Libero\ViewsBundle\Views\View;
11+
use Libero\ViewsBundle\Views\ViewConverter;
12+
use Libero\ViewsBundle\Views\ViewConverterVisitor;
13+
14+
final class BoldVisitor implements ViewConverterVisitor
15+
{
16+
use ConvertsChildren;
17+
use SimplifiedChildVisitor;
18+
19+
public function __construct(ViewConverter $converter)
20+
{
21+
$this->converter = $converter;
22+
}
23+
24+
protected function doVisit(Element $object, View $view, array &$context = []) : View
25+
{
26+
return $view->withArgument('text', $this->convertChildren($object, $context));
27+
}
28+
29+
protected function possibleTemplate() : string
30+
{
31+
return '@LiberoPatterns/bold.html.twig';
32+
}
33+
34+
protected function expectedElement() : string
35+
{
36+
return '{http://jats.nlm.nih.gov}bold';
37+
}
38+
39+
protected function unexpectedArguments() : array
40+
{
41+
return ['text'];
42+
}
43+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace tests\Libero\JatsContentBundle\ViewConverter;
6+
7+
use FluentDOM;
8+
use FluentDOM\DOM\Element;
9+
use Libero\JatsContentBundle\ViewConverter\BoldVisitor;
10+
use Libero\ViewsBundle\Views\View;
11+
use PHPUnit\Framework\TestCase;
12+
use tests\Libero\ContentPageBundle\ViewConvertingTestCase;
13+
14+
final class BoldVisitorTest extends TestCase
15+
{
16+
use ViewConvertingTestCase;
17+
18+
/**
19+
* @test
20+
* @dataProvider nodeProvider
21+
*/
22+
public function it_does_nothing_if_it_is_not_a_jats_bold_element(string $xml) : void
23+
{
24+
$visitor = new BoldVisitor($this->createFailingConverter());
25+
26+
$xml = FluentDOM::load("<foo>${xml}</foo>");
27+
/** @var Element $element */
28+
$element = $xml->documentElement->firstChild;
29+
30+
$newContext = [];
31+
$view = $visitor->visit($element, new View(null), $newContext);
32+
33+
$this->assertNull($view->getTemplate());
34+
$this->assertEmpty($view->getArguments());
35+
$this->assertEmpty($newContext);
36+
}
37+
38+
public function nodeProvider() : iterable
39+
{
40+
yield 'different namespace' => ['<bold xmlns="http://example.com">foo</bold>'];
41+
yield 'different element' => ['<italic xmlns="http://jats.nlm.nih.gov">foo</italic>'];
42+
}
43+
44+
/**
45+
* @test
46+
*/
47+
public function it_does_nothing_if_is_not_the_bold_template() : void
48+
{
49+
$visitor = new BoldVisitor($this->createFailingConverter());
50+
51+
$xml = FluentDOM::load('<bold xmlns="http://jats.nlm.nih.gov">foo</bold>');
52+
/** @var Element $element */
53+
$element = $xml->documentElement;
54+
55+
$newContext = [];
56+
$view = $visitor->visit($element, new View('template'), $newContext);
57+
58+
$this->assertSame('template', $view->getTemplate());
59+
$this->assertEmpty($view->getArguments());
60+
$this->assertEmpty($newContext);
61+
}
62+
63+
/**
64+
* @test
65+
*/
66+
public function it_does_nothing_if_there_is_already_text_set() : void
67+
{
68+
$visitor = new BoldVisitor($this->createFailingConverter());
69+
70+
$xml = FluentDOM::load('<bold xmlns="http://jats.nlm.nih.gov">foo</bold>');
71+
/** @var Element $element */
72+
$element = $xml->documentElement;
73+
74+
$newContext = [];
75+
$view = $visitor->visit($element, new View(null, ['text' => 'bar']), $newContext);
76+
77+
$this->assertNull($view->getTemplate());
78+
$this->assertSame(['text' => 'bar'], $view->getArguments());
79+
$this->assertEmpty($newContext);
80+
}
81+
82+
/**
83+
* @test
84+
*/
85+
public function it_sets_the_template_and_text_argument() : void
86+
{
87+
$visitor = new BoldVisitor($this->createDumpingConverter());
88+
89+
$xml = FluentDOM::load(
90+
<<<XML
91+
<jats:bold xmlns:jats="http://jats.nlm.nih.gov">
92+
foo <jats:italic>bar</jats:italic> baz
93+
</jats:bold>
94+
XML
95+
);
96+
/** @var Element $element */
97+
$element = $xml->documentElement;
98+
99+
$newContext = ['qux' => 'quux'];
100+
$view = $visitor->visit($element, new View(null), $newContext);
101+
102+
$this->assertSame('@LiberoPatterns/bold.html.twig', $view->getTemplate());
103+
$this->assertEquals(
104+
[
105+
'text' => [
106+
new View(
107+
null,
108+
['node' => '/jats:bold/text()[1]', 'template' => null, 'context' => ['qux' => 'quux']]
109+
),
110+
new View(
111+
null,
112+
['node' => '/jats:bold/jats:italic', 'template' => null, 'context' => ['qux' => 'quux']]
113+
),
114+
new View(
115+
null,
116+
['node' => '/jats:bold/text()[2]', 'template' => null, 'context' => ['qux' => 'quux']]
117+
),
118+
],
119+
],
120+
$view->getArguments()
121+
);
122+
$this->assertSame(['qux' => 'quux'], $newContext);
123+
}
124+
}

vendor-extra/LiberoContentBundle/src/Resources/config/services.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
<tag name="libero.view_converter"/>
3333
</service>
3434

35+
<service id="Libero\LiberoContentBundle\ViewConverter\BoldVisitor"
36+
class="Libero\LiberoContentBundle\ViewConverter\BoldVisitor">
37+
<argument type="service" id="Libero\ViewsBundle\Views\ViewConverter"/>
38+
<tag name="libero.view_converter"/>
39+
</service>
40+
3541
</services>
3642

3743
</container>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Libero\LiberoContentBundle\ViewConverter;
6+
7+
use FluentDOM\DOM\Element;
8+
use Libero\ViewsBundle\Views\ConvertsChildren;
9+
use Libero\ViewsBundle\Views\SimplifiedChildVisitor;
10+
use Libero\ViewsBundle\Views\View;
11+
use Libero\ViewsBundle\Views\ViewConverter;
12+
use Libero\ViewsBundle\Views\ViewConverterVisitor;
13+
14+
final class BoldVisitor implements ViewConverterVisitor
15+
{
16+
use ConvertsChildren;
17+
use SimplifiedChildVisitor;
18+
19+
private $converter;
20+
21+
public function __construct(ViewConverter $converter)
22+
{
23+
$this->converter = $converter;
24+
}
25+
26+
protected function doVisit(Element $object, View $view, array &$context = []) : View
27+
{
28+
return $view->withArgument('text', $this->convertChildren($object, $context));
29+
}
30+
31+
protected function possibleTemplate() : string
32+
{
33+
return '@LiberoPatterns/bold.html.twig';
34+
}
35+
36+
protected function expectedElement() : string
37+
{
38+
return '{http://libero.pub}bold';
39+
}
40+
41+
protected function unexpectedArguments() : array
42+
{
43+
return ['text'];
44+
}
45+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace tests\Libero\LiberoContentBundle\ViewConverter;
6+
7+
use FluentDOM;
8+
use FluentDOM\DOM\Element;
9+
use Libero\LiberoContentBundle\ViewConverter\BoldVisitor;
10+
use Libero\ViewsBundle\Views\View;
11+
use PHPUnit\Framework\TestCase;
12+
use tests\Libero\ContentPageBundle\ViewConvertingTestCase;
13+
14+
final class BoldVisitorTest extends TestCase
15+
{
16+
use ViewConvertingTestCase;
17+
18+
/**
19+
* @test
20+
* @dataProvider nodeProvider
21+
*/
22+
public function it_does_nothing_if_it_is_not_a_libero_bold_element(string $xml) : void
23+
{
24+
$visitor = new BoldVisitor($this->createFailingConverter());
25+
26+
$xml = FluentDOM::load("<foo>${xml}</foo>");
27+
/** @var Element $element */
28+
$element = $xml->documentElement->firstChild;
29+
30+
$newContext = [];
31+
$view = $visitor->visit($element, new View(null), $newContext);
32+
33+
$this->assertNull($view->getTemplate());
34+
$this->assertEmpty($view->getArguments());
35+
$this->assertEmpty($newContext);
36+
}
37+
38+
public function nodeProvider() : iterable
39+
{
40+
yield 'different namespace' => ['<bold xmlns="http://example.com">foo</bold>'];
41+
yield 'different element' => ['<italic xmlns="http://libero.pub">foo</italic>'];
42+
}
43+
44+
/**
45+
* @test
46+
*/
47+
public function it_does_nothing_if_is_not_the_bold_template() : void
48+
{
49+
$visitor = new BoldVisitor($this->createFailingConverter());
50+
51+
$xml = FluentDOM::load('<bold xmlns="http://libero.pub">foo</bold>');
52+
/** @var Element $element */
53+
$element = $xml->documentElement;
54+
55+
$newContext = [];
56+
$view = $visitor->visit($element, new View('template'), $newContext);
57+
58+
$this->assertSame('template', $view->getTemplate());
59+
$this->assertEmpty($view->getArguments());
60+
$this->assertEmpty($newContext);
61+
}
62+
63+
/**
64+
* @test
65+
*/
66+
public function it_does_nothing_if_there_is_already_text_set() : void
67+
{
68+
$visitor = new BoldVisitor($this->createFailingConverter());
69+
70+
$xml = FluentDOM::load('<bold xmlns="http://libero.pub">foo</bold>');
71+
/** @var Element $element */
72+
$element = $xml->documentElement;
73+
74+
$newContext = [];
75+
$view = $visitor->visit($element, new View(null, ['text' => 'bar']), $newContext);
76+
77+
$this->assertNull($view->getTemplate());
78+
$this->assertSame(['text' => 'bar'], $view->getArguments());
79+
$this->assertEmpty($newContext);
80+
}
81+
82+
/**
83+
* @test
84+
*/
85+
public function it_sets_the_template_and_text_argument() : void
86+
{
87+
$visitor = new BoldVisitor($this->createDumpingConverter());
88+
89+
$xml = FluentDOM::load(
90+
<<<XML
91+
<libero:bold xmlns:libero="http://libero.pub">
92+
foo <libero:italic>bar</libero:italic> baz
93+
</libero:bold>
94+
XML
95+
);
96+
/** @var Element $element */
97+
$element = $xml->documentElement;
98+
99+
$newContext = ['qux' => 'quux'];
100+
$view = $visitor->visit($element, new View(null), $newContext);
101+
102+
$this->assertSame('@LiberoPatterns/bold.html.twig', $view->getTemplate());
103+
$this->assertEquals(
104+
[
105+
'text' => [
106+
new View(
107+
null,
108+
['node' => '/libero:bold/text()[1]', 'template' => null, 'context' => ['qux' => 'quux']]
109+
),
110+
new View(
111+
null,
112+
['node' => '/libero:bold/libero:italic', 'template' => null, 'context' => ['qux' => 'quux']]
113+
),
114+
new View(
115+
null,
116+
['node' => '/libero:bold/text()[2]', 'template' => null, 'context' => ['qux' => 'quux']]
117+
),
118+
],
119+
],
120+
$view->getArguments()
121+
);
122+
$this->assertSame(['qux' => 'quux'], $newContext);
123+
}
124+
}

0 commit comments

Comments
 (0)