55 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Picea\Extension;
 | |
| 
 | |
| use Picea\Compiler\Context;
 | |
| 
 | |
| class JsonExtension implements Extension, FunctionExtension {
 | |
| 
 | |
|     public array $token = [ "json", "json.pretty", "json.html" ];
 | |
|     
 | |
|     public int $flags =  JSON_HEX_TAG | \JSON_HEX_QUOT | \JSON_THROW_ON_ERROR | \JSON_UNESCAPED_UNICODE;
 | |
|    
 | |
|     public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token)
 | |
|     {
 | |
|         $flag = $this->flags;
 | |
| 
 | |
|         switch ($token) {
 | |
|             case "json.pretty":
 | |
|                 $flag |= \JSON_PRETTY_PRINT;
 | |
|                 break;
 | |
| 
 | |
|             case "json.html":
 | |
|                 return "<?php echo htmlentities(json_encode($arguments, {$this->flags}), ENT_QUOTES, 'UTF-8') ?>";
 | |
|         }
 | |
| 
 | |
|         $cls = static::class;
 | |
| 
 | |
|         return "<?php echo json_encode(\\$cls::utf8($arguments), $flag) ?>";
 | |
|     }
 | |
| 
 | |
|     public function exportFunctions(): array
 | |
|     {
 | |
|         return [
 | |
|             'json' => function($arguments, ? int $flags = null) {
 | |
|                 return json_encode($arguments, \JSON_FORCE_OBJECT);
 | |
|             },
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public static function utf8($src) {
 | |
| 
 | |
|         if (is_array($src)) {
 | |
|             foreach ($src as $key => $value) {
 | |
|                 $src[$key] = static::utf8($value);
 | |
|             }
 | |
|         }
 | |
|         elseif (is_string($src)) {
 | |
|             return mb_convert_encoding($src, "UTF-8", "UTF-8");
 | |
|         }
 | |
| 
 | |
|         return $src;
 | |
|     }
 | |
| 
 | |
| }
 |