118 lines
2.7 KiB
TypeScript
118 lines
2.7 KiB
TypeScript
![]() |
import { ExtendedRegex } from "../text/ExtendedRegex";
|
||
|
import { TemplateSource } from "./TemplateSource";
|
||
|
import { TemplatesSourceLexer } from "./TemplatesSourceLexer";
|
||
|
|
||
|
export enum TemplateMatchType
|
||
|
{
|
||
|
SPECIAL,
|
||
|
SELECTOR,
|
||
|
ATTRIBUTE,
|
||
|
PASS_THROUGH
|
||
|
}
|
||
|
|
||
|
export class TemplateSourceMatchers
|
||
|
{
|
||
|
static readonly regex = ExtendedRegex.create(
|
||
|
/@\{(\P):(\V)\}\[(\P)\]|@\{(\V)\}\[(\P)\]|@\{(\P):(\V)\}|@\{(\V)\}|@\[(\P)\]|(@\{\})/g
|
||
|
);
|
||
|
|
||
|
|
||
|
static readonly matchers =
|
||
|
[
|
||
|
{
|
||
|
type:
|
||
|
TemplatesSourceLexer.SPECIAL_SELECTOR_AND_ATTRIBUTE,
|
||
|
values:
|
||
|
[ TemplateMatchType.SPECIAL, TemplateMatchType.SELECTOR, TemplateMatchType.ATTRIBUTE ]
|
||
|
},
|
||
|
|
||
|
{
|
||
|
type:
|
||
|
TemplatesSourceLexer.SELECTOR_AND_ATTRIBUTE,
|
||
|
values:
|
||
|
[ TemplateMatchType.SELECTOR, TemplateMatchType.ATTRIBUTE ]
|
||
|
},
|
||
|
|
||
|
{
|
||
|
type:
|
||
|
TemplatesSourceLexer.SPECIAL_SELECTOR,
|
||
|
values:
|
||
|
[ TemplateMatchType.SPECIAL, TemplateMatchType.SELECTOR ]
|
||
|
},
|
||
|
|
||
|
{
|
||
|
type:
|
||
|
TemplatesSourceLexer.SELECTOR,
|
||
|
values:
|
||
|
[ TemplateMatchType.SELECTOR ]
|
||
|
},
|
||
|
|
||
|
{
|
||
|
type:
|
||
|
TemplatesSourceLexer.ATTRIBUTE,
|
||
|
values:
|
||
|
[ TemplateMatchType.ATTRIBUTE ]
|
||
|
},
|
||
|
|
||
|
{
|
||
|
type:
|
||
|
TemplatesSourceLexer.PASS_THROUGH,
|
||
|
values:
|
||
|
[ TemplateMatchType.PASS_THROUGH ]
|
||
|
}
|
||
|
];
|
||
|
|
||
|
static createTemplateSource( match:RegExpExecArray )
|
||
|
{
|
||
|
let elementSource = new TemplateSource();
|
||
|
|
||
|
var offset = 1;
|
||
|
|
||
|
if ( match == null || offset > match.length )
|
||
|
{
|
||
|
elementSource.defaultValue = "";
|
||
|
console.log( "No matching value >> ", match );
|
||
|
return elementSource;
|
||
|
}
|
||
|
|
||
|
for ( let i = 0; i < this.matchers.length; i++ )
|
||
|
{
|
||
|
let matcher = this.matchers[ i ];
|
||
|
|
||
|
if ( ! match[ offset ] )
|
||
|
{
|
||
|
offset += matcher.values.length;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
let matchValuesOffset = offset;
|
||
|
|
||
|
for ( let j = 0; j < matcher.values.length; j++ )
|
||
|
{
|
||
|
let value = matcher.values[ j ];
|
||
|
let valueOffset = matchValuesOffset + j;
|
||
|
|
||
|
if ( TemplateMatchType.SPECIAL === value )
|
||
|
{
|
||
|
elementSource.special = match[ valueOffset ];
|
||
|
}
|
||
|
else if ( TemplateMatchType.SELECTOR === value )
|
||
|
{
|
||
|
elementSource.selector = match[ valueOffset ];
|
||
|
}
|
||
|
else if ( TemplateMatchType.ATTRIBUTE === value )
|
||
|
{
|
||
|
elementSource.attribute = match[ valueOffset ];
|
||
|
}
|
||
|
else if ( TemplateMatchType.PASS_THROUGH === value )
|
||
|
{
|
||
|
elementSource.innerHTML = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return elementSource;
|
||
|
}
|
||
|
|
||
|
return elementSource;
|
||
|
}
|
||
|
}
|