（Pythonista対応）Pythonでクリップボード内の文字を箇条書きに変換する

# はじめの前のおねがい
できれば「いいね♡」をお願いします。励みになります。

# はじめに
このコードは**Python3**に対応したクリップボード内の文字を

1. 箇条書きに変換する
1. 箇条書きが数字のものを特定の頭文字に変換する
1. 箇条書きそのものを削除する

といったことをするためのものです。

# このコードの目的
こういう操作は基本的にはエディターでできる機能ではありますが、クリップボード内を自動検知して再出力できたら、エディターを使用中に新規ウィンドウを開いたりといった一手間が減らせれば良いと思い作成しました。

# 本コードを実行するとどうなるか
本コードを実行すると、変数「mode」の内容が

```zsh:mode = 'NUM'の場合：
箇条書き
　　↓
1. 箇条書き
```

```zsh:mode = 'DEL'の場合：
1. 箇条書き
　　↓
・箇条書き
```

```zsh:mode = 'NONE'の場合：
1. 箇条書き
　　↓
箇条書き
```
といった出力をします。

# 注意点
1. このコード冒頭に書かれている変数で機能を切り替える必要があります。
1. 具体的にはseparator, old_separator, modeの3つの変数を書き換えます。
1. このコードはPython 3とPythonista共用です。
1. Python 3の場合はpyperclipモジュールが必要です。
1. Pythonistaの場合はclipboardモジュールが必要です。

## Pythonの必要なモジュール
Pythonに関して必要なモジュールは“pyperclip”のみです。
```zsh:pip
pip install pyperclip
```

# ソースコード
### Python 3版
```python:text-list.py
import pyperclip  # pyperclipをインポート

# 初期設定
separator = '. '    # 使用する新しいセパレータを定義
old_separator = '. '  # 削除したい既存のセパレータを定義

# モード設定 ('NONE', 'NUM', 'DEL')
#mode = 'NONE'    #NONEの場合はseparator変数を先頭文字に使用
mode = 'NUM'     #NUMの場合は数字の後ろにseparator変数を後置
# mode = 'DEL'     #DELの場合は箇条書き削除


class TextFormatter:
    def __init__(self, separator, old_separator, mode):
        self.separator = separator
        self.old_separator = old_separator
        self.mode = mode

    def reformat_text(self, input_text):
        lines = input_text.strip().split('\n')
        return '\n'.join(self.process_line(index, line) for index, line in enumerate(lines))

    def process_line(self, index, line):
        content = line.strip()
        if self.mode == 'DEL':
            parts = content.split(maxsplit=1)
            if parts[0].strip().rstrip('.').isdigit() and len(parts) > 1:
                content = parts[1]
            if content.startswith(self.old_separator):
                content = content[len(self.old_separator):]

        if self.mode == 'NUM':
            return f"{index + 1}{self.separator}{content}"
        elif self.mode == 'DEL':
            return content
        elif self.mode == 'NONE':
            return f"{self.separator}{content}"

    def process_clipboard(self):
        input_text = pyperclip.paste()
        output_text = self.reformat_text(input_text)
        pyperclip.copy(output_text)
        print(output_text)

    @staticmethod
    def run_list():
        formatter = TextFormatter(separator, old_separator, mode)
        formatter.process_clipboard()

# 呼び出し判定
def main():
    TextFormatter.run_list()

# 実行
def main():
    TextFormatter.run_list()

if __name__ == "__main__":
    main()
```

### Pythonista版
```python:text-list.py
import clipboard

# 初期設定
separator = '. '    # 使用する新しいセパレータを定義
old_separator = '. '  # 削除したい既存のセパレータを定義

# モード設定 ('NONE', 'NUM', 'DEL')
#mode = 'NONE'    #NONEの場合はseparator変数を先頭文字に使用
mode = 'NUM'     #NUMの場合は数字の後ろにseparator変数を後置
# mode = 'DEL'     #DELの場合は箇条書き削除


class TextFormatter:
    def __init__(self, separator, old_separator, mode):
        self.separator = separator
        self.old_separator = old_separator
        self.mode = mode

    def reformat_text(self, input_text):
        lines = input_text.strip().split('\n')
        return '\n'.join(self.process_line(index, line) for index, line in enumerate(lines))

    def process_line(self, index, line):
        content = line.strip()
        if self.mode == 'DEL':
            parts = content.split(maxsplit=1)
            if parts[0].strip().rstrip('.').isdigit() and len(parts) > 1:
                content = parts[1]
            if content.startswith(self.old_separator):
                content = content[len(self.old_separator):]

        if self.mode == 'NUM':
            return f"{index + 1}{self.separator}{content}"
        elif self.mode == 'DEL':
            return content
        elif self.mode == 'NONE':
            return f"{self.separator}{content}"

    def process_clipboard(self):
        input_text = clipboard.get()
        output_text = self.reformat_text(input_text)
        clipboard.set(output_text)
        print(output_text)

    @staticmethod
    def run_list():
        formatter = TextFormatter(separator, old_separator, mode)
        formatter.process_clipboard()

# 呼び出し判定
def main():
    TextFormatter.run_list()

# 実行
def main():
    TextFormatter.run_list()

if __name__ == "__main__":
    main()
```

以上です。お役に立てれば幸いです。