色つきテキストを、コマンド・ラインから.rtfに保存する?
iPhone 5s, OS X Yosemite (10.10.5), Mac mini(mid 2011), iMac(late 2009)
iPhone 5s, OS X Yosemite (10.10.5), Mac mini(mid 2011), iMac(late 2009)
OSX の RTF には文字化け問題があります、思わぬ事故を起こさないためにもこの手の作業はやめるべきです。
また、化け方は OS のバージョンにより異なり、状況は混沌としてます。下記の記事にはありませんが、Leopard と Snow Leopard でも異なります。Lion 以降のことは知りませんが、危険な香りがします。
WindowsとMacでUnicodeマッピングが違う文字
http://d.hatena.ne.jp/NAOI/20061018/1161168147
Mac OS Xのリッチテキストの扱いに関する問題
http://d.hatena.ne.jp/NAOI/20080221/1203591326
アプリケーション間のコピー&ペーストで化ける文字
http://d.hatena.ne.jp/NAOI/20080222/1203677305
TigerのリッチテキストとLeopardのリッチテキスト
http://d.hatena.ne.jp/NAOI/20080304/1204604432
リッチテキスト関連の文字化けについてのとりあえずのまとめ
Hiro.Sさん、
早速のご説明、ありがとうございました。日常のテキストではあまり問題ないようですが、てXなどに渡すとトラブりそうですね。
OSX の RTF には文字化け問題があります
もしも、TextEdit.app以外のアプリでなら、正常に動作するものでしょうか?
もしも、TextEdit.app以外のアプリでなら、正常に動作するものでしょうか?
いいえ。クリップボードに RTF データをコピーした場合、クリップボード内で既に化けてます。
Tiger では Mac 寄りに化け、Leopard では Win 寄りに化け、Snow Leopard ではフォント依存。まあ、おっしゃるように対象の文字は少ないのですが、タチが悪いので RTF なんてのはなるべく使いたくないというのが正直なところです。
ちなみに、クリップボードの中から RTF を取り出すのはこんな感じ。
#!/bin/bash osascript -e 'the clipboard as «class RTF »' 2>/dev/null | perl -0777 -ne 'print pack q[H*], substr $_, 11, -3'
実行は
$ bash rtf_in_clipboard.sh
ファイルへの書き出し
bash rtf_in_clipboard.sh >"foo.rtf"
あるいは PyObjC で
#!/usr/bin/python # -*- coding: utf-8 -*- import sys from AppKit import NSPasteboard, NSRTFPboardType pboard = NSPasteboard.generalPasteboard() rtf = pboard.dataForType_(NSRTFPboardType) if not rtf: sys.exit('no rtf data') sys.stdout.write('{0}'.format(rtf))
実行
$ python rtf_in_clipboard.py
書き出し
$ python rtf_in_clipboard.py >"foo.rtf"
それか、HTML を作成して、RTF にコンバートするとか。こんな感じにすれば、HTML をファイルに書き出さずに済みます。
#!/bin/bash html=$(cat <<'EOS' <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>001</title> </head> <body> <p style="color: red; font-family: sans-serif;">テスト</p> </body> </html> EOS ) printf '%s' "$html" | textutil -stdin -stdout -convert rtf -format html
実行
$ bash html2rtf.sh
書き出し
$ bash html2rtf.sh >"foo.rtf"
でも、コピペの方が簡単じゃないでしょうかね。
色々なスクリプトの例題ありがtとうございます。じっくり拝見します。
私は、現行の「OS ver. 10.10.5」での自分の常用えひた、TextWranglerとTextEditとの間で、ご紹介された件の数学記号に関する動作を確認しました。
数学記号を出すために、図1に示したように、「Character Viewer」のSearchボックスで文字入力(図では not)して入手しました。
図1 「not」の入手例
これで、4つの文字(EM DASH, MINUS SIGN, HYPHEN MINUS, PARALLE TO, NOT SIGN)を入手する準備をしてから、
(1) TextWranglerに書き込み、保存。
(2) そのファイルを TextEditでも開き、確認。「PARALLEL TO」だけ変化文字種依存性があるようです
(3) もう一度、TextWranglerを開いて、(1)の部分をコピーすると、(2)と一致。
(4) TextWranglerで確認すると、(4)が出来ていて、(1)と一致。
図2に、左側にTextWrangler, 右側にTextEditの表示を示します。図中の(1)~(4)は、上記の説明に対応します。
これらから、私の利用範囲なら許容できそうです。
ご報告まで。
ANSI エスケープコードを含むテキストを HTML に変換するには、例えば、aha を使えば良いです。
ANSI HTML Adapter
aha-master.zip をダンロードして、コンパイル、インストールしてください。
html から rtf への変換には textutil を使えます。使用法は、
#!/bin/bash printf '\033[34mANSI blue text\033[0m' | /usr/local/bin/aha | textutil -convert rtf -stdin -output ~/Desktop/out.rtf
など。
aha 以外にも、python や perl のモジュールがあるようですね。
Hiro.Sさん、
html経由というのは、考えていませんでした。
rtfというフォーマットに出力するとい積もりよりも、色つきテクストのブラウザとしてTextEditを使おうと考えたいました。
むしろ、「Termnalからどのような形式で出力が出ているのか」から見直してみたと思います。
chandanaさん、
aha, textutilは存じませんでした。これらも利用して、先に述べた見直しをしたいとおもいました。
少し時間が掛かると思います。進展がありましたら、ご報告します。
shell に出力される色付きテキストを TextEdit で表示するのが目的なら、例えば、以下のようにできます。(この場合、TextEdit は rtf のタグを解釈するよう環境設定しておく必要があります。)
#!/bin/bash function textedit() { /usr/local/bin/aha | textutil -convert rtf -stdin -stdout | open -b com.apple.TextEdit -f } printf '\033[34mANSI blue text\033[0m\n' | textedit
あるいは、以下のスクリプトでは、色付きテストを shell と TextEdit の双方に出力します。
#!/bin/bash function textedit2() { ( exec 7>&1 tee /dev/fd/7 | /usr/local/bin/aha | textutil -convert rtf -stdin -stdout | open -b com.apple.TextEdit -f exec 7>&- ) } printf '\033[34mANSI blue text\033[0m\n' | textedit2
いずれも OS X 10.6.8 で動作を確認しました。
例は bash ですが、zsh でもそのまま動きます。
又、一部の Unicode の扱いで問題がある rtf に変換する事を避けたいなら、TextEdit を html のタグを解釈するように環境設定しておけば、aha の出力する html をそのまま TextEdit に渡せばよいです。
これから弄り回すために、関数呼び足しにするために、頂いた分のprintf分をコメントアウトしました;
#!/bin/zsh
# test.color2TextEdit:
# usage: ••• |textedit2
#Appleサポート・コミュニティ:: 色つきテキストを、コマンド・ラインから.rtfに保存する?
# https://discussionsjapan.apple.com/thread/10172424
# 1) chandanaさんのコメント: 2016/04/03 0:15
function textedit2()
{
(
exec 7>&1
tee /dev/fd/7 |
/usr/local/bin/aha | textutil -convert rtf -stdin -stdout |\
open -b com.apple.TextEdit -f
exec 7>&-
)
}
#printf '\033[34mANSI blue text\033[0m\n' | textedit2
ターミナルで、手動で上記スクリプト()の色調整をするためのスクリプトをターミナルで動作させ、そのスクリプト(test.color2TextEdit)を読み込(source command: .)、test.color2TextEditパイプ渡しをしました、図4。
図4 (a) ターミナルでの表示、(b) テキストエディットでの表示。
概ねテキスト構造は問題ないですが、発色の違いが大きいです。TextEditの色設定を調べる必要があります。
Terminal と同じ (ような) 色になるように、aha のソースコードを書き換えて再コンパイルすれば良いと思います。
ご参考
ANSI escape code
Hiro.Sさんによると;
Terminal と同じ (ような) 色になるように、aha のソースコードを書き換えて再コンパイルすれば良いと思います。
そうですか、ahaのカラー変換があるのですね。ちょっと覗いて見ましたが、colorshemaの前後で具体的な色コードを書いてあると思ったら、一般的な規格名を引用しているのが大部分でした。
ご参考 ANSI escape code
になるわけですね。
下手に考えるよりも、部分的に自分の設定を書き込んで、様子を見た方が早いかもしれないですね。
名前指定の色が実際にどんな色で表示されるかは、アプリケーションによって違うようなので、Terminal の色表示に合わせたければ、数値指定するほかないでしょう。aha は色を html の stylesheet 又は style 属性で指定しているので、ソースコード中のその部分を名前指定から数値指定に書き換えてコンパイルすることになります。
例えば、stylesheet の部分では、
color: blue;
を
color: rgb(73,46,255);
に書き換え、style 属性の部分では、
color:blue;
を
color:rgb(73,46,255);
に書き換える、など。(数値は Wikipedia の記事から取りました。)
TextEdit でなくて、ブラウズ専用のアプリケーションということであれば、qlmanage で QuickLook を使う手もあります。
例えば、
#!/bin/bash function quicklook() { temp=$(mktemp /tmp/quicklook_XXXXXX) && html=$temp.html && mv "$temp" "$html" || exit /usr/local/bin/aha > "$html" qlmanage -p "$html" &>/dev/null rm "$html" } printf '\033[34mANSI blue text\033[0m\n' | quicklook
又は、
#!/bin/bash function quicklook2() { temp=$(mktemp /tmp/quicklook_XXXXXX) && html=$temp.html && mv "$temp" "$html" || exit ( exec 7>&1 tee /dev/fd/7 | /usr/local/bin/aha > "$html" exec 7>&- ) qlmanage -p "$html" &>/dev/null rm "$html" } printf '\033[34mANSI blue text\033[0m\n' | quicklook2
これらの例では、rtf ではなく html を表示させています。
しかし、QuickLook では表示されているテキストを選択してコピーする事ができないので不便ではないかな。
OS X 10.7 から 10.10 では以下のコマンドで QuickLook でのテキスト選択ができるようになるようですが、OS X 10.11 ではまた出来なくなったようです。
defaults write com.apple.finder QLEnableTextSelection -bool true killall Finder
こっちの方がシンプルですね。
#!/bin/bash function quicklook() { qlmanage -p -c public.html <(/usr/local/bin/aha) &>/dev/null & } printf '\033[34mANSI blue text\033[0m\n' | quicklook
#!/bin/bash function quicklook2() { ( exec 7>&1 tee /dev/fd/7 | { qlmanage -p -c public.html <(/usr/local/bin/aha) &>/dev/null & } exec 7>&- ) } printf '\033[34mANSI blue text\033[0m\n' | quicklook2
OS X 10.6.8 で bash と zsh で動作を確認しました。
色つきテキストを、コマンド・ラインから.rtfに保存する?