Gmailの本文にマークダウン記法でソースコードが書けるアドオンをいれたい。
# Gmail用マークダウン記法ソースコード挿入アドオン (Tkinter版)
以下は、PythonのTkinterを使ってGmailにマークダウン記法でソースコードを挿入するアドオンを作成するプログラムです。このプログラムはGmailのウェブインターフェースと連携して動作します。
```py
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import pyperclip
import webbrowser
import json
import os
class GmailMarkdownAdder:
def __init__(self, root):
self.root = root
self.root.title("Gmail Markdown Code Adder")
self.root.geometry("600x500")
# 設定ファイルのパス
self.config_file = "gmail_markdown_config.json"
# デフォルト設定
self.default_config = {
"language": "python",
"theme": "github",
"font_size": "14px",
"show_line_numbers": True,
"auto_copy": True
}
# 現在の設定を読み込む
self.config = self.load_config()
# UIの作成
self.create_ui()
def load_config(self):
"""設定ファイルを読み込む"""
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r') as f:
return json.load(f)
except:
return self.default_config
return self.default_config
def save_config(self):
"""設定をファイルに保存する"""
with open(self.config_file, 'w') as f:
json.dump(self.config, f, indent=2)
def create_ui(self):
"""UIを作成する"""
# メインフレーム
main_frame = ttk.Frame(self.root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
# コード入力エリア
code_label = ttk.Label(main_frame, text="ソースコード:")
code_label.grid(row=0, column=0, sticky=tk.W, pady=(0, 5))
self.code_text = scrolledtext.ScrolledText(main_frame, width=70, height=15, wrap=tk.NONE)
self.code_text.grid(row=1, column=0, columnspan=2, pady=(0, 10))
# 設定フレーム
settings_frame = ttk.LabelFrame(main_frame, text="設定", padding="10")
settings_frame.grid(row=2, column=0, columnspan=2, sticky=tk.EW, pady=(0, 10))
# 言語選択
lang_label = ttk.Label(settings_frame, text="言語:")
lang_label.grid(row=0, column=0, sticky=tk.W)
self.lang_var = tk.StringVar(value=self.config.get("language", "python"))
lang_combo = ttk.Combobox(settings_frame, textvariable=self.lang_var, width=15)
lang_combo['values'] = [
'python', 'javascript', 'html', 'css', 'java', 'c', 'cpp',
'csharp', 'php', 'ruby', 'go', 'swift', 'kotlin', 'typescript',
'bash', 'sql', 'json', 'yaml', 'markdown', 'plaintext'
]
lang_combo.grid(row=0, column=1, sticky=tk.W, padx=(0, 20))
# テーマ選択
theme_label = ttk.Label(settings_frame, text="テーマ:")
theme_label.grid(row=0, column=2, sticky=tk.W)
self.theme_var = tk.StringVar(value=self.config.get("theme", "github"))
theme_combo = ttk.Combobox(settings_frame, textvariable=self.theme_var, width=15)
theme_combo['values'] = [
'github', 'atom-one-dark', 'dracula', 'solarized-light',
'solarized-dark', 'monokai', 'tomorrow'
]
theme_combo.grid(row=0, column=3, sticky=tk.W)
# フォントサイズ
font_size_label = ttk.Label(settings_frame, text="フォントサイズ:")
font_size_label.grid(row=1, column=0, sticky=tk.W, pady=(10, 0))
self.font_size_var = tk.StringVar(value=self.config.get("font_size", "14px"))
font_size_combo = ttk.Combobox(settings_frame, textvariable=self.font_size_var, width=15)
font_size_combo['values'] = ['12px', '14px', '16px', '18px', '20px']
font_size_combo.grid(row=1, column=1, sticky=tk.W, pady=(10, 0), padx=(0, 20))
# 行番号表示
self.line_numbers_var = tk.BooleanVar(value=self.config.get("show_line_numbers", True))
line_numbers_cb = ttk.Checkbutton(
settings_frame, text="行番号を表示", variable=self.line_numbers_var
)
line_numbers_cb.grid(row=1, column=2, columnspan=2, sticky=tk.W, pady=(10, 0))
# 自動コピー
self.auto_copy_var = tk.BooleanVar(value=self.config.get("auto_copy", True))
auto_copy_cb = ttk.Checkbutton(
settings_frame, text="自動でクリップボードにコピー", variable=self.auto_copy_var
)
auto_copy_cb.grid(row=2, column=0, columnspan=4, sticky=tk.W, pady=(10, 0))
# ボタンフレーム
button_frame = ttk.Frame(main_frame)
button_frame.grid(row=3, column=0, columnspan=2, sticky=tk.EW)
# コピーボタン
copy_btn = ttk.Button(
button_frame, text="クリップボードにコピー", command=self.copy_to_clipboard
)
copy_btn.pack(side=tk.LEFT, padx=(0, 10))
# Gmailを開くボタン
gmail_btn = ttk.Button(
button_frame, text="Gmailを開く", command=self.open_gmail
)
gmail_btn.pack(side=tk.LEFT, padx=(0, 10))
# クリアボタン
clear_btn = ttk.Button(
button_frame, text="クリア", command=self.clear_code
)
clear_btn.pack(side=tk.LEFT)
# プレビューボタン
preview_btn = ttk.Button(
button_frame, text="プレビュー", command=self.show_preview
)
preview_btn.pack(side=tk.RIGHT)
def generate_markdown(self):
"""マークダウン形式のコードブロックを生成する"""
language = self.lang_var.get()
code = self.code_text.get("1.0", tk.END).strip()
if not code:
messagebox.showwarning("警告", "ソースコードが入力されていません")
return None
# マークダウンコードブロックを生成
markdown = f"```{language}\n{code}\n```"
return markdown
def copy_to_clipboard(self):
"""マークダウンをクリップボードにコピーする"""
markdown = self.generate_markdown()
if markdown:
pyperclip.copy(markdown)
messagebox.showinfo("成功", "マークダウン形式のコードがクリップボードにコピーされました")
def open_gmail(self):
"""Gmailを開く"""
# 設定を保存
self.config = {
"language": self.lang_var.get(),
"theme": self.theme_var.get(),
"font_size": self.font_size_var.get(),
"show_line_numbers": self.line_numbers_var.get(),
"auto_copy": self.auto_copy_var.get()
}
self.save_config()
# 自動コピーが有効ならコピーする
if self.auto_copy_var.get():
self.copy_to_clipboard()
# Gmailを開く
webbrowser.open("https://mail.google.com/mail/u/0/#compose")
def clear_code(self):
"""コードエリアをクリアする"""
self.code_text.delete("1.0", tk.END)
def show_preview(self):
"""マークダウンのプレビューを表示する"""
markdown = self.generate_markdown()
if not markdown:
return
# プレビューウィンドウを作成
preview_window = tk.Toplevel(self.root)
preview_window.title("マークダウンプレビュー")
preview_window.geometry("800x600")
# WebViewを表示する代わりにテキストで表示
preview_frame = ttk.Frame(preview_window, padding="10")
preview_frame.pack(fill=tk.BOTH, expand=True)
preview_label = ttk.Label(preview_frame, text="マークダウン形式のプレビュー:")
preview_label.pack(anchor=tk.W)
preview_text = scrolledtext.ScrolledText(
preview_frame, wrap=tk.WORD, width=80, height=25
)
preview_text.pack(fill=tk.BOTH, expand=True)
preview_text.insert(tk.END, markdown)
preview_text.config(state=tk.DISABLED)
# HTMLプレビュー用のボタン
html_btn = ttk.Button(
preview_frame,
text="ブラウザでHTMLプレビューを開く",
command=lambda: self.open_html_preview(markdown)
)
html_btn.pack(pady=(10, 0))
def open_html_preview(self, markdown):
"""ブラウザでHTMLプレビューを開く"""
# シンプルなHTMLテンプレート
html_template = f"""
<!DOCTYPE html>
<html>
<head>
<title>Markdown Preview</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/{self.theme_var.get()}.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/languages/{self.lang_var.get()}.min.js"></script>
<style>
body {{
font-family: Arial, sans-serif;
margin: 20px;
line-height: 1.6;
}}
pre {{
font-size: {self.font_size_var.get()};
border-radius: 5px;
padding: 15px;
overflow-x: auto;
}}
.hljs {{
background: #f8f8f8;
}}
</style>
</head>
<body>
<pre><code class="language-{self.lang_var.get()}">{markdown.replace('```' + self.lang_var.get(), '').replace('```', '').strip()}</code></pre>
<script>hljs.highlightAll();</script>
</body>
</html>
"""
# 一時ファイルにHTMLを保存
temp_file = "markdown_preview.html"
with open(temp_file, "w", encoding="utf-8") as f:
f.write(html_template)
# ブラウザで開く
webbrowser.open(f"file://{os.path.abspath(temp_file)}")
if __name__ == "__main__":
root = tk.Tk()
app = GmailMarkdownAdder(root)
root.mainloop()
```
## 機能説明
1. **ソースコード入力エリア**:
- ソースコードを入力するためのテキストエリア
- スクロールバー付きで長いコードも入力可能
2. **設定オプション**:
- 言語選択 (Python, JavaScript, HTMLなど多数対応)
- シンタックスハイライトのテーマ選択
- フォントサイズ設定
- 行番号表示の有無
- 自動コピー機能の有無
3. **主要機能**:
- クリップボードにマークダウン形式でコピー
- Gmailの新規メール作成画面を開く
- 入力内容のクリア
- マークダウンプレビュー表示
4. **設定の永続化**:
- 最後に使用した設定をJSONファイルに保存
- 次回起動時に自動で読み込み
## 必要なライブラリ
このプログラムを実行するには、以下のライブラリが必要です:
```
pip install pyperclip
```
## 使用方法
1. ソースコードを入力エリアに入力
2. 必要に応じて設定を変更
3. 「クリップボードにコピー」ボタンをクリック
4. 「Gmailを開く」ボタンでGmailを開き、メール本文に貼り付け
## 注意点
- このプログラムはGmailのウェブインターフェースと連携しますが、直接統合するものではありません
- 実際のGmailアドオンとして配布する
コメント
コメントを投稿