Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2009-05-30

[]はてな記法でリンクを作成するブックマークレット

はてなダイアリーでリンクを書く時、はてな記法でURLとtitleを指定しますよね。他の方はどうしているのかよく知らないんですが、わたしはちょっと前からこんなブックマークレットを使っています。簡単なものですが、まあ便利。

javascript:(function(){alert('['+document.location+':title='+document.title.replace(/([\[\]<>&])/g,%20function(){return%20"&#"%20+%20RegExp.$1.charCodeAt(0)%20+%20";"})+']');})()

ダイアログが出るので(IE以外だとクリップボードに格納するのはめんどくさそうでした)コピーしてダイアリーに貼付けます。

f:id:seuzo:20090530165204p:image

2009-05-29

[]オンラインでプレゼンテーション用スライドを作成できる、Acrobat.com Presentations(ベータ)

Adobe Labsで、Acrobat.comの新しいサービスである「Presentations」(ベータ)が発表されました。

Adobe Labs - Acrobat.com Presentations

オンライン上で、プレゼンテーションのスライドを作成できます。ユーザーは、複数のプレゼンテーションを管理でき、他ユーザーとコラボレーションも可能です。プレゼンテーションのスライドは、デザインテンプレートから、好きなデザインを選択し、新しいレイアウトをカスタマイズできます。 Text Layout Frameworkが採用されたリッチなテキスト環境に加え、写真やFLV、図形などを配置でき、それぞれのオブジェクトにさまざまな属性を付加できます。完全なクラウドアプリケーションになっています。

ただ、残念なことに日本語は正しく&美しく表示できません。フォントの制限によるものですが、「・」(中黒)などは文字化けてしまいました。


ログインする

Acrobat.com Labs」からログインします。ログインにはAdobe IDが必要です。

f:id:seuzo:20090528232023p:image

最初にログインすると「Welcome to Presentations」が自動的に開きます。このプレゼンテーション自体が「Presentations」のチュートリアルになっています。

f:id:seuzo:20090528232427p:image


プレゼンテーションの作成方法

新しいプレゼンテーションを作成

「Presentations」メニューから「New」を選択します。ブラウザが新規ウインドウを開いて、新しいプレゼンテーション「Untitled」が開きます。

f:id:seuzo:20090528185341p:image


マスターレイヤーを作成

左側にある「Master」タブをクリックしてマスターレイヤーを作成します。

Masterレイヤーは、各ページの変更しないオブジェクトを指定します。

ここでは、右側にある「add content」パネルから四角をページ上にドラッグして、上の「shape toolbar」で色やグラデーションをつけました。

f:id:seuzo:20090528190004p:image


レイアウトレイヤーを作成

「Layout」タブをクリックしてレイアウトレイヤーを作成します。

Layoutレイヤーは、各スライドのコンテンツのひな形になります。いくつかのサンプルが左側に表示されますので、用途に合ったものから選んで、それを編集もかまいません。

ここではタイトルと文字、写真が入るようなレイアウトとしました。イメージにはエフェクトを付けました。

f:id:seuzo:20090528193345p:image

各スライドを編集

「Slides」タブをクリックして、各スライドを編集します。

日本語はフォントがないので、なんだかカクカクします。

f:id:seuzo:20090528194045p:image


新しいスライドを追加

「New Slides」の右側にある▼をクリックして、レイアウトを選びます。

f:id:seuzo:20090528194429p:image

新しいスライドが追加されました。

f:id:seuzo:20090528194643p:image

編集を繰り返し、すべてのスライドを完成させます。

f:id:seuzo:20090528200552p:image


カバーページをつける

ブランクページを追加して、スライドを一番上にドラッグします。

f:id:seuzo:20090528201415p:image

f:id:seuzo:20090528201442p:image

ブランクスライドを編集して、カバーページにしました。

f:id:seuzo:20090528203255p:image


プレゼンテーションに名前を付ける

「Presentations」メニューから「Close」を選択します。

f:id:seuzo:20090528203643p:image

「Docs」画面になりますから、今作成した「Untitled」の右側の▼をクリックします。

f:id:seuzo:20090528203900p:image

サブメニューから「Rename」を選択して、名前を変更します。

f:id:seuzo:20090528204104p:image


他のユーザーとプレゼンテーションを共有する

作成したプレゼンテーションを他のユーザー(AdobeIDを持っているユーザーに限る)と共有し、互いに編集できるようになります。

左下の「Share」ボタンをクリックすると、他のユーザーへの通知メールを送るダイアログが出ます。メッセージには日本語は使えないようです。

f:id:seuzo:20090528232911p:image

プレゼンテーションを共有すると、ウインドウの一番下にユーザーが追加されています。

f:id:seuzo:20090528213622p:image


プレゼンテーションを再生する

スライドショーを再生する

右下の「Play SlideShow」をクリックすると、ブラウザのウインドウがスライドのみになります。カーソルを下側に近づけるとスライド一覧が現れて、スライドを自由に行き来できます。

f:id:seuzo:20090528215235p:image


全画面表示にする

カーソルを右上に近づけると、「全画面・閉じる」アイコンが表示されます。

f:id:seuzo:20090528215657p:image

全画面表示になりました。

f:id:seuzo:20090528220030p:image


スライドを移動する

プレゼンテーション内のスライドを移動するには[←][→]キーで移動します。


全画面を中止する

全画面表示を中止するには、[ecs]キーを押します。ブラウザウインドウに戻ります。


スライドショーを中止する

ブラウザウインドウの状態で、[ecs]キーを押します。編集画面に戻ります。


