テキストエディター上のテキストをPerlやPythonで直接加工する方法

## はじめに

今回が初めての投稿となります。
何か不備があるかもしれませんが、よろしくお願い致します。m(_ _)m

PerlやPythonを使ってテキスト加工を行う場合には、既存のファイルからテキストを読み込むのが一般的だと思います。

ペースターというソフトを使うと、エディター上のテキストを選択して、そのままPerlやPythonのプログラムで加工することができるようになります。
もし、ご興味がある方は読んでみて下さい。

## PerlやPythonの準備

現在のシステムに、PerlやPythonがインストールされている必要があります。
Pythonのようにシステムの環境変数（PATH）に登録することを推奨していない言語の場合には、ペースターのデータフォルダにある「ProgLangPathName.txt」というファイルにパス名を記述しておきます。

## ペースターの準備

ペースターというのは、Windows10/8で動作する常駐タイプのソフトで、ドネーションウェア（カンパウェア）として公開されているものです。主要な機能は、定型文の貼り付けと、クリップボード履歴の貼り付けを行うものです。

また、タグというものを使用すると、エディター上で選択されているテキストを、いろいろな形で加工することができます。大文字／小文字の変換、全角／半角の変換、Perl互換の正規表現を使用したテキスト変換、URLエンコード、Base64エンコード、FIFOペースト、連番ペースト、などいろいろな機能があります。

このタグの中に、PerlやPythonのプログラムで選択テキストを加工するものがあります。

ペースターは、下記のホームページからダウンロードできます。
[オータムソフトのホームページ](https://www.autumn-soft.com/)

## Perlのプログラムを作成する

ここでは、Udemyというオンライン学習サイトから、あるコースの講座内容をエディター上にコピーしてきて、それをDynalistなどのツールに貼り付ける、という事例を紹介します。
早速ですが、Perlのソースコードは以下のようになります。

```Perl:udemy_course_text.pl
use strict;
use warnings;
use utf8;

# 今回、入出力はShift-JISで行います。（UTF8も可能です）
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';

while (<>) {
    my ($sec_count, $mov_count);

    if (/^\s*セクション(\d{1,}):\s*(.*)$/) {
        # セクションの行をピックアップ
        $sec_count = sprintf("%02d", $1);

        print "Section${sec_count}_$2\n";
    }
    elsif (/^\s*(\d{1,})\.\s{1,}(.*)$/) {
        # 各動画の行をピックアップ
        $mov_count = sprintf("%02d", $1);

        print "\t${mov_count}_$2\n";
    }

    # それ以外の行はスルー
}
```

Pythonのソースコードは以下のようになります。

```Python:udemy_course_text.py

import sys
import io
import re

sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='cp932')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='cp932')

reg1 = re.compile(r'^\s*セクション(\d{1,}):\s*(.*)$')
reg2 = re.compile(r'^\s*(\d{1,})\.\s{1,}(.*)$')

while True:
    try:
        line = input()
    except EOFError:
        break
    
    m = reg1.search(line)
    if m: # セクションの行をピックアップ
        print("\n#Section{0:02d}_{1}".format(int(m.group(1)), m.group(2)))
        continue
    
    m = reg2.search(line)
    if m: # 各動画の行をピックアップ
        print("\t{0:03}_{1}".format(int(m.group(1)), m.group(2)))
        continue

```

このソースは、ホームページからコピーしてきたテキストをタブ記号をインデントにして、きれいに整形するものです。プログラムはとても単純で、ダイアモンド演算子で１行づつ読み込んで、変換対象となる行をピックアップして、希望の形に整形して、標準出力にプリントアウトするだけです。

ペースターのことはまったく意識する必要はありません。ただし、冒頭にあるような文字コードの指定は必要です。

## テキストデータを準備する

以下のように、ホームページからテキストをコピーします。

![qiita_pstr_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262544/4a5786b5-83ee-865f-ba88-13f2b7853e41.png)

それを、そのままテキストエディターに貼り付けます。

```Text
セクション1: はじめに
2 / 2|4分

1. Windows版Camtasia9がおすすめな理由
2分

2. このコースで学ぶことの全体像
1分
セクション2: カムタジア9の基本操作
7 / 7|14分

3. このセクションで学べること
1分

4. カムタジアを起動して録画の初期設定をする
4分

5. 新規で画面を録画する
2分

6. 外部からファイルを挿入する
2分

7. 画面全体の構成
2分

8. メニューバーの使い方
3分

9. このセクションのまとめ
1分

（以下、省略）
```

これを上記のPerlのコードで処理すると、以下のように出力します。

```Text
Section01_はじめに
	01_Windows版Camtasia9がおすすめな理由
	02_このコースで学ぶことの全体像
Section02_カムタジア9の基本操作
	03_このセクションで学べること
	04_カムタジアを起動して録画の初期設定をする
	05_新規で画面を録画する
	06_外部からファイルを挿入する
	07_画面全体の構成
	08_メニューバーの使い方
	09_このセクションのまとめ

（以下、省略）
```

## ペースターから、どのように呼び出すのか

まずは、エディター上に貼り付けた、変換元のテキストを全選択します。

![qiita_pstr_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262544/77148381-363b-ac4a-4e34-a0ba37c390bf.png)

次に、ペースターのカスタムメニューを表示して、「Udemyのコーステキストの取得」コマンドを実行します。このコマンドは、カスタムメニューファイルの中で、以下のように定義されています。

`[P12 ～\udemy_course_text.pl]`というのがタグで、「現在選択されているテキストをカットして`～\udemy_course_text.pl`のプログラムに渡して、出力されたテキストをキャレット位置に貼り付けよ」という意味になります。

```Text
Udemyのコーステキストの取得 | 
	[P12 "%PERSONAL%\Visual Studio Code\Perl\udemy_course_text.pl"]
	; [P32 "%PERSONAL%\Visual Studio Code\Perl\udemy_course_text.py"]
/E
```

![qiita_pstr_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262544/4185b465-cd57-de29-9fba-c0b54a5badd3.png)

すると、選択されているテキストがカットされて、すぐに整形されたテキストが同じ場所にペーストされます。初回の実行時のみ、Perlのエンジンをロードする関係で１～２秒かかりますが、それ以降は０．５秒くらいで変換できます。

![qiita_pstr_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262544/3b74150f-54bb-b827-59ff-1e6f0dc2f412.png)

このような感じで、テキストエディター上のテキストをPerlのプログラムで直接加工することができます。

## Dynalistに貼り付ける

最後に、整形されたテキストを全選択してDynalistに貼り付けます。Dynalistは、タブ記号をインデントとして扱ってくれるので、Perlのプログラムではそのように出力しています。WorkFlowyへの貼り付けも同様に行えます。

![qiita_pstr_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262544/1733724d-63f4-84a4-95c4-de765bce5fe5.png)

ちなみに、上記の操作の動画による実演デモをYouTubeにて公開しています。もし、興味のある方がいましたらご覧下さい。

[ペースターの使い方 #06 Perlとの連携について](https://youtu.be/JHw3iELRiSU)

最後までご覧いただきまして、ありがとうございました。