• 沒有找到結果。

中文新聞內容之視覺化 XML 標誌實驗平台 陳爽 葉健欣 2007.1.18

圖 1)啟動系統,讀入一篇未標誌的純文字新聞稿。

圖 2)選取人名,按左上方「人」按鈕,進行標誌。

圖 3)為加速標誌作業,可鉤選 「設定->自動」 選項。

圖 4)選取「心臟」,點「事」,所有的心臟皆被自動標誌。

圖 6)由於顏色的區別並不明顯,可在標籤上按滑鼠右鍵修改顏色。

圖 7)確定後,所有相同標誌的內容,顏色自動改變。

圖 8)修改「人」的背景色,不同文字亦可自動換色。

圖 9)補上地名、時間和事件的標誌,「事件」是巢狀標誌,可包含其他標誌。

圖 10)為標誌加上 XML 的屬性,這裡示範地名加上英文原名。

圖 10)在空白標籤區點滑鼠右鍵,加入新的標籤。

圖 11)用新的標籤來標誌第一行文字。標誌作業完成。

圖 12)軟體產生的 XML 檔

注意:本標誌範例之目的為展示軟體功能,不一定符合新聞標誌 5W1H 之規範。

可從以下網址下載本軟體及完整說明檔:

http://www.ksana.tw/newsmarkup/ or http://220.128.136.40/newsmarkup/

歡迎來信指教:

陳爽

[email protected]

葉健欣

[email protected]

unit main;

// 視覺化 xml 標記平台 950820--951115 剎那工坊 葉健欣--陳爽 interface

uses

//不需 Messages,Variants,Buttons,TntButtons,

SysUtils,//提供 strToIntDef、format、expandFileName、fileExists Classes,//提供 TStringList、TList

Graphics,//提供 Tcolor、tFontStyles、fsbold、fsItalic、fsUnderline、fsStrikeOut Forms,//提供 TTorm

//unicode,//提供

tntclasses,//提供 TTntStringList TntComCtrls,//提供 TTntRichEdit TntStdCtrls,//提供 TTntLabel TntDialogs,//提供 TTntOpenDialog tntinifiles,//提供 TTntInifile

TntMenus,//提供 TTntMainMenu、TTntMenuItem windows,//提供 mb_YesNo、mb_Yes、mb_Ok RichEdit,//提供 format2

ComCtrls, StdCtrls, ExtCtrls, Dialogs, Menus, Controls;//系統自動加入 type

tElement=record//備選標誌記錄 tagname:WideString;//標誌名稱,

如:WHO,WHAT,WHEN,WHERE,EVENT,CRITICIZE,TITLE,..

caption:WideString;//標誌顯示名, 如:人&Person,物 Thin&g,時&Time,地&Location, 事件&Event,評議&Criticize,標題 T&itle

name:WideString;//標誌字形, 如:標楷體,微軟正黑體,細明體

color:tcolor;//標誌色碼 (指定藍綠紅光三色的強度), 如:$3fafaf 表示藍 3f 綠 af 紅 af (分別以兩位 16 進制數表示)

style:tfontstyles;//標誌風格, 是否包含:粗體 bold,斜體 italic,底線 underline,刪 線 strikeout (可覆選)

size:single;//標誌大小

bgcolor:tcolor;//標誌背景色碼 (指定藍綠紅光三色的強度), 如:$3fafaf 表示藍 3f 綠 af 紅 af (分別以兩位 16 進制數表示)

defaultname:boolean;//標誌字形未宣告 defaultcolor:boolean;//標誌色碼未宣告 defaultBold:boolean;//標誌風格未宣告

defaultItalic:boolean;//標誌風格未宣告 defaultUnderLine:boolean;//標誌風格未宣告 defaultStrikeOut:boolean;//標誌風格未宣告 defaultsize:boolean;//標誌大小未宣告 defaultbgcolor:boolean;//標誌背景未宣告

attributes:WideString;//標誌包含之屬性 (以逗點區隔)

TForm1=class(TForm)

Panel1: TPanel; // 文字編輯視窗上方區域

XmlOpenDialog: TTntOpenDialog; // XML 匯入介面 TxtOpenDialog: TTntOpenDialog; // txt 開檔介面

