首页
论坛
课程
招聘
雪    币: 1635
活跃值: 活跃值 (20)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝

[调试逆向] [原创]《韦氏可视化词典》之HTMDIY

2009-12-27 14:17 8931

[调试逆向] [原创]《韦氏可视化词典》之HTMDIY

2009-12-27 14:17
8931
《韦氏可视化词典》之HTMDIY      By 天易love  2009-12-27

      时代背景: 2009年即将过去,为了给以后留下点可以回味的文字,特此撰文一篇,希望对正在学习和即将学习英语的朋友提供一条捷径。《韦氏可视化词典》(Merriam-webster Visual Dictionary)是一本不可多得的好词典。前两天偶尔得到且试用了一下,发觉学习效果非比一般。但是有一点细节方面的问题需要修改,否则对学习效率有所影响。

     一、存在问题:对类似下面插图中的文字不能鼠标即指即读,影响学习效果。
    House.Jpg


       Fruit.jpg


     二、分析原因:通过分析htm文件内容,发现插图中的每个文字标题都对应类似下面的一行代码:
<area shape="rect" coords="428,307,474,322" href="#worker10692" alt="worker" />
原本鼠标单击插图中的每个文字标题都会跳转到href="#worker10692"所指定的地方,但使用中发现,这样的效果很差,基本上不知道一下子跳到了哪里。我个人认为在插图上还是鼠标即指即读效果更好。其实很简单,只要把href="#worker10692"替换为
onmouseover="DHTMLSound('../../sounds/astronomy/astronomical-observation/05971.aif')"即可解决问题。
只是这个声音文件的路径要利用worker10692这个关键字来搜索网页内容提取。例如:
先定位网页中该处,然后即可提取出对应的声音文件详细路径。
<div class="descript" id="worker10692">
<h4>aperture door <span id="dummyspan"><embed src='../../sounds/astronomy/astronomical-observation/05971.aif' hidden=true autostart=false loop=false height=1 width=1></span>
<img src="../../images/big-speaker.jpg" onmouseup="DHTMLSound('../../sounds/astronomy/astronomical-observation/05971.aif')"></h4></div>
修改成这样: <area shape="rect" coords="428,307,474,322" onmouseover="DHTMLSound('../../sounds/astronomy/astronomical-observation/05971.aif')"  />
      三、解决问题:
      由于整个词典接近1.8G,仅仅声音文件就接近2万个,需要修改的地方多如牛毛,只能编个程序(懒人被逼急了使出了杀手锏)。工具还是用Delphi快,花了我半天时间(时间都花在语法上了),算法代码极其丑陋,反正也只用一次,处理完就可以扔掉。通过实际测试,2009年购买的4500左右的thinkpad需要60秒,其他价格品牌依次类推,再打个更形象的比方就是尿个尿回来就搞定了。随便打开一个网页即指即读,一个字爽!


     贴一下代码:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Controls, Forms,
  Dialogs, StdCtrls, FileCtrl, Classes, Grids, Outline, DirOutln;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Button2: TButton;
    DirectoryOutline1: TDirectoryOutline;
    DriveComboBox1: TDriveComboBox;
    Label1: TLabel;
    Memo3: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure DriveComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  number:integer;
implementation
{$R *.dfm}
function newline(tt:string):string;
var i,j,lines:integer;
    ss:string;
begin
    for lines:=Form1.memo2.lines.count-1 downto 0 do
       begin
           if (pos(tt,Form1.memo2.lines[lines])<>0)  then
               begin
                 i:=pos('DHTMLSound(',Form1.memo2.lines[lines+1]);
                 j:=pos(')">',Form1.memo2.lines[lines+1]);
                 ss:=copy(Form1.memo2.lines[lines+1],i+11,j-i-11);
                 break;
               end;
       end;
    result:='onmouseover="DHTMLSound('+ss+')"  />';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:byte;
  F: TextFile;
  path,singleLine,content,tt,tt1,tt2: string;
  lines:integer;
