Skip to content

Commit d28ed81

Browse files
committed
Improve remaining issues and allow drafter 5
1 parent 8e4556a commit d28ed81

18 files changed

+254
-83
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ vendor/**
1818
atlassian-ide-plugin.xml
1919

2020
*.pem
21+
22+
index.html

composer.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

phpstan.neon

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ parameters:
77
- src/PHPDraft/Parse/Tests/DrafterAPITest.php
88
ignoreErrors:
99
- '#Access to an undefined property object::\$[a-zA-Z0-9\\_]+#'
10-
- '#Access to an undefined property PHPUnit\\Framework\\MockObject\\MockObject::\$[a-zA-Z0-9_]+#'
1110
- '#Access to an undefined property PHPDraft\\Model\\HierarchyElement::\$[a-zA-Z0-9_]+#'

src/PHPDraft/Model/Elements/ArrayStructureElement.php

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,9 @@ public function parse(?object $object, array &$dependencies): StructureElement
3838
}
3939

4040
foreach ($object->content as $sub_item) {
41-
if (!in_array($sub_item->element, self::DEFAULTS)) {
42-
$dependencies[] = $sub_item->element;
43-
}
44-
45-
$key = $sub_item->element ?? 'any';
46-
$value = $sub_item->content ?? null;
47-
$this->value[] = [$value => $key];
41+
$element = new ElementStructureElement();
42+
$element->parse($sub_item, $dependencies);
43+
$this->value[] = $element;
4844
}
4945

5046
$this->deps = $dependencies;
@@ -67,11 +63,7 @@ public function __toString(): string
6763

6864
$return = '';
6965
foreach ($this->value as $item) {
70-
$value = key($item);
71-
$type = $this->get_element_as_html($item[$value]);
72-
73-
$value = empty($value) ? '' : " - <span class=\"example-value pull-right\">$value</span>";
74-
$return .= '<li class="list-group-item mdl-list__item">' . $type . $value . '</li>';
66+
$return .= $item->__toString();
7567
}
7668

7769
return '<ul class="list-group mdl-list">' . $return . '</ul>';

src/PHPDraft/Model/Elements/BasicStructureElement.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ abstract class BasicStructureElement implements StructureElement
1515
/**
1616
* Object key.
1717
*
18-
* @var string|null
18+
* @var ElementStructureElement|null
1919
*/
2020
public $key;
2121
/**
@@ -101,8 +101,14 @@ abstract protected function new_instance(): StructureElement;
101101
*/
102102
protected function parse_common(object $object, array &$dependencies): void
103103
{
104-
$this->key = $object->content->key->content ?? null;
105-
$this->type = $object->content->value->element
104+
$this->key = null;
105+
if (isset($object->content->key)) {
106+
$key = new ElementStructureElement();
107+
$key->parse($object->content->key, $dependencies);
108+
$this->key = $key;
109+
}
110+
111+
$this->type = $object->content->value->element
106112
?? $object->meta->title->content
107113
?? $object->meta->id->content
108114
?? null;
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace PHPDraft\Model\Elements;
4+
5+
class ElementStructureElement implements StructureElement
6+
{
7+
/**
8+
* Object JSON type.
9+
*
10+
* @var string|null
11+
*/
12+
public $type;
13+
14+
/**
15+
* Object description.
16+
*
17+
* @var string|null
18+
*/
19+
public $description;
20+
21+
/**
22+
* Object value.
23+
*
24+
* @var mixed
25+
*/
26+
public $value = null;
27+
28+
/**
29+
* @param object|null $object
30+
* @param array $dependencies
31+
* @return StructureElement
32+
*/
33+
public function parse(?object $object, array &$dependencies): StructureElement
34+
{
35+
if (!in_array($object->element, self::DEFAULTS)) {
36+
$dependencies[] = $object->element;
37+
}
38+
39+
$this->type = $object->element;
40+
$this->value = $object->content ?? null;
41+
$this->description = $object->meta->description->content ?? null;
42+
43+
return $this;
44+
}
45+
46+
public function __toString(): string
47+
{
48+
$type = $this->get_element_as_html($this->type);
49+
50+
$desc = empty($this->description) ? '' : " - <span class=\"description\">{$this->description}</span>";
51+
$value = empty($this->value) ? '' : " - <span class=\"example-value pull-right\">{$this->value}</span>";
52+
return '<li class="list-group-item mdl-list__item">' . $type . $desc . $value . '</li>';
53+
}
54+
55+
public function string_value($flat = false)
56+
{
57+
return $this->__toString();
58+
}
59+
60+
/**
61+
* Represent the element in HTML.
62+
*
63+
* @param string $element Element name
64+
*
65+
* @return string HTML string
66+
*/
67+
protected function get_element_as_html($element): string
68+
{
69+
if (in_array($element, self::DEFAULTS)) {
70+
return '<code>' . $element . '</code>';
71+
}
72+
73+
$link_name = str_replace(' ', '-', strtolower($element));
74+
return '<a class="code" title="' . $element . '" href="#object-' . $link_name . '">' . $element . '</a>';
75+
}
76+
}

src/PHPDraft/Model/Elements/EnumStructureElement.php

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ public function parse(?object $object, array &$dependencies): StructureElement
2727
$this->element = $object->element;
2828

2929
$this->parse_common($object, $dependencies);
30-
31-
$this->key = $this->key ?? $object->content->content ?? null;
30+
if (!isset($this->key) && isset($object->content->content)) {
31+
$this->key = new ElementStructureElement();
32+
$this->key->parse($object->content, $dependencies);
33+
}
3234
$this->type = $this->type ?? $object->content->element ?? null;
3335

3436
if (!isset($object->content) && !isset($object->attributes)) {
@@ -58,11 +60,9 @@ public function parse(?object $object, array &$dependencies): StructureElement
5860
}
5961

6062
foreach ($object->attributes->enumerations->content as $sub_item) {
61-
if (!in_array($sub_item->element, self::DEFAULTS)) {
62-
$dependencies[] = $sub_item->element;
63-
}
64-
65-
$this->value[$sub_item->content] = $sub_item->element ?? '';
63+
$element = new ElementStructureElement();
64+
$element->parse($sub_item, $dependencies);
65+
$this->value[] = $element;
6666
}
6767

6868
$this->deps = $dependencies;
@@ -80,15 +80,12 @@ public function __toString(): string
8080
if (is_string($this->value)) {
8181
$type = $this->get_element_as_html($this->element);
8282

83-
return '<tr><td>' . $this->key . '</td><td>' . $type . '</td><td>' . $this->description . '</td></tr>';
83+
return '<tr><td>' . $this->key->value . '</td><td>' . $type . '</td><td>' . $this->description . '</td></tr>';
8484
}
8585

8686
$return = '';
87-
foreach ($this->value as $value => $key) {
88-
$type = $type = $this->get_element_as_html($key);
89-
90-
$item = empty($value) ? '' : " - <span class=\"example-value pull-right\">$value</span>";
91-
$return .= '<li class="list-group-item mdl-list__item">' . $type . $item . '</li>';
87+
foreach ($this->value as $item) {
88+
$return .= $item->__toString();
9289
}
9390

9491
return '<ul class="list-group mdl-list">' . $return . '</ul>';

src/PHPDraft/Model/Elements/ObjectStructureElement.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,12 @@ protected function construct_string_return(string $value): string
208208
$type = $this->get_element_as_html($this->type);
209209
$variable = '';
210210
if ($this->is_variable) {
211-
$variable = '<span class="fas fa-info variable-info" data-toggle="tooltip" data-placement="top" title="This is a variable key"></span>';
211+
$link_name = str_replace(' ', '-', strtolower($this->key->type));
212+
$variable = '<a class="variable-key" title="' . $this->key->type . '" href="#object-' . $link_name . '"><span class="fas fa-info variable-info" data-toggle="tooltip" data-placement="top" title="This is a variable key of type &quot;' . $this->key->type . '&quot;"></span></a>';
212213
}
213214

214215
return '<tr>' .
215-
'<td>' . '<span>' . $this->key . '</span>' . $variable . '</td>' .
216+
'<td>' . '<span>' . $this->key->value . '</span>' . $variable . '</td>' .
216217
'<td>' . $type . '</td>' .
217218
'<td> <span class="status">' . $this->status . '</span></td>' .
218219
'<td>' . $this->description . '</td>' .

src/PHPDraft/Model/Elements/Tests/ArrayStructureElementTest.php

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
use Lunr\Halo\LunrBaseTest;
1313
use PHPDraft\Model\Elements\ArrayStructureElement;
14+
use PHPDraft\Model\Elements\ElementStructureElement;
1415

1516
/**
1617
* Class ArrayStructureTest
@@ -58,7 +59,13 @@ public function parseObjectProvider(): array
5859
$return = [];
5960
$base1 = new ArrayStructureElement();
6061
$base1->key = null;
61-
$base1->value = [['Swift' => 'string'], ['Objective-C' => 'string']];
62+
$val1 = new ElementStructureElement();
63+
$val1->value = 'Swift';
64+
$val1->type = 'string';
65+
$val2 = new ElementStructureElement();
66+
$val2->value = 'Objective-C';
67+
$val2->type = 'string';
68+
$base1->value = [$val1, $val2];
6269
$base1->status = null;
6370
$base1->element = 'array';
6471
$base1->type = null;
@@ -68,7 +75,13 @@ public function parseObjectProvider(): array
6875

6976
$base2 = new ArrayStructureElement();
7077
$base2->key = null;
71-
$base2->value = [['item' => 'string'], ['another item' => 'string']];
78+
$val1 = new ElementStructureElement();
79+
$val1->value = 'item';
80+
$val1->type = 'string';
81+
$val2 = new ElementStructureElement();
82+
$val2->value = 'another item';
83+
$val2->type = 'string';
84+
$base2->value = [$val1, $val2];
7285
$base2->status = null;
7386
$base2->element = 'array';
7487
$base2->type = 'Some simple array';
@@ -77,8 +90,16 @@ public function parseObjectProvider(): array
7790
$base2->deps = ['Some simple array'];
7891

7992
$base3 = new ArrayStructureElement();
80-
$base3->key = 'car_id_list';
81-
$base3->value = [['car_id_list' => 'string'], ['' => 'array']];
93+
$base3->key = new ElementStructureElement();
94+
$base3->key->value = 'car_id_list';
95+
$base3->key->type = 'string';
96+
$val1 = new ElementStructureElement();
97+
$val1->value = 'car_id_list';
98+
$val1->type = 'string';
99+
$val2 = new ElementStructureElement();
100+
$val2->value = null;
101+
$val2->type = 'array';
102+
$base3->value = [$val1, $val2];
82103
$base3->status = 'optional';
83104
$base3->element = 'member';
84105
$base3->type = 'array';
@@ -167,18 +188,32 @@ public function testNewInstance(): void
167188
*/
168189
public function testToStringWithArray(): void
169190
{
170-
$this->class->value = [['string' => 'stuff'], ['int' => 'class']];
191+
$val1 = new ElementStructureElement();
192+
$val1->type = 'string';
193+
$val1->value = 'stuff';
194+
$val2 = new ElementStructureElement();
195+
$val2->type = 'int';
196+
$val2->value = 'class';
197+
$val2->description = 'Description';
198+
$this->class->value = [$val1, $val2];
171199
$return = $this->class->__toString();
172-
$this->assertSame('<ul class="list-group mdl-list"><li class="list-group-item mdl-list__item"><a class="code" title="stuff" href="#object-stuff">stuff</a> - <span class="example-value pull-right">string</span></li><li class="list-group-item mdl-list__item"><a class="code" title="class" href="#object-class">class</a> - <span class="example-value pull-right">int</span></li></ul>', $return);
200+
$this->assertSame('<ul class="list-group mdl-list"><li class="list-group-item mdl-list__item"><code>string</code> - <span class="example-value pull-right">stuff</span></li><li class="list-group-item mdl-list__item"><a class="code" title="int" href="#object-int">int</a> - <span class="description">Description</span> - <span class="example-value pull-right">class</span></li></ul>', $return);
173201
}
174202

175203
/**
176204
* Test setup of new instances
177205
*/
178206
public function testToStringWithComplexArray(): void
179207
{
180-
$this->class->value = [['type' => 'Bike'], ['stuff' => 'car']];
208+
$val1 = new ElementStructureElement();
209+
$val1->type = 'Bike';
210+
$val1->value = 'type';
211+
$val2 = new ElementStructureElement();
212+
$val2->type = 'car';
213+
$val2->value = 'stuff';
214+
$val2->description = 'Description';
215+
$this->class->value = [$val1, $val2];
181216
$return = $this->class->__toString();
182-
$this->assertSame('<ul class="list-group mdl-list"><li class="list-group-item mdl-list__item"><a class="code" title="Bike" href="#object-bike">Bike</a> - <span class="example-value pull-right">type</span></li><li class="list-group-item mdl-list__item"><a class="code" title="car" href="#object-car">car</a> - <span class="example-value pull-right">stuff</span></li></ul>', $return);
217+
$this->assertSame('<ul class="list-group mdl-list"><li class="list-group-item mdl-list__item"><a class="code" title="Bike" href="#object-bike">Bike</a> - <span class="example-value pull-right">type</span></li><li class="list-group-item mdl-list__item"><a class="code" title="car" href="#object-car">car</a> - <span class="description">Description</span> - <span class="example-value pull-right">stuff</span></li></ul>', $return);
183218
}
184219
}

src/PHPDraft/Model/Elements/Tests/BasicStructureElementTest.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Lunr\Halo\LunrBaseTest;
1313
use PHPDraft\Model\Elements\ArrayStructureElement;
1414
use PHPDraft\Model\Elements\BasicStructureElement;
15+
use PHPDraft\Model\Elements\ElementStructureElement;
1516
use PHPDraft\Model\Elements\ObjectStructureElement;
1617
use ReflectionClass;
1718

@@ -90,10 +91,12 @@ public function testParseCommonDeps(): void
9091
{
9192
$dep = [];
9293

93-
$json = '{"meta":{},"attributes":{},"content":{"key":{"content":"key"}, "value":{"element":"cat"}}}';
94+
$json = '{"meta":{},"attributes":{},"content":{"key":{"element": "string", "content":"key"}, "value":{"element":"cat"}}}';
9495

9596
$answer = new ObjectStructureElement();
96-
$answer->key = 'key';
97+
$answer->key = new ElementStructureElement();
98+
$answer->key->type = 'string';
99+
$answer->key->value = 'key';
97100
$answer->type = 'cat';
98101
$answer->description = null;
99102

@@ -134,11 +137,13 @@ public function parseValueProvider(): array
134137
{
135138
$return = [];
136139

137-
$json = '{"meta":{},"attributes":{},"content":{"key":{"content":"key"}, "value":{"element":"string"}}}';
140+
$json = '{"meta":{},"attributes":{},"content":{"key":{"element": "string", "content":"key"}, "value":{"element":"string"}}}';
138141
$obj = json_decode($json);
139142

140143
$answer = new ObjectStructureElement();
141-
$answer->key = 'key';
144+
$answer->key = new ElementStructureElement();
145+
$answer->key->type = 'string';
146+
$answer->key->value = 'key';
142147
$answer->type = 'string';
143148
$answer->description = PHP_EOL;
144149

0 commit comments

Comments
 (0)