aardio:用 WebView 模仿 mdict 界面

news2024/12/26 14:51:51

aardio:用 WebView 模仿 mdict 界面

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio2";right=889;bottom=467)
mainForm.add(
button={cls="button";text="go";left=335;top=22;right=399;bottom=41;z=2};
button2={cls="button";text="prefix";left=426;top=21;right=497;bottom=40;z=4};
button3={cls="button";text="sound";left=537;top=23;right=596;bottom=38;z=5};
custom={cls="custom";text="WebView2";left=165;top=55;right=889;bottom=469;z=3};
edit={cls="edit";left=17;top=19;right=317;bottom=43;edge=1;z=1};
listbox={cls="listbox";left=7;top=56;right=161;bottom=463;edge=1;items={};vscroll=1;z=6}
)
/*}}*/

import web.view;
var wb = web.view(mainForm.custom);

import web.json;
import console;

import io;
import sys;
import fsys.media;
import web.rest.jsonClient;
//创建 HTTP 客户端
var http = web.rest.jsonClient();

var basepath = "D:\mdict\data";
//导出本地函数给网页 JavaScript
wb.external = {
  mplay = function(url){
	if (string.startWith(url, "sound://")){
		if (string.endWith(txt, ".mp3")){
			var str = string.slice(txt,8,-1,true);
			var path = basepath + string.replace(str,"/","\");
			if(! io.exist(path)){
				mainForm.msgbox(path+" not found.");
				return;
			}
			mediaFile = fsys.media(path);
			if (mediaFile){ mediaFile.play();}
		}
	}		
  }
}

var js = /**
  window.onload = function(){
    document.body.addEventListener('click', function(event){
        var target = event.target || event.srcElement;      // 兼容处理
        if (target.nodeName.toLocaleLowerCase() === "a") {  // 判断是否匹配目标元素
            if (event.preventDefault) {     // 对捕获到的 a 标签进行处理
                event.preventDefault();
                var addr = target.getAttribute('href');
                if (addr.indexOf('sound://')==0){
                    alert(addr);
                } else {
                    alert('href='+addr);
                }
            }
        }       
    });
  }
**/

var baseurl = "http://localhost:8888/";
//响应按钮事件
mainForm.button.oncommand = function(id,event){
	var url = mainForm.edit.text ;
	if (string.startWith(url, "http://") or string.startWith(url, "https://")){
		wb.go(url);
	} else {
		url = baseurl + "trans?txt=" + string.trim(url)
		wb.go(url);
		//wb.doScript(js);
	}
}

mainForm.button2.oncommand = function(id,event){
	var txt = mainForm.edit.text;
	var str = string.trim(txt);
	if (string.startWith(str, "http://")){
		wb.go(str);
	} else {
		//url = baseurl + "prefix?txt=" + txt;
		//发送 GET 请求
		var ret = http.get(baseurl++"prefix",{ txt=str });
		//console.dumpJson(ret);
		mainForm.listbox.clear();		
		for( k,v in ret){
			mainForm.listbox.add(v);
		}
		mainForm.listbox.selIndex = 1;
	}
	//win.delay(1000);
}

mainForm.button3.oncommand = function(id,event){
	var txt = mainForm.edit.text ;
	if (string.startWith(txt, "sound://")){
		if (string.endWith(txt, ".mp3")){
			var str = string.slice(txt,8,-1,true);
			var path = basepath + string.replace(str,"/","\");
			if(! io.exist(path)){
				mainForm.msgbox(path+" not found.");
				return;
			}
			mediaFile = fsys.media(path);
			if (mediaFile) {
				mediaFile.play();
			}
		}
	}
	win.delay(1000);		
}

mainForm.listbox.oncommand = function(id,event){
	if( event == 0x1/*_LBN_SELCHANGE*/ ){
		str = mainForm.listbox.selText;
		url = baseurl + "trans?txt=" + str;
		wb.go(url);
	}
}

//响应回车键弹起的消息
mainForm.edit.wndproc = function(hwnd,message,wParam,lParam){
    if(message == 0x101/*_WM_KEYUP*/ && wParam == 0xD/*_VK_ENTER*/){
	  var url = mainForm.edit.text ;
	  if (string.startWith(url, "http://") or string.startWith(url, "https://")){
		wb.go(url);
	  } else {
		url = baseurl + "trans?txt=" + string.trim(url)
		wb.go(url);
		//wb.doScript(js);
	  }
    }
    //无返回值则继续调用默认回调函数
}

mainForm.show();
return win.loopMessage();

 对这个模仿程序的评价:"有点像"跟"是一样",很多时候有遥远的距离。

web 服务程序参见:python:mdict + bottle = web 查询英汉词典

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/840042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于以太网的煤矿电力监控系统的设计与应用 安科瑞 许敏

摘 要:针对传统煤矿电力监控系统通讯网络性能较差、无法实现准确故障定位及报警、不具备数据交互功能等问题,结合分布式网络及GPS授时技术设计了一套基于工业以太网及RS485总线架构的煤矿电力监控系统,可实现对井下供电网络及设备的远程监控…

C++ 字符串

在C语言中是使用字符型数组来存放字符串,C程序也仍然可以沿用这种方法。不仅如此,C库中还预定义了string类。 1.用字符数组存储和处理字符串 字符串常量是用一对双引号括起来的字符序列。例如"abcd","China"都是字符串…

跨域+四种解决方法

文章目录 一、跨域二、JSONP实现跨域请求三、前端代理实现跨域请求四、后端设置请求头实现跨域请求五、Nginx代理实现跨域请求5.1 安装Nginx软件5.2 使用Ubuntu安装nginx 本文是在学习课程满神yyds后记录的笔记,强烈推荐读者去看此课程。 一、跨域 出于浏览器的同…

【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>

目录 【力扣】23. 合并 K 个升序链表题解方法一:暴力,先遍历取出来值到数组中排序,再生成新链表方法二:基础堆排序(使用优先队列 PriorityQueue)方法三:基础堆排序(使用优先队列 Pri…

时序预测 | Matlab实现基于SVR支持向量机回归的电力负荷预测模型

文章目录 预测结果基本介绍程序设计参考资料预测结果 基本介绍 时序预测 | Matlab实现基于SVR支持向量机回归的电力负荷预测模型 支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给…

微信小程序nodejs+vue+uniapp个人家庭理财系统--论文

随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理家庭理财系统app的最新形式。本论文是以构建家庭理财系统app为目标,使用nodejs技术制作&…

什么是Linux,如何在Windows操作系统下搭建Linux环境,远程连接Linux系统

文章目录 什么是LinuxLinux的诞生及发展为什么要学习LinuxLinux内核Linux发行版什么是虚拟机如何在VMware虚拟机中搭建Linux系统环境远程连接 Linux 系统Linux 帮助网站 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户…

概念解析 | PointNet概述

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次解析的概念是:点云深度学习及PointNet论文概述 参考论文:Qi C R, Su H, Mo K, et al. Pointnet: Deep learning on point sets for 3d classification and segmentation[C]//Proceedings of …

《向量数据库指南》——GPTCache 中的温度参数

目录 GPTCache 中的温度参数 a. 从多个候选答案中随机选择 b. 调整概率跳过缓存,直接调用模型 GPTCache 中的温度参数 为了平衡响应的随机性和一致性,并满足用户偏好或应用需求,在多模态 AI 应用中选择适当的温度参数值至关重要。GPTCache 保留了机器学习中温度参数的概…

Netty 粘包半包

什么是 TCP 粘包半包? 假设客户端分别发送了两个数据包 D1 和 D2 给服务端,由于服务端一次读取到的字节 数是不确定的,故可能存在以下 4 种情况。 (1)服务端分两次读取到了两个独立的数据包,分别…

kubernetes基于helm部署gitlab-operator

kubernetes基于helm部署gitlab-operator 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-operator。 先决条件 已运行的 Kubernetes 集群负载均衡器,为ingress-nginx控制器提供EXTERNAL-IP,本示例使用metallb默认存储类,为gitlab p…

ChatGPT“侵入”校园,教学评价体制受冲击,需作出调整

北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的“完美论文”。“这篇文章写得比大多数学生都要好......好到不符合我对学生的预期!”他去问ChatGPT:“这是你写的吗?”ChatGPT回答:“99.9%的概率是的。” ChatGPT“侵…

C++二叉搜索树剖析

目录 🍇二叉搜索树概念🍈二叉搜索树查找🍉二叉搜索树的插入🍊二叉搜索树的删除🍍二叉搜索树的查找、插入、删除实现🍋二叉搜索树的应用🥭二叉搜索树的性能分析🍓总结 🍇二…

Mac 创建和删除 Automator 工作流程,设置 Terminal 快捷键

1. 创建 Automator 流程 本文以创建一个快捷键启动 Terminal 的自动操作为示例。 点击打开 自动操作; 点击 新建文稿 点击 快速操作 选择 运行 AppleScript 填入以下内容 保存名为 “Open Terminal” 打开 设置 > 键盘,选择 键盘快捷键 以此选择 服…

Python(六十九)为什么要将元组设计成不可变序列

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

git bash 安装sdkadmin

1.下载相关安装包,复制到git 安装目录 D:\software\Git\mingw64\bin 2. 运行 curl -s "https://get.sdkman.io" | bash

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

文章目录 前言介绍系统框架原项目地址本项目开发开源地址硬件PCB软件功能 详细内容硬件外壳制作WS2812级联及控制MAX30102血氧传感器0.96OLEDFreeRTOS 效果视频总结 前言 在好几年前,我好像就看到了焊武帝 jiripraus在纪念结婚五周年时,制作的一个心跳跟…

10 日志系统(下)

10 日志系统(下) 本文内容 日志系统分为两部分,其一是单例模式与阻塞队列的定义,其二是日志类的定义与使用。 本篇将介绍日志类的定义与使用,具体的涉及到基础API,流程图与日志类定义,功能实现…

Android 刷新与显示

目录 屏幕显示原理: 显示刷新的过程 VSYNC机制具体实现 小结: 屏幕显示原理: 过程描述: 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制,绘制完成就提交buffer,系统服务把buffer数据…

第三章 CUDA编译器环境配置篇

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…