Initial commit
[yaffs-website] / node_modules / node-sass / src / libsass / src / values.cpp
1 #include "sass.hpp"
2 #include "sass.h"
3 #include "values.hpp"
4
5 #include <stdint.h>
6
7 namespace Sass {
8
9   // convert value from C++ side to C-API
10   union Sass_Value* ast_node_to_sass_value (const Expression_Ptr val)
11   {
12     if (val->concrete_type() == Expression::NUMBER)
13     {
14       Number_Ptr_Const res = Cast<Number>(val);
15       return sass_make_number(res->value(), res->unit().c_str());
16     }
17     else if (val->concrete_type() == Expression::COLOR)
18     {
19       Color_Ptr_Const col = Cast<Color>(val);
20       return sass_make_color(col->r(), col->g(), col->b(), col->a());
21     }
22     else if (val->concrete_type() == Expression::LIST)
23     {
24       List_Ptr_Const l = Cast<List>(val);
25       union Sass_Value* list = sass_make_list(l->size(), l->separator(), l->is_bracketed());
26       for (size_t i = 0, L = l->length(); i < L; ++i) {
27         Expression_Obj obj = l->at(i);
28         auto val = ast_node_to_sass_value(obj);
29         sass_list_set_value(list, i, val);
30       }
31       return list;
32     }
33     else if (val->concrete_type() == Expression::MAP)
34     {
35       Map_Ptr_Const m = Cast<Map>(val);
36       union Sass_Value* map = sass_make_map(m->length());
37       size_t i = 0; for (Expression_Obj key : m->keys()) {
38         sass_map_set_key(map, i, ast_node_to_sass_value(key));
39         sass_map_set_value(map, i, ast_node_to_sass_value(m->at(key)));
40         ++ i;
41       }
42       return map;
43     }
44     else if (val->concrete_type() == Expression::NULL_VAL)
45     {
46       return sass_make_null();
47     }
48     else if (val->concrete_type() == Expression::BOOLEAN)
49     {
50       Boolean_Ptr_Const res = Cast<Boolean>(val);
51       return sass_make_boolean(res->value());
52     }
53     else if (val->concrete_type() == Expression::STRING)
54     {
55       if (String_Quoted_Ptr_Const qstr = Cast<String_Quoted>(val))
56       {
57         return sass_make_qstring(qstr->value().c_str());
58       }
59       else if (String_Constant_Ptr_Const cstr = Cast<String_Constant>(val))
60       {
61         return sass_make_string(cstr->value().c_str());
62       }
63     }
64     return sass_make_error("unknown sass value type");
65   }
66
67   // convert value from C-API to C++ side
68   Value_Ptr sass_value_to_ast_node (const union Sass_Value* val)
69   {
70     switch (sass_value_get_tag(val)) {
71       case SASS_NUMBER:
72         return SASS_MEMORY_NEW(Number,
73                                ParserState("[C-VALUE]"),
74                                sass_number_get_value(val),
75                                sass_number_get_unit(val));
76       break;
77       case SASS_BOOLEAN:
78         return SASS_MEMORY_NEW(Boolean,
79                                ParserState("[C-VALUE]"),
80                                sass_boolean_get_value(val));
81       break;
82       case SASS_COLOR:
83         return SASS_MEMORY_NEW(Color,
84                                ParserState("[C-VALUE]"),
85                                sass_color_get_r(val),
86                                sass_color_get_g(val),
87                                sass_color_get_b(val),
88                                sass_color_get_a(val));
89       break;
90       case SASS_STRING:
91         if (sass_string_is_quoted(val)) {
92           return SASS_MEMORY_NEW(String_Quoted,
93                                  ParserState("[C-VALUE]"),
94                                  sass_string_get_value(val));
95         } else {
96           return SASS_MEMORY_NEW(String_Constant,
97                                  ParserState("[C-VALUE]"),
98                                  sass_string_get_value(val));
99         }
100       break;
101       case SASS_LIST: {
102         List_Ptr l = SASS_MEMORY_NEW(List,
103                                   ParserState("[C-VALUE]"),
104                                   sass_list_get_length(val),
105                                   sass_list_get_separator(val));
106         for (size_t i = 0, L = sass_list_get_length(val); i < L; ++i) {
107           l->append(sass_value_to_ast_node(sass_list_get_value(val, i)));
108         }
109         l->is_bracketed(sass_list_get_is_bracketed(val));
110         return l;
111       }
112       break;
113       case SASS_MAP: {
114         Map_Ptr m = SASS_MEMORY_NEW(Map, ParserState("[C-VALUE]"));
115         for (size_t i = 0, L = sass_map_get_length(val); i < L; ++i) {
116           *m << std::make_pair(
117             sass_value_to_ast_node(sass_map_get_key(val, i)),
118             sass_value_to_ast_node(sass_map_get_value(val, i)));
119         }
120         return m;
121       }
122       break;
123       case SASS_NULL:
124         return SASS_MEMORY_NEW(Null, ParserState("[C-VALUE]"));
125       break;
126       case SASS_ERROR:
127         return SASS_MEMORY_NEW(Custom_Error,
128                                ParserState("[C-VALUE]"),
129                                sass_error_get_message(val));
130       break;
131       case SASS_WARNING:
132         return SASS_MEMORY_NEW(Custom_Warning,
133                                ParserState("[C-VALUE]"),
134                                sass_warning_get_message(val));
135       break;
136     }
137     return 0;
138   }
139
140 }