スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AppleScriptのシンタックスをハイライトするJavaScriptを少し改良

ウチのblogではAppleScriptとかJavaSciptのソースコードをいろいろ書き散らして晒してますが、ソースコードの構文を色分け表示するのに、AppleScriptの場合は自作のJavaScriptを使ってハイライト表示させています。(AppleScript以外のソースコードは、『SyntaxHighlighter』を利用)

で、今回ちょっと不具合があったのを直したついでに少し改良して、スクリプトエディタでの表示と同じ様に、主要な構文がボールドの文字で表示出来る様にしたのと、あとリストのラベル名やAppleEventが含まれるコードもできるだけスクリプトエディタでの色分けに合わせる様にしました。ソースコードのクリップボードへのコピーをする部分は、flashを使った外部のライブラリ『Zero Clipboard』を使っています。

<pre class="applescript">~</pre>でAppleScriptのソースを囲むとこんな感じに表示する様になってます。
on «event appSscrW» theObject given «class eveE»:theEvent
	set theValue to «class conT» of theObject as number
	(«class delY» of theEvent)
	set theValue to theValue + («class delY» of theEvent)
	set theEvent to theEvent
	set «class conT» of theObject to theValue
	tell window of theObject
		set contents of «class texF» "seconds" to contents of «class sliI» "secondsSlider"
		set secsToPlay to contents of «class texF» "seconds"
	end tell
end «event appSscrW»


on create_thumb(tgt_file, dest_file)
	tell application "Adobe Photoshop CS4"
		activate
		open tgt_file showing dialogs never
		set theDoc to current document
		tell theDoc
			if width > height then
				resize image width thumb_size as pixels resolution 72 resample method bicubic
			else
				resize image height thumb_size as pixels resolution 72 resample method bicubic
			end if
			change mode to RGB
			convert to profile "sRGB IEC61966-2.1" intent relative colorimetric with blackpoint compensation and dithering
			set save_opts to {class:JPEG save options, embed color profile:false, quality:10}
			save in file dest_file as JPEG with options save_opts appending no extension with copying
			close without saving
		end tell
	end tell
end create_thumb


