mirror of
https://github.com/searxng/searxng
synced 2024-01-01 19:24:07 +01:00
o
This commit is contained in:
parent
f4acd9b242
commit
eeefe60652
3 changed files with 995 additions and 3 deletions
121
searx/element-parse.txt
Normal file
121
searx/element-parse.txt
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
function eleparse(doc)
|
||||||
|
{
|
||||||
|
// 获取页面元素
|
||||||
|
const elements = doc.querySelectorAll("*");
|
||||||
|
|
||||||
|
// 定义位置常量
|
||||||
|
const POSITION = {
|
||||||
|
TOP_LEFT: "左上",
|
||||||
|
TOP_MIDDLE: "上中",
|
||||||
|
TOP_RIGHT: "右上",
|
||||||
|
MIDDLE_LEFT: "左中",
|
||||||
|
CENTER: "中间",
|
||||||
|
MIDDLE_RIGHT: "右中",
|
||||||
|
BOTTOM_LEFT: "左下",
|
||||||
|
BOTTOM_MIDDLE: "下中",
|
||||||
|
BOTTOM_RIGHT: "右下",
|
||||||
|
};
|
||||||
|
|
||||||
|
// 定义颜色名称映射表
|
||||||
|
const COLOR_NAMES = {
|
||||||
|
"#000000": "黑色",
|
||||||
|
"#ffffff": "白色",
|
||||||
|
"#ff0000": "红色",
|
||||||
|
"#00ff00": "绿色",
|
||||||
|
"#0000ff": "蓝色",
|
||||||
|
// 可以添加更多颜色
|
||||||
|
};
|
||||||
|
|
||||||
|
// 创建描述文本
|
||||||
|
let description=[];
|
||||||
|
let seen = [];
|
||||||
|
let dismiss = ['up vote', 'down vote', 'dismiss', 'github license', 'npm version', 'circleci', 'site']
|
||||||
|
for (let i = 0; i < elements.length; i++) {
|
||||||
|
const element = elements[i];
|
||||||
|
let elementDescription = "";
|
||||||
|
|
||||||
|
// 判断元素是否可见
|
||||||
|
if (element.offsetWidth > 0 || element.offsetHeight > 0) {
|
||||||
|
|
||||||
|
// 获取元素类型
|
||||||
|
let elementType = element.tagName.toLowerCase();
|
||||||
|
if (elementType === "input" && (element.type === "search" || (element.getAttribute('aria-label') && element.getAttribute('aria-label').toLowerCase().indexOf("search") !== -1))) {
|
||||||
|
elementType = "搜索框";
|
||||||
|
} else if (elementType === "input" || elementType === "select" || elementType === "textarea") {
|
||||||
|
elementType = "输入框";
|
||||||
|
} else if (elementType.indexOf("button") !== -1 || element.id.indexOf("button") !== -1) {
|
||||||
|
elementType = "按钮";
|
||||||
|
} else if (elementType === "img") {
|
||||||
|
elementType = "图片";
|
||||||
|
} else if (elementType === "form") {
|
||||||
|
elementType = "表单";
|
||||||
|
} else if (elementType === "pre" || elementType === "code") {
|
||||||
|
elementType = "代码块";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
elementType = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是可识别的元素类型,则生成元素描述
|
||||||
|
if (elementType && (elementType == "代码块" || element.title||element.alt||element.getAttribute('aria-label'))){
|
||||||
|
elementDescription += elementType;
|
||||||
|
if (element.title) {
|
||||||
|
if(element.title.includes('avatar') || dismiss.includes((element.title.toLowerCase()))) continue;
|
||||||
|
elementDescription += `:“${element.title}”`;
|
||||||
|
}
|
||||||
|
else if (element.alt||element.getAttribute('aria-label')) {
|
||||||
|
if(seen.includes(element.alt||element.getAttribute('aria-label'))) continue;
|
||||||
|
if((element.alt||element.getAttribute('aria-label')).includes('avatar') || dismiss.includes((element.alt||element.getAttribute('aria-label')).toLowerCase())) continue;
|
||||||
|
elementDescription += `:“${element.alt||element.getAttribute('aria-label')}”`;
|
||||||
|
seen.push(element.alt||element.getAttribute('aria-label'))
|
||||||
|
}
|
||||||
|
if ((element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color) && (`${element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color}`.indexOf( "255, 255, 255") == -1 ) && (`${element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color}`.indexOf( "0, 0, 0") == -1 ) ) {
|
||||||
|
elementDescription += `,颜色:${element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color}`;
|
||||||
|
}
|
||||||
|
const elementPosition = getElementPosition(element);
|
||||||
|
elementDescription += `,位于${elementPosition}`;
|
||||||
|
// if (element.offsetWidth && element.offsetHeight) {
|
||||||
|
// elementDescription += `,大小为${element.offsetWidth}像素 x ${element.offsetHeight}像素`;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(elementDescription&&elementDescription!='')
|
||||||
|
description.push(elementDescription);
|
||||||
|
}
|
||||||
|
return (unique(description));
|
||||||
|
}
|
||||||
|
|
||||||
|
function unique (arr) {
|
||||||
|
return Array.from(new Set(arr))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输出描述文本
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取元素相对位置
|
||||||
|
*/
|
||||||
|
function getElementPosition(element) {
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
const x = rect.left + rect.width / 2;
|
||||||
|
const y = rect.top + rect.height / 2;
|
||||||
|
let position = "";
|
||||||
|
|
||||||
|
if (x < window.innerWidth / 3) {
|
||||||
|
position += "左";
|
||||||
|
} else if (x > window.innerWidth * 2 / 3) {
|
||||||
|
position += "右";
|
||||||
|
} else {
|
||||||
|
position += "中";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y < window.innerHeight / 3) {
|
||||||
|
position += "上";
|
||||||
|
} else if (y > window.innerHeight * 2 / 3) {
|
||||||
|
position += "下";
|
||||||
|
} else {
|
||||||
|
position += "中";
|
||||||
|
}
|
||||||
|
|
||||||
|
return position;
|
||||||
|
}
|
747
searx/webapp.py
747
searx/webapp.py
File diff suppressed because one or more lines are too long
130
searx/webapp1.py
130
searx/webapp1.py
|
@ -1179,7 +1179,6 @@ function proxify()
|
||||||
}catch(e){}
|
}catch(e){}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function modal_open(url)
|
function modal_open(url)
|
||||||
{
|
{
|
||||||
modal.style.display = 'block';
|
modal.style.display = 'block';
|
||||||
|
@ -1199,9 +1198,13 @@ function modal_open(url)
|
||||||
});
|
});
|
||||||
iframePromise.then(
|
iframePromise.then(
|
||||||
() => {
|
() => {
|
||||||
|
|
||||||
var iframe = document.querySelector("#iframe-wrapper > iframe");
|
var iframe = document.querySelector("#iframe-wrapper > iframe");
|
||||||
|
let modalele = eleparse(iframe.contentDocument);
|
||||||
|
let article = new Readability(iframe.contentDocument.cloneNode(true)).parse();
|
||||||
|
console.log(modalele)
|
||||||
|
console.log(article)
|
||||||
if (isProbablyReaderable(iframe.contentDocument)) {
|
if (isProbablyReaderable(iframe.contentDocument)) {
|
||||||
let article = new Readability(iframe.contentDocument.cloneNode(true)).parse();
|
|
||||||
iframe.removeAttribute('src')
|
iframe.removeAttribute('src')
|
||||||
document.querySelector("#readability-reader").innerHTML = article.content
|
document.querySelector("#readability-reader").innerHTML = article.content
|
||||||
}
|
}
|
||||||
|
@ -1212,6 +1215,129 @@ function modal_open(url)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function eleparse(doc)
|
||||||
|
{
|
||||||
|
// 获取页面元素
|
||||||
|
const elements = doc.querySelectorAll("*");
|
||||||
|
|
||||||
|
// 定义位置常量
|
||||||
|
const POSITION = {
|
||||||
|
TOP_LEFT: "左上",
|
||||||
|
TOP_MIDDLE: "上中",
|
||||||
|
TOP_RIGHT: "右上",
|
||||||
|
MIDDLE_LEFT: "左中",
|
||||||
|
CENTER: "中间",
|
||||||
|
MIDDLE_RIGHT: "右中",
|
||||||
|
BOTTOM_LEFT: "左下",
|
||||||
|
BOTTOM_MIDDLE: "下中",
|
||||||
|
BOTTOM_RIGHT: "右下",
|
||||||
|
};
|
||||||
|
|
||||||
|
// 定义颜色名称映射表
|
||||||
|
const COLOR_NAMES = {
|
||||||
|
"#000000": "黑色",
|
||||||
|
"#ffffff": "白色",
|
||||||
|
"#ff0000": "红色",
|
||||||
|
"#00ff00": "绿色",
|
||||||
|
"#0000ff": "蓝色",
|
||||||
|
// 可以添加更多颜色
|
||||||
|
};
|
||||||
|
|
||||||
|
// 创建描述文本
|
||||||
|
let description=[];
|
||||||
|
let seen = [];
|
||||||
|
let dismiss = ['up vote', 'down vote', 'dismiss', 'github license', 'npm version', 'circleci', 'site']
|
||||||
|
for (let i = 0; i < elements.length; i++) {
|
||||||
|
const element = elements[i];
|
||||||
|
let elementDescription = "";
|
||||||
|
|
||||||
|
// 判断元素是否可见
|
||||||
|
if (element.offsetWidth > 0 || element.offsetHeight > 0) {
|
||||||
|
|
||||||
|
// 获取元素类型
|
||||||
|
let elementType = element.tagName.toLowerCase();
|
||||||
|
if (elementType === "input" && (element.type === "search" || (element.getAttribute('aria-label') && element.getAttribute('aria-label').toLowerCase().indexOf("search") !== -1))) {
|
||||||
|
elementType = "搜索框";
|
||||||
|
} else if (elementType === "input" || elementType === "select" || elementType === "textarea") {
|
||||||
|
elementType = "输入框";
|
||||||
|
} else if (elementType.indexOf("button") !== -1 || element.id.indexOf("button") !== -1) {
|
||||||
|
elementType = "按钮";
|
||||||
|
} else if (elementType === "img") {
|
||||||
|
elementType = "图片";
|
||||||
|
} else if (elementType === "form") {
|
||||||
|
elementType = "表单";
|
||||||
|
} else if (elementType === "pre" || elementType === "code") {
|
||||||
|
elementType = "代码块";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
elementType = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是可识别的元素类型,则生成元素描述
|
||||||
|
if (elementType && (elementType == "代码块" || element.title||element.alt||element.getAttribute('aria-label'))){
|
||||||
|
elementDescription += elementType;
|
||||||
|
if (element.title) {
|
||||||
|
if(element.title.includes('avatar') || dismiss.includes((element.title.toLowerCase()))) continue;
|
||||||
|
elementDescription += `:“${element.title}”`;
|
||||||
|
}
|
||||||
|
else if (element.alt||element.getAttribute('aria-label')) {
|
||||||
|
if(seen.includes(element.alt||element.getAttribute('aria-label'))) continue;
|
||||||
|
if((element.alt||element.getAttribute('aria-label')).includes('avatar') || dismiss.includes((element.alt||element.getAttribute('aria-label')).toLowerCase())) continue;
|
||||||
|
elementDescription += `:“${element.alt||element.getAttribute('aria-label')}”`;
|
||||||
|
seen.push(element.alt||element.getAttribute('aria-label'))
|
||||||
|
}
|
||||||
|
if ((element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color) && (`${element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color}`.indexOf( "255, 255, 255") == -1 ) && (`${element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color}`.indexOf( "0, 0, 0") == -1 ) ) {
|
||||||
|
elementDescription += `,颜色:${element.style.color||window.getComputedStyle(element).backgroundColor||window.getComputedStyle(element).color}`;
|
||||||
|
}
|
||||||
|
const elementPosition = getElementPosition(element);
|
||||||
|
elementDescription += `,位于${elementPosition}`;
|
||||||
|
// if (element.offsetWidth && element.offsetHeight) {
|
||||||
|
// elementDescription += `,大小为${element.offsetWidth}像素 x ${element.offsetHeight}像素`;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(elementDescription&&elementDescription!='')
|
||||||
|
description.push(elementDescription);
|
||||||
|
}
|
||||||
|
return (unique(description));
|
||||||
|
}
|
||||||
|
|
||||||
|
function unique (arr) {
|
||||||
|
return Array.from(new Set(arr))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输出描述文本
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取元素相对位置
|
||||||
|
*/
|
||||||
|
function getElementPosition(element) {
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
const x = rect.left + rect.width / 2;
|
||||||
|
const y = rect.top + rect.height / 2;
|
||||||
|
let position = "";
|
||||||
|
|
||||||
|
if (x < window.innerWidth / 3) {
|
||||||
|
position += "左";
|
||||||
|
} else if (x > window.innerWidth * 2 / 3) {
|
||||||
|
position += "右";
|
||||||
|
} else {
|
||||||
|
position += "中";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y < window.innerHeight / 3) {
|
||||||
|
position += "上";
|
||||||
|
} else if (y > window.innerHeight * 2 / 3) {
|
||||||
|
position += "下";
|
||||||
|
} else {
|
||||||
|
position += "中";
|
||||||
|
}
|
||||||
|
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//rsa
|
//rsa
|
||||||
function stringToArrayBuffer(str){
|
function stringToArrayBuffer(str){
|
||||||
if(!str) return;
|
if(!str) return;
|
||||||
|
|
Loading…
Add table
Reference in a new issue