CSS-Sass
view release on metacpan or search on metacpan
libsass/prelexer.cpp view on Meta::CPAN
// Match a line comment (/.*?(?=\n|\r\n?|\Z)/.
const char* line_comment(const char* src)
{
return sequence<
exactly <
slash_slash
>,
non_greedy<
any_char,
end_of_line
>
>(src);
}
// Match a block comment.
const char* block_comment(const char* src)
{
return sequence<
zero_plus < space >,
delimited_by<slash_star, star_slash, false> >(src);
}
/* not use anymore - remove?
const char* block_comment_prefix(const char* src) {
return exactly<slash_star>(src);
}
// Match either comment.
const char* comment(const char* src) {
return line_comment(src);
}
*/
// Match zero plus white-space or line_comments
const char* optional_css_whitespace(const char* src) {
return zero_plus< alternatives<spaces, line_comment> >(src);
}
const char* css_whitespace(const char* src) {
return one_plus< alternatives<spaces, line_comment> >(src);
}
// Match optional_css_whitepace plus block_comments
const char* optional_css_comments(const char* src) {
return zero_plus< alternatives<spaces, line_comment, block_comment> >(src);
}
const char* css_comments(const char* src) {
return one_plus< alternatives<spaces, line_comment, block_comment> >(src);
}
// Match one backslash escaped char /\\./
const char* escape_seq(const char* src)
{
return sequence<
exactly<'\\'>,
any_char
>(src);
}
// Match identifier start
const char* identifier_alpha(const char* src)
{
return alternatives<
alpha,
unicode,
exactly<'-'>,
exactly<'_'>,
escape_seq
>(src);
}
// Match identifier after start
const char* identifier_alnum(const char* src)
{
return alternatives<
alnum,
unicode,
exactly<'-'>,
exactly<'_'>,
escape_seq
>(src);
}
// Match CSS identifiers.
const char* identifier(const char* src)
{
return sequence<
zero_plus< exactly<'-'> >,
one_plus < identifier_alpha >,
zero_plus < identifier_alnum >
// word_boundary not needed
>(src);
}
const char* identifier_alnums(const char* src)
{
return one_plus< identifier_alnum >(src);
}
// Match number prefix ([\+\-]+)
const char* number_prefix(const char* src) {
return alternatives <
exactly < '+' >,
sequence <
exactly < '-' >,
optional_css_whitespace,
exactly< '-' >
>
>(src);
}
// Match interpolant schemas
const char* identifier_schema(const char* src) {
// follows this pattern: (x*ix*)+ ... well, not quite
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
libsass/prelexer.cpp view on Meta::CPAN
optional_css_whitespace,
exactly<'='>,
optional_css_whitespace,
alternatives< variable, identifier_schema, identifier, quoted_string, number, hexa >
>(src);
}
// Path matching functions.
/* not used anymore - remove?
const char* folder(const char* src) {
return sequence< zero_plus< any_char_except<'/'> >,
exactly<'/'> >(src);
}
const char* folders(const char* src) {
return zero_plus< folder >(src);
}*/
/* not used anymore - remove?
const char* chunk(const char* src) {
char inside_str = 0;
const char* p = src;
size_t depth = 0;
while (true) {
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.443 second using v1.01-cache-2.11-cpan-39bf76dae61 )