CSS-Sass
view release on metacpan or search on metacpan
libsass/inspect.cpp view on Meta::CPAN
// helper function for serializing colors
template <size_t range>
static double cap_channel(double c) {
if (c > range) return range;
else if (c < 0) return 0;
else return c;
}
void Inspect::operator()(Color* c)
{
stringstream ss;
// check if we prefer short hex colors
bool want_short = output_style() == COMPRESSED;
// original color name
// maybe an unknown token
string name = c->disp();
// resolved color
string res_name = name;
double r = round(cap_channel<0xff>(c->r()));
double g = round(cap_channel<0xff>(c->g()));
double b = round(cap_channel<0xff>(c->b()));
double a = cap_channel<1> (c->a());
// get color from given name (if one was given at all)
if (name != "" && ctx && ctx->names_to_colors.count(name)) {
Color* n = ctx->names_to_colors[name];
r = round(cap_channel<0xff>(n->r()));
g = round(cap_channel<0xff>(n->g()));
b = round(cap_channel<0xff>(n->b()));
a = cap_channel<1> (n->a());
}
// otherwise get the possible resolved color name
else {
int numval = static_cast<int>(r) * 0x10000 + static_cast<int>(g) * 0x100 + static_cast<int>(b);
if (ctx && ctx->colors_to_names.count(numval))
res_name = ctx->colors_to_names[numval];
}
stringstream hexlet;
hexlet << '#' << setw(1) << setfill('0');
// create a short color hexlet if there is any need for it
if (want_short && is_color_doublet(r, g, b) && a == 1) {
hexlet << hex << setw(1) << (static_cast<unsigned long>(r) >> 4);
hexlet << hex << setw(1) << (static_cast<unsigned long>(g) >> 4);
hexlet << hex << setw(1) << (static_cast<unsigned long>(b) >> 4);
} else {
hexlet << hex << setw(2) << static_cast<unsigned long>(r);
hexlet << hex << setw(2) << static_cast<unsigned long>(g);
hexlet << hex << setw(2) << static_cast<unsigned long>(b);
}
// retain the originally specified color definition if unchanged
if (name != "") {
ss << name;
}
else if (r == 0 && g == 0 && b == 0 && a == 0) {
ss << "transparent";
}
else if (a >= 1) {
if (res_name != "") {
if (want_short && hexlet.str().size() < res_name.size()) {
ss << hexlet.str();
} else {
ss << res_name;
}
}
else {
ss << hexlet.str();
}
}
else {
ss << "rgba(";
ss << static_cast<unsigned long>(r) << ",";
if (output_style() != COMPRESSED) ss << " ";
ss << static_cast<unsigned long>(g) << ",";
if (output_style() != COMPRESSED) ss << " ";
ss << static_cast<unsigned long>(b) << ",";
if (output_style() != COMPRESSED) ss << " ";
ss << a << ')';
}
append_token(ss.str(), c);
}
void Inspect::operator()(Boolean* b)
{
append_token(b->value() ? "true" : "false", b);
}
void Inspect::operator()(String_Schema* ss)
{
// Evaluation should turn these into String_Constants, so this method is
// only for inspection purposes.
for (size_t i = 0, L = ss->length(); i < L; ++i) {
if ((*ss)[i]->is_interpolant()) append_string("#{");
(*ss)[i]->perform(this);
if ((*ss)[i]->is_interpolant()) append_string("}");
}
}
void Inspect::operator()(String_Constant* s)
{
if (String_Quoted* quoted = dynamic_cast<String_Quoted*>(s)) {
return Inspect::operator()(quoted);
}
append_token(s->value(), s);
}
void Inspect::operator()(String_Quoted* s)
{
if (s->quote_mark()) {
append_token(quote(s->value(), s->quote_mark()), s);
} else {
append_token(s->value(), s);
}
}
void Inspect::operator()(Feature_Query* fq)
( run in 0.850 second using v1.01-cache-2.11-cpan-39bf76dae61 )