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