;GifView.as ;ホームページ素材閲覧ツール ; 指定されたフォルダ以下のgifファイルをフォルダごとにまとめてウェブブラウザに ; 表示させます。 ; 「次」ボタンをクリックすると、次のフォルダの表示に移ります。 ; ウィンドウが消えたら終わりです。 ; 起動方法は3通りあります。 ; ・ダブルクリックで起動すると、フォルダ選択ダイアログが表示されます。 ; ・exeファイルまたはそのショートカットにドラッグ&ドロップ ; ドラッグ&ドロップするのは、フォルダでもgifファイルでもかまいません。 ; ・関連づけ(gifファイルまたはフォルダまたは両方に) ; 初めて実行したとき、テキスト形式のGifview.iniが作成されます。 ; ブラウザのウィンドウ幅・文字の横幅・本体のウィンドウ位置が指定できます。 #include "Exforce.as" #define MAX_BUF 96000 #define MAX_PART_BUF 2000 ;htmlのtable 1行分のバッファ(からまで) #define MAX_PATH 261 #define MAX_CMDLINE 521 #define FILE_NAME "GifView" #define MAX_NEST 15 ;repeatネスト最大値 #define NUM_INI 4 ;iniファイルデータ数 sdim keyword,64,NUM_INI keyword="BrowserWidth","CharacterWidth","WindowX","WindowY" sdim coment,80,NUM_INI coment="ファイル名1文字の横幅のドット数","ブラウザの横幅のドット数" coment.2="ウィンドウ位置X座標","ウィンドウ位置Y座標" dim aflg,NUM_INI dim ini,NUM_INI dup wid,ini.0: dup chrwid,ini.1: dup winpx,ini.2: dup winpy,ini.3 sdim abuf,32000,MAX_NEST sdim folder,MAX_PATH,MAX_NEST sdim fronta,64,2: fronta="非最前面","最前面" dim idx,MAX_NEST dim amax,MAX_NEST sdim buf1,MAX_PART_BUF+1 sdim buf2,MAX_PART_BUF+1 sdim instdir,MAX_PATH sdim fn,MAX_PATH sdim arg,MAX_CMDLINE sdim tdir,MAX_PATH+8 ;sdim tbuf,MAX_BUF+1 ;iniファイル読み込みの後で定義している sdim s,MAX_PATH sdim t,MAX_PATH*3 sdim u,MAX_PATH title "GifView" exist exedir+"\\GifView.exe" if strsize<0 { instdir=curdir } else { instdir=exedir } wid=620: chrwid=9: winpx=0: winpy=0 ;Gifview.iniの読み込み s=instdir+"\\GifView.ini" gosub *l_readIni ;フォルダ nest=0 if cmdline!="" { arg=cmdline extract s,arg,2 ;拡張子→s extract t,s,7 ;小文字にする→t if t==".gif": extract arg,arg,5 ;親フォルダ→arg } else { ;引数がないとき seldir "gifファイルのあるフォルダを選択してください" if stat: dialog "キャンセルまたはエラー": end arg=refstr } strlen l,arg: if l>(MAX_PATH-1): dialog "引数が長すぎます\n"+arg: end ;ウィンドウ screen 0,130,64,,winpx,winpy: gsel 0,1 objsize 130,32: button "次",*l_next: enable 0,0 button "",*l_noFront: objprm 1,fronta.0: enable 1,0 onexit *l_exit u="": nest=0: dispflg=1: folder.nest=arg: gosub *l_disp gosub *l_dirRecursive ;終了時処理 *l_exit ginfo 2: winpx=prmx: winpy=prmy fn=instdir+"\\GifView.ini" gosub *l_writeIni end *l_dirRecursive s=folder.nest+"\\*.*": dirlist abuf.nest,s,5 strlen l,abuf.nest: if l>MAX_BUF: dialog "MAX_BUFが足りません l="+l: end notesel abuf.nest: notedel 0: notedel 0 ;「.」「..」の削除 notemax amax.nest ;dialog "dir max="+amax.nest+" s="+s,3: if stat==7: end if amax.nest<=0: return ;folder.nestが空でないとき idx.nest=0 *l_loop noteget s,idx.nest: s=folder.nest+"\\"+s nest++ if nest>=MAX_NEST { dialog "フォルダが深すぎます": end } folder.nest=s: gosub *l_disp gosub *l_dirRecursive ;再帰呼び出し!! nest--: notesel abuf.nest idx.nest++: if idx.nest\n\n" tbuf+="\n"+t+"

