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