procedure btnMouseDown(o:TObject;b:TMouseButton;s:TShiftState;X,Y:Integer);

// 標記按鈕 觸動處理

procedure btnMouseEnter(o:TObject); // 滑鼠進入標記按鈕 處理 procedure btnMouseLeave(o:TObject); // 滑鼠離開標記按鈕 處理 procedure edtChange(o:TObject); // 標記屬性 改變處理

procedure FormCreate(o:TObject); // 系統啟動 處理 procedure FormDestroy(o:TObject); // 系統結束 處理

procedure mAutoClick(o:TObject); // 自動搜尋選項 觸動處理

procedure mClearManyClick(o:TObject); // 清除這些標記選項 觸動處理 procedure mClearOneClick(o:TObject); // 清除這個標記選項 觸動處理 procedure mConfirmClick(o:TObject); // 要求確認選項 觸動處理

procedure mOpenTxtClick(o:TObject); // 開啟 TXT 文字稿選項 觸動處理 procedure mSaveMrkClick(o:TObject); // 儲存 MRK 標記稿選項 觸動處理 procedure mXmlInpClick(o:TObject); // 匯入 XML 新聞稿選項 觸動處理 procedure mXmlOutClick(o:TObject); // 匯出 XML 標準稿選項 觸動處理 procedure Panel1Click(o:TObject); // 新增備選標誌

procedure re1KeyUp(o:TObject;var k:Word;s:TShiftState); // 手離鍵盤 處理 procedure re1MouseDown(o:TObject;b:TMouseButton;s:TShiftState;X,Y:Integer);

// 手按滑鼠 處理

procedure re1MouseUp(o:TObject;b:TMouseButton;s:TShiftState;X,Y:Integer); //

手離滑鼠 處理

procedure re1DblClick(o:TObject);

procedure

function getTagFromPos(textpos:integer):integer; // 依游標位置取得標記序號 function InStr(p:PWidechar;s:WideString):PWidechar; // 回應在 p 所指字串中 s 之位址

procedure loadMrk; // 載入 mrk 檔的標記

procedure loadTxt; // 載入 txt 檔 procedure loadXml; // 載入 xml 檔

function selTextToTag(Start,Len:integer):integer; // 反白文字所指標誌序號 procedure repaintAllTags; // 更新顯示所有的標記

procedure repaintBlock(sStart,sEnd:integer); // 更新顯示所有的標記 procedure resetTagsOfElem(relatedTags:wideString;iEl:integer);

procedure updateStatusAndAttrUI; // 更新標記屬性輸入介面 end;

var

Form1: TForm1; // 系統視窗

ElemIni:TTntinifile; // 備選標記定義 tagDef.ini 匯入檔 systemIni:TTntinifile; // 系統設定 newsMarkup.ini 匯入檔 markupini:TTntinifile; // txt 對應標記 mrk 匯入檔 slElement:ttntstringlist; // 備選標誌排序列表 tags:tlist; // 標誌列表

wrkFile:WideString; // TXT 文字稿檔名 txtPath:WideString; // TXT 文字稿檔全名 form2Changed:integer;

startPos:integer; // 滑鼠按下時的游標位置 tagStarts:TStringList; // 標誌依位置排序 tagLens:TStringList; // 標誌依寬度排序 sections:ttntstringlist;

needToSave:Boolean; // 標誌異動資訊待輸出 input:tTNTStringList; // txt 文稿

sysDir:WideString; // 系統程式所在資料夾 exeName:WideString; // 系統程式名稱 xmlPath:WideString; // xml 檔全名 XmlFileName:WideString;

wrkDir:WideString=''; // 文稿所在資料夾

btnColor:tColor; // 標記按鈕顏色 (滑鼠進入按鈕時暫存原有顏色) slColor:tColor=$eaeaea; // 滑鼠進入按鈕時顯示的按鈕顏色

defBackColor:tColor=$f7f7f7; // 文字編輯區背景色 defFontColor:tColor=$400040;

attributes:tTNTStringList; // 屬性名稱列表 lastTag:integer=-1; // 最後設定的標記

sysCaption:String=' 視覺化 XML 標記平台 2007.1.16';// 950820--951115 剎那工坊 葉 健欣--陳爽';

iEl:integer;

Elem:tElement;

procedure resetTagOfElem(n:integer);

