|  | 
| 4 | 4 | #include "context.hpp" | 
| 5 | 5 | #endif | 
| 6 | 6 | 
 | 
|  | 7 | +#include <string> | 
| 7 | 8 | #include <sstream> | 
| 8 | 9 | #include <cstddef> | 
|  | 10 | +#include <iomanip> | 
| 9 | 11 | 
 | 
| 10 | 12 | namespace Sass { | 
| 11 | 13 |   using std::ptrdiff_t; | 
| 12 | 14 |   SourceMap::SourceMap(const string& file) : current_position(Position(1, 1)), file(file) { } | 
| 13 | 15 | 
 | 
|  | 16 | +  // taken from http://stackoverflow.com/a/7725289/1550314 | 
|  | 17 | +  std::string encodeJsonString(const std::string& input) { | 
|  | 18 | +    std::ostringstream ss; | 
|  | 19 | +    for (std::string::const_iterator iter = input.begin(); iter != input.end(); iter++) { | 
|  | 20 | +        switch (*iter) { | 
|  | 21 | +            case '\\': ss << "\\\\"; break; | 
|  | 22 | +            case '"': ss << "\\\""; break; | 
|  | 23 | +            case '\b': ss << "\\b"; break; | 
|  | 24 | +            case '\f': ss << "\\f"; break; | 
|  | 25 | +            case '\n': ss << "\\n"; break; | 
|  | 26 | +            case '\r': ss << "\\r"; break; | 
|  | 27 | +            case '\t': ss << "\\t"; break; | 
|  | 28 | +            // is a legal escape in JSON | 
|  | 29 | +            case '/': ss << "\\/"; break; | 
|  | 30 | +            default: ss << *iter; break; | 
|  | 31 | +        } | 
|  | 32 | +    } | 
|  | 33 | + | 
|  | 34 | +    return ss.str(); | 
|  | 35 | +  } | 
|  | 36 | + | 
| 14 | 37 |   string SourceMap::generate_source_map() { | 
| 15 | 38 |     string result = "{\n"; | 
| 16 | 39 |     result += "  \"version\": 3,\n"; | 
| 17 |  | -    result += "  \"file\": \"" + file + "\",\n"; | 
|  | 40 | +    result += "  \"file\": \"" + encodeJsonString(file) + "\",\n"; | 
| 18 | 41 |     result += "  \"sources\": ["; | 
| 19 | 42 |     for (size_t i = 0; i < files.size(); ++i) { | 
| 20 |  | -      result+="\"" + files[i] + "\","; | 
|  | 43 | +      result+="\"" + encodeJsonString(files[i]) + "\","; | 
| 21 | 44 |     } | 
| 22 | 45 |     if (!files.empty()) result.erase(result.length() - 1); | 
| 23 | 46 |     result += "],\n"; | 
|  | 
0 commit comments