(*  via MacWiki http://macwiki.sourceforge.jp/wiki/index.php/AppleScriptTips *)
set chars to {¬
	{uc:"A", lc:"a", ucj:"A", lcj:"a"}, {uc:"B", lc:"b", ucj:"B", lcj:"b"}, ¬
	{uc:"C", lc:"c", ucj:"C", lcj:"c"}, {uc:"D", lc:"d", ucj:"D", lcj:"d"}, ¬
	{uc:"E", lc:"e", ucj:"E", lcj:"e"}, {uc:"F", lc:"f", ucj:"F", lcj:"f"}, ¬
	{uc:"G", lc:"g", ucj:"G", lcj:"g"}, {uc:"H", lc:"h", ucj:"H", lcj:"h"}, ¬
	{uc:"I", lc:"i", ucj:"I", lcj:"i"}, {uc:"J", lc:"j", ucj:"J", lcj:"j"}, ¬
	{uc:"K", lc:"k", ucj:"K", lcj:"k"}, {uc:"L", lc:"l", ucj:"L", lcj:"l"}, ¬
	{uc:"M", lc:"m", ucj:"M", lcj:"m"}, {uc:"N", lc:"n", ucj:"N", lcj:"n"}, ¬
	{uc:"O", lc:"o", ucj:"O", lcj:"o"}, {uc:"P", lc:"p", ucj:"P", lcj:"p"}, ¬
	{uc:"Q", lc:"q", ucj:"Q", lcj:"q"}, {uc:"R", lc:"r", ucj:"R", lcj:"r"}, ¬
	{uc:"S", lc:"s", ucj:"S", lcj:"s"}, {uc:"T", lc:"t", ucj:"T", lcj:"t"}, ¬
	{uc:"U", lc:"u", ucj:"U", lcj:"u"}, {uc:"V", lc:"v", ucj:"V", lcj:"v"}, ¬
	{uc:"W", lc:"w", ucj:"W", lcj:"w"}, {uc:"X", lc:"x", ucj:"X", lcj:"x"}, ¬
	{uc:"Y", lc:"y", ucj:"Y", lcj:"y"}, {uc:"Z", lc:"z", ucj:"Z", lcj:"z"}}
set theText to "AppleScript アップルスクリプト AppleScript"
set newText to ""
repeat with aChar in every character of theText
	repeat with c in chars
		if aChar as string is uc of c then set aChar to lc of c -- tr/A-Z/a-z/
		-- if aChar as string is lc of c then set aChar to uc of c -- tr/a-z/A-Z/
	end repeat
	set newText to newText & aChar
end repeat
-- display dialog newText
クォートされた文字列を赤くしてるのは、ウチのblogにあるAppleScriptのコードはシェルとか他の言語に処理を投げてるのが多いので、その部分を目立つ様にするためです。

AppleScriptはアプリケーションの数だけ、それこそ無限にプロパティやメソッド等の予約語があるので、完璧に構文を正しく表示するのは難しいですが、基本的にこのJavaScriptでは『変数名とハンドラ名と記号と数字とコメントとクォートされた文字列以外はすべて予約語』として扱ってます。(で、イレギュラーなものを個別に登録して処理。)

変数名やハンドラかどうかは一旦コードを頭からスキャンして判断してるので、コードの一部を載せた様な場合いきなり変数名が出て来ても対応出来ず、スクリプトエディタでコンパイルが通る形のものでないときちんと処理出来ないという弱点はあります。

まあ、今後Adobeはアプリの新機能をAppleScriptでサポートしなくなるというのもあって、AppleScript書く事が少なくなってるので出番はあまり無いかも知れません。
スポンサーサイト

AppleSciptのシンタックスをハイライトするJavaScript(いちおう完成)

■2008-03-16追記 IEでの不具合を修正…できたか?■


前のエントリで途中経過というか副産物として、ハイライト表示するためのHTMLを生成するWebフォームとして公開してましたけど、JavaScriptをblogに設置しておけば勝手にハイライト出来るようになりました。『SyntaxHighlighter』の AppleScript用みたいな感じで。

<pre class="applescript">~</pre>の間にAppleScriptのコードを貼ると自動で行番号とともにハイライト表示します。

実際の表示はこんな感じ。
(* 拡張子を変更したファイル名を返す 簡易版 *)
on replaceExtension(fName, new_ext)
	tell application "Finder"
		set base_name to (do shell script "echo " & quoted form of fName & " | sed 's/\.[^.]*$//'") as Unicode text
		return base_name & "." & new_ext
	end tell
end replaceExtension
行番号表示のままだと、スクリプトエディタにコピペするとき行番号が邪魔になるので、プレーンなテキスト表示とトグルする事ができます。『SyntaxHighlighter』の場合プレーンテキストは別窓で開くんですが、こっちのほうが良いと思うんですがどうでしょう。

現状、とりあえず動く…程度のものなので書き直していくと思います。

AppleScriptのシンタックスをハイライトしたHTMLを生成するWebフォームを作ってみた

AppleScriptの構文を色分けして表示させるためのHTMLを生成するWebフォームをJavaScriptで作ってみました。まだまだ対応しきれてない構文とかあると思いますが。

Syntax Highlighting for AppleScript

実用性を考えると、HTMLを生成するフォームではなくて、『SyntaxHighlighter』とか『GeSHi』みたいにblogに設置しておいて、例えば<pre>要素のclassを指定してやれば勝手にハイライトするようなのが良いんですが、まずは構文の色付けする部分をマトモに動かす事から…みたいな感じで。まあ一回やってみたかったんです。

『GeSHi』なんかはAppleScriptにも対応してるんですが、色分け出来る予約語も多くないし、スクリプト中に他の言語が混ざってたりすると表示がおかしくなってしまい、今ひとつ完全ではない感じでした。

フォームの上側のテキストエリアに、スクリプトエディタからコピーしたコードをペーストして『Highlight!』ボタンを押すと、下側のテキストエリアに『<span class="hoge">~</span>』の形で区切られたHTMLが表示され、さらにその下が実際に色分けされた表示になります。AppleScriptのコードをコピペ出来るように、行番号抜きのHTMLも生成出来ます。

ハイライト表示のために、以下のcssを追加する必要があります
.applescript {
	font-size: 11px;
	width: inherit;
	overflow: scroll;
}

/* 行番号ありの場合はol要素 */
/* 行番号なしの場合はdiv要素のclass名 */    
.ash_highlighted {
	white-space: nowrap;
	color: #999;
	background-color: #f8f8f8;
	list-style-position: outside;
	list-style-type:decimal;
}

/* 行番号なしの場合のdiv要素調整用 */
div.ash_highlighted {
	padding-left: 1.5em;
	padding-top: 1em;
	padding-bottom: 1em
}

span.ash_reserved { color: #33c; } /* 予約語 */
span.ash_variable { color: #383; } /* 変数名 */
span.ash_handler { color: #383; } /* ハンドラ */
span.ash_quoted { color: #c3c; } /* クォートされた文字列 */
span.ash_symbol	{ color: #000; } /* 記号類 */
span.ash_normal	{ color: #000; } /* 上記以外の数字など */
span.ash_comment { color: #757; } /* コメント */

/* 行番号ありの場合のコード部分との境界 */
.applescript li { border-left: solid 1px #ccc; padding-left: 1em; }

/* 奇数行の背景色 */
li.odd { background-color: #fff; }

生成されたHTMLをblogに貼り付けるとこんな感じになります。
  1. property work_folder : "Images for Web" as Unicode text --保存先のフォルダ名(デスクトップに作成) 
  2. property jpeg_quality : 10 as integer --JPEGの画質(0-12) 
  3. on open drop
  4.     tell application "Finder"
  5.         if not (exists folder work_folder of desktop) then
  6.             make new folder with properties {name:work_folder} at desktop
  7.         end if
  8.         set dest_path to ((path to desktop folder) as Unicode text) & work_folder
  9.         set img_size to text returned of (display dialog "生成する画像の長辺のサイズ(ピクセル数)を入力。" default answer "") as integer
  10.     end tell
  11.     
  12.     (*ディスプレイプロファイル取得*)
  13.     tell application "ColorSyncScripting"
  14.         set profile_name to name of display profile of display 1
  15.     end tell
  16.     
  17.     repeat with theFile in drop
  18.         tell application "Adobe Photoshop CS2"
  19.             open theFile showing dialogs never
  20.             set theDoc to current document
  21.             tell theDoc
  22.                 if width > height then
  23.                     resize image width img_size as pixels resolution 72 resample method bicubic
  24.                 else
  25.                     resize image height img_size as pixels resolution 72 resample method bicubic
  26.                 end if
  27.                 change mode to RGB
  28.                 convert to profile profile_name intent relative colorimetric with blackpoint compensation and dithering
  29.                 set save_opts to {class:JPEG save options, embed color profile:false, quality:jpeg_quality}
  30.                 set new_name to my replaceExtension(name of theDoc, "jpg") as Unicode text
  31.                 set dest_file to dest_path & ":" & new_name
  32.                 save in file dest_file as JPEG with options save_opts appending no extension with copying
  33.                 close without saving
  34.             end tell
  35.         end tell
  36.     end repeat
  37. end open
  38. (* 拡張子を変更したファイル名を返す 簡易版 *)
  39. on replaceExtension(fName, new_ext)
  40.     tell application "Finder"
  41.         set base_name to (do shell script "echo " & quoted form of fName & " | sed 's/\.[^.]*$//'") as Unicode text
  42.         return base_name & "." & new_ext
  43.     end tell
  44. end replaceExtension
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。