procedure repaintRelatedTags(RelatedTags:wideString);

procedure repaintInsideTags(RelatedTags:wideString);

procedure tagsChanged; // 標記改變 procedure rebuildElemini;

procedure setTagOflElem(n:integer);

function IndexOfElement(tagName:WideString):integer; // 依名稱取得備選標記序 號

procedure saveMrk; // 標記存成 mrk 檔

function selTextAsTagStart(start,len:integer):integer; // 反白文字的標誌位置 序號

function match(t:PWidechar;s:WideString):Boolean; // 檢視在 t 位置是否有字串 s

function saveXml:wideString; // 本文及標記存成 Xml 檔

function TrimLast(s,d:String):WideString; // 刪除 s 字串中末尾 d 字元後之字串 function tagsOfElem(iEl:integer):wideString;

procedure updateElem(iEl:integer);

function trimLead(s,d:String):WideString; // 刪除 s 字串中末尾 d 字元前之字串 procedure asureTagDef(filename:widestring); // 載入工作資料夾中的 tagDef.ini procedure freeAttrUI;

procedure freeElemUi;

procedure loadElements(re1:tTntRichEdit); // 自 newsMarkUp.tag 匯入備選標記的定 義

procedure loadUi; // 自動產生標記設定按鈕

function selTextAsTag(start,len:integer):integer; // 反白文字的標誌序號 procedure clearTags;

procedure deleteElem(iEl:integer);

implementation uses Unit2;

{$R *.dfm}

procedure asureTagDef(filename:widestring);

VAR wDir:wideString;

begin

wDir:=TrimLast(filename,'\');

if match(pWideChar(wDir+'\'),sysDir) then begin

if wDir+'\'=sysDir then wDir:=''

else wDir:=wideString(pWideChar(wDir)+length(sysDir));

end;

freeAttrUi;

if wDir<>wrkDir then begin

wrkDir:=wDir;

freeElemUi;

loadElements(form1.re1);

loadUI;

systemIni.WriteString('TxtFile','dir',wrkDir);

end;

form1.statusbar1.Panels.Items[0].text:=filename;

end;

procedure deleteElem(iEl:integer);

var

relatedTags:wideString; i,start,L:integer; tag:tTag; p:pWideChar;

begin

relatedTags:='';

start:=form1.re1.selStart; L:=form1.re1.SelLength;

for i:=tagLens.Count-1 downto 0 do begin tag:=tags[i];

if tag.tagName=elements[iEl].tagName then begin

form1.re1.selStart:=tag.Start; form1.re1.SelLength:=tag.len;

resetTagOfElem(iEl); tag.tagName:='';

relatedTags:=relatedTags+wideChar(i+1);

end;

end;

form1.re1.selStart:=start; form1.re1.SelLength:=L;

i:=slElement.indexOf(Elements[iEl].tagName);

Elements[iEl].tagName:='';

if i>=0 then slElement.Delete(i);

btn[iEl].Visible:=False;

if iEl<elemCount-1 then begin

L:=btn[iEl+1].Left-btn[iEl].Left;

for i:=iEl+1 to elemCount-1 do btn[i].Left:=btn[i].Left-L;

end;

repaintRelatedTags(relatedTags);

p:=pWideChar(relatedTags);

while p^<>#0 do begin

i:=integer(p^)-1; inc(p); tags.Delete(i);

end;

tagschanged;

rebuildElemIni;

end;

procedure updateElem(iEl:integer);

var form2:tForm2; b:tTntLabel; e:tElement;

res:integer; relatedTags:wideString;

begin

freeAttrUi;

b:=btn[iEl]; e:=Elements[iEl];

form2:=tForm2.Create(nil);

form2.lbOldTag.Caption:=b.Caption;

form2.lbOldTag.Color:=$FFFFFF xor b.Color;

form2.lbOldTag.Font:=b.Font;

form2.lbOldTag.Font.Color:=$FFFFFF xor b.Font.Color;

form2.lbXfer.Left:=form2.lbOldTag.Left+form2.lbOldTag.width+10;

form2.lbNewTag.Caption:=b.Caption;

form2.lbNewTag.Color:=form2.lbOldTag.Color;

form2.lbNewTag.Font:=form2.lbOldTag.Font;

相關文件