home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 April / VPR0204A.ISO / OLS / KAKIMAC1 / kakimac1.lzh / GYOUCHK2.MAC next >
Text File  |  1994-07-07  |  12KB  |  341 lines

  1. //【マクロ名】 gyouCHK2.mac by 水銀水(Suigwinsui)  94/07/07(木) 七夕さま(^^)
  2. //【主な用途】日本語文書作成支援シリーズ・行数算出 
  3. //【使用対象】清貧にあえぐライター(締切前になると突如住所不定になる習性をお持ち)
  4. //            ならびに,印刷所のファックス前に顔面蒼白で立ち尽くす編集者のみなさま(^^;
  5. //【機能概略】文章の行数を算出する。(1行の文字数は秀丸に依存)
  6. //        (1)見出の行数,本文の行数を総計,各ブロック(見出行+本文)に分けて算出。
  7. //        (2)行頭の●,■は、見出行頭マークとしてする。
  8. //        (3)行算出は,全文書,選択範囲に両設定可能。
  9. //        (4)空白行の出現回数(写真スペース用)表示。
  10. //        (5)見出行には、通番設定。
  11. //        (6)本文行以上の長さの見出行も、見出し1行として算出
  12. //        (7)第一見出し行までは、本文として計算しない。(リード部処理)
  13. //        (8)全文指定と部分指定の動作が可変。
  14. //         (+9)結果をファイルに一覧出力する機能を追加。
  15. //         (+10)結果を見出ごとに表示するか、ファイル出力だけにするか選択可能。
  16. //              (+11)結果出力ファイル上で特化タグを実現するgyoyTAG2.mac を同梱。
  17. //【使用法】  全文指定=範囲指定をしていない状態で本マクロを実行。
  18. //            範囲指定=指定部分のみ。
  19. //【補注】  
  20. //変数の初期設定
  21. #sn       = 0;    // Shou Number            章の番号(0,1,2,3,・・・)=見出の個数
  22. #kd[0]     = 0;    // KomiDasi Gyousuu        見出の見出内行数(0,1,2,3,・・・)
  23. #tl_kd[0]= 0;    // KomiDasi Ruiseki        見出累積行数(0,1,2,3,・・・)
  24. #ln[0]   = 0;    // Line Number            章内の全本文行数(0,1,2,3,・・・)
  25. #tl_ln[0]= 0;    // Line Number            全本文行数(0,1,2,3,・・・)
  26. #zl[0]      = 0;    // Zissitu Line number        章内の実質本文行の行数
  27. #tl_zl[0]= 0;    // Total Zissitu Line number    全文の実質本文行の行数
  28. #rn[0]   = 0;    // only Return line Number    章内の空白行の行数(0,1,2,3,・・・)
  29. #tl_rn[0]= 0;    // Total only Return line Number空白行の累積行数(0,1,2,3,・・・)
  30. #rk[0]   = 0;    // Return Kasyo箇所 number    章内の空白行の出現箇所数(0,1,2,3,・・・)
  31. #tl_rk[0]= 0;    // Total Return Kasyo箇所 number空白行の出現箇所数累積(0,1,2,3,・・・)
  32. #gc      = 0;    // GyoutouCharacter        行頭の文字種
  33. #gcb      = 0;    //GyoutouCharacterBefoer    1行前の行頭状態
  34. #SelAll     = 0;    //マクロ開始時に select 範囲のあるなし 
  35. #BlockCheck = 0; // ブロック毎に結果を報告するか、最後だけにするか?0:各ブロック  1:最後だけ
  36. #eoc = 0;
  37. #jz = getininum("hidemaru.ini","Default","Orikaeshi");//秀丸で設定されている一行の字詰め
  38. $oldfilename = filename;
  39. //秀丸設定 freecursor  
  40. #fc = 0;
  41. if (freecursor){
  42.     freecursorswitch;
  43.     #fc = 1;
  44. }
  45. // not selecting
  46. if(!selecting){        // no selecting case 
  47. #SelAll = 1;    //SelAll=1なら選択状態になかったため全文選択をした
  48. question "今からテキスト全体の行数チェックを開始します。\n結果報告だけでいいですか?\n\n"+
  49.     "[はい]<<==◎最後にまとめて出力\n"+"     ◎ブロックごとに結果表示==>>[いいえ]";
  50. if(result)#BlockCheck = 1;
  51. //範囲の取得
  52. disabledraw;
  53. selectall;
  54. //enabledraw;
  55. }    // if( !selecting )'s end ).
  56. if (selecting){ 
  57. //#SelAll = 0 <=実際には何もしない; // SelAll=0:選択状態  SelAll=1:最初は選択状態でないため全文を選択した
  58. if (#SelAll==0){#sn=1;#eoc=2;}
  59. //範囲の取得
  60. #tlx=seltopx;        //tlx:Top_Line_X
  61. #tly=seltopy;        //tly:Top_Line_Y
  62. #elx=selendx;        //elx:End_Line_X
  63. #ely=selendy;        //elx:End_Line_X
  64. // 取得範囲の確認
  65. escape;
  66. //disabledraw;        //動きを見たくない場合には //を消去
  67. //moveto #elx,#ely;//ファイル最終行のカウントは行範囲指定や全体指定の時と文字指定の時で相違
  68. if ( #elx != 0)#ely = #ely;            // x==0:最後が[eof]だけの行
  69. else #ely = #ely -1;
  70. //main
  71. moveto #tlx,#tly;
  72. //$starttime = time;// 実行実時間を計測する(開始)
  73. while( 1 )    //main start
  74. {
  75.     golinetop;
  76.     call hanbetu_joutai;    //行頭状態判別
  77.     #gc = ##return;
  78.          if (#gc == 3 )call line_h;    //本文の場合
  79.     else if (#gc == 1 )call line_k; //空白行
  80.     else if (#gc == 2 )call line_m; //小見出行
  81.     else if (#gc == 9 )break; //強制終了
  82.     if ( y >= #ely )    break;
  83.     call c_move;
  84.     if ( code == eof )break;
  85. }
  86. //$endtime = time;// 実行実時間を計測する(終了)
  87. //message "starttime:"+$starttime+
  88. //    "endtime:"+$endtime;
  89. call zensyou;
  90. call mes_num_newfile;
  91. }
  92. call end_fc;
  93. escape;
  94. endmacro;
  95. FileOutput:// 全体結果のファイル出力
  96. $$sp4="    ";
  97. enabledraw;
  98. #snMax = #sn;
  99. $OpenFileKekka = hidemarudir+"\\gcreport.txt";
  100. if (findhidemaru($OpenFileKekka)==-1) openfile $OpenFileKekka;
  101. else setactivehidemaru findhidemaru($OpenFileKekka);
  102. if (#SelAll == 0){$InsHead2 = "▲部分";$InsHead3="";}
  103. else {$InsHead2 = "■全文";$InsHead3="--------------------------------------------------先行部分(最初の行頭●迄)-";}
  104. config "w90";
  105. gofileend;
  106. if (#eoc == 1) $FinishCondition = " && [-eoc-]";
  107. else if (#eoc == 0)$FinishCondition = " && [EOF]";
  108. else $FinishCondition = "";
  109. #sn = 0;
  110. $ln_lead0 = str(#ln[#sn]);
  111. if(#SelAll==0)$ln_lead00 = "";
  112. else $ln_lead00 ="--("+$ln_lead0+"L)"+"\n";
  113. $sT=str(#tl_kd[#snMax]+#tl_ln[#snMax])+"L";// 全実効総行数(全文時のリード行を除く)
  114. insert "==========================================================================================\n";
  115. insert $InsHead2+"行数チェック結果出力  ("+date+"  "+time+")\n";
  116. if (#SelAll==0) insert "対象ファイル名:["+$oldfilename+"]\nチェック完了行==>>("+$sT+")==>>("+str(#tly+1+#ln[#sn])+" ~ "+str(#ely+1)+$FinishCondition+")\n";
  117. else insert "対象ファイル名:["+$oldfilename+"]\nチェック完了行:("+$sT+")==>>{("+str(#tly+1)+" ~ "+str(#ely+1)+")-"+str(#ln[#sn])+"}==>>("+str(#tly+1+#ln[#sn])+" ~ "+str(#ely+1)+")"+$FinishCondition+"\n";
  118. insert $InsHead3+$ln_lead00;
  119. $sC=rightstr("     "+str(#rk[#sn]),3);
  120. $sD=rightstr("     "+str(#rk[#sn]),3);
  121. #sn = 1;
  122. while(#sn <= #snMax){
  123. $s1=rightstr($$sp4+"["+str(#sn)+"]",4);
  124. $s2=rightstr($$sp4+str(#kd[#sn]),2);//見出
  125. $s3=rightstr($$sp4+str(#ln[#sn]),3);//本文
  126. $s4=rightstr($$sp4+str(#zl[#sn]),3);//実文
  127. $s5=rightstr($$sp4+str(#rn[#sn]),3);//空白
  128. $s6=rightstr($$sp4+str(#rk[#sn]),2);//空回
  129. $T1=rightstr($$sp4+str(#tl_kd[#sn]+#tl_ln[#sn])+" ",5);//空回
  130. $T2=rightstr($$sp4+str(#tl_kd[#sn]),2);//見出total
  131. $T3=rightstr($$sp4+str(#tl_zl[#sn]),3);//zitubun total
  132. $T4=rightstr($$sp4+str(#tl_ln[#sn]),3);//honbun total
  133. $T5=rightstr($$sp4+str(#tl_rn[#sn]),3);//kuuhaku total
  134. $T6=rightstr($$sp4+str(#tl_rk[#sn]),2);//kuuhaku syutugenn kaisuu total
  135. $sB=rightstr("    <"+str(#kd[#sn]+#ln[#sn])+"L>",6);//ブロックの総行数(見出行+本文行)
  136. insert $s1+$sB+"/"+$T1+"="+"(見出:"+$s2+"L/"+$T2+")+(本文:"+$s3+"L/"+$T4+"),(実文:"+$s4+
  137. "L/"+$T3+"+空白:"+$s5+"L/"+$T5+"), 空回"+$s6+"/"+$T6+"\n";
  138. #sn = #sn+1;
  139. }
  140. return;
  141. hanbetu_joutai:
  142. ##gc0 = 0;
  143. if ( code == 13 ){                //空白行(行頭改行)
  144.         ##gc0 = 1;
  145. }else if (code == '●' || code == '■'){    //見出行の候補と判断された場合
  146.         if ( y == 0 ){ ##gc0 = 2;}
  147.         else{
  148.             left;
  149.             if ( code == 13 ){
  150.                 right;
  151.                 ##gc0 = 2;//本行は見出行である
  152.             }else{
  153.                 right;
  154.                 ##gc0 = 3;//本行は実本文行である
  155.             }
  156.         }
  157. }else if ( code == '['){//空白行でも見出行でもない。本バージョンでは、強制終了マークを付加 [-eoc-]
  158.         #x_ifeom=x;#y_ifeom=y;
  159.         right;$2_ifeom = char(code);
  160.         right;$3_ifeom = char(code);
  161.         right;$4_ifeom = char(code);
  162.         right;$5_ifeom = char(code);
  163.         right;$6_ifeom = char(code);
  164.         right;$7_ifeom = char(code);
  165.         if("-eoc-]" == $2_ifeom+$3_ifeom+$4_ifeom+$5_ifeom+$6_ifeom+$7_ifeom||
  166.         "-EOC-]" == $2_ifeom+$3_ifeom+$4_ifeom+$5_ifeom+$6_ifeom+$7_ifeom){#eoc=1;#ely=y-1;##gc0 = 9;}
  167.         else{moveto #x_ifeom,#y_ifeom;##gc0 = 3;}
  168.  
  169. }else{        
  170.         ##gc0 = 3;        //本行は実本文行である
  171. }
  172. return ##gc0;
  173. line_k:    //空白
  174.     #ln[#sn] = #ln[#sn] + 1;            //章内行数増加
  175.     #rn[#sn] = #rn[#sn] + 1;            //章内空白行増加
  176.     if ( #gcb != 1 ){        //(#gcb = 0,2,3)の場合
  177.         #rk[#sn] = #rk[#sn] + 1;        //空白行箇所増加
  178.     }
  179.     #gcb = 1;            //本処理を行った行は空白行である
  180. return;
  181. line_h: //本文
  182.     #ln[#sn] = #ln[#sn] + 1;            //章内行数増加
  183.     #zl[#sn] = #zl[#sn] + 1;            //章内本文行増加
  184.     #gcb = 3;            //本処理を行った行は実本文行である
  185. return;
  186. line_m:    //if ( code == '●' || code == '■')    //見出行の場合 #gc = 2;
  187.     if ( #gcb != 2){    //(#gcb=0,1,3)前の行が,本文,空白,あるいは最初の行だった!!!!!
  188.         //新章突入
  189.         call zensyou;
  190.         if (#BlockCheck==0)call mes_num $$"新章突入記念",$$"経過表示";
  191.         //新章突入処理
  192.         #sn = #sn + 1;        //章を増加
  193.         #kd[#sn]= 1;        //章内見出行数を初期化
  194.         #ln[#sn] = 0;        //章内行番初期化
  195.         #zl[#sn] = 0;        //章内実文行数初期化
  196.         #rn[#sn] = 0;        //章内空白行数初期化
  197.         #rk[#sn] = 0;        //章内空白行箇所数初期化
  198.     }else{    // #gcb=2 見出の連続
  199.         #kd[#sn]= #kd[#sn]+ 1;        //見出行数の増加
  200.     }
  201.     if ( #SelAll == 1 ) call m_ban;    //全体選択時のみ小見出行の再設定を行う
  202.     #gcb = 2;
  203. return;
  204. zensyou:    //前章処理
  205. if ( #SelAll == 1 && #sn == 0){    //最初選択状態になく、全文選択をした、かつ、0章である
  206.         #tl_kd_r =#tl_kd[#sn];
  207.         #tl_ln_r =#tl_ln[#sn];
  208.         #tl_zl_r =#tl_zl[#sn];
  209.         #tl_rn_r =#tl_rn[#sn];
  210.         #tl_rk_r =#tl_rk[#sn];
  211.         
  212.         #tl_kd[#sn] = 0;
  213.         #tl_ln[#sn] = 0;
  214.         #tl_zl[#sn] = 0;
  215.         #tl_rn[#sn] = 0;
  216.         #tl_rk[#sn] = 0;
  217. }else {                //通常の累積加算
  218.         #tl_kd[#sn] = #tl_kd[#sn-1] + #kd[#sn];
  219.         #tl_ln[#sn] = #tl_ln[#sn-1] + #ln[#sn];
  220.         #tl_zl[#sn] = #tl_zl[#sn-1] + #zl[#sn];
  221.         #tl_rn[#sn] = #tl_rn[#sn-1] + #rn[#sn];
  222.         #tl_rk[#sn] = #tl_rk[#sn-1] + #rk[#sn];
  223. }
  224. return;
  225. c_move:    // 処理後のカーソル移動
  226.     if (#gcb != 2) down;
  227.     else {                //●行の時
  228.             golineend2;    //複数行にわたる見出しに対応(●で始まる行は改行不可)
  229.             right;        //●共通の2行
  230.     }
  231. return;
  232. m_ban:    //小見出行の●の次に(2)などの番号を挿入する
  233. //消去を伴う処理なので、スピードを犠牲にしてもチェックをする
  234. //もし●の次が[英数]だったらこれを削除.新規に挿入.[はx=2に限る
  235. //次の ] までは、半角の数字のみ許される!!!!
  236. ##xp1 = strstr(gettext(0,y,linelen,y),"[");    // [の有無 なし:-1 発見:x
  237. ##xp2 = strstr(gettext(0,y,linelen,y),"]");    // ]の有無 なし:-1 発見:x
  238. ##xp0 = ##xp2 - ##xp1;
  239. ##kkok = 0;    // KaKko OKey 0:[123]なしか[あいai]状態=最初から[1]挿入, 1:[123]=括弧内が半角数字だけの置換
  240. if ( ##xp1 == -1 || ##xp2 == -1 || ##xp1 != 2 || ##xp0 <= 1  )//{ // [111]がない
  241. {
  242.     ##kkoy = 0;
  243. }else{
  244.     moveto ##xp1+1,y;
  245.     ##step = ##xp0;
  246.     while(x < ##xp2 )
  247.     {
  248.         if (code >= 48 && code <= 57 )
  249.         {
  250.             ##kkok = 1;
  251.             ##step = ##step - 1;
  252.         }else{
  253.             ##kkok = 0;
  254.             break;
  255.         }
  256.         right;
  257.     }
  258. }
  259. if ( ##kkok == 0 )
  260. {                        //初期処理
  261.     golinetop;
  262.     right;
  263.     //insert [12345]
  264.     insert "["+str(#sn)+"]";
  265. }else{                        // [123]
  266.     moveto ##xp1+1,y;
  267.     while (##xp0 > 1 ){
  268.         delete ;
  269.         ##xp0 = ##xp0 -1;
  270.     }
  271.     //insert ONLY #sn;
  272.     insert str(#sn);
  273. }
  274. golinetop;
  275. return;
  276. mes_num:
  277. enabledraw;
  278. golinetop;    //処理済み行をわかりやすくする
  279. beginsel;
  280. golineend;
  281. if ( #SelAll == 1 )$$dsp0 = "   《処理対象: 全文》";
  282. if ( #SelAll == 0 )$$dsp0 = "《処理対象: "+str(#tly+1)+"行~ "+str(#ely+1)+"行》";
  283. question    $$dsp0+
  284.     "\n\n↓処理済ブロック   ↓累積結果"+
  285.     "\n\n処理ブロック: "+str(#sn)+
  286.     "\n見出行数 : "+str(#kd[#sn])+"   / 累積見出行数:"+str(#tl_kd[#sn])+
  287.     "\n\n本文行数 : "+str(#ln[#sn])+"   / 累積本文行数:"+str(#tl_ln[#sn])+
  288.     "\n実文行数 : "+str(#zl[#sn])+"   / 累積実文行数:"+str(#tl_zl[#sn])+
  289.     "\n\n空白行数 : "+str(#rn[#sn])+"   / 累積空白行数:"+str(#tl_rn[#sn])+
  290.     "\n空白出現 : "+str(#rk[#sn])+"   / 累積出現回数:"+str(#tl_rk[#sn])+
  291.     "\n\n          継続しますか???";    //制作中はquestionで確認しながらやる
  292. if (result != no)
  293. {
  294.     escape;
  295.     disabledraw;
  296.     return;
  297. }else{
  298.     escape;
  299.     call end_fc;
  300.     escape;
  301.     endmacro;
  302. }
  303. mes_num_newfile:// ファイル出力用( eof で終了した場合)
  304. enabledraw;
  305. golinetop;    //処理済み行をわかりやすくする
  306. beginsel;
  307. golineend;
  308. if ( #SelAll == 1 )$$dsp0 = "   《処理対象: 全文》";
  309. if ( #SelAll == 0 )$$dsp0 = "《処理対象: "+str(#tly+1)+"行~ "+str(#ely+1)+"行》";
  310. if (#BlockCheck == 0){
  311. question    $$dsp0+
  312.     "\n\n↓処理済ブロック   ↓累積結果"+
  313.     "\n\n処理ブロック: "+str(#sn)+
  314.     "\n見出行数 : "+str(#kd[#sn])+"   / 累積見出行数:"+str(#tl_kd[#sn])+
  315.     "\n\n本文行数 : "+str(#ln[#sn])+"   / 累積本文行数:"+str(#tl_ln[#sn])+
  316.     "\n実文行数 : "+str(#zl[#sn])+"   / 累積実文行数:"+str(#tl_zl[#sn])+
  317.     "\n\n空白行数 : "+str(#rn[#sn])+"   / 累積空白行数:"+str(#tl_rn[#sn])+
  318.     "\n空白出現 : "+str(#rk[#sn])+"   / 累積出現回数:"+str(#tl_rk[#sn])+
  319.     "\n\n全文のチェックが終わりました。\n全文の結果をファイルに出力しますか?";
  320.     if (result == no)
  321.     {
  322.         escape;
  323.         enabledraw;
  324.         return;
  325.     }else{
  326.         escape;
  327.         call FileOutput;
  328.         call end_fc;
  329.         escape;
  330.         endmacro;
  331.     }
  332. }else{
  333.         escape;
  334.     call FileOutput;
  335.     call end_fc;
  336.     escape;
  337.     endmacro;
  338. }
  339. end_fc:                        //フリーカーソルモードを戻す
  340. if ( #fc == 1) freecursorswitch;
  341. return;