中文新聞內容之視覺化 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;