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

[querySelector] implementation of querySelector

This commit is contained in:
Witold Filipczyk 2021-10-04 15:28:26 +02:00
parent af059861ba
commit 1618038dc3
6 changed files with 45 additions and 20 deletions

View File

@ -2,7 +2,7 @@ top_builddir=../../..
include $(top_builddir)/Makefile.config
INCLUDES += $(SPIDERMONKEY_CFLAGS)
OBJS = console.o document.o element.o form.o heartbeat.o implementation.o location.o \
OBJS = console.o css2xpath.o document.o element.o form.o heartbeat.o implementation.o location.o \
localstorage.o localstorage-db.o navigator.o screen.o unibar.o window.o
include $(top_srcdir)/Makefile.lib

View File

@ -1,3 +1,5 @@
// This code is based on github.com/theseer/css2xpath and other sources
#include <string>
#include <vector>
#include <sstream>
@ -13,6 +15,8 @@
#include <string>
#include <regex>
#include "ecmascript/spidermonkey/css2xpath.h"
namespace std
{
@ -167,8 +171,6 @@ class RegexRule : public Rule
{
std::string r(pattern);
// std::cout << "RegexRule: pattern=" << r << " replacement=" << replacement << " selector=" << selector << "\n";
return preg_replace(r, replacement, selector);
}
};
@ -278,8 +280,6 @@ class DollarEqualRule : public Rule
std::string apply(std::string &selector)
{
// std::cout << "DollarEqualRule: selector=" << selector << "\n";
std::string pattern("\\[([a-zA-Z0-9\\_\\-]+)\\$=([^\\]]+)\\]");
return preg_replace_callback(pattern, dollar_equal_rule_callback, selector);
@ -395,8 +395,6 @@ NotRule::NotRule(Translator *tt) : t(tt)
std::string
NotRule::apply(std::string &selector)
{
// std::cout << "NotRule: selector=" << selector << "\n";
std::string pat("([a-zA-Z0-9\\_\\-\\*]+):not\\(([^\\)]*)\\)");
return preg_replace_callback(pat, not_rule_callback, selector);
}
@ -411,9 +409,19 @@ NotRule::callback(const std::smatch &matches)
return matches[1].str() + "[not(" + subresult + ")]";
}
std::string
css2xpath(std::string &selector)
{
static Translator *translator;
if (!translator)
{
translator = new Translator();
}
return translator->translate(selector);
}
#if 1
#if 0
std::string
next_year(const std::smatch& matches)
@ -491,11 +499,6 @@ tests()
std::string result = translator->translate(selector);
std::cout << t[0] << " ";
std::cout << ((result == expected) ? "\033[32mOK\033[0m" : "\033[31mFAIL\033[0m");
// if (result != expected)
// {
// std::cout << " " << result << " " << expected;
// }
std::cout << "\n";
}
}

View File

@ -0,0 +1,8 @@
#ifndef EL__ECMASCRIPT_SPIDERMONKEY_CSS2XPATH_H
#define EL__ECMASCRIPT_SPIDERMONKEY_CSS2XPATH_H
#include <string>
std::string css2xpath(std::string &selector);
#endif

View File

@ -24,6 +24,7 @@
#include "document/forms.h"
#include "document/view.h"
#include "ecmascript/ecmascript.h"
#include "ecmascript/spidermonkey/css2xpath.h"
#include "ecmascript/spidermonkey/form.h"
#include "ecmascript/spidermonkey/implementation.h"
#include "ecmascript/spidermonkey/location.h"
@ -57,12 +58,6 @@
#include <iostream>
std::string css2xpath(std::string css)
{
/* TODO */
return css;
}
static xmlpp::Document emptyDoc;
static JSObject *getDoctype(JSContext *ctx, void *node);

View File

@ -1,3 +1,3 @@
#INCLUDES += $(SPIDERMONKEY_CFLAGS)
srcs += files('console.c', 'document.c', 'element.c', 'form.c', 'heartbeat.c', 'implementation.c', 'location.c', 'localstorage.c', 'localstorage-db.c', 'navigator.c', 'screen.c', 'unibar.c', 'window.c')
srcs += files('console.c', 'css2xpath.c', 'document.c', 'element.c', 'form.c', 'heartbeat.c', 'implementation.c', 'location.c', 'localstorage.c', 'localstorage-db.c', 'navigator.c', 'screen.c', 'unibar.c', 'window.c')

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<body>
<h2 class="example">A heading with class="example"</h2>
<p class="example">A paragraph with class="example".</p>
<p>Click the button to add a background color to the first element in the document with class="example".</p>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction() {
alert(document.querySelector(".example").innerHTML);
}
</script>
</body>
</html>