1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-09-27 02:56:18 -04:00

[meson] compilation fixes related to CSS

This commit is contained in:
Witold Filipczyk 2021-06-21 21:01:37 +02:00
parent ba3af06b40
commit d5b27592a1
8 changed files with 122 additions and 51 deletions

View File

@ -44,7 +44,7 @@ conf_data.set('CONFIG_TRUE_COLOR', get_option('true-color'))
conf_data.set('CONFIG_EXMODE', get_option('exmode')) conf_data.set('CONFIG_EXMODE', get_option('exmode'))
conf_data.set('CONFIG_LEDS', get_option('leds')) conf_data.set('CONFIG_LEDS', get_option('leds'))
conf_data.set('CONFIG_MARKS', get_option('marks')) conf_data.set('CONFIG_MARKS', get_option('marks'))
conf_data.set10('CONFIG_CSS', get_option('css')) conf_data.set('CONFIG_CSS', get_option('css'))
conf_data.set('CONFIG_DOM', get_option('html-highlight')) conf_data.set('CONFIG_DOM', get_option('html-highlight'))
conf_data.set('CONFIG_BACKTRACE', get_option('backtrace')) conf_data.set('CONFIG_BACKTRACE', get_option('backtrace'))
@ -112,7 +112,6 @@ conf_data.set('CONFIG_SCRIPTING', true)
#CONFIG_SCRIPTING_SPIDERMONKEY', false) #CONFIG_SCRIPTING_SPIDERMONKEY', false)
#CONFIG_LEDS', true) #CONFIG_LEDS', true)
#CONFIG_EXMODE', false) #CONFIG_EXMODE', false)
#CONFIG_CSS', true)
#CONFIG_BROTLI', true) #CONFIG_BROTLI', true)
#CONFIG_BZIP2', true) #CONFIG_BZIP2', true)
#CONFIG_GZIP', true) #CONFIG_GZIP', true)

View File