\n" strlen lb,tbuf t=dir+"\\*.gif": dirlist buf,t strlen l,buf: if l>MAX_BUF: dialog "MAX_BUFが足りません l="+l: end notesel buf: notemax max ;dialog "gif max="+max+" t="+t,3: if stat==7: end if max>0 { chdir dir: tw=wid: firstflg=1 repeat max noteget s,cnt: strlen l3,s: pw=l3*chrwid u=dir+"\\"+s exist u: if strsize<0: dialog "not found "+u: end bload u,t,10: wpeek c,t,6: if c>pw: pw=c if tw+pw+2>wid { if firstflg { firstflg=0 } else { gosub *l_addBuf } tw=2 buf1="\n": strlen l1,buf1 buf2="\n": strlen l2,buf2 } tw+=pw+2 t="\n" strlen l,t: l1+=l if l1>MAX_PART_BUF { dialog "MAX_PART_BUFが足りません l1="+l1: end } buf1+=t t="\n" strlen l,t: l2+=l if l2>MAX_PART_BUF { dialog "MAX_PART_BUFが足りません l2="+l2: end } buf2+=t loop gosub *l_addBuf tbuf+="\n" strlen l,tbuf: if l>MAX_BUF: dialog "error": end s=instdir+"\\"+FILE_NAME+".html if dispflg==0 { front=0: objprm 1,fronta.front: enable 0,1: enable 1,1: gsel 0,2 *l_loop2 repeat stick c,0,1: if c&48: break wait 1 loop *l_next enable 0,0: enable 1,0: gsel 0,1 } bsave s,tbuf,l exec s,16 dispflg=0 } return ;最前面ボタン *l_noFront front=1-front: objprm 1,fronta.front: gsel 0,2-front goto *l_loop2 ;buf1,buf2をtbufに追加する *l_addBuf t=buf1+buf2+"
"+s+"
\n" strlen l,t: lb+=l c=lb+16: if c>MAX_BUF { dialog "MAX_BUFが足りません lb="+c: end } tbuf+=t return ;------------------------------------------------------------------------------ ;iniファイルの読み込み ;入力:s(ファイル名),keyword.*,NUM_INI ;出力:ini.* ;破壊:c,count,l,max,p,s,t,tbuf,u ;------------------------------------------------------------------------------ *l_ReadIni exist s if strsize>0 { sdim tbuf,strsize+1 bload s,tbuf notesel tbuf: notemax max if max>0 { count=0 repeat max noteget s,cnt peek c,s,0 if (c>='A')&(c<='Z') { repeat NUM_INI u=keyword.cnt+"=": strlen l,u strmid t,s,0,l if t==u { p=l repeat peek c,s,p if (c<'0')|(C>'9'): break p++ loop strmid t,s,l,p-l int t: ini.cnt=t: str t break } loop } loop } } sdim tbuf,MAX_BUF+1 return ;------------------------------------------------------------------------------ ;iniファイルの書き込み ;入力:coment.*,fn(ファイル名),ini.*,keyword.*,MAX_BUF,NUM_INI ;出力:なし ;破壊:aflg.*,c,flg,i,l,len,max,p,s,t,tbuf,u ;------------------------------------------------------------------------------ *l_writeIni exist fn: flg=1 if strsize>0 { ;iniファイルあり if strsize>MAX_BUF: dialog "MAX_BUFが足りません--iniファイル size="+strsize: end bload fn,tbuf: poke tbuf,strsize,0 notesel tbuf: notemax max if max>0 { repeat NUM_INI: aflg.cnt=0: loop repeat max noteget s,cnt peek c,s,0 if (c>='A')&(c<='Z') { i=cnt repeat NUM_INI u=keyword.cnt+"=": strlen l,u strmid t,s,0,l if t==u { p=l repeat peek c,s,p if (c<'0')|(C>'9'): break p++ loop strlen l,s: strmid t,s,p,l s=keyword.cnt+"="+ini.cnt+t noteadd s,i,1 aflg.cnt=1 break } loop } loop strlen len,tbuf repeat NUM_INI if aflg.cnt==0 { t=keyword.cnt+"="+ini.cnt+"\t;"+coment.cnt+"\n" strlen l,t: len+=l if len>MAX_BUF: dialog "MAX_BUFが足りません。size="+len: end tbuf+=t } loop flg=0 } } if flg { ;iniファイルなし tbuf="行頭が英大文字でなければ注釈です(無視します)\n" tbuf+="以下はブラウザの横にいくつの画像を並べるか(一定ではありません)を\n" tbuf+="計算するための基礎になるデータです。\n" strlen len,tbuf repeat NUM_INI t=keyword.cnt+"="+ini.cnt+"\t;"+coment.cnt+"\n" strlen l,t: len+=l if len>MAX_BUF: dialog "MAX_BUFが足りません。size="+len: end tbuf+=t loop } bsave fn,tbuf,len return ;------------------------------------------------------------------------------ ;フルパスをlfnに変換 ;入力:s ;出力:t ;破壊:l,p,q,v,ss ;------------------------------------------------------------------------------ *l_path2lfn if s=="": t="": return instr p,s,"\\" if p<0 { t=s: return } ;「\」がなければ「ドライブ名:」とみなす strmid t,s,0,p strlen l,s repeat t+="\\" p++: if p>=l: break ;最後が「\」のとき repeat peek c,s,p: if c=='\': break if (c>$7F)&(c<$A0)|(c>$DF): p++ p++: if p>=l: p=l: break loop strmid v,s,0,p dirlist ss,v: strlen m,ss: strmid ss,ss,0,m-2 t+=ss ;dialog "v="+v+" ss="+ss+" t=["+t+"]",2: if stat==7: end if p>=l: break ;最後が「\」でないとき loop return