CSS-Sass
view release on metacpan or search on metacpan
libsass/sass2scss.cpp view on Meta::CPAN
if (!(
// strip css and src comments if option is set
(IS_COMMENT(converter) && STRIP_COMMENT(converter)) ||
// strip src comment even if strip option is not set
// but only if the keep src comment option is not set
(IS_SRC_COMMENT(converter) && ! KEEP_COMMENT(converter))
))
{
// flush data and buffer whitespace
scss += flush(sass, converter);
}
// get postion of last meaningfull char
size_t pos_right = sass.find_last_not_of(SASS2SCSS_FIND_WHITESPACE);
// check for invalid result
if (pos_right != string::npos)
{
// get the last meaningfull char
string close = sass.substr(pos_right, 1);
// check if next line should be concatenated (list mode)
converter.comma = IS_PARSING(converter) && close == ",";
converter.semicolon = IS_PARSING(converter) && close == ";";
// check if we have more than
// one meaningfull char
if (pos_right > 0)
{
// get the last two chars from string
string close = sass.substr(pos_right - 1, 2);
// update parser status for expicitly closed comment
if (close == "*/") converter.comment = "";
}
}
// EO have meaningfull chars from end
}
// EO have meaningfull chars from start
// return scss
return scss;
}
// EO process
// read line with either CR, LF or CR LF format
// http://stackoverflow.com/a/6089413/1550314
static std::istream& safeGetline(std::istream& is, std::string& t)
{
t.clear();
// The characters in the stream are read one-by-one using a std::streambuf.
// That is faster than reading them one-by-one using the std::istream.
// Code that uses streambuf this way must be guarded by a sentry object.
// The sentry object performs various tasks,
// such as thread synchronization and updating the stream state.
std::istream::sentry se(is, true);
std::streambuf* sb = is.rdbuf();
for(;;) {
int c = sb->sbumpc();
switch (c) {
case '\n':
return is;
case '\r':
if(sb->sgetc() == '\n')
sb->sbumpc();
return is;
case EOF:
// Also handle the case when the last line has no line ending
if(t.empty())
is.setstate(std::ios::eofbit);
return is;
default:
t += (char)c;
}
}
}
// the main converter function for c++
char* sass2scss (const string sass, const int options)
{
// local variables
string line;
string scss = "";
stringstream stream(sass);
// create converter variable
converter converter;
// initialise all options
converter.comma = false;
converter.property = false;
converter.selector = false;
converter.semicolon = false;
converter.end_of_file = false;
converter.comment = "";
converter.whitespace = "";
converter.indents.push("");
converter.options = options;
// read line by line and process them
while(safeGetline(stream, line) && !stream.eof())
{ scss += process(line, converter); }
// create mutable string
string closer = "";
// set the end of file flag
converter.end_of_file = true;
// process to close all open blocks
scss += process(closer, converter);
// allocate new memory on the heap
// caller has to free it after use
char * cstr = (char*) malloc (scss.length() + 1);
( run in 0.824 second using v1.01-cache-2.11-cpan-39bf76dae61 )