home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 January (DVD) / VPR980100.ISO / OLS / WIN32 / KAKIMAC / KAKIMAC5.LZH / K_PAGE.MAC next >
Text File  |  1995-04-25  |  14KB  |  425 lines

  1. //【マクロ名】 k_PAGE.mac Ver.1.            by 水銀水(Suigwinsui)
  2. //【主な用途】日本語文書作成支援シリーズ・目標設定行数達成度算出 
  3. //【使用対象】清貧にあえぐライター(締切前になると突如住所不定になる習性をお持ち)
  4. //            ならびに,印刷所のファックス前に顔面蒼白で立ち尽くす編集者のみなさま(^^;
  5. //【機能概略】文章の行数を算出する。(1行の文字数は秀丸に依存。意識的に文章内に記入可)
  6. //        (1)見出の行数,本文の行数を総計,各セクション(見出行+本文)に分けて算出。
  7. //        (2)論理行頭の●,■を見出行頭マークのデフォルトとする。
  8. //        (3)行算出は,カーソルのある位置のブロックのみ。
  9. // gyouMOK8.mac 
  10. //94/06/19(日) 15:22:07 ほぼ基本的には動きはじめる。
  11. //95/04/09(日) 16:40:38 k_PAGE Ver.1に名称変更。
  12.  
  13.  
  14.  
  15.  
  16.  
  17. //17---------------------------------------[▼行頭マークの設定]----------------------------------
  18. // SET-1(見出し行マーカー第1セット)
  19.  
  20. $HeadM1="●";
  21. $HeadM2="■";
  22.  
  23. // SET-2(見出し行マーカー第2セット)
  24.  
  25. //$HeadM1="〓";
  26. //$HeadM2="§";
  27.  
  28. //---------------------------------------[▲行頭マークの設定]----------------------------------
  29.  
  30. #jz = getininum("hidemaru.ini","Default","Orikaeshi");//秀丸で設定されている一行の字詰め
  31. #file_end = 0;
  32. #Hcode1=ascii($HeadM1);
  33. #Hcode2=ascii($HeadM2);
  34. #fc = 0;
  35. $sBuffer=searchbuffer;#sFlug=searchoption;
  36. if (freecursor){
  37.     freecursorswitch;
  38.     #fc = 1;
  39. }
  40. //-- 最終行の設定(出来ればこういう、ファイルに手を加えるようなパターンは避けたいが・・・)
  41. #org_x = x;
  42. #org_y = y;
  43. disabledraw;
  44. gofileend;
  45. if ( x != 0 )insert "\n";
  46. moveto #org_x,#org_y;
  47. enabledraw;
  48. // 取得範囲の確認
  49. golinetop;
  50. while( 1 )    //main start
  51. {
  52.     call findTopOfMidasi;// カーソルのある行より上にある一番近い見出しで第一上の行に移動する
  53.     call getMarkedDatas;// 目標取得
  54.     #top_block_y = y;
  55.     call gc_chk;// カーソル位置の文字種を判別してgcbに代入
  56.     call chkGoNextMidasi;//次の見出まで行をカウント(空白行と実文行は数える必要あり)
  57.     if (#file_end == 1 ){
  58.         call mes_num $$"Good Luck !!!",$$"最終表示";
  59.         break;
  60.     }else if(code == eof){
  61.         break;
  62.     }
  63. }
  64. goto ending;
  65.  
  66.  
  67. ending:
  68. enabledraw;
  69. escape;
  70. call end_fc;
  71. setsearch $sBuffer,#sFlug;
  72. endmacro;
  73.  
  74. gc_chk:
  75. if (code == #Hcode1 || code == #Hcode2 || code == eof)#gc = 2;//行頭が●■
  76. else if (code == 13){#gc = 1;//空白行である
  77.     }else{ #gc = 3;//本行は実本文行である
  78. }
  79. return;
  80.  
  81.  
  82. chkGoNextMidasi:// gyou_chk1 と同等
  83. #gcb2 = 2;//そもそも見出行からスタート!?
  84. #new_midasi = 0;
  85. while( 1 )    //
  86. {
  87.          if (#gc == 3 )call line_h2; //本文の場合
  88.     else if (#gc == 1 )call line_k2; //空白行
  89.     else if (#gc == 2 )call line_m2; //小見出行
  90.     if ( #file_end == 1  ){ break;}    
  91.     if ( #new_midasi == 1 || code == eof ){    
  92.         if (#new_midasi == 1){
  93.         } else {    // case of code = eof
  94.             #file_end = 1;
  95.             //本文&実文の行数を1減らすというセコい真似をする(^^;
  96.             #ln[#sn] = #ln[#sn] - 1;//章内行数増加
  97.             #zl[#sn] = #zl[#sn] - 1;//章内本文行増加
  98.         }
  99.         break;
  100.     }
  101.     #end_block_y = y;
  102.     call c_move2;
  103.     call checkStateJ2;//行頭状態判別
  104. }
  105. return;// end of chkGoNextMidasi:
  106.  
  107.  
  108. line_m2://if ( code == #Hcode1 || code == #Hcode2)    //見出行の場合 #gc = 2;
  109.     if ( #gcb2 != 2){    //(#gcb2=0,1,3)前の行が,本文,空白,あるいは最初の行だった!!!!!
  110.         //新章突入  次の見出に入ったと認識=開始時は、見出行:gcb=2
  111.         call zensyou;
  112.         call mes_num;
  113.         //新章突入処理
  114.         #sn = #sn + 1;//章を増加
  115.         #kd[#sn]= 0;//章内見出行数を初期化
  116.         #ln[#sn] = 0;//章内行番初期化
  117.         #zl[#sn] = 0;//章内実文行数初期化
  118.         #rn[#sn] = 0;//章内空白行数初期化
  119.         #rk[#sn] = 0;//章内空白行箇所数初期化
  120.         #new_midasi = 1;
  121.     }else{    // #gcb2=2 見出の連続
  122.         #kd[#sn]= #kd[#sn]+ 1;//見出行数の増加
  123.     }
  124.     #gcb2 = 2;
  125. return;
  126.  
  127.  
  128. // ただ、キーワード"return" は、upして右隅へジャンプ、そこでリターンキーの有無を調べているだけみたいで、
  129. // マクロの見栄えはすっきりするが、画面の見栄えと速度は遅いかも? disbledrawにすべき?
  130. checkStateJ2:// 0:default 2:見出行
  131. if (code == #Hcode1 || code == #Hcode2 || code == eof){    //見出行の候補と判断された場合
  132.         if ( y == 0 ){ #gc = 2;}
  133.         else{
  134.             left;
  135.             if ( code == 13 )#gc = 2;//{//本行は見出行である
  136.             else #gc = 3;//本行は実本文行である
  137.             right;
  138.         }
  139. }else if (code == 13)#gc = 1;//{//行頭が●でない&&空白行である
  140. else #gc = 3;//行頭が●でない&&空白行でない=本行は実本文行である
  141. return;
  142.  
  143. line_k2://空白
  144.     #ln[#sn] = #ln[#sn] + 1;//章内行数増加
  145.     #rn[#sn] = #rn[#sn] + 1;//章内空白行増加
  146.     if ( #gcb2 != 1 ){                //(#gcb2 = 0,2,3)の場合
  147.         #rk[#sn] = #rk[#sn] + 1;//空白行箇所増加
  148.     }
  149.     #gcb2 = 1;//本処理を行った行は空白行である
  150. return;
  151.  
  152. line_h2://本文
  153.     #ln[#sn] = #ln[#sn] + 1;//章内行数増加
  154.     #zl[#sn] = #zl[#sn] + 1;//章内本文行増加
  155.     #gcb2 = 3;//本処理を行った行は実本文行である
  156. return;
  157.  
  158. zensyou://前章処理
  159. if ( #selyn == 1 && #sn == 0){                //最初選択状態になく、全文選択をした、かつ、0章である
  160. //if ( #sn == 0){    //0章である
  161.         #tl_kd = 0;
  162.         #tl_ln = 0;
  163.         #tl_zl = 0;
  164.         #tl_rn = 0;
  165.         #tl_rk = 0;
  166. }else{        //通常の累積加算
  167.         #tl_kd = #tl_kd + #kd[#sn];
  168.         #tl_ln = #tl_ln + #ln[#sn];
  169.         #tl_zl = #tl_zl + #zl[#sn];
  170.         #tl_rn = #tl_rn + #rn[#sn];
  171.         #tl_rk = #tl_rk + #rk[#sn];
  172. }
  173. return;
  174.  
  175. c_move2:// 処理後のカーソル移動
  176. //---eof の見つけ方・・悩むなあ・・・きっと if(return) のような関数か、変数があるはずなんだけど
  177. // これをやると画面が揺れる。DISABLEDRAW;にすると画面表示がおかしい。どうしましょ。
  178.  
  179.     if (#gcb2 != 2 ) down;//通常時
  180.     else if (code != eof) {        //●行の時
  181.             golineend2;//複数行にわたる見出しに対応(●で始まる行は改行不可)
  182.             right;//●共通の2行
  183.     } else {            // case of eof???
  184.         #file_end = 1;
  185.     }
  186. return;
  187.  
  188. get_mokuhyou://簡単に字詰めと目標行を得る(見出し行に含まれる同文字対策は無し(^^;)
  189. // 折り返されている論理行には対応したが、厳密なチェックはしていない(^^; 約束を守って入力しているものとする(^^;
  190. disableinvert;
  191. ##gPx=x;##gPy=y;
  192. selectline;
  193. $$gt=gettext(seltopx,seltopy,selendx,selendy);
  194. ##mxp1 = strstr($$gt,"<");// <の有無 なし:-1 発見:位置
  195. ##mxp2 = strstr($$gt,">");// >の有無 なし:-1 発見:位置
  196. if(##mxp1>##mxp2)return 0;
  197. $$gt=midstr($$gt,##mxp1,##mxp2-##mxp1+1);//
  198. ##mxp1 = strstr($$gt,"<");// <の有無 なし:-1 発見:位置
  199. ##mxp2 = strstr($$gt,">");// >の有無 なし:-1 発見:位置
  200. ##mxpW = strstr($$gt,"w");// wの有無 なし:-1 発見:位置 半角字詰め指定
  201. ##mxpWW= strstr($$gt,"W");// Wの有無 なし:-1 発見:位置 全角字詰め指定
  202. ##mxpL = strstr($$gt,"L");// Lの有無 なし:-1 発見:位置
  203. ##mxpl = strstr($$gt,"l");// lの有無 なし:-1 発見:位置
  204. ##mxpK = strstr($$gt,"*");// *の有無 なし:-1 発見:位置
  205. if(##mxpL==-1 && ##mxpl!=-1)##mxpL=##mxpl;
  206.  
  207.  
  208. //完全な形式があると思われる場合
  209. if ( ##mxp1 != -1 && ##mxp2 != -1 &&( ##mxpW != -1 || ##mxpWW != -1)&& ##mxpL != -1 && ##mxpK != -1 ){
  210. if(##mxpW!=-1)$m_zizume = str(val(midstr($$gt,##mxp1+1,##mxpW-(##mxp1+1))));
  211. else if(##mxpWW!=-1)$m_zizume = str(val(midstr($$gt,##mxp1+1,##mxpWW-(##mxp1+1)))*2);
  212. $m_gyousu = str(val(midstr($$gt,##mxpK+1,##mxpL-(##mxpK+1))));
  213. if((val($m_zizume)<10)&&(val($m_gyousu)<1)){
  214.     question "●注意...字詰め情報と目標行数情報が不正です。\n"+
  215.         "●原因...見出し行の第1行目の「字詰め&目標行数の指定部分」に全角の空白等が入り込んでいる可能性があります。\n"+
  216.         "●対応...「既存の字詰め、目標行数設定なし」で行数を数えますか?";
  217.     if(!result){
  218.         call msg0;
  219.         goto ending;//endmacro;
  220.     }else return 0;
  221. }else if(val($m_zizume)<10){
  222.     question "●注意...字詰め情報が不正です。\n"+
  223.         "●原因...見出し行の第1行目の「字詰めの指定部分」に全角の空白等が入り込んでいる可能性があります。また、このバージョンでは字詰めが全角5文字以下には対応できません。\n"+
  224.         "●対応...「既存の字詰め」で行数を数えますか?";
  225.     if(!result){
  226.         call msg0;
  227.         goto ending;//endmacro;
  228.     }else return 3;
  229. }else if(val($m_gyousu)<1){
  230.     question "●注意...目標行数情報が不正です。\n"+
  231.         "●原因...見出し行の第1行目の「目標行数情報の指定部分」に全角の空白等が入り込んでいる可能性があります。\n"+
  232.         "●対応...「目標行数設定なし」で行数を数えますか?";
  233.     if(!result){
  234.         call msg0;
  235.         goto ending;//endmacro;
  236.     }else return 2;
  237. }
  238. return 1;
  239. //字詰め情報だけが得られた場合
  240. if ( ##mxp1 != -1 && ##mxp2 != -1 &&( ##mxpW != -1 || ##mxpWW != -1)){//「##mxpL == -1 && ##mxpK == -1」はどうでも良い
  241. if(##mxpW!=-1)$m_zizume = str(val(midstr($$gt,##mxp1+1,##mxpW-(##mxp1+1))));
  242. else if(##mxpWW!=-1)$m_zizume = str(val(midstr($$gt,##mxp1+1,##mxpWW-(##mxp1+1)))*2);
  243. if(val($m_zizume)<10){
  244.     question "●注意...字詰め情報が不正です。\n"+
  245.         "●原因...見出し行の第1行目の「字詰めの指定部分」に全角の空白等が入り込んでいる可能性があります。また、このバージョンでは字詰めが全角5文字以下には対応できません。\n"+
  246.         "●対応...「既存の字詰め」で行数を数えますか?";
  247.     if(!result){
  248.         call msg0;
  249.         goto ending;//endmacro;
  250.     }else return 3;
  251. }
  252.  
  253. return 2;
  254. }
  255. //目標行数だけが得られた場合
  256. if ( ##mxp1 != -1 && ##mxp2 != -1 && ##mxpL != -1 ){//「( ##mxpW == -1 && ##mxpWW == -1)&&」「&& ##mxpK == -1」ドウでも良い
  257. if(##mspK>0)$m_gyousu = str(val(midstr($$gt,##mxpK+1,##mxpL-(##mxpK+1))));
  258. else $m_gyousu = str(val(midstr($$gt,##mxp1+1,##mxpL-(##mxp1+1))));
  259.  
  260. if(val($m_gyousu)<1){
  261.     question "●注意...目標行数情報が不正です。\n"+
  262.         "●原因...見出し行の第1行目の「目標行数情報の指定部分」に全角の空白等が入り込んでいる可能性があります。\n"+
  263.         "●対応...「目標行数設定なし」で行数を数えますか?";
  264.     if(!result){
  265.         call msg0;
  266.         goto ending;//endmacro;
  267.     }else return 2;
  268. }
  269.  
  270. return 3;
  271. }
  272. return 0;
  273.  
  274.  
  275.  
  276. msg0:
  277. message "●補助...見出し行の第1行目の<mmW*nnL>の部分に全角の空白などが混入していないか調べて下さい。この場合、「その他(O)-設定(C)-全角空白表示(Z)」をチェックすれば判り易いです。\n"+
  278. "なお、半角数字の前後に、半角の空白、タブ等は混入していても問題ありません。でも、必要最小限しか入れない方が見やすいとは思います。";
  279. return;
  280.  
  281. calcResult://行算出結果を表示用に集計形式整理
  282. if ( #mokuhyou_n ==1 ){//2つとも設定 
  283.     #kannryou_g = #ln[#sn];
  284.     #mokuhyou_g = val($m_gyousu);
  285.     #tasseido = ((#kannryou_g*100)/#mokuhyou_g);
  286.     #tassei_sa = #kannryou_g - #mokuhyou_g;
  287.     $mokuhyo_disp_end =  $m_gyousu+" 行 ";
  288.     $tassei_disp_end  =  str(#tasseido)+"%";
  289.     if ( #tassei_sa > 0){        // 目標オーバー
  290.         $f_cmt = "   ▼既に "+str(#tassei_sa)+" 行オーバー"; 
  291.     } else if (#tassei_sa < 0){    // 目標不足
  292.         $f_cmt = "   ▲まだ "+str(-#tassei_sa)+" 行不足"; 
  293.     } else {            // 目標完遂  #tassei_sa = 0
  294.         $f_cmt = "  !(^.^)! !(^o^)! !(^O^)!"; 
  295.     }
  296.     $disp_jze = str(val($m_zizume)/2)+"字×";
  297. }else if ( #mokuhyou_n ==2 ){// 字詰めだけ設定
  298.     $disp_jze = str(val($m_zizume)/2)+"字×";
  299.     $mokuhyo_disp_end =  "未定 ";
  300.     $tassei_disp_end  =  " - ";
  301.     $f_cmt = "-"; 
  302. } else if ( #mokuhyou_n == 3 ){// 目標行数だけ設定
  303.     #kannryou_g = #ln[#sn];
  304.     #mokuhyou_g = val($m_gyousu);
  305.     #tasseido = ((#kannryou_g*100)/#mokuhyou_g);
  306.     #tassei_sa = #kannryou_g - #mokuhyou_g;
  307.     $mokuhyo_disp_end =  $m_gyousu+" 行 ";
  308.     $tassei_disp_end  =  str(#tasseido)+"%";
  309.     if ( #tassei_sa > 0){        // 目標オーバー
  310.         $f_cmt = "   ▼既に "+str(#tassei_sa)+" 行オーバー"; 
  311.     } else if (#tassei_sa < 0){    // 目標不足
  312.         $f_cmt = "   ▲まだ "+str(-#tassei_sa)+" 行不足"; 
  313.     } else {            // 目標完遂  #tassei_sa = 0
  314.         $f_cmt = "  !(^.^)! !(^o^)! !(^O^)!"; 
  315.     }
  316.     $disp_jze = "(字詰:既定値)";
  317. }else {                    //両方とも未設定
  318.  
  319.     $mokuhyo_disp_end =  "未定 ";
  320.     $tassei_disp_end  =  " - ";
  321.     $disp_jze = "(字詰:既定値)";
  322.     $f_cmt = "-"; 
  323.  
  324. }
  325. return;
  326.  
  327.  
  328.  
  329. mes_num:
  330. call calcResult;//達成度の算出
  331. golinetop;//処理済み行をわかりやすくする
  332. beginsel;
  333. golineend;
  334. $$dsp0 = "●k_PAGE 《対象:"+str(#top_block_y+1)+"行~ "+str(#end_block_y+1)+"行》"+
  335. "\n─────────────────";//+$disp_jze;
  336. question    $$dsp0+
  337. "\n ◎設定目標:"+$disp_jze+$mokuhyo_disp_end+
  338. "\n ○現在の本文行数 : "+str(#ln[#sn])+" 行"+
  339. "\n\n ・達成率:"+$tassei_disp_end+$f_cmt+
  340. "\n ・全行数: ["+str(#kd[#sn]+#ln[#sn])+"] / ・累積全行数:["+str(#tl_kd+#tl_ln)+"]"+
  341. "\n─────────────────"+
  342. "\n 見出行数 : "+str(#kd[#sn])+"   / 累積見出行数: "+str(#tl_kd)+
  343. "\n 本文行数 :("+str(#ln[#sn])+")  / 累積本文行数:("+str(#tl_ln)+")"+
  344. "\n 実文行数 : "+str(#zl[#sn])+"   / 累積実文行数: "+str(#tl_zl)+
  345. "\n 空白行数 : "+str(#rn[#sn])+"   / 累積空白行数: "+str(#tl_rn)+
  346. "\n 空白出現 : "+str(#rk[#sn])+"   / 累積出現回数: "+str(#tl_rk)+
  347. "\n─────────────────"+
  348. "\n継続しますか?   (C)1995 水銀水";
  349. if (!result || code == eof){
  350.     goto ending;//
  351. }else{
  352.     escape;
  353.     return;
  354. }
  355.  
  356.  
  357.  
  358.  
  359. end_fc://フリーカーソルモードを戻す
  360. if ( #fc == 1) freecursorswitch;
  361. return;
  362.  
  363. findTopOfMidasi://(1)現在のカーソルより上の行にある●行を見つけ、(2)更にその最上行の●行に移動
  364.     golinetop;
  365.     call checkStateJ2;//行頭状態判別 3:honbun 2:midasi
  366. //    call line_h_first;//秀丸v1.32で、検索フラグが戻らない場合に使用
  367.     call line_h_firstF;//秀丸v1.40以降に使用
  368.     call findTopInMidasi;//(2)見出行の中で、最上行の見出を見つける
  369. return;
  370.  
  371.  
  372. line_h_firstF:
  373. golinetop;
  374. call checkStateJ2;//行頭状態判別 3:honbun 2:midasi
  375. while( 1 ){
  376.     if(y == 0 || #gc == 2 )    break;
  377.     searchup "\^("+$HeadM1+"|"+$HeadM2+")",regular;
  378.     if(result){
  379.         call checkStateJ2;
  380.         call line_h_first;
  381.     }else{
  382.         if((code==#Hcode1||code==#Hcode2)&&y!=0)#gc=2;
  383.         else gofiletop;
  384.     }
  385.     if(y == 0 || #gc == 2 )    break;
  386. }
  387. return;
  388.  
  389. line_h_first://本文か、見出の場合、最初、初めての●行の行頭まで上昇方向に移動。見出か第一行の時は何もしない。
  390. while( 1 ){
  391.     if(y == 0 || #gc == 2 )    break;
  392.     left;
  393.     golinetop2;
  394.     call checkStateJ2;
  395.     if(y == 0 || #gc == 2 )    break;
  396. }
  397. return;
  398.  
  399. findTopInMidasi://見出行の連続を上にチェックして、最上行の見出行に位置する
  400.     while(1){
  401.         if( y == 0 ){
  402.             break;
  403.         }
  404.         left;
  405.         golinetop2;
  406.         call checkStateJ2;
  407.         if (#gc != 2 ){
  408.             golineend2;
  409.             right;//これで元の行頭に
  410.             break;
  411.         }
  412.     }
  413. return;
  414.  
  415. getMarkedDatas:
  416. call get_mokuhyou;//##return=1:正しく設定  :=0 不正な設定
  417. #mokuhyou_n = ##return;
  418. if ( #mokuhyou_n == 1 || #mokuhyou_n == 2 ){//  ##return=1:正しく設定の場合.2:行だけ
  419. $kettei = "w"+$m_zizume;
  420. config $kettei;// 字詰め変更を行ってもカーソルは、実行時の文字列の上のまま! 素晴らしい(^O^)!
  421. }
  422. return;
  423.  
  424.