begin
     for lines:=0 to memo3.lines.count-1 do
       begin
          path:=memo3.lines[lines];
          memo2.Lines.LoadFromFile(path);
          content:=memo2.Text;
          AssignFile(F, path);
          Reset(F);
           while  (not eof(F))  do
             begin
               Readln(F, singleLine);
               i:=pos('" href="#',singleLine);
               if i<>0 then
                 begin
                    j:=pos('" alt="',singleLine);
                    tt:=copy(singleLine,i+9,j-i-9);
                    tt1:=copy(singleLine,1,i+1);
                    tt2:= tt1+newline(tt) ;
                    Memo1.Lines.Append(tt2);
                 end
                    else
                     Memo1.Lines.Append(singleLine);
              end;
           CloseFile(F);
           memo1.Lines.SaveToFile(path);
           memo1.Clear;
           memo2.Clear;
      end;
     Label1.Caption:=Label1.Caption+'  处理完: '+inttostr(memo3.lines.count)+' 个';
end;
function searchHtm(dir:string):boolean;
var sr:tsearchrec;
    sdir:string;
begin
   sdir:=dir+'*.*';
   if findfirst(sdir,faanyfile,sr)=0 then
    begin
       repeat
         begin
          if (sr.Name ='.') or (sr.Name ='..') then continue;
          if sr.Attr  and fadirectory=0 then
            begin
               if  ExtractFileExt(sr.Name)='.htm' then
                   begin
                     form1.Memo3.Lines.Append(dir+sr.Name);
                     number:=number+1;
                   end;
            end else
                   begin
                         searchHtm(dir+sr.Name+'\');
                   end;
         end
       until findnext(sr)<>0;
       findclose(sr);
    end;
   result:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var  dir:string;
begin
    number:=0;
    Label1.Caption:='网页文件:  个';
    dir :=DirectoryOutline1.Directory+'\';
    if searchHtm(dir) then Label1.Caption:='网页文件: '+inttostr(number)+' 个';
    number:=0;
end;
procedure TForm1.DriveComboBox1Change(Sender: TObject);
var str:string;
     cc:char;
begin
    str:=DriveComboBox1.Text;
      cc:=str[1];
     DirectoryOutline1.Drive:=cc;
   end;
end.

HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

上传的附件:
最新回复 (14)
雪    币: 945
活跃值: 活跃值 (812)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2009-12-27 21:51
2
0
编辑了一下你的帖,修正了附件帖图,帖图用这帖的方法:
http://bbs.pediy.com/showpost.php?postid=292659
雪    币: 1635
活跃值: 活跃值 (20)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
天易love 活跃值 18 2009-12-27 23:00
3
0
犯了个低级错误,麻烦坛主了,实在不好意思。
雪    币: 258
活跃值: 活跃值 (86)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 活跃值 41 2009-12-28 08:07
4
0
这软件看起来不错,下载下来试试
雪    币: 258
活跃值: 活跃值 (86)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 活跃值 41 2009-12-28 08:12
5
0
是书,不是软件,弄错了,呵呵
雪    币: 13
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jasonzhou 活跃值 2009-12-31 09:34
6
0
不错不错,学为所用~
雪    币: 29
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sungy 活跃值 1 2009-12-31 09:42
7
0
学英文得学要有好工具
雪    币: 793
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
zyr零零发 活跃值 1 2009-12-31 18:31
8
0
很好啊,楼主介绍了个学习英语的好书。
雪    币: 100
活跃值: 活跃值 (16)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 活跃值 24 2010-1-1 10:31
9
0
基本没太看明白啥意思,不过觉得应该支持下!
雪    币: 1635
活跃值: 活跃值 (20)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
天易love 活跃值 18 2010-1-1 12:47
10
0
楼上的前辈你的直觉是对的!这个词典给小孩学不错。处理后图片上可以指哪读哪,原版本是没有这个功能的哦!
雪    币: 216
活跃值: 活跃值 (19)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
tzl 活跃值 10 2010-1-2 09:53
11
0
不错,学习一下
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjackn 活跃值 2010-3-13 21:58
12
0
学英语,很不错
把技术应用到生活。
雪    币: 473
活跃值: 活跃值 (73)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
kagayaki 活跃值 2010-4-21 02:21
13
0
不错!!!!!!!!!!
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_逃离地球fly 活跃值 2018-1-23 18:16
14
0
楼主,求助细节
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_逃离地球fly 活跃值 2018-1-23 18:32
15
0
楼主,可否指导一下具体操作流程,可有偿,急需此软件发音
游客
登录 | 注册 方可回帖
返回