Compare commits

..

2 Commits

Author SHA1 Message Date
Pavel Shevaev a0a3183312 Fixing autoloading 2022-05-16 15:45:40 +03:00
Pavel Shevaev ef8bd66f20 Fixing autoloading 2022-05-16 15:37:21 +03:00
7 changed files with 32 additions and 158 deletions

View File

@ -1,29 +0,0 @@
name: Publish PHP Package
on:
push:
tags:
- 'v*'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Get tag name
run: echo "TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: zip and send
run: |
ls -la
apt-get update -y
apt-get install -y zip
cd ../
zip -r ${{ gitea.event.repository.name }}.zip ${{ gitea.event.repository.name }} -x '*.git*'
curl -v \
--user composer-pbl:${{ secrets.COMPOSER_PSWD }} \
--upload-file ${{ gitea.event.repository.name }}.zip \
https://git.bit5.ru/api/packages/bit/composer?version=${{ env.TAG }}

1
.gitignore vendored
View File

@ -1 +0,0 @@
tags

View File

@ -1,8 +0,0 @@
## v1.0.8
- Parse number as floating-point if it doesn't fit in integer; trying hard to
use integer when possible though to not lose precision
## v1.0.7
- Removing slashes which escape quotes inside strings

View File

@ -1,63 +0,0 @@
# PHP JZON #
This is a small PHP library for parsing JZON documents.
## What is JZON? ##
JZON is a *superset* of JSON which is designed to be actively edited by *humans*.
PHP JZON features:
* no need to worry about trailing commas
* one line comments starting with #
* simple array keys don't need to be quoted with ""
* parsing errors are shown in a friendly manner
### Quick Example ###
Say, you have the following JZON file example.json:
```
["foo",
"bar",
{meaning_of_life: 42,
#NOTE: no comma ahead
# and yes comments are supported!
hey: "bar"
"thatscool": 1
}
]
```
Now you can parse it this way:
```
<?php
$str = file_get_contents('example.json');
var_dump(jzon_parse($str));
```
And it should output something as follows:
```
array(3) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
array(3) {
["thatscool"]=>
int(1)
["meaning_of_life"]=>
int(42)
["hey"]=>
string(3) "bar"
}
}
```

View File

@ -6,6 +6,6 @@
"php": ">=7.4" "php": ">=7.4"
}, },
"autoload": { "autoload": {
"files": ["json.inc.php", "jzon.inc.php"] "classmap": ["jzon.inc.php", "jzon.inc.php"]
} }
} }

View File

@ -105,7 +105,7 @@ class JsonParser
/** /**
* @param string $input JSON string * @param string $input JSON string
* @return null|JsonParsingException null if no error is found, a ParsingException containing all details otherwise * @return null|ParsingException null if no error is found, a ParsingException containing all details otherwise
*/ */
public function lint($input) public function lint($input)
{ {
@ -114,13 +114,12 @@ class JsonParser
} catch (JsonParsingException $e) { } catch (JsonParsingException $e) {
return $e; return $e;
} }
return null;
} }
/** /**
* @param string $input JSON string * @param string $input JSON string
* @return mixed * @return mixed
* @throws JsonParsingException * @throws ParsingException
*/ */
public function parse($input, $flags = 0) public function parse($input, $flags = 0)
{ {
@ -290,7 +289,7 @@ class JsonParser
'first_column' => $this->lstack[count($this->lstack) - ($len ?: 1)]['first_column'], 'first_column' => $this->lstack[count($this->lstack) - ($len ?: 1)]['first_column'],
'last_column' => $this->lstack[count($this->lstack) - 1]['last_column'], 'last_column' => $this->lstack[count($this->lstack) - 1]['last_column'],
); );
$r = $this->performAction($yyval, $yytext, $yyleng, $yylineno, $action[1], $this->vstack); $r = $this->performAction($yyval, $yytext, $yyleng, $yylineno, $action[1], $this->vstack, $this->lstack);
if (!$r instanceof JsonUndefined) { if (!$r instanceof JsonUndefined) {
return $r; return $r;
@ -312,6 +311,8 @@ class JsonParser
return true; return true;
} }
} }
return true;
} }
protected function parseError($str, $hash) protected function parseError($str, $hash)
@ -663,6 +664,7 @@ class JsonLexer
break; break;
case 1: case 1:
return 6; return 6;
break;
case 2: case 2:
$this->yytext = substr($this->yytext, 1, $this->yyleng-2); $this->yytext = substr($this->yytext, 1, $this->yyleng-2);

View File

