mirror of
https://gitlab.com/signalytic/client-external/streamline/streamline-emr.git
synced 2026-09-13 03:31:31 +00:00
Import latest app updates from streamline
An updated set of source files and initialization was provided by streamline to address issues observed during initial testing. These files have been updated in order to generate a new set of app images.
This commit is contained in:
@@ -1,5 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
class Exception extends \Exception {
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
class NamespaceUri {
|
||||
|
||||
/** @var string */
|
||||
private $value;
|
||||
|
||||
public function __construct(string $value) {
|
||||
$this->ensureValidUri($value);
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
public function asString(): string {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
private function ensureValidUri($value): void {
|
||||
if (\strpos($value, ':') === false) {
|
||||
throw new NamespaceUriException(
|
||||
\sprintf("Namespace URI '%s' must contain at least one colon", $value)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
class NamespaceUriException extends Exception {
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
class Token {
|
||||
|
||||
/** @var int */
|
||||
private $line;
|
||||
|
||||
/** @var string */
|
||||
private $name;
|
||||
|
||||
/** @var string */
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* Token constructor.
|
||||
*/
|
||||
public function __construct(int $line, string $name, string $value) {
|
||||
$this->line = $line;
|
||||
$this->name = $name;
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
public function getLine(): int {
|
||||
return $this->line;
|
||||
}
|
||||
|
||||
public function getName(): string {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function getValue(): string {
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
class TokenCollection implements \ArrayAccess, \Iterator, \Countable {
|
||||
|
||||
/** @var Token[] */
|
||||
private $tokens = [];
|
||||
|
||||
/** @var int */
|
||||
private $pos;
|
||||
|
||||
public function addToken(Token $token): void {
|
||||
$this->tokens[] = $token;
|
||||
}
|
||||
|
||||
public function current(): Token {
|
||||
return \current($this->tokens);
|
||||
}
|
||||
|
||||
public function key(): int {
|
||||
return \key($this->tokens);
|
||||
}
|
||||
|
||||
public function next(): void {
|
||||
\next($this->tokens);
|
||||
$this->pos++;
|
||||
}
|
||||
|
||||
public function valid(): bool {
|
||||
return $this->count() > $this->pos;
|
||||
}
|
||||
|
||||
public function rewind(): void {
|
||||
\reset($this->tokens);
|
||||
$this->pos = 0;
|
||||
}
|
||||
|
||||
public function count(): int {
|
||||
return \count($this->tokens);
|
||||
}
|
||||
|
||||
public function offsetExists($offset): bool {
|
||||
return isset($this->tokens[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws TokenCollectionException
|
||||
*/
|
||||
public function offsetGet($offset): Token {
|
||||
if (!$this->offsetExists($offset)) {
|
||||
throw new TokenCollectionException(
|
||||
\sprintf('No Token at offest %s', $offset)
|
||||
);
|
||||
}
|
||||
|
||||
return $this->tokens[$offset];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Token $value
|
||||
*
|
||||
* @throws TokenCollectionException
|
||||
*/
|
||||
public function offsetSet($offset, $value): void {
|
||||
if (!\is_int($offset)) {
|
||||
$type = \gettype($offset);
|
||||
|
||||
throw new TokenCollectionException(
|
||||
\sprintf(
|
||||
'Offset must be of type integer, %s given',
|
||||
$type === 'object' ? \get_class($value) : $type
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (!$value instanceof Token) {
|
||||
$type = \gettype($value);
|
||||
|
||||
throw new TokenCollectionException(
|
||||
\sprintf(
|
||||
'Value must be of type %s, %s given',
|
||||
Token::class,
|
||||
$type === 'object' ? \get_class($value) : $type
|
||||
)
|
||||
);
|
||||
}
|
||||
$this->tokens[$offset] = $value;
|
||||
}
|
||||
|
||||
public function offsetUnset($offset): void {
|
||||
unset($this->tokens[$offset]);
|
||||
}
|
||||
}
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
class TokenCollectionException extends Exception {
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
use function var_dump;
|
||||
|
||||
class Tokenizer {
|
||||
|
||||
/**
|
||||
* Token Map for "non-tokens"
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $map = [
|
||||
'(' => 'T_OPEN_BRACKET',
|
||||
')' => 'T_CLOSE_BRACKET',
|
||||
'[' => 'T_OPEN_SQUARE',
|
||||
']' => 'T_CLOSE_SQUARE',
|
||||
'{' => 'T_OPEN_CURLY',
|
||||
'}' => 'T_CLOSE_CURLY',
|
||||
';' => 'T_SEMICOLON',
|
||||
'.' => 'T_DOT',
|
||||
',' => 'T_COMMA',
|
||||
'=' => 'T_EQUAL',
|
||||
'<' => 'T_LT',
|
||||
'>' => 'T_GT',
|
||||
'+' => 'T_PLUS',
|
||||
'-' => 'T_MINUS',
|
||||
'*' => 'T_MULT',
|
||||
'/' => 'T_DIV',
|
||||
'?' => 'T_QUESTION_MARK',
|
||||
'!' => 'T_EXCLAMATION_MARK',
|
||||
':' => 'T_COLON',
|
||||
'"' => 'T_DOUBLE_QUOTES',
|
||||
'@' => 'T_AT',
|
||||
'&' => 'T_AMPERSAND',
|
||||
'%' => 'T_PERCENT',
|
||||
'|' => 'T_PIPE',
|
||||
'$' => 'T_DOLLAR',
|
||||
'^' => 'T_CARET',
|
||||
'~' => 'T_TILDE',
|
||||
'`' => 'T_BACKTICK'
|
||||
];
|
||||
|
||||
public function parse(string $source): TokenCollection {
|
||||
$result = new TokenCollection();
|
||||
|
||||
if ($source === '') {
|
||||
return $result;
|
||||
}
|
||||
|
||||
$tokens = \token_get_all($source);
|
||||
|
||||
$lastToken = new Token(
|
||||
$tokens[0][2],
|
||||
'Placeholder',
|
||||
''
|
||||
);
|
||||
|
||||
foreach ($tokens as $pos => $tok) {
|
||||
if (\is_string($tok)) {
|
||||
$token = new Token(
|
||||
$lastToken->getLine(),
|
||||
$this->map[$tok],
|
||||
$tok
|
||||
);
|
||||
$result->addToken($token);
|
||||
$lastToken = $token;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$line = $tok[2];
|
||||
$values = \preg_split('/\R+/Uu', $tok[1]);
|
||||
|
||||
if (!$values) {
|
||||
$result->addToken(
|
||||
new Token(
|
||||
$line,
|
||||
\token_name($tok[0]),
|
||||
'{binary data}'
|
||||
)
|
||||
);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($values as $v) {
|
||||
$token = new Token(
|
||||
$line,
|
||||
\token_name($tok[0]),
|
||||
$v
|
||||
);
|
||||
$lastToken = $token;
|
||||
$line++;
|
||||
|
||||
if ($v === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$result->addToken($token);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->fillBlanks($result, $lastToken->getLine());
|
||||
}
|
||||
|
||||
private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection {
|
||||
$prev = new Token(
|
||||
0,
|
||||
'Placeholder',
|
||||
''
|
||||
);
|
||||
|
||||
$final = new TokenCollection();
|
||||
|
||||
foreach ($tokens as $token) {
|
||||
$gap = $token->getLine() - $prev->getLine();
|
||||
|
||||
while ($gap > 1) {
|
||||
$linebreak = new Token(
|
||||
$prev->getLine() + 1,
|
||||
'T_WHITESPACE',
|
||||
''
|
||||
);
|
||||
$final->addToken($linebreak);
|
||||
$prev = $linebreak;
|
||||
$gap--;
|
||||
}
|
||||
|
||||
$final->addToken($token);
|
||||
$prev = $token;
|
||||
}
|
||||
|
||||
$gap = $maxLine - $prev->getLine();
|
||||
|
||||
while ($gap > 0) {
|
||||
$linebreak = new Token(
|
||||
$prev->getLine() + 1,
|
||||
'T_WHITESPACE',
|
||||
''
|
||||
);
|
||||
$final->addToken($linebreak);
|
||||
$prev = $linebreak;
|
||||
$gap--;
|
||||
}
|
||||
|
||||
return $final;
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
<?php declare(strict_types = 1);
|
||||
namespace TheSeer\Tokenizer;
|
||||
|
||||
use DOMDocument;
|
||||
|
||||
class XMLSerializer {
|
||||
|
||||
/** @var \XMLWriter */
|
||||
private $writer;
|
||||
|
||||
/** @var Token */
|
||||
private $previousToken;
|
||||
|
||||
/** @var NamespaceUri */
|
||||
private $xmlns;
|
||||
|
||||
/**
|
||||
* XMLSerializer constructor.
|
||||
*
|
||||
* @param NamespaceUri $xmlns
|
||||
*/
|
||||
public function __construct(NamespaceUri $xmlns = null) {
|
||||
if ($xmlns === null) {
|
||||
$xmlns = new NamespaceUri('https://github.com/theseer/tokenizer');
|
||||
}
|
||||
$this->xmlns = $xmlns;
|
||||
}
|
||||
|
||||
public function toDom(TokenCollection $tokens): DOMDocument {
|
||||
$dom = new DOMDocument();
|
||||
$dom->preserveWhiteSpace = false;
|
||||
$dom->loadXML($this->toXML($tokens));
|
||||
|
||||
return $dom;
|
||||
}
|
||||
|
||||
public function toXML(TokenCollection $tokens): string {
|
||||
$this->writer = new \XMLWriter();
|
||||
$this->writer->openMemory();
|
||||
$this->writer->setIndent(true);
|
||||
$this->writer->startDocument();
|
||||
$this->writer->startElement('source');
|
||||
$this->writer->writeAttribute('xmlns', $this->xmlns->asString());
|
||||
|
||||
if (\count($tokens) > 0) {
|
||||
$this->writer->startElement('line');
|
||||
$this->writer->writeAttribute('no', '1');
|
||||
|
||||
$this->previousToken = $tokens[0];
|
||||
|
||||
foreach ($tokens as $token) {
|
||||
$this->addToken($token);
|
||||
}
|
||||
}
|
||||
|
||||
$this->writer->endElement();
|
||||
$this->writer->endElement();
|
||||
$this->writer->endDocument();
|
||||
|
||||
return $this->writer->outputMemory();
|
||||
}
|
||||
|
||||
private function addToken(Token $token): void {
|
||||
if ($this->previousToken->getLine() < $token->getLine()) {
|
||||
$this->writer->endElement();
|
||||
|
||||
$this->writer->startElement('line');
|
||||
$this->writer->writeAttribute('no', (string)$token->getLine());
|
||||
$this->previousToken = $token;
|
||||
}
|
||||
|
||||
if ($token->getValue() !== '') {
|
||||
$this->writer->startElement('token');
|
||||
$this->writer->writeAttribute('name', $token->getName());
|
||||
$this->writer->writeRaw(\htmlspecialchars($token->getValue(), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1));
|
||||
$this->writer->endElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user