CSS-Sass
view release on metacpan or search on metacpan
libsass/prelexer.cpp view on Meta::CPAN
return sequence< one_plus< sequence< zero_plus< alternatives< identifier, exactly<'-'> > >,
interpolant,
zero_plus< alternatives< identifier, number, exactly<'-'> > > > >,
negate< exactly<'%'> > >(src);
}
// interpolants can be recursive/nested
const char* interpolant(const char* src) {
return recursive_scopes< exactly<hash_lbrace>, exactly<rbrace> >(src);
}
// $re_squote = /'(?:$re_itplnt|\\.|[^'])*'/
const char* single_quoted_string(const char* src) {
// match a single quoted string, while skipping interpolants
return sequence <
exactly <'\''>,
zero_plus <
alternatives <
// skip all escaped chars first
escape_seq,
// skip interpolants
interpolant,
// skip non delimiters
any_char_but < '\'' >
>
>,
exactly <'\''>
>(src);
}
// $re_dquote = /"(?:$re_itp|\\.|[^"])*"/
const char* double_quoted_string(const char* src) {
// match a single quoted string, while skipping interpolants
return sequence <
exactly <'"'>,
zero_plus <
alternatives <
// skip all escaped chars first
escape_seq,
// skip interpolants
interpolant,
// skip non delimiters
any_char_but < '"' >
>
>,
exactly <'"'>
>(src);
}
// $re_quoted = /(?:$re_squote|$re_dquote)/
const char* quoted_string(const char* src) {
// match a quoted string, while skipping interpolants
return alternatives<
single_quoted_string,
double_quoted_string
>(src);
}
const char* value_schema(const char* src) {
// follows this pattern: ([xyz]*i[xyz]*)+
return one_plus< sequence< zero_plus< alternatives< identifier, percentage, dimension, hex, number, quoted_string > >,
interpolant,
zero_plus< alternatives< identifier, percentage, dimension, hex, number, quoted_string, exactly<'%'> > > > >(src);
}
/* not used anymore - remove?
const char* filename(const char* src) {
return one_plus< alternatives< identifier, number, exactly<'.'> > >(src);
}
*/
// Match CSS '@' keywords.
const char* at_keyword(const char* src) {
return sequence<exactly<'@'>, identifier>(src);
}
const char* kwd_sel_deep(const char* src) {
return word<sel_deep_kwd>(src);
}
const char* kwd_import(const char* src) {
return word<import_kwd>(src);
}
const char* kwd_at_root(const char* src) {
return word<at_root_kwd>(src);
}
const char* kwd_with_directive(const char* src) {
return word<with_kwd>(src);
}
const char* kwd_without_directive(const char* src) {
return word<without_kwd>(src);
}
const char* kwd_media(const char* src) {
return word<media_kwd>(src);
}
const char* kwd_supports(const char* src) {
return word<supports_kwd>(src);
}
const char* kwd_mixin(const char* src) {
return word<mixin_kwd>(src);
}
const char* kwd_function(const char* src) {
return word<function_kwd>(src);
}
const char* kwd_return_directive(const char* src) {
return word<return_kwd>(src);
}
const char* kwd_include(const char* src) {
return word<include_kwd>(src);
}
const char* kwd_content(const char* src) {
return word<content_kwd>(src);
}
libsass/prelexer.cpp view on Meta::CPAN
const char* namespace_prefix(const char* src) {
return sequence< optional< alternatives< identifier, exactly<'*'> > >,
exactly<'|'> >(src);
}
const char* type_selector(const char* src) {
return sequence< optional<namespace_prefix>, identifier>(src);
}
const char* hyphens_and_identifier(const char* src) {
return sequence< zero_plus< exactly< '-' > >, identifier >(src);
}
const char* hyphens_and_name(const char* src) {
return sequence< zero_plus< exactly< '-' > >, name >(src);
}
const char* universal(const char* src) {
return sequence< optional<namespace_prefix>, exactly<'*'> >(src);
}
// Match CSS id names.
const char* id_name(const char* src) {
return sequence<exactly<'#'>, name>(src);
}
// Match CSS class names.
const char* class_name(const char* src) {
return sequence<exactly<'.'>, identifier>(src);
}
// Attribute name in an attribute selector.
const char* attribute_name(const char* src) {
return alternatives< sequence< optional<namespace_prefix>, identifier>,
identifier >(src);
}
// match placeholder selectors
const char* placeholder(const char* src) {
return sequence<exactly<'%'>, identifier>(src);
}
// Match CSS numeric constants.
const char* sign(const char* src) {
return class_char<sign_chars>(src);
}
const char* unsigned_number(const char* src) {
return alternatives<sequence< zero_plus<digits>,
exactly<'.'>,
one_plus<digits> >,
digits>(src);
}
const char* number(const char* src) {
return sequence< optional<sign>, unsigned_number>(src);
}
const char* coefficient(const char* src) {
return alternatives< sequence< optional<sign>, digits >,
sign >(src);
}
const char* binomial(const char* src) {
return sequence< optional<sign>,
optional<digits>,
exactly<'n'>,
zero_plus < space >,
sign,
zero_plus < space >,
digits >(src);
}
const char* percentage(const char* src) {
return sequence< number, exactly<'%'> >(src);
}
const char* ampersand(const char* src) {
return exactly<'&'>(src);
}
/* not used anymore - remove?
const char* em(const char* src) {
return sequence< number, exactly<em_kwd> >(src);
} */
const char* dimension(const char* src) {
return sequence<number, one_plus< alpha > >(src);
}
const char* hex(const char* src) {
const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
ptrdiff_t len = p - src;
return (len != 4 && len != 7) ? 0 : p;
}
const char* hexa(const char* src) {
const char* p = sequence< exactly<'#'>, one_plus<xdigit> >(src);
ptrdiff_t len = p - src;
return (len != 4 && len != 7 && len != 9) ? 0 : p;
}
const char* hex0(const char* src) {
const char* p = sequence< exactly<'0'>, exactly<'x'>, one_plus<xdigit> >(src);
ptrdiff_t len = p - src;
return (len != 5 && len != 8) ? 0 : p;
}
/* no longer used - remove?
const char* rgb_prefix(const char* src) {
return word<rgb_kwd>(src);
}*/
// Match CSS uri specifiers.
const char* uri_prefix(const char* src) {
return exactly<url_kwd>(src);
}
const char* uri_value(const char* src)
{
return
sequence <
negate <
exactly < '$' >
>,
zero_plus <
alternatives <
alnum,
exactly <'/'>,
class_char < uri_chars >
>
>
>(src);
}
// TODO: rename the following two functions
/* no longer used - remove?
const char* uri(const char* src) {
return sequence< exactly<url_kwd>,
optional<spaces>,
libsass/prelexer.cpp view on Meta::CPAN
if (!*p) {
return 0;
}
else if (!inside_str && (*p == '"' || *p == '\'')) {
inside_str = *p;
}
else if (*p == inside_str && *(p-1) != '\\') {
inside_str = 0;
}
else if (*p == '(' && !inside_str) {
++depth;
}
else if (*p == ')' && !inside_str) {
if (depth == 0) return p;
else --depth;
}
++p;
}
// unreachable
return 0;
}
*/
// follow the CSS spec more closely and see if this helps us scan URLs correctly
/* not used anymore - remove?
const char* NL(const char* src) {
return alternatives< exactly<'\n'>,
sequence< exactly<'\r'>, exactly<'\n'> >,
exactly<'\r'>,
exactly<'\f'> >(src);
}*/
/* not used anymore - remove?
const char* H(const char* src) {
return std::isxdigit(*src) ? src+1 : 0;
}*/
/* not used anymore - remove?
const char* unicode(const char* src) {
return sequence< exactly<'\\'>,
between<H, 1, 6>,
optional< class_char<url_space_chars> > >(src);
}*/
/* not used anymore - remove?
const char* ESCAPE(const char* src) {
return alternatives< unicode, class_char<escape_chars> >(src);
}*/
const char* static_string(const char* src) {
const char* pos = src;
const char * s = quoted_string(pos);
Token t(pos, s);
const unsigned int p = count_interval< interpolant >(t.begin, t.end);
return (p == 0) ? t.end : 0;
}
const char* static_component(const char* src) {
return alternatives< identifier,
static_string,
percentage,
hex,
number,
sequence< exactly<'!'>, word<important_kwd> >
>(src);
}
const char* static_value(const char* src) {
return sequence< sequence<
static_component,
zero_plus< identifier >
>,
zero_plus < sequence<
alternatives<
sequence< optional_spaces, alternatives<
exactly < '/' >,
exactly < ',' >,
exactly < ' ' >
>, optional_spaces >,
spaces
>,
static_component
> >,
optional_css_whitespace,
alternatives< exactly<';'>, exactly<'}'> >
>(src);
}
}
}
( run in 0.540 second using v1.01-cache-2.11-cpan-39bf76dae61 )