ログアウトする

右上の「ACROBAT.COM LABS」ロゴをクリックして「Sign Out」を選択して、ログアウトします。


参照

Text Layout Framework Team: Acrobat.com Presentations Text Powered by TLF

Rufus Deuchler | Travelogue: Welcome to Acrobat.com Presentations

2009-05-28

[][][][]スクリプトのユーザーインターフェイスをFlashで作成する

InDesign SDK: Flash UIs with InDesign CS4

スクリプトのユーザーインターフェイスをFlashで作成するって方法ですね。CS4の発売当時から「CS4ではFlashでパネルウィジットが作成できる」とアドビが言っていたものです。

JavaScriptのデモサンプルは「~/Library/Preferences/Adobe InDesign/Version 6.0-J/ja_JP/Scripts/」フォルダに「Startup Scripts」というフォルダ*1を作成して、伸長したファイルを置いてInDesignを起動させて使用します。

なにがいいのかというと、ダイアログがFlashライクに作成できるということと、Flashの機能を利用したリッチなUIになること、スクリプトパネルからではなく、「ウインドウ」メニューからの操作(それはMenuActionが効いているからなんですが...)ができるってことです。

実用的な例としては、「Kuler」パネルがFlashウィジットのプラグインとして書かれています。

実際の作成はFlex Builder 3を使うようです(持っていないので検証できません^^)。フリーで配布されている「Flex SDK」でも可能のようです。たしか以前インストールして少しコマンドを触ってみましたが、あえなく挫折。


もちろん、アドビCSアプリケーションでのスクリプトではScriptUIクラスがありますので、ちょっとしたものならば(まあ、面倒ではあるけれど)ダイアログを作成できます。他の方のスクリプトではかなり丁寧に作り込んであるものもあります。これで十分な人はこれでもよいの、かな?

Mac環境ならXCodeとInterface Builderでかなりのものができます。AppleScriptだけじゃなくてJavaScriptのフレームワークもいくつかあるようです。

ほかにもRealBasicとか、まだ開発していたのか FaceSpan*2とか。もしかしたら(わたしが知らないだけで)Ruby/TKとかで作っている人すらいるかもしれません。

とまあ、この手の話題は尽きないわけです。たかがUIされどUIですね。やりたいことはUIではないのに、UIによって選択肢が変わってしまう。

重要なのは、Adobeの展望です。簡単なものはScriptUIで、より複雑なものはFlashでという使い分けを考えているのかもしれません。もっと言うならFlash圧力というか... 以前「Adobe MAX Japan 2009:Flash Player10の新テキストエンジン”Text Layout Framework”フル活用tips − MACお宝鑑定団 blog(羅針盤)」で紹介されていた「Text Layout Framework」が使えるのも魅力です。IDMLなどとの相性もよいでしょう。

でもなあ、そこまでのUIを必要とするものを考えられるかどうか、なんて言い訳を考えつつFlashを習得するのに二の足を踏んでいるわたしです。

*1:「Startup Scripts」フォルダ内に置かれたスクリプトはInDesignの起動時に実行される。http://www.seuzo.jp/rubbs/search_html/msg01593.html

*2:FaceSpan 5の開発は断念されたようです。http://www.latenightsw.com/blogfs5/?p=179

2009-05-27

[][][]丸数字などを簡単に変換できる「round_num 0.3」

何をするスクリプトか?

選択したテキスト中の数字を丸数字などに変換します。

選べるオプションは7つ。

  • 丸数字にする
  • 白抜き丸数字にする
  • 四角内数字にする
  • 四角(ラウンド)内数字にする
  • 黒四角内白抜き数字にする
  • 黒四角(ラウンド)内白抜き数字にする
  • 括弧内数字にする

D


同梱ファイル(2Files)

Readme.txt このファイルです。とにかく最初によんでください。

round_num.jsx スクリプト本体です。


使用条件

このスクリプトが正常に動作する環境は以下の通りです。Windows環境でも動作する可能性がありますが未検証です。

  • MacOS X10.5.7
  • InDesign CS4_J(6.0.2)

ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS4/index.html#round_num


インストール

スクリプト本体(round_num.jsx)を

~/Library/Preferences/Adobe InDesign/Version 6.0-J/ja_JP/Scripts/Scripts Panel/

にコピーしてください。エイリアスを入れておくだけでもかまいません。

スクリプトパレットから使用します。


使用方法

(0)「ウインドウ」メニューから「スクリプティング」ー「スクリプト」を選択し、スクリプトパレットを出します。

(1)変換したい数字を含むテキストを選択します。

(2)スクリプトパレットから、スクリプト「round_num.jsx」をダブルクリックします。

(3)変換したい字種を選んで、OKボタンをクリックしてください


既知の不具合、またはToDo

OTFでGIDが同じ値を持つフォントしか置換しません。例えば、Osakaフォント(TrueType)には「①」「❶」などの字形を持ちますが、数字の「1」のCID/GIDは「18」ではなく、「47」なので置換対象になりません。

変換できる数字は「0」〜「100」までと「00」〜「09」までです。これ以上の大きな数は無視されます。

数字列中に「,」(カンマ)や「.」(ピリオド)を含む数字列は変換しません。「1.0」は「1」と解釈しません。位取りのカンマでないとしても「1,2,3」という数字列は無視します。どうしても置換したい場合は、それぞれ数字のみを選択して実行してください。

表組みはサポートしておりません。

合成フォントはサポートしておりません。InDesignの字形置換の仕様です。


