1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-20 00:15:31 +00:00

[htmlcxx] Added htmlcxx parser for source code displaying

It is compilable only together with spidermonkey, and only with meson
for now.
This commit is contained in:
Witold Filipczyk 2021-04-18 18:26:58 +02:00
parent fe040ee50a
commit 1fa5504570
8 changed files with 128 additions and 1 deletions

View File

@ -100,6 +100,9 @@
/* Define if you want: zlib support */
#mesondefine CONFIG_GZIP
/* Define if you want: htmlcxx support */
#mesondefine CONFIG_HTMLCXX
/* Define if you want: HTML highlighting support */
#mesondefine CONFIG_HTML_HIGHLIGHT

View File

@ -87,6 +87,7 @@ conf_data.set('CONFIG_LIBEV', get_option('libev'))
conf_data.set('CONFIG_LIBEVENT', get_option('libevent'))
conf_data.set('CONFIG_X', get_option('x'))
conf_data.set('CONFIG_LIBDOM', get_option('libdom'))
conf_data.set('CONFIG_HTMLCXX', get_option('htmlcxx'))
#CONFIG_BOOKMARKS=true
#CONFIG_XBEL_BOOKMARKS=true
@ -156,7 +157,7 @@ conf_data.set10('HAVE_SYS_TIME_H', 1)
compiler = meson.get_compiler('c')
if conf_data.get('CONFIG_ECMASCRIPT')
if conf_data.get('CONFIG_ECMASCRIPT') or conf_data.get('CONFIG_HTMLCXX')
extracflags = ['-xc++', '-fpermissive']
else
extracflags = []
@ -295,6 +296,11 @@ if conf_data.get('CONFIG_LIBDOM')
deps += domdeps
endif
if conf_data.get('CONFIG_HTMLCXX')
htmlcxxdeps = dependency('htmlcxx')
deps += htmlcxxdeps
endif
if conf_data.get('CONFIG_SCRIPTING_PYTHON')
python3deps = dependency('python3-embed')
deps += python3deps

View File

@ -61,3 +61,4 @@ option('libev', type: 'boolean', value: false, description: 'compile with libev
option('libevent', type: 'boolean', value: false, description: 'compile with libevent. Note that libev has precedence')
option('x', type: 'boolean', value: false, description: 'use the X Window System')
option('libdom', type: 'boolean', value: false, description: 'libdom')
option('htmlcxx', type: 'boolean', value: false, description: 'htmlcxx')

View File

@ -0,0 +1 @@
srcs += files('renderer.c')

View File

@ -0,0 +1,86 @@
/* Plain text document renderer */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "elinks.h"
#include "bookmarks/bookmarks.h"
#include "cache/cache.h"
#include "config/options.h"
#include "document/docdata.h"
#include "document/document.h"
#include "document/format.h"
#include "document/options.h"
#include "document/htmlcxx/renderer.h"
#include "document/plain/renderer.h"
#include "document/renderer.h"
#include "globhist/globhist.h"
#include "intl/charsets.h"
#include "protocol/protocol.h"
#include "protocol/uri.h"
#include "terminal/color.h"
#include "terminal/draw.h"
#include "util/color.h"
#include "util/error.h"
#include "util/memory.h"
#include "util/string.h"
#include <htmlcxx/html/ParserDom.h>
using namespace htmlcxx;
struct source_renderer {
struct string tmp_buffer;
struct string *source;
char *enc;
};
static void
walk_tree(struct string *buf, tree<HTML::Node> const &dom)
{
tree<HTML::Node>::iterator it = dom.begin();
add_to_string(buf, it->text().c_str());
for (tree<HTML::Node>::sibling_iterator childIt = dom.begin(it); childIt != dom.end(it); ++childIt)
{
walk_tree(buf, childIt);
}
add_to_string(buf, it->closingText().c_str());
}
static int
htmlcxx_main(struct source_renderer *renderer)
{
std::string html = renderer->source->source;
HTML::ParserDom parser;
tree<HTML::Node> dom = parser.parseTree(html);
walk_tree(&renderer->tmp_buffer, dom);
return 0;
}
void
render_source_document_cxx(struct cache_entry *cached, struct document *document,
struct string *buffer)
{
struct source_renderer renderer;
char *head = empty_string_or_(cached->head);
(void)get_convert_table(head, document->options.cp,
document->options.assume_cp,
&document->cp,
&document->cp_status,
document->options.hard_assume);
init_string(&renderer.tmp_buffer);
renderer.source = buffer;
renderer.enc = get_cp_mime_name(document->cp);
htmlcxx_main(&renderer);
render_plain_document(cached, document, &renderer.tmp_buffer);
done_string(&renderer.tmp_buffer);
}

View File

@ -0,0 +1,18 @@
#ifndef EL__DOCUMENT_HTMLCXX_RENDERER_H
#define EL__DOCUMENT_HTMLCXX_RENDERER_H
#ifdef __cplusplus
extern "C" {
#endif
struct cache_entry;
struct document;
struct string;
void render_source_document_cxx(struct cache_entry *cached, struct document *document, struct string *buffer);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -7,6 +7,9 @@ endif
if conf_data.get('CONFIG_LIBDOM')
subdir('libdom')
endif
if conf_data.get('CONFIG_HTMLCXX')
subdir('htmlcxx')
endif
subdir('html')
subdir('plain')
srcs += files('docdata.c', 'document.c', 'format.c', 'forms.c', 'options.c', 'refresh.c', 'renderer.c')

View File

@ -18,6 +18,7 @@
#include "document/dom/renderer.h"
#include "document/html/frames.h"
#include "document/html/renderer.h"
#include "document/htmlcxx/renderer.h"
#include "document/libdom/renderer.h"
#include "document/plain/renderer.h"
#include "document/renderer.h"
@ -256,6 +257,14 @@ render_encoded_document(struct cache_entry *cached, struct document *document)
render_source_document(cached, document, &buffer);
}
else
#endif
#ifdef CONFIG_HTMLCXX
if (document->options.plain && cached->content_type
&& (!c_strcasecmp("text/html", cached->content_type)
|| !c_strcasecmp("application/xhtml+xml", cached->content_type))) {
render_source_document_cxx(cached, document, &buffer);
}
else
#endif
if (document->options.plain) {
#ifdef CONFIG_DOM