mirror of
https://git.checksum.fail/alec/erythros
synced 2025-12-12 05:59:53 +02:00
Applications/Internet/Cyberia: Add web browser
This is the initial commit of the Cyberia web browser, Html and Css libraries.
This commit is contained in:
1
System/Libraries/Css/CustomRules.json
Normal file
1
System/Libraries/Css/CustomRules.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
System/Libraries/Css/NamedColors.json
Normal file
1
System/Libraries/Css/NamedColors.json
Normal file
@@ -0,0 +1 @@
|
||||
{"aliceblue":"#f0f8ff","antiquewhite":"#faebd7","aqua":"#00ffff","aquamarine":"#7fffd4","azure":"#f0ffff","beige":"#f5f5dc","bisque":"#ffe4c4","black":"#000000","blanchedalmond":"#ffebcd","blue":"#0000ff","blueviolet":"#8a2be2","brown":"#a52a2a","burlywood":"#deb887","cadetblue":"#5f9ea0","chartreuse":"#7fff00","chocolate":"#d2691e","coral":"#ff7f50","cornflowerblue":"#6495ed","cornsilk":"#fff8dc","crimson":"#dc143c","cyan":"#00ffff","darkblue":"#00008b","darkcyan":"#008b8b","darkgoldenrod":"#b8860b","darkgray":"#a9a9a9","darkgreen":"#006400","darkgrey":"#a9a9a9","darkkhaki":"#bdb76b","darkmagenta":"#8b008b","darkolivegreen":"#556b2f","darkorange":"#ff8c00","darkorchid":"#9932cc","darkred":"#8b0000","darksalmon":"#e9967a","darkseagreen":"#8fbc8f","darkslateblue":"#483d8b","darkslategray":"#2f4f4f","darkslategrey":"#2f4f4f","darkturquoise":"#00ced1","darkviolet":"#9400d3","deeppink":"#ff1493","deepskyblue":"#00bfff","dimgray":"#696969","dimgrey":"#696969","dodgerblue":"#1e90ff","firebrick":"#b22222","floralwhite":"#fffaf0","forestgreen":"#228b22","fuchsia":"#ff00ff","gainsboro":"#dcdcdc","ghostwhite":"#f8f8ff","gold":"#ffd700","goldenrod":"#daa520","gray":"#808080","green":"#008000","greenyellow":"#adff2f","grey":"#808080","honeydew":"#f0fff0","hotpink":"#ff69b4","indianred":"#cd5c5c","indigo":"#4b0082","ivory":"#fffff0","khaki":"#f0e68c","lavender":"#e6e6fa","lavenderblush":"#fff0f5","lawngreen":"#7cfc00","lemonchiffon":"#fffacd","lightblue":"#add8e6","lightcoral":"#f08080","lightcyan":"#e0ffff","lightgoldenrodyellow":"#fafad2","lightgray":"#d3d3d3","lightgreen":"#90ee90","lightgrey":"#d3d3d3","lightpink":"#ffb6c1","lightsalmon":"#ffa07a","lightseagreen":"#20b2aa","lightskyblue":"#87cefa","lightslategray":"#778899","lightslategrey":"#778899","lightsteelblue":"#b0c4de","lightyellow":"#ffffe0","lime":"#00ff00","limegreen":"#32cd32","linen":"#faf0e6","magenta":"#ff00ff","maroon":"#800000","mediumaquamarine":"#66cdaa","mediumblue":"#0000cd","mediumorchid":"#ba55d3","mediumpurple":"#9370db","mediumseagreen":"#3cb371","mediumslateblue":"#7b68ee","mediumspringgreen":"#00fa9a","mediumturquoise":"#48d1cc","mediumvioletred":"#c71585","midnightblue":"#191970","mintcream":"#f5fffa","mistyrose":"#ffe4e1","moccasin":"#ffe4b5","navajowhite":"#ffdead","navy":"#000080","oldlace":"#fdf5e6","olive":"#808000","olivedrab":"#6b8e23","orange":"#ffa500","orangered":"#ff4500","orchid":"#da70d6","palegoldenrod":"#eee8aa","palegreen":"#98fb98","paleturquoise":"#afeeee","palevioletred":"#db7093","papayawhip":"#ffefd5","peachpuff":"#ffdab9","peru":"#cd853f","pink":"#ffc0cb","plum":"#dda0dd","powderblue":"#b0e0e6","purple":"#800080","rebeccapurple":"#663399","red":"#ff0000","rosybrown":"#bc8f8f","royalblue":"#4169e1","saddlebrown":"#8b4513","salmon":"#fa8072","sandybrown":"#f4a460","seagreen":"#2e8b57","seashell":"#fff5ee","sienna":"#a0522d","silver":"#c0c0c0","skyblue":"#87ceeb","slateblue":"#6a5acd","slategray":"#708090","slategrey":"#708090","snow":"#fffafa","springgreen":"#00ff7f","steelblue":"#4682b4","tan":"#d2b48c","teal":"#008080","thistle":"#d8bfd8","tomato":"#ff6347","turquoise":"#40e0d0","violet":"#ee82ee","wheat":"#f5deb3","white":"#ffffff","whitesmoke":"#f5f5f5","yellow":"#ffff00","yellowgreen":"#9acd32"}
|
||||
239
System/Libraries/Css/Tokenizer.HC
Normal file
239
System/Libraries/Css/Tokenizer.HC
Normal file
@@ -0,0 +1,239 @@
|
||||
#define CSS_TEXT_ALIGN_CENTER 1
|
||||
#define CSS_TEXT_ALIGN_RIGHT 2
|
||||
|
||||
#define CSS_TOKENIZER_STATE_CONSUME_MATCH 0
|
||||
#define CSS_TOKENIZER_STATE_CONSUME_PROPERTY 1
|
||||
#define CSS_TOKENIZER_STATE_CONSUME_VALUE 2
|
||||
#define CSS_TOKENIZER_SKIP_AT_RULE 3
|
||||
#define CSS_TOKENIZER_SKIP_COMMENT 4
|
||||
|
||||
U8* @css_named_colors_buffer = FileRead("M:/System/Libraries/Css/NamedColors.json");
|
||||
JsonObject* @css_named_colors = Json.Parse(@css_named_colors_buffer, erythros_mem_task);
|
||||
Free(@css_named_colors_buffer);
|
||||
|
||||
class @css_tokenizer
|
||||
{
|
||||
U8* buffer;
|
||||
I64 pos;
|
||||
I64 size;
|
||||
I64 state;
|
||||
I64 previous_state;
|
||||
CFifoU8* match_fifo;
|
||||
CFifoU8* property_fifo;
|
||||
CFifoU8* value_fifo;
|
||||
JsonObject* current_rule;
|
||||
JsonArray* current_values;
|
||||
CTask* mem_task;
|
||||
};
|
||||
|
||||
// U8* @custom_css_rules_buffer = FileRead("M:/System/Libraries/Css/CustomRules.json");
|
||||
JsonObject* @custom_css_rules = Json.Parse("{}", erythros_mem_task);
|
||||
// Free(@custom_css_rules_buffer);
|
||||
|
||||
U0 @css_init_current_values(@css_tokenizer* t)
|
||||
{
|
||||
t->current_values = Json.CreateArray(erythros_mem_task);
|
||||
}
|
||||
|
||||
U0 @css_init_current_rule(@css_tokenizer* t)
|
||||
{
|
||||
t->current_rule = Json.CreateObject(erythros_mem_task);
|
||||
t->current_rule->set("matches", Json.CreateArray(erythros_mem_task), JSON_ARRAY);
|
||||
t->current_rule->set("properties", Json.CreateObject(erythros_mem_task), JSON_OBJECT);
|
||||
}
|
||||
|
||||
U0 @css_init_tokenizer(@css_tokenizer* t, U8* buffer, I64 size, CTask* mem_task = NULL)
|
||||
{
|
||||
t->buffer = buffer;
|
||||
t->pos = 0;
|
||||
t->size = size;
|
||||
t->state = CSS_TOKENIZER_STATE_CONSUME_MATCH;
|
||||
t->match_fifo = FifoU8New(1024);
|
||||
t->mem_task = mem_task;
|
||||
t->property_fifo = FifoU8New(1024);
|
||||
t->value_fifo = FifoU8New(1024);
|
||||
@css_init_current_rule(t);
|
||||
}
|
||||
|
||||
Bool @css_try_append_match(@css_tokenizer* t)
|
||||
{
|
||||
U8* match;
|
||||
if (FifoU8Cnt(t->match_fifo)) {
|
||||
match = @json_string_from_fifo(t->match_fifo, Fs);
|
||||
t->current_rule->a("matches")->append(match);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool @css_try_append_value(@css_tokenizer* t)
|
||||
{
|
||||
U8* value;
|
||||
if (FifoU8Cnt(t->value_fifo)) {
|
||||
value = @json_string_from_fifo(t->value_fifo, Fs);
|
||||
t->current_values->append(value);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool @css_try_set_property(@css_tokenizer* t)
|
||||
{
|
||||
U8* property;
|
||||
if (FifoU8Cnt(t->property_fifo)) {
|
||||
property = CAlloc(FifoU8Cnt(t->property_fifo) + 1, t->mem_task);
|
||||
while (FifoU8Cnt(t->property_fifo))
|
||||
FifoU8Rem(t->property_fifo, property + StrLen(property));
|
||||
t->current_rule->o("properties")->set(property, t->current_values, JSON_ARRAY);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
U0 @css_tokenize_and_create_rules_from_buffer(JsonArray* rules, U8* buffer, I64 size, CTask* mem_task = NULL)
|
||||
{
|
||||
@css_tokenizer t;
|
||||
@css_init_tokenizer(&t, buffer, size, mem_task);
|
||||
I64 brace_depth = 0;
|
||||
JsonItem* item;
|
||||
while (t.pos < t.size) {
|
||||
I64 token = t.buffer[t.pos];
|
||||
switch (t.state) {
|
||||
case CSS_TOKENIZER_SKIP_COMMENT:
|
||||
if (token == '*' && t.buffer[t.pos + 1] == '/') {
|
||||
++t.pos;
|
||||
t.state = t.previous_state;
|
||||
goto @css_tokenizer_continue;
|
||||
}
|
||||
break;
|
||||
case CSS_TOKENIZER_SKIP_AT_RULE:
|
||||
switch (token) {
|
||||
case '{':
|
||||
brace_depth++;
|
||||
break;
|
||||
case '}':
|
||||
brace_depth--;
|
||||
if (brace_depth <= 0) {
|
||||
t.state = CSS_TOKENIZER_STATE_CONSUME_MATCH;
|
||||
goto @css_tokenizer_continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CSS_TOKENIZER_STATE_CONSUME_VALUE:
|
||||
switch (token) {
|
||||
case '/':
|
||||
if (t.buffer[t.pos + 1] == '*') {
|
||||
++t.pos;
|
||||
t.previous_state = t.state;
|
||||
t.state = CSS_TOKENIZER_SKIP_COMMENT;
|
||||
goto @css_tokenizer_continue;
|
||||
}
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\n':
|
||||
if (FifoU8Cnt(t.value_fifo))
|
||||
@css_try_append_value(&t);
|
||||
break;
|
||||
case '}':
|
||||
@css_try_append_value(&t);
|
||||
if (FifoU8Cnt(t.property_fifo))
|
||||
@css_try_set_property(&t);
|
||||
if (t.current_rule->a("matches")->length) {
|
||||
rules->append(t.current_rule);
|
||||
@css_init_current_rule(&t);
|
||||
}
|
||||
t.state = CSS_TOKENIZER_STATE_CONSUME_MATCH;
|
||||
goto @css_tokenizer_continue;
|
||||
case ';':
|
||||
@css_try_append_value(&t);
|
||||
if (FifoU8Cnt(t.property_fifo))
|
||||
@css_try_set_property(&t);
|
||||
t.state = CSS_TOKENIZER_STATE_CONSUME_PROPERTY;
|
||||
goto @css_tokenizer_continue;
|
||||
default:
|
||||
FifoU8Ins(t.value_fifo, token);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CSS_TOKENIZER_STATE_CONSUME_PROPERTY:
|
||||
switch (token) {
|
||||
case '/':
|
||||
if (t.buffer[t.pos + 1] == '*') {
|
||||
++t.pos;
|
||||
t.previous_state = t.state;
|
||||
t.state = CSS_TOKENIZER_SKIP_COMMENT;
|
||||
goto @css_tokenizer_continue;
|
||||
}
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\n':
|
||||
if (FifoU8Cnt(t.property_fifo)) {
|
||||
PrintErr("Invalid token in CSS property at pos %d, token: '%c'\n", t.pos, token);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case '}':
|
||||
if (t.current_rule->a("matches")->length) {
|
||||
rules->append(t.current_rule);
|
||||
@css_init_current_rule(&t);
|
||||
}
|
||||
t.state = CSS_TOKENIZER_STATE_CONSUME_MATCH;
|
||||
goto @css_tokenizer_continue;
|
||||
case ':':
|
||||
if (!FifoU8Cnt(t.property_fifo)) {
|
||||
PrintErr("CSS property is not defined at pos %d, token: '%c'\n", t.pos, token);
|
||||
return;
|
||||
}
|
||||
@css_init_current_values(&t);
|
||||
t.state = CSS_TOKENIZER_STATE_CONSUME_VALUE;
|
||||
goto @css_tokenizer_continue;
|
||||
default:
|
||||
FifoU8Ins(t.property_fifo, token);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case CSS_TOKENIZER_STATE_CONSUME_MATCH:
|
||||
switch (token) {
|
||||
case '/':
|
||||
if (t.buffer[t.pos + 1] == '*') {
|
||||
++t.pos;
|
||||
t.previous_state = t.state;
|
||||
t.state = CSS_TOKENIZER_SKIP_COMMENT;
|
||||
goto @css_tokenizer_continue;
|
||||
}
|
||||
case '@':
|
||||
t.state = CSS_TOKENIZER_SKIP_AT_RULE;
|
||||
goto @css_tokenizer_continue;
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\n':
|
||||
case ',':
|
||||
if (FifoU8Cnt(t.match_fifo))
|
||||
@css_try_append_match(&t);
|
||||
break;
|
||||
case '{':
|
||||
@css_try_append_match(&t);
|
||||
if (!t.current_rule->a("matches")->length) {
|
||||
PrintErr("CSS match string is not defined at pos %d, token: '%c'\n", t.pos, token);
|
||||
return;
|
||||
}
|
||||
t.state = CSS_TOKENIZER_STATE_CONSUME_PROPERTY;
|
||||
goto @css_tokenizer_continue;
|
||||
default:
|
||||
FifoU8Ins(t.match_fifo, token);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@css_tokenizer_continue : ++t.pos;
|
||||
}
|
||||
FifoU8Del(t.match_fifo);
|
||||
FifoU8Del(t.property_fifo);
|
||||
FifoU8Del(t.value_fifo);
|
||||
}
|
||||
Reference in New Issue
Block a user