@ -6,44 +6,29 @@ if(!defined('JZON_VERSION'))
define('JZON_EXT_VERSION', phpversion('jzon')); define('JZON_EXT_VERSION', phpversion('jzon'));
} }
function jzon_show_position(int $p, string $in, int $context_lines = 5) : string function jzon_show_position($p, $in, $context_chars)
{ {
$out = array(); $pre = str_replace("\n", '', jzon_get_past_input($p, $in, $context_chars));
$lines = explode("\n", $in); $c = str_repeat('-', max(0, strlen($pre) - 1));
foreach($lines as $line_idx => $line)
{
//normalizing tabs by converting them to spaces
$out[] = str_replace("\t", " ", $line);
$left = $p - (strlen($line) + 1/*taking into account \n*/);
if($left <= 0)
{
$arrow = '';
//let's take into account tabs
for($i=0;$i<$p;++$i)
$arrow .= ($line[$i] === "\t" ? '----' : '-');
$arrow .= '^';
$out[] = $arrow; return $pre . str_replace("\n", '', jzon_get_upcoming_input($p, $in, $context_chars)) . "\n" . $c . "^";
break;
} }
$p = $left;
function jzon_get_past_input($c, $in, $context_chars)
{
$past = substr($in, 0, $c+1);
return (strlen($past) > $context_chars ? '...' : '') . substr($past, -$context_chars);
} }
if(count($out) > $context_lines)
$out = array_slice($out, -$context_lines);
//let's add line numbers function jzon_get_upcoming_input($c, $in, $context_chars)
end($out); {
//let's find out the maximum leading zeros for line numbers $next = substr($in, $c+1);
$fmt_num = (int)round(log10(key($out)))+1; return substr($next, 0, $context_chars) . (strlen($next) > $context_chars ? '...' : '');
foreach($out as $idx => $line)
$out[$idx] = sprintf('%0'.$fmt_num.'d', ($idx+1)) . ' ' . $line;
return implode("\n", $out);
} }
class jzonParser class jzonParser
{ {
const ERR_CONTEXT_LINES = 5; const ERR_CONTEXT_CHARS = 200;
private $in; private $in;
private $len; private $len;
@ -101,9 +86,9 @@ class jzonParser
private function _error($error) private function _error($error)
{ {
if($this->c < $this->len) if($this->c < $this->len)
throw new Exception("Parse error: $error\n" . jzon_show_position($this->c, $this->in, self::ERR_CONTEXT_LINES)); throw new Exception("Parse error: $error\n" . jzon_show_position($this->c, $this->in, self::ERR_CONTEXT_CHARS));
else else
throw new Exception("Parse error: $error\n" . jzon_show_position($this->len-1, $this->in, self::ERR_CONTEXT_LINES)); throw new Exception("Parse error: $error\n" . jzon_show_position($this->len-1, $this->in, self::ERR_CONTEXT_CHARS));
} }
private function skip_whitespace() private function skip_whitespace()
@ -264,9 +249,7 @@ class jzonParser
{ {
$end = $this->c; $end = $this->c;
++$this->c; ++$this->c;
$str = substr($this->in, $start, $end - $start); return substr($this->in, $start, $end - $start);
//let's remove escape slashes before "
return str_replace('\\"', '"', $str);
} }
$prev = $this->in[$this->c]; $prev = $this->in[$this->c];
++$this->c; ++$this->c;
@ -307,17 +290,10 @@ class jzonParser
++$this->c; ++$this->c;
} }
$str_num = substr($this->in, $start, $this->c - $start);
$fval = floatval($str_num);
$ival = intval($str_num);
if($is_float) if($is_float)
$out = $fval; $out = 1*substr($this->in, $start, $this->c - $start);
else if(($ival < PHP_INT_MAX && $ival > PHP_INT_MIN) || strval($ival) === $str_num)
$out = $ival;
else else
$out = $fval; $out = (int)(1*substr($this->in, $start, $this->c - $start));
} }
private function parse_true(&$out) private function parse_true(&$out)
@ -352,31 +328,28 @@ class jzonParser
else else
$this->_error("'null' expected"); $this->_error("'null' expected");
} }
} }
function jzon_parse($str, ?int &$parser = null) : array function jzon_parse($str)
{ {
//NOTE: using super fast built-in implementation and making a gracefull fallback to a slower and //NOTE: using super fast built-in implementation and making a gracefull fallback to a slower and
// more relaxed implementation // more relaxed implementation
$parser = 1;
$res = json_decode($str, true); $res = json_decode($str, true);
if(is_array($res)) if(is_array($res))
return $res; return $res;
//NOTE: only allowing extension implementation if versions match //NOTE: only allowing extension implementation if versions match
if(defined('JZON_EXT_VERSION') && JZON_EXT_VERSION === JZON_VERSION) if(JZON_EXT_VERSION === JZON_VERSION)
{ {
$parser = 2;
list($ok, $err, $err_pos, $res) = jzon_parse_c($str); list($ok, $err, $err_pos, $res) = jzon_parse_c($str);
if(!$ok) if(!$ok)
throw new Exception($err . "\n" . jzon_show_position($err_pos, $str, jzonParser::ERR_CONTEXT_LINES)); throw new Exception($err . "\n" . jzon_show_position($err_pos, $str, jzonParser::ERR_CONTEXT_CHARS));
return $res; return $res;
} }
else else
{ {
$parser = 3;
$p = new jzonParser($str); $p = new jzonParser($str);
$res = $p->parse(); return $p->parse();
return $res;
} }
} }