@ -300,7 +300,7 @@ find_tag(struct document *document, char *name, int namelen)
/* ECMAScript doesn't like anything like CSS since it doesn't modify the /* ECMAScript doesn't like anything like CSS since it doesn't modify the
* formatted document (yet). */ * formatted document (yet). */
#if CONFIG_CSS #ifdef CONFIG_CSS
unsigned long unsigned long
get_document_css_magic(struct document *document) get_document_css_magic(struct document *document)
{ {

View File

@ -1,4 +1,4 @@
if conf_data.get('CONFIG_CSS') == 1 if conf_data.get('CONFIG_CSS')
subdir('css') subdir('css')
endif endif
if conf_data.get('CONFIG_DOM') if conf_data.get('CONFIG_DOM')

View File

@ -26,6 +26,7 @@
#include "document/renderer.h" #include "document/renderer.h"
#include "document/view.h" #include "document/view.h"
#include "ecmascript/ecmascript.h" #include "ecmascript/ecmascript.h"
#include "ecmascript/spidermonkey/document.h"
#include "encoding/encoding.h" #include "encoding/encoding.h"
#include "intl/charsets.h" #include "intl/charsets.h"
#include "main/main.h" #include "main/main.h"
@ -282,8 +283,7 @@ render_encoded_document(struct cache_entry *cached, struct document *document)
else else
#endif #endif
#ifdef CONFIG_XML #ifdef CONFIG_XML
if (document->dom) if (true) render_xhtml_document(cached, document, NULL);
render_xhtml_document(cached, document, &buffer);
else else
#endif #endif
render_html_document(cached, document, &buffer); render_html_document(cached, document, &buffer);

View File

@ -24,6 +24,7 @@
#include "document/renderer.h" #include "document/renderer.h"
#include "document/xml/renderer2.h" #include "document/xml/renderer2.h"
#include "document/xml/tags.h" #include "document/xml/tags.h"
#include "ecmascript/spidermonkey/document.h"
#include "globhist/globhist.h" #include "globhist/globhist.h"
#include "intl/charsets.h" #include "intl/charsets.h"
#include "protocol/protocol.h" #include "protocol/protocol.h"
@ -61,38 +62,9 @@ dump_text(struct source_renderer *renderer, unsigned char *html, int length)
int noupdate = 0; int noupdate = 0;
main_loop: main_loop:
if (!html_is_preformatted()) {
unsigned char *buffer = fmem_alloc(length+1);
unsigned char *dst;
html_context->part = renderer->part;
html_context->eoff = eof;
if (!buffer) {
return;
}
dst = buffer;
*dst = *html;
for (html++; html <= eof; html++) {
if (isspace(*html)) {
if (*dst != ' ') {
*(++dst) = ' ';
}
} else {
*(++dst) = *html;
}
}
if (dst - buffer > 1) {
if (*buffer == ' ') {
html_context->putsp = HTML_SPACE_ADD;
}
}
put_chrs(html_context, buffer, dst - buffer);
fmem_free(buffer);
}
while (html < eof) { while (html < eof) {
char *name, *attr, *end;
int namelen, endingtag;
int dotcounter = 0; int dotcounter = 0;
if (!noupdate) { if (!noupdate) {
@ -102,27 +74,60 @@ main_loop:
} else { } else {
noupdate = 0; noupdate = 0;
} }
if (isspace(*html) && !html_is_preformatted()) {
char *h = html;
while (h < eof && isspace(*h))
h++;
if (h + 1 < eof && h[0] == '<' && h[1] == '/') {
if (!parse_element(h, eof, &name, &namelen, &attr, &end)) {
put_chrs(html_context, base_pos, html - base_pos);
base_pos = html = h;
html_context->putsp = HTML_SPACE_ADD;
goto element;
}
}
html++;
if (!(html_context->position + (html - base_pos - 1)))
goto skip_w; /* ??? */
if (*(html - 1) == ' ') { /* Do not replace with isspace() ! --Zas */
/* BIG performance win; not sure if it doesn't cause any bug */
if (html < eof && !isspace(*html)) {
noupdate = 1;
continue;
}
put_chrs(html_context, base_pos, html - base_pos);
} else {
put_chrs(html_context, base_pos, html - base_pos - 1);
put_chrs(html_context, " ", 1);
}
skip_w:
while (html < eof && isspace(*html))
html++;
continue;
}
if (html_is_preformatted()) { if (html_is_preformatted()) {
html_context->putsp = HTML_SPACE_NORMAL; html_context->putsp = HTML_SPACE_NORMAL;
if (*html == ASCII_TAB) { if (*html == ASCII_TAB) {
put_chrs(html_context, base_pos, html - base_pos); put_chrs(html_context, base_pos, html - base_pos);
put_chrs(html_context, " ", put_chrs(html_context, " ",
8 - (html_context->position % 8)); 8 - (html_context->position % 8));
html++; html++;
continue; continue;
} else if (*html == ASCII_CR || *html == ASCII_LF) { } else if (*html == ASCII_CR || *html == ASCII_LF) {
put_chrs(html_context, base_pos, html - base_pos); put_chrs(html_context, base_pos, html - base_pos);
if (html - base_pos == 0 && html_context->line_breax > 0) { if (html - base_pos == 0 && html_context->line_breax > 0)
html_context->line_breax--; html_context->line_breax--;
}
next_break: next_break:
if (*html == ASCII_CR && html < eof - 1 && html[1] == ASCII_LF) { if (*html == ASCII_CR && html < eof - 1
&& html[1] == ASCII_LF)
html++; html++;
}
ln_break(html_context, 1); ln_break(html_context, 1);
html++; html++;
if (*html == ASCII_CR || *html == ASCII_LF) { if (*html == ASCII_CR || *html == ASCII_LF) {
html_context->line_breax = 0; html_context->line_breax = 0;
goto next_break; goto next_break;
@ -140,7 +145,7 @@ next_break:
int length = html - base_pos; int length = html - base_pos;
int newlines; int newlines;
html = (unsigned char *) count_newline_entities(html, eof, &newlines); html = (char *) count_newline_entities(html, eof, &newlines);
if (newlines) { if (newlines) {
put_chrs(html_context, base_pos, length); put_chrs(html_context, base_pos, length);
ln_break(html_context, newlines); ln_break(html_context, newlines);
@ -149,15 +154,14 @@ next_break:
} }
} }
while (*html < ' ') { while ((unsigned char)*html < ' ') {
if (html - base_pos) { if (html - base_pos)
put_chrs(html_context, base_pos, html - base_pos); put_chrs(html_context, base_pos, html - base_pos);
}
dotcounter++; dotcounter++;
base_pos = ++html; base_pos = ++html;
if (*html >= ' ' || isspace(*html) || html >= eof) { if (*html >= ' ' || isspace(*html) || html >= eof) {
unsigned char *dots = fmem_alloc(dotcounter); char *dots = fmem_alloc(dotcounter);
if (dots) { if (dots) {
memset(dots, '.', dotcounter); memset(dots, '.', dotcounter);
@ -167,7 +171,49 @@ next_break:
goto main_loop; goto main_loop;
} }
} }
if (html + 2 <= eof && html[0] == '<' && (html[1] == '!' || html[1] == '?')
&& !(html_context->was_xmp || html_context->was_style)) {
put_chrs(html_context, base_pos, html - base_pos);
html = skip_comment(html, eof);
continue;
}
if (*html != '<' || parse_element(html, eof, &name, &namelen, &attr, &end)) {
html++;
noupdate = 1;
continue;
}
element:
endingtag = *name == '/'; name += endingtag; namelen -= endingtag;
if (!endingtag && html_context->putsp == HTML_SPACE_ADD && !html_top->invisible)
put_chrs(html_context, " ", 1);
put_chrs(html_context, base_pos, html - base_pos);
if (!html_is_preformatted() && !endingtag && html_context->putsp == HTML_SPACE_NORMAL) {
char *ee = end;
char *nm;
/// while (!parse_element(ee, eof, &nm, NULL, NULL, &ee))
/// if (*nm == '/')
/// goto ng;
if (ee < eof && isspace(*ee)) {
put_chrs(html_context, " ", 1);
}
}
//ng:
// html = process_element(name, namelen, endingtag, end, html, eof, attr, html_context);
} }
if (noupdate) put_chrs(html_context, base_pos, html - base_pos);
ln_break(html_context, 1);
/* Restore the part in case the html_context was trashed in the last
* iteration so that when destroying the stack in the caller we still
* get the right part pointer. */
html_context->part = renderer->part;
html_context->putsp = HTML_SPACE_SUPPRESS;
html_context->position = 0;
html_context->was_br = 0;
} }
#define HTML_MAX_DOM_STRUCTURE_DEPTH 1024 #define HTML_MAX_DOM_STRUCTURE_DEPTH 1024
@ -218,10 +264,24 @@ render_xhtml_document(struct cache_entry *cached, struct document *document, str
{ {
struct html_context *html_context; struct html_context *html_context;
struct part *part = NULL; struct part *part = NULL;
part = mem_calloc(1, sizeof(*part));
if (!part) {
return;
}
part->document = document;
part->box.x = 0;
part->box.y = 0;
part->cx = -1;
part->cy = 0;
part->link_num = 0;
char *start; char *start;
char *end; char *end;
struct string title; struct string title;
struct string head; struct string head;
struct string tt;
struct source_renderer renderer; struct source_renderer renderer;
@ -232,6 +292,17 @@ render_xhtml_document(struct cache_entry *cached, struct document *document, str
if (cached->head) add_to_string(&head, cached->head); if (cached->head) add_to_string(&head, cached->head);
if (!document->dom) {
document->dom = document_parse(document);
}
xmlpp::Document *doc = document->dom;
if (!buffer) {
std::string text = doc->write_to_string_formatted();
init_string(&tt);
add_bytes_to_string(&tt, text.c_str(), text.size());
buffer = &tt;
}
start = buffer->source; start = buffer->source;
end = buffer->source + buffer->length; end = buffer->source + buffer->length;
@ -274,7 +345,6 @@ render_xhtml_document(struct cache_entry *cached, struct document *document, str
} }
done_string(&title); done_string(&title);
xmlpp::Document *doc = document->dom;
xmlpp::Element *root = doc->get_root_node(); xmlpp::Element *root = doc->get_root_node();
renderer.html_context = html_context; renderer.html_context = html_context;

View File

@ -21,6 +21,7 @@
#include "dialogs/status.h" #include "dialogs/status.h"
#include "document/html/frames.h" #include "document/html/frames.h"
#include "document/xml/renderer.h" #include "document/xml/renderer.h"
#include "document/xml/renderer2.h"
#include "document/document.h" #include "document/document.h"
#include "document/forms.h" #include "document/forms.h"
#include "document/renderer.h" #include "document/renderer.h"
@ -444,7 +445,7 @@ delayed_reload(void *data)
struct delayed_rel *rel = data; struct delayed_rel *rel = data;
assert(rel); assert(rel);
render_source_document_cxx(rel->cached, rel->document, NULL); render_xhtml_document(rel->cached, rel->document, NULL);
mem_free(rel); mem_free(rel);
} }

View File

@ -16,6 +16,7 @@ OBJS-unless$(CONFIG_OPENSSL) += md5.o
endif endif
ifeq ($(CONFIG_BITTORRENT),yes) ifeq ($(CONFIG_BITTORRENT),yes)
OBJS-$(CONFIG_BITTORRENT) += scanner.o
# BitTorrent is the only user. Compile in SHA1 if testing libc or # BitTorrent is the only user. Compile in SHA1 if testing libc or
# there is no OpenSSL. The GNUTLS OpenSSL wrappers doesn't have it. # there is no OpenSSL. The GNUTLS OpenSSL wrappers doesn't have it.
OBJS-$(CONFIG_OWN_LIBC) += sha1.o OBJS-$(CONFIG_OWN_LIBC) += sha1.o

View File

@ -3,7 +3,7 @@
if not conf_data.get('CONFIG_SMALL') if not conf_data.get('CONFIG_SMALL')
srcs += files('fastfind.c') srcs += files('fastfind.c')
endif endif
if conf_data.get('CONFIG_CSS') == 1 if conf_data.get('CONFIG_CSS') or conf_data.get('CONFIG_BITTORRENT')
srcs += files('scanner.c') srcs += files('scanner.c')
endif endif
if conf_data.get('CONFIG_DEBUG') if conf_data.get('CONFIG_DEBUG')