免責事項

  • 本アプリケーションはInDesignにおける作業効率支援なのであって、処理結果を保証するものではありません。かならず確認をされることをおすすめします。
  • このツールを使用する上でデータの破損などのあらゆる不具合・不利益については一切の責任を負いかねますのでご了解ください。
  • このツールはすべてのMacintoshMac OS上で動作をするという確認をとっていませんし、事実上出来ません。したがって、動作を保証するものではありません。

ライセンス

GNU GPLv3

http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0


履 歴

2008-09-19 ver.0.1 とりあえず

2008-09-20 ver.0.2 2桁以上の選択文字がストーリーの最後にある時、処理が失敗するのを修正した。文字列「111」の最初の「11」を選択しているとき、「①①」などと変換されてしまうのを修正した。

2009-05-26 ver.0.3 InDesign CS4対応版。選択しているテキストが数字だけでなく、他の文字列を選択していても、選択文字列中の数字列を変換できるようにした。


ソースコード

/*
round_num.jsx
(c)2008-2009 www.seuzo.jp
選択したテキスト中の数字を丸数字などに変換します。

2008-09-19	ver.0.1	とりあえず
2008-09-20	ver.0.2	2桁以上の選択文字がストーリーの最後にある時、処理が失敗するのを修正した。文字列「111」の最初の「11」を選択しているとき、「&#9312;&#9312;」と変換されてしまうのを修正した。
2009-05-26	ver.0.3	InDesign CS4対応版。選択しているテキストが数字だけでなく、他の文字列を選択していても、選択文字列中の数字列を変換できるようにした。
*/

////////////////////////////////////////////設定
#target "InDesign-6.0"
var my_report = true;//処理の最後にレポートダイアログを表示するかどうか


////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}


////////////////////////////////////////////ラジオダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ラジオボタンに展開するリスト

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}


	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}

////////////////////////////////////////////正規表現検索
//正規表現で検索して、ヒットオブジェクトを(お尻から)返すだけ
function my_regex(my_range_obj, my_find_str) {
        //検索の初期化
        app.findGrepPreferences = NothingEnum.nothing;
        app.changeGrepPreferences = NothingEnum.nothing;
        //検索オプション
        app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
        app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
        app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
        app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
        app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
        app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
        app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

        app.findGrepPreferences.findWhat = my_find_str;//検索文字の設定
        //app.changeGrepPreferences.changeTo = my_change_str;//置換文字の設定
        return my_range_obj.findGrep(true);//検索の実行(reverse)
}

////////////////////////////////////////////字形検索置換
function change_glyph(my_range_obj, find_font, find_gid, change_font, change_gid) {
	var my_doc = app.activeDocument;
	app.findGlyphPreferences = NothingEnum.nothing;
	app.changeGlyphPreferences = NothingEnum.nothing;
	app.findGlyphPreferences.appliedFont = find_font;
	app.changeGlyphPreferences.appliedFont = change_font;
	app.findGlyphPreferences.glyphID = find_gid;
	app.changeGlyphPreferences.glyphID = change_gid;
	var my_result = my_range_obj.changeGlyph ();
	return my_result;
}



////////////////////////////////////////////以下メイン実行
////////////////まずは選択しているもののチェック
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var my_doc = app.activeDocument;
if (my_doc.selection.length == 0) {myerror("テキストを選択してください")}
var my_selection = my_doc.selection[0];
var my_class =my_selection.reflect.name;
my_class = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(my_class);
if (my_class == null) {myerror("テキストを選択してください")}

var hit_obj = my_regex(my_selection, "[0-9,.]*[0-9]+");//数字列の検索
var target_obj = new Array();//ターゲットとなるオブジェクトの配列
for (var i = 0; i< hit_obj.length; i++) {
	var tmp_str = hit_obj[i].contents;
	if ((tmp_str.match(/[,.]/) == null) && (tmp_str.match(/^(100|\d\d?)$/) !=null)) {//数字列にカンマやピリオドが含まれておらず、かつ、0〜100の数字列ならば
		target_obj.push(hit_obj[i]);//ターゲットとする
	}
}
if (target_obj.length == 0) {myerror("変換可能な数字はありませんでした")}


////////////////検索前処理
//処理の選択ダイアログ
var myList = ["丸数字にする", 
"白抜き丸数字にする", 
"四角内数字にする", 
"四角(ラウンド)内数字にする", 
"黒四角内白抜き数字にする", 
"黒四角(ラウンド)内白抜き数字にする", 
"括弧内数字にする"];
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var ans_int = radioDialog("round_num", "選択した数字テキストを丸数字などに変換します。処理を選択してください\n", myList);

