xref: /plugin/combo/ComboStrap/Json.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
11fa8c418SNickeau<?php
21fa8c418SNickeau
31fa8c418SNickeau
41fa8c418SNickeaunamespace ComboStrap;
51fa8c418SNickeau
61fa8c418SNickeau
71fa8c418SNickeauclass Json
81fa8c418SNickeau{
91fa8c418SNickeau
10c3437056SNickeau    const TYPE_OBJECT = "{";
11c3437056SNickeau    const PARENT_TYPE_ARRAY = "[";
12c3437056SNickeau    const TAB_SPACES_COUNTER = 4;
13c3437056SNickeau    const EXTENSION = "json";
14c3437056SNickeau
15c3437056SNickeau    /**
16c3437056SNickeau     * @var array
17c3437056SNickeau     */
18c3437056SNickeau    private $jsonArray;
19c3437056SNickeau
20c3437056SNickeau    /**
21c3437056SNickeau     * Json constructor.
22c3437056SNickeau     * @param array|null $jsonValue
23c3437056SNickeau     */
24c3437056SNickeau    public function __construct(?array $jsonValue = null)
251fa8c418SNickeau    {
26c3437056SNickeau        $this->jsonArray = $jsonValue;
27c3437056SNickeau
281fa8c418SNickeau    }
29c3437056SNickeau
30c3437056SNickeau    public static function createEmpty(): Json
31c3437056SNickeau    {
32c3437056SNickeau        return new Json([]);
33c3437056SNickeau    }
34c3437056SNickeau
35c3437056SNickeau    public static function createFromArray(array $actual): Json
36c3437056SNickeau    {
37c3437056SNickeau        return new Json($actual);
38c3437056SNickeau    }
39c3437056SNickeau
40c3437056SNickeau    public static function getValidationLink(string $json): string
41c3437056SNickeau    {
42c3437056SNickeau        return "See the errors it by clicking on <a href=\"https://jsonformatter.curiousconcept.com/?data=" . urlencode($json) . "\">this link</a>";
43c3437056SNickeau    }
44c3437056SNickeau
45c3437056SNickeau    /**
46*04fd306cSNickeau     * @throws ExceptionBadSyntax
47*04fd306cSNickeau     * @throws ExceptionNotFound
48*04fd306cSNickeau     */
49*04fd306cSNickeau    public static function createFromPath(Path $path): Json
50*04fd306cSNickeau    {
51*04fd306cSNickeau
52*04fd306cSNickeau
53*04fd306cSNickeau        $content = FileSystems::getContent($path);
54*04fd306cSNickeau        return self::createFromString($content);
55*04fd306cSNickeau
56*04fd306cSNickeau    }
57*04fd306cSNickeau
58*04fd306cSNickeau    /**
59c3437056SNickeau     * Used to make diff
60c3437056SNickeau     * @return false|string
61c3437056SNickeau     */
62c3437056SNickeau    public function toNormalizedJsonString()
63c3437056SNickeau    {
64c3437056SNickeau        $jsonArray = $this->getJsonArray();
65c3437056SNickeau        if ($jsonArray === null) {
66c3437056SNickeau            /**
67c3437056SNickeau             * Edge case empty string
68c3437056SNickeau             */
69c3437056SNickeau            return "";
70c3437056SNickeau        }
71c3437056SNickeau        return json_encode($jsonArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
72c3437056SNickeau    }
73c3437056SNickeau
74c3437056SNickeau    /**
75c3437056SNickeau     * This formatting make the object on one line for a list of object
76c3437056SNickeau     * making the frontmatter compacter (one line, one meta)
77c3437056SNickeau     * @return string
78c3437056SNickeau     * @deprecated You should use the {@link MetadataFrontmatterStore::toFrontmatterJsonString()} instead
79c3437056SNickeau     */
80c3437056SNickeau    public function toFrontMatterFormat(): string
81c3437056SNickeau    {
82c3437056SNickeau
83c3437056SNickeau        $jsonArray = $this->getJsonArray();
84c3437056SNickeau        return MetadataFrontmatterStore::toFrontmatterJsonString($jsonArray);
85c3437056SNickeau
86c3437056SNickeau    }
87c3437056SNickeau
88c3437056SNickeau
89c3437056SNickeau    /**
90*04fd306cSNickeau     * @throws ExceptionBadSyntax
91c3437056SNickeau     */
92c3437056SNickeau    public
93c3437056SNickeau    static function createFromString($jsonString): Json
94c3437056SNickeau    {
95c3437056SNickeau        if ($jsonString === null || $jsonString === "") {
96c3437056SNickeau            return new Json();
97c3437056SNickeau        }
98c3437056SNickeau        $jsonArray = json_decode($jsonString, true);
99c3437056SNickeau        if ($jsonArray === null) {
100*04fd306cSNickeau            throw new ExceptionBadSyntax("The string is not a valid json. Value: ($jsonString)");
101c3437056SNickeau        }
102c3437056SNickeau        return new Json($jsonArray);
103c3437056SNickeau    }
104c3437056SNickeau
105c3437056SNickeau    /**
106c3437056SNickeau     * @return mixed
107c3437056SNickeau     */
108c3437056SNickeau    public
109c3437056SNickeau    function toJsonObject()
110c3437056SNickeau    {
111c3437056SNickeau        $jsonString = $this->getJsonString();
112c3437056SNickeau        return json_decode($jsonString);
113c3437056SNickeau
114c3437056SNickeau    }
115c3437056SNickeau
116c3437056SNickeau    public
117c3437056SNickeau    function toArray(): ?array
118c3437056SNickeau    {
119c3437056SNickeau        return $this->getJsonArray();
120c3437056SNickeau
121c3437056SNickeau    }
122c3437056SNickeau
123c3437056SNickeau    public
124c3437056SNickeau    function toPrettyJsonString()
125c3437056SNickeau    {
126c3437056SNickeau        return $this->toNormalizedJsonString();
127c3437056SNickeau    }
128c3437056SNickeau
129c3437056SNickeau    private
130c3437056SNickeau    function getJsonString()
131c3437056SNickeau    {
132c3437056SNickeau        return json_encode($this->jsonArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
133c3437056SNickeau    }
134c3437056SNickeau
135c3437056SNickeau    /**
136c3437056SNickeau     * @return array|null
137c3437056SNickeau     */
138c3437056SNickeau    private
139c3437056SNickeau    function getJsonArray(): ?array
140c3437056SNickeau    {
141c3437056SNickeau        return $this->jsonArray;
142c3437056SNickeau    }
143c3437056SNickeau
144c3437056SNickeau    public
145c3437056SNickeau    function toMinifiedJsonString()
146c3437056SNickeau    {
147c3437056SNickeau        return json_encode($this->jsonArray);
148c3437056SNickeau    }
149c3437056SNickeau
150c3437056SNickeau
1511fa8c418SNickeau}
152