//CIDテーブルのセット
var my_tbl = new Array();//my_tblはCID番号の配列。0番地から100番地までが「0」〜「100」の字形の対応し、101番地から111番地までが「00」〜「09」の字形の対応している。
if (ans_int == 0) {//丸数字にする &#65533;
	my_tbl = [8224, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 8091, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 10244, 10245, 10246, 10247, 10248, 10249, 10250, 10251, 10252, 10253, 10254, 10255, 10256, 10257, 10258, 10259, 10260, 10261, 10262, 10263, 10264, 10265, 10266, 10267, 10268, 10269, 10270, 10271, 10272, 10273, 10274, 10275, 10276, 10277, 10278, 10279, 10280, 10281, 10282, 10283, 10284, 10285, 10286, 10287, 10288, 10289, 10290, 10291, 10292, 10293, 10294, 10295, 10296, 10297, 10298, 10299, 10300, 10301, 10302, 10303, 10304, 10305, 10306, 10307, 10308, 10309, 10310, 10311, 10312, 10234, 10235, 10236, 10237, 10238, 10239, 10240, 10241, 10242, 10243];
} else if (ans_int == 1) {//白抜き丸数字にする &#10103;
	my_tbl = [10503, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 10514, 10515, 10516, 10517, 10518, 10519, 10520, 10521, 10522, 10523, 10524, 10525, 10526, 10527, 10528, 10529, 10530, 10531, 10532, 10533, 10534, 10535, 10536, 10537, 10538, 10539, 10540, 10541, 10542, 10543, 10544, 10545, 10546, 10547, 10548, 10549, 10550, 10551, 10552, 10553, 10554, 10555, 10556, 10557, 10558, 10559, 10560, 10561, 10562, 10563, 10564, 10565, 10566, 10567, 10568, 10569, 10570, 10571, 10572, 10573, 10574, 10575, 10576, 10577, 10578, 10579, 10580, 10581, 10582, 10583, 10584, 10585, 10586, 10587, 10588, 10589, 10590, 10591, 10592, 10593, 10594, 10595, 10596, 10597, 10598, 10599, 10600, 10601, 10602, 10603, 10604, 10504, 10505, 10506, 10507, 10508, 10509, 10510, 10511, 10512, 10513];
} else if (ans_int == 2) {//四角内数字にする
	my_tbl = [10764, 10766, 10768, 10770, 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10785, 10786, 10787, 10788, 10789, 10790, 10791, 10792, 10793, 10794, 10795, 10796, 10797, 10798, 10799, 10800, 10801, 10802, 10803, 10804, 10805, 10806, 10807, 10808, 10809, 10810, 10811, 10812, 10813, 10814, 10815, 10816, 10817, 10818, 10819, 10820, 10821, 10822, 10823, 10824, 10825, 10826, 10827, 10828, 10829, 10830, 10831, 10832, 10833, 10834, 10835, 10836, 10837, 10838, 10839, 10840, 10841, 10842, 10843, 10844, 10845, 10846, 10847, 10848, 10849, 10850, 10851, 10852, 10853, 10854, 10855, 10856, 10857, 10858, 10859, 10860, 10861, 10862, 10863, 10864, 10865, 10866, 10867, 10868, 10869, 10870, 10871, 10872, 10873, 10874, 10765, 10767, 10769, 10771, 10773, 10775, 10777, 10779, 10781, 10783];
} else if (ans_int == 3) {//四角(ラウンド)内数字にする
	my_tbl = [11307, 11309, 11311, 11313, 11315, 11317, 11319, 11321, 11323, 11325, 11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359, 11360, 11361, 11362, 11363, 11364, 11365, 11366, 11367, 11368, 11369, 11370, 11371, 11372, 11373, 11374, 11375, 11376, 11377, 11378, 11379, 11380, 11381, 11382, 11383, 11384, 11385, 11386, 11387, 11388, 11389, 11390, 11391, 11392, 11393, 11394, 11395, 11396, 11397, 11398, 11399, 11400, 11401, 11402, 11403, 11404, 11405, 11406, 11407, 11408, 11409, 11410, 11411, 11412, 11413, 11414, 11415, 11416, 11417, 11308, 11310, 11312, 11314, 11316, 11318, 11320, 11322, 11324, 11326];
} else if (ans_int == 4) {//黒四角内白抜き数字にする
	my_tbl =[11037, 11039, 11041, 11043, 11045, 11047, 11049, 11051, 11053, 11055, 11057, 11058, 11059, 11060, 11061, 11062, 11063, 11064, 11065, 11066, 11067, 11068, 11069, 11070, 11071, 11072, 11073, 11074, 11075, 11076, 11077, 11078, 11079, 11080, 11081, 11082, 11083, 11084, 11085, 11086, 11087, 11088, 11089, 11090, 11091, 11092, 11093, 11094, 11095, 11096, 11097, 11098, 11099, 11100, 11101, 11102, 11103, 11104, 11105, 11106, 11107, 11108, 11109, 11110, 11111, 11112, 11113, 11114, 11115, 11116, 11117, 11118, 11119, 11120, 11121, 11122, 11123, 11124, 11125, 11126, 11127, 11128, 11129, 11130, 11131, 11132, 11133, 11134, 11135, 11136, 11137, 11138, 11139, 11140, 11141, 11142, 11143, 11144, 11145, 11146, 11147, 11038, 11040, 11042, 11044, 11046, 11048, 11050, 11052, 11054, 11056];
} else if (ans_int == 5) {//黒四角(ラウンド)内白抜き数字にする
	my_tbl =[11576, 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, 11597, 11598, 11599, 11600, 11601, 11602, 11603, 11604, 11605, 11606, 11607, 11608, 11609, 11610, 11611, 11612, 11613, 11614, 11615, 11616, 11617, 11618, 11619, 11620, 11621, 11622, 11623, 11624, 11625, 11626, 11627, 11628, 11629, 11630, 11631, 11632, 11633, 11634, 11635, 11636, 11637, 11638, 11639, 11640, 11641, 11642, 11643, 11644, 11645, 11646, 11647, 11648, 11649, 11650, 11651, 11652, 11653, 11654, 11655, 11656, 11657, 11658, 11659, 11660, 11661, 11662, 11663, 11664, 11665, 11666, 11667, 11668, 11669, 11670, 11671, 11672, 11673, 11674, 11675, 11676, 11677, 11678, 11679, 11680, 11681, 11682, 11683, 11684, 11685, 11686, 11577, 11579, 11581, 11583, 11585, 11587, 11589, 11591, 11593, 11595];
} else if (ans_int == 6) {//括弧内数字にする
	my_tbl =[8227, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 9894, 9895, 9896, 9897, 9898, 9899, 9900, 9901, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, 9913, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 9921, 9922, 9923, 9924, 9925, 9926, 9927, 9928, 9929, 9930, 9931, 9932, 9933, 9934, 9935, 9936, 9937, 9938, 9939, 9940, 9941, 9942, 9943, 9944, 9945, 9946, 9947, 9948, 9949, 9950, 9951, 9952, 9953, 9954, 9955, 9956, 9957, 9958, 9959, 9960, 9961, 9962, 9963, 9964, 9965, 9966, 9967, 9968, 9969, 9970, 9971, 9972, 9973, 9884, 9885, 9886, 9887, 9888, 9889, 9890, 9891, 9892, 9893];
} else {
	myerror("処理をキャンセルしました");
}

//ターゲットをループ
var my_count = 0;
var tmp_result = "";
for (var i = 0; i < target_obj.length; i++) {
	//target_obj[i].select();
	var my_contents = target_obj[i].contents;//ターゲットの数字(テキスト)
	var my_font = target_obj[i].appliedFont;//ターゲットテキストのフォント
	
	//添字のスライド
	var my_suffix = 0;
	if (my_contents.match(/^0\d$/)) {//00〜09の時
		my_suffix = 101 + parseInt (my_contents);
	} else {
		my_suffix = parseInt (my_contents);
	}

	//選択文字列の変換
	target_obj[i].contents = "1";//強制的に選択文字を「1」にする

	//字形検索置換
	try {
		tmp_result = change_glyph(target_obj[i], my_font, 18, my_font, my_tbl[my_suffix]);
		if (tmp_result == "") {
			target_obj[i].contents = my_contents;
		} else {
			my_count++;
		}
	} catch(e) {
		target_obj[i].contents = my_contents;
	}
}

//結果レポート
if (my_report) {
	if (my_count == 0) {
		alert ("変更箇所はありませんでした。字形をもたないフォントである可能性があります");
	} else if (target_obj.length > my_count) {
		var failure_count = target_obj.length - my_count;
		alert (target_obj.length + "箇所中、" + my_count + "箇所の数字を変換しました\n失敗した" + failure_count + "箇所については字形をもたないフォントである可能性があります");
	} else {
		alert ( my_count + "箇所の数字を変換しました");
	}
}

2009-05-26

[]ドネーションのご案内

現在、わたしが「Show Time +one」「名もないテクノ手」などで個人的に公開してるスクリプトの使用や各種情報に対して、金銭的な対価を支払う必要はありません。その方針は今後とも変わりません。たぶん。

だがしかし。開発やメンテナンスにかかる手間と時間。参考書籍や機器、ソフトウエアの購入。さらにサイト運営費などはすべて個人の持ち出しになっています。こうした「清廉潔白さ」はわたしの好感度をますますアップさせますが、現状はかなり汲々としています。たまにちょっと疲れちゃうのです。ときどき回っていないお寿司も食べたいんです。

ということで、せうぞー活動に対してなんらかの援助をする各種方法を書いておきます。こころおきなくご利用くださいませ。

アフィリエイトのご利用

Adobe製品のご購入の場合は下記バナーからAdobeストアに入ってください


Apple製品をご購入の場合は下記バナーからアップルストアに入ってください


Amazonでのお買い物は下記から検索してください

Amazon


Amazonのセレクトショップ(主に自分で買ってよかったもの)

せうぞー商店


はてなポイントを送付

はてなユーザーの方ははてなポイントを購入していただき「はてなポイントを送付」いただけます。「送信先はてなID」は「seuzo」になります。


コンサルタント

簡単なスクリプトの質問やカスタマイズなどのご相談に応じます。こちらはお仕事としてやらせていただきますので、決してお安くはありませんが誠実に対応いたします。

オファーはメールフォームからお願いいたします。


最後に...

一般的にアフィリエイトはよほどの人気サイトでない限り大きな収益は見込めないと言われています。

このブログに限らず、ブログ内のアフィリエイトを利用することは、そのブログへの支持を表明する手段であることを知っていただきたいと思います。

2009-05-25

[]入力ファイル(ARGF)の行番号

何をいまさら的メモ。入力ファイルARGFの行番号を参照したいとき、「$.」を使っているんですが、複数のファイルを指定したときは

ARGF.close if ARGF.eof?

のように明示的にカレントファイルを閉じて、$.をリセットしていました。

だがしかし。「ARGF.file.lineno」を使えばよかったんですね。知らなかったワ。リファレンスにもちゃんと記述がありました。

ARGF - Rubyリファレンスマニュアル


何をいまさらついでに告白すると、旧BBSの過去ログはEUCどっぷりだったせいで、charsetを指定していませんでした。よそ様のページで文字化けなんかしようものなら、「charsetくらい書いとけよ...」と不機嫌になってしまふわたくしの何と身勝手なことか。

1720もファイルがあるので、こんな感じで直しておきました。

#! /usr/bin/ruby -Ke -i.bak -np
if (ARGF.file.lineno == 9) ... (ARGF.file.lineno == 11) then
  $_.sub!(/^<head>\n/) {"<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\" />\n"}
end

2009-05-22

[][]画像にかかる文字を白抜きにする

InDesignSecrets -- Split Text Color from Black to White in the Middle of a Frame

の通りなんだけれど、手順の図解がいまひとつなのでわかりずらいかもしれません。わかってしまえば、簡単なことです。


(1)画像の上にテキスト(黒文字)が乗っている状態

f:id:seuzo:20090522155321p:image


(2)背面のグラフィックフレームを選択し、コピーします。
(3)「編集」メニューの「元の位置にペースト」を実行します。

最前面にグラフィックフレームがペーストされて、テキストを覆い隠すようになります。

f:id:seuzo:20090522155622p:image


(4)画像等を削除します。

ダイレクト選択ツールで、グラフィックフレームの画像だけを削除します。グラフィックフレームに塗りや線が適用されている場合は、スウォッチパネルでそれらを「なし」にします。

f:id:seuzo:20090522160002p:image


(5)テキストフレームを選択し、コピーします。
(6)手順4で作成したグラフィックフレームを選択し、「編集」メニューの「選択範囲へペースト」を実行します。

ここがキモ。まだ見た目では、手順1の状態と同じです。

f:id:seuzo:20090522160311p:image


(7)テキストツールで、手順6でペーストしたテキスト中にカーソルを置き、すべてを選択します。

左側のテキストも選択されているように見えますが、気にしないでください。

f:id:seuzo:20090522160624p:image


(8)スウォッチパネルで、文字の色を「紙色」を選択します。

画像の上だけテキストが白になりました。

f:id:seuzo:20090522160905p:image


(9)文字に白の線幅を持たせる

白抜き文字は若干ウエイトが細く見えることがあります。気になるようなら、文字を再度選択し、0.1pt程度の線(紙色)を適用します。

f:id:seuzo:20090522161525p:image



まあ、要するに、手順1の状態の上に、「選択範囲へペースト」されたグラフィックフレームが乗っているんですね。そのグラフィックフレームだけをズラしてみるとこんな感じです(わかりやすいようにテキストをグレーにしてあります)。

f:id:seuzo:20090522161951p:image

「1/1000gの日記」さんでは、この一連の処理を自動化するスクリプトを公開されています。

InDesignネガポジテキスト - 1/1000gの日記

dupG.fillColor="None";//塗りなしに

の下に

dupG.strokeWeight = 0;
または
dupG.strokeColor = "None";

を入れると、グラフィックフレームが線幅を持っているときも、テキストがきれいに繋がるようになります。

2009-05-20

[][][][]特定のXMLElementから関連するpageitemオブジェクトを得る

特定のXMLElementから関連するpageitemオブジェクトを得たいのだけれど、XMLElementは必ずしもPageItemと関連しているとは限らない。逆にPageItemにはassociatedXMLElementプロパティがあるので、関連づけられたXMLElementオブジェクトを知ることができる。

ここではドキュメント中のallPageItemsについて、associatedXMLElementを持っていれば、IDをキーにしてハッシュとした。

//ドキュメントのすべてのpageitemでXMLElementを持つものを収集してハッシュで返す
function collectPageItem() {
	var my_collection = new Array();
	var my_doc = app.activeDocument;
	for (var i = 0; i < my_doc.allPageItems.length; i++) {
		var tmp_key = my_doc.allPageItems[i].associatedXMLElement;
		if (tmp_key != null) {my_collection["id" + tmp_key.id] = my_doc.allPageItems[i];}
	}
	return my_collection;
}

//XMLElementからpageitemオブジェクトを返す
function getPageItem(my_element, my_collection) {
	var tmp_key = "id" + my_element.id;
	return my_collection[tmp_key];
}

var my_doc = app.activeDocument;
var my_root = my_doc.xmlElements.item("records");//root要素
var my_element = my_root.xmlElements[1];//ターゲットelement

var my_collection = collectPageItem();
var my_obj = getPageItem(my_element, my_collection);
my_obj.select();//選択してみる

2009-05-19

[][]SayKanaを使ってInDesignで読み上げテスト

Mac版音声合成ソフト「SayKana」がリリースされましたので使ってみました。

SayKana - Mac用音声合成プログラム

$ saykana "わたしのなまえはいちかわせうぞーです"

おー、喋るしゃべる。たのしい。

mecabを介して、仮名漢字まじり文を試してみます。

$ echo "私の名前は市川せうぞーです。" | mecab -Oyomi | saykana -f -

楽しいなあ...で終わってしまうと、いかにも遊んでる風なので、InDesignにこじつけてみます。むりむり。読み上げ校正とかが必要な仕事に縁がないのだけど...^^

tell application "Adobe InDesign CS4"
	tell document 1
		set str to contents of selection
		set str to do shell script "echo " & quoted form of str & " | tr \"[\\']\" ' '"--ここはもうちょっと考える必要があるかも
		do shell script "echo " & quoted form of str & " | /usr/local/bin/mecab -Oyomi | /usr/local/bin/saykana -f -"
	end tell
end tell

楽しいので、動画age。

D

2009-05-18

[][][]クエリを使った連続検索置換「run_Queries 0.3」

何をするスクリプトか?

  • 指定した複数のクエリを連続実行します。違うタイプの検索モードを混在できます。
  • 検索(置換)範囲を「選択範囲」「ストーリー」「ドキュメント」から選べます。
  • クエリを使用するので、スタイルグループ内のスタイルも指定可能です。
  • オブジェクト検索については未完全なサポート(検索範囲「ドキュメント」のみサポート)

同梱ファイル2Files

  • Readme.txt このファイルです。とにかく最初によんでください。
  • run_Queries.jsx スクリプト本体です。

使用条件

このスクリプトが正常に動作する環境は以下の通りです。Windows環境でも動作する可能性がありますが未検証です。

  • MacOS X10.5.7
  • InDesign CS4_J(6.0.2)

ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS4/index.html#run_Queries


インストール

スクリプト本体(run_Queries.jsx)を

~/Library/Preferences/Adobe InDesign/Version 6.0-J/ja_JP/Scripts/Scripts Panel/

にコピーしてください。エイリアスを入れておくだけでもかまいません。

スクリプトパレットから使用します。


設定

0)スクリプトで使用したいクエリを設定します。クエリの保存方法は、http://help.adobe.com/ja_JP/InDesign/6.0/WSB4D7E9CD-F741-40a0-A72A-1DB0E6089630a.htmlを参照してください。

1)スクリプトパレット上で「run_Queries.jsx」を選択し、パレットメニューから「スクリプトを編集」を選びます。

2)もし「スクリプトを実行しますか?」とダイアログが出たら、「いいえ」を選択します。

3)「ExtendScript Toolkit.app」が立ち上がり、コードが表示されます。24行目付近の

var my_Queries = [
["transliterate","半角カナ"],
["glyph","葛飾区"],
["text","カンマ"],
["grep","大見出し"],
["grep","中見出し"],
["grep","小見出し"],
["grep","図太字"],
];

部分を書き換えます。書式は

["モード", "クエリ名"],

となっており、指定モードは「text」がテキスト、「grep」が正規表現、「glyph」が字形、「object」がオブジェクト、「transliterate」が文字種変換になっています。書いた順に上から実行されます。

ただし、objectモードのサポートは不完全で、ドキュメントを対象にした時にだけ有効になります。それ以外の検索範囲をobjectモードで仕様するとエラーになります。

4)書き換えが終了したら、保存して閉じます。


使用方法

0)「ウインドウ」メニューから「スクリプティング」ー「スクリプト」を選択し、スクリプトパレットを出します。

1)「選択範囲」または「ストーリー」から検索置換したい場合は、該当範囲またストーリーの一部をテキストツールで選択しておきます。

2)スクリプトパレットから、スクリプト「run_Queries.jsx」をダブルクリックします。

3)検索範囲を「選択範囲」「ストーリー」「ドキュメント」からひとつ選び、「OK」をクリックします

4)現在の設定がダイアログで表示されるので、この設定でOKであれば「はい」をクリックします。

5)処理が始まります。


既知の不具合、またはToDo

オブジェクト検索については未完全なサポート(検索範囲ドキュメントのみサポート)

grepモードでクエリに詳細形式を保存できないInDesignのバグをどうするか?

http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=483


免責事項

  • 本アプリケーションはInDesignにおける作業効率支援なのであって、処理結果を保証するものではありません。かならず確認をされることをおすすめします。
  • このツールを使用する上でデータの破損などのあらゆる不具合・不利益については一切の責任を負いかねますのでご了解ください。
  • このツールはすべてのMacintoshMac OS上で動作をするという確認をとっていませんし、事実上出来ません。したがって、動作を保証するものではありません。

ライセンス

GNU GPLv3

http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0


履 歴

2008-07-21 ver.0.1 とりあえず。http://d.hatena.ne.jp/seuzo/20080601/1212331508 の改良版。クエリを利用することで、モード、スタイルグループ、詳細形式を扱えるようにした。

2008-08-05 var.0.2 選択範囲がTextStyleRangeの時も正常に動作するようにした。選択範囲ダイアログで「キャンセル」をクリックした時、スクリプトが終了するようにした。

2009-05-18 ver.0.3 InDesign CS4対応。


ソースコード

/*
run_Queries.jsx
(c)2008-2009 www.seuzo.jp
指定された検索クエリを連続実行します。

●履歴
2008-07-21	ver.0.1	とりあえず。http://d.hatena.ne.jp/seuzo/20080601/1212331508 の改良版。クエリを利用することで、モード、スタイルグループ、詳細形式を扱えるようにした。
2008-08-05	var.0.2	選択範囲がTextStyleRangeの時も正常に動作するようにした。選択範囲ダイアログで「キャンセル」をクリックした時、スクリプトが終了するようにした。
2009-05-18	ver.0.3	InDesign CS4対応。

*/

//ターゲットをInDesignにする
#target "InDesign"

////////////////////////////////////////////★ここでクエリを設定する。書式は["モード", "クエリ名"],
//指定モードは下記の通り
//text	テキスト
//grep	正規表現
//glyph	字形
//object	オブジェクト(不完全)
//transliterate	文字種変換

var my_Queries = [
["transliterate","半角カナ"],
["glyph","葛飾区"],
["text","カンマ"],
["grep","大見出し"],
["grep","中見出し"],
["grep","小見出し"],
["grep","図太字"],
];







////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}

////////////////////////////////////////////ラジオダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ラジオボタンに展開するリスト

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}
	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}

////////////////////////////////////////////選択テキストのストーリを返す。選択チェックを兼ねる。
function get_story() {
	var mydocument = app.activeDocument;
	if (mydocument.selection.length == 0) {myerror("テキストを選択してください")}
	var myselection = mydocument.selection[0];
	var myclass =myselection.reflect.name;
	myclass = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(myclass);
	if (myclass == null) {myerror("テキストを選択してください")}
	return myselection.parentStory;//ストーリーオブジェクトを返す
}

////////////////////////////////////////////文字列を16進数にエスケープして、「\x{hex}」という形で返す。
function my_escape(str) {
tmp_str = escape(str);
return tmp_str.replace(/\%u([0-9A-F]+)/i, "\\x{$1}")
}

////////////////////////////////////////////正規表現検索でカタカナを16進に変換
function katakana2hex() {
	var find_str = app.findGrepPreferences.findWhat;
	while (/([ァ-ヴ])/.exec(find_str)) {
		find_str = find_str.replace(/([ァ-ヴ])/, my_escape(RegExp.$1));
	}
	app.findGrepPreferences.findWhat = find_str;//検索文字の設定
}


////////////////////////////////////////////以下処理
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var mydocument = app.activeDocument;

//検索範囲を指定
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
var my_range = radioDialog("run_Queries", "検索範囲を指定してください", ["選択範囲", "ストーリー", "ドキュメント"]);
if (my_range ==0) {//選択範囲
	get_story();//選択チェックとして使用
	var my_range_obj = mydocument.selection[0];
} else if (my_range == 1) {//ストーリー
	var my_range_obj = get_story();
} else if (my_range == 2) {//"ドキュメント"
	var my_range_obj = mydocument;
} else {
	myerror("処理をキャンセルしました");
}

//現在の設定を表示
var tmp = "現在の設定は下記の通りです\r";
for (var i = 0; i < my_Queries.length; i++){
tmp += my_Queries[i] + "\r";
}
if (! (confirm(tmp))) {myerror("")};//「いいえ」を選んだらエラーで中止


//検索置換
for (var i = 0; i < my_Queries.length; i++){
	try {
		var my_query_name = my_Queries[i][1];
		var my_mode = my_Queries[i][0];
		if (my_mode == "text") {
			my_mode = SearchModes.TEXT_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeText();
		} else if (my_mode == "grep") {
			my_mode = SearchModes.GREP_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			if (parseInt(app.version) == 5) {
				katakana2hex();//カタカナにマッチしないバグ回避
			}
			my_range_obj.changeGrep();
		} else if (my_mode == "glyph") {
			my_mode = SearchModes.GLYPH_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeGlyph ();
		} else if (my_mode == "object") {
			my_mode = SearchModes.OBJECT_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeObject();
		} else if (my_mode == "transliterate") {
			my_mode = SearchModes.TRANSLITERATE_SEARCH;
			app.loadFindChangeQuery(my_query_name, my_mode);//クエリをセットする
			my_range_obj.changeTransliterate();
		} else {myerror("モードの記述が不正です:" +my_Queries[i][0] + ":" + my_query_name)}
	} catch(e) {
		myerror("エラーが発生しました:" + my_Queries[i][0] + ":" + my_query_name + "\r" + e);
	}
}

2009-05-16

[][]LineMarkerがしつこく生き残っている

本日とあるデータを受け取って開いたら...

f:id:seuzo:20090516163423p:image

もちろん、LineMarkerの機能は使われていない。それでもプラグインのない環境ではプリントもパッケージもできなくなります。単なる伝染性のあるウイルスと化していますね。

この問題については「M.C.P.C.: レイアウトソフトにおけるプラグイン使用で悶々」が詳しいのでそちらを見てください。

うーん、L.C.Sさんはまだ公開しているようだし、使っている人がいるってことですね。標準機能で同じことができるんだが...

ちなみにこのプラグイン、Adobe Systems Inc.のクレジットが付いたままだし、いったいどんな来歴なんでしょうね。。。

2009-05-14

[]local IPアドレスを得る

AppleScriptでlocal IPアドレスを得るには

do shell script "ifconfig -a"

この返値からごにょごにょするしかないと思ってた。

けれど、こんな感じで簡単に取れるのね。知らなかった。

IPv4 address of (get system info)
-->"192.168.1.2"

system infoコマンドではほかにもいろいろと調べられるようです。試してみて。


あ、ちなみに外から見たグローバルIPを調べたい時のcgiはまだ生きています。ぼくが生きている間は生き続けると思ってください。

http://www.seuzo.jp/cgi-bin/address.cgi

2009-05-01

[][]Adobe Illustrator 88に学ぶ歴史の時間

YouTubeにジョン・ワーノック(John Warnock)氏によるAdobe Illustrator 88の紹介ビデオが公開されています。

D

ジョン・ワーノック若っ! 画面小さっ!

1987年だと、マシンはSE/30かな。あれやこれやで300万円くらいしたと思います。

わたしはまだIllustratorに触ったことありませんでした。当時、キヤノンEZPSを触って「楕円書ける、スゲーっ!」などと言っていたのです。信じられないかもしれませんが、版下に自由曲線を書くためにいくつかのRの違う楕円定規を使っていたのです。そんなわたくしにとってはMacやIllustratorは、おとぎ話というか、なにか外国の架空のお話のように感じていたものでした。つまり、ロットリングや烏口で自由曲線なんて面倒な仕事でしたし、それをものすごくキレイに仕上げてくれるコンピュータに畏れと憧れを抱いていました。

海の向こうではAdobe PostScriptってやつが発明されていて、IllustratorはPostScriptをGUIで操作できる唯一のソフトウエアだったわけです。ページ記述言語をGUIで書く、なんてぶっ飛んだ発想でしょうか?

このビデオは5分割されています。完全なリストは下記のとおり。さあ、あなたもどっぷりと当時を思い出してみてください。

アドビの歴史について、さらに詳しく知りたいと思ってしまった人は、下記の書籍も読んでみるといいと思います。

The Adobe Story -出版革命をデザインした男たち-

The Adobe Story -出版革命をデザインした男たち-