Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2010-09-22

[][][][][][]TSVからInDesignXML流し込み

昨日のエントリ「TSV(タブ区切りテキスト)からXMLを簡易生成」を実際にInDesign上で使ってみます。

CSVTSVを指定して、内部的にXMLに変換し、ノードごとにInDesignXML流し込みを行います。動画で見るとこんな感じ:

D

とりあえず、CS4でもCS5でも動作しました。テストしてみたい方はテストキットを用意しました。

data_tsv2xml.zip 直

////////////////////////////////////////////エラー終了
function my_error(mess) {
	if (mess !== "") {alert (mess)}
	exit();
}

////////////////////////////////////////////ファイル・フォルダ選択ダイアログ。ファイルオブジェクトを返す。
function chooseF(my_prompt, my_kind) {
	var my_path;
	if (my_kind === "Folder") {
		my_path = Folder.selectDialog (my_prompt);
	} else {
		var my_regex = new RegExp('\\' + my_kind + '$');
		my_path =  File.openDialog (my_prompt, function(file){return(file.name.match(my_regex) || file instanceof Folder) ? true : false}, false );
	}
	return my_path
}

////////////////////////////////////////////ファイルの内容を読み込んで返す 
function read_file(my_read_file_path) {
	var my_file_obj = new File(my_read_file_path);
	if (!(my_file_obj.exists)) {my_error("ファイルがありません\n" + my_read_file_path)};
	if(my_file_obj.open("r")) {
		var tmp_str = my_file_obj.read();
		my_file_obj.close();
	} else {
		my_error("ファイルが開けません\n" + my_read_file_path);
	}
	 tmp_str = tmp_str.replace(/[\r\n]+$/, '');//最後の行末の改行を削除
	return tmp_str;
}

////////////////////////////////////////////データをファイルに書き込む 。書き込んだファイルオブジェクトを返す
function write_file(my_write_file_path, my_data) {
	var my_file_obj = new File(my_write_file_path);
	my_file_obj.encoding = "UTF-8";//★この行がないとShift-JISで書き出される
	//if (!(my_file_obj.exists)) {myerror("ファイルがありません\n" + my_write_file_path)};
	if(my_file_obj.open("w")) {
		my_file_obj.write(my_data);
		my_file_obj.close();
		return my_file_obj;
	} else {
		my_error("ファイルが開けません\n" + my_write_file_path);
	}
}

////////////////////////////////////////////TSVから簡易XMLを生成 
function tsv2xml(my_tsv) {
	//XMLのノード名とアイテム名
	var my_nodeName = "record";//ノード名
	var my_imteName = "item"//item名(追番がつきます)
	
	//XMLの生成
	var my_data = my_tsv.split("\n");//文字列を行ごとに分割
	var my_xml = new XML("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n</root>");//XMLのrootオブジェクトの生成
	for (var i in my_data) {//行ごと
		my_xml.appendChild(<{my_nodeName}></{my_nodeName}>);//ノードの作成
		var tmp_line = my_data[i].replace(/[\r\n]+$/, '');//行末改行の削除
		var tmp_items = tmp_line.split("\t");//tabで分割
		for (var ii in tmp_items) {//カラムごとの処理
			my_xml[my_nodeName][i].appendChild(<{my_imteName}{ii}>{tmp_items[ii]}</{my_imteName}{ii}>);
		}
	}
	return my_xml;
}

////////////////////////////////////////////XMLコンテンツの修正 
function modify_xml(my_xml, my_ext) {
	for (var i in my_xml.record) {
		my_xml.record[i].item2[0] = my_xml.record[i].item2[0].toString() + "円";//item2の文字列に「円」を加える
		my_xml.record[i].appendChild(<item0img />);//画像用の空要素をひとつ作る
		var tmp_str = my_xml.record[i].item0[0].toString();//item0の文字列を取り出しておく
		my_xml.record[i].item0img[0].@href = "file:///" +  tmp_str + my_ext;//画像のフルパスを生成して属性値にする
	}
	return my_xml;
}

////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////メイン 
function main(){
var my_filepath = chooseF("TSV(タブ区切りテキスト)ファイルを選んでください", ".tsv");
var my_template_indd = chooseF("ひな形のInDesignファイルを選んでください", ".indd");
var my_img_folder = chooseF("画像フォルダを選んでください", "Folder");//

var my_data = read_file(my_filepath);//ファイルの読み込み
var my_xml = tsv2xml(my_data);//TSVからXMLへ変換
my_xml = modify_xml(my_xml, ".psd");//XMLコンテンツの修正

//以下InDesign内の処理
app.open(my_template_indd);//ひな形のドキュメントを開く
for (var i in my_xml.record) {
	var my_doc = app.documents[0];
	var tmp_xml_path = write_file('' + my_img_folder + "/tmp.xml", my_xml.record[i].toXMLString());//レコードをファイルに書き込み##ああ、importXML()はなんでXMLを直接読まないかね?
	my_doc.importXML(tmp_xml_path);
	var tmp_save_path = new File('' + my_template_indd.parent + '/' + my_xml.record[i].item0[0].toString() + '.indd');
	my_doc.save(tmp_save_path);//別名で保存
}
my_doc.close();//ドキュメントを閉じる
File('' + my_img_folder + "/tmp.xml").remove();//tmp.xmlを削除
}
main();

まあ、これだけだったら、データ結合でもいいんだが...<みもふたもない^^

2010-09-21

[][][]TSV(タブ区切りテキスト)からXMLを簡易生成

TSVからXMLを生成するアプリケーションはたくさんありますけれど、JavaScript内で完結させるために書いてみました。メモ。

こんなTSVがあったとします。

f:id:seuzo:20100919140828p:image

JavaScript内からこのファイルを読み込んで、内部的にXMLオブジェクトを生成します(エラー処理の関係でInDesignで使用するのを前提にしています)。

////////////////////////////////////////////エラー終了
function my_error(mess) {
	if (mess !== "") {alert (mess)}
	exit();
}

////////////////////////////////////////////ファイル・フォルダ選択ダイアログ。パス文字列を返す。
function chooseF(my_prompt, my_kind) {
	var my_path = '';
	if (my_kind === "Folder") {
		my_path = my_path + Folder.selectDialog (my_prompt);
	} else {
		var my_regex = new RegExp('\\' + my_kind + '$');
		my_path = my_path + File.openDialog (my_prompt, function(file){return(file.name.match(my_regex) || file instanceof Folder) ? true : false}, false );
	}
	return my_path
}

////////////////////////////////////////////ファイルの内容を読み込んで返す 
function read_file(my_read_file_path) {
	var my_file_obj = new File(my_read_file_path);
	if (!(my_file_obj.exists)) {myerror("ファイルがありません\n" + my_read_file_path)};
	if(my_file_obj.open("r")) {
		var tmp_str = my_file_obj.read();
		my_file_obj.close();
	} else {
		myerror("ファイルが開けません\n" + my_read_file_path);
	}
	 tmp_str = tmp_str.replace(/[\r\n]+$/, '');//最後の行末の改行を削除
	return tmp_str;
}

////////////////////////////////////////////TSVから簡易XMLを生成 
function tsv2xml(my_tsv) {
	//XMLのノード名とアイテム名
	var my_nodeName = "record";//ノード名
	var my_imteName = "item"//item名(追番がつきます)
	
	//XMLの生成
	var my_data = my_tsv.split("\n");//文字列を行ごとに分割
	var my_xml = new XML("<root>\n</root>");//XMLのrootオブジェクトの生成
	for (var i in my_data) {//行ごと
		my_xml.appendChild(<{my_nodeName}></{my_nodeName}>);//ノードの作成
		var tmp_line = my_data[i].replace(/[\r\n]+$/, '');//行末改行の削除
		var tmp_items = tmp_line.split("\t");//tabで分割
		for (var ii in tmp_items) {//カラムごとの処理
			my_xml[my_nodeName][i].appendChild(<{my_imteName}{ii}>{tmp_items[ii]}</{my_imteName}{ii}>);
		}
	}
	return my_xml;
}


////////////////////////////////////////////メイン 
var my_filepath = chooseF("TSV(タブ区切りテキスト)ファイルを選んでください", ".tsv");
var my_data = read_file(my_filepath);//ファイルの読み込み
var my_xml = tsv2xml(my_data);//TSVからXMLへ変換

my_xml.toXMLString();

XMLはこんな感じになっています。あとはお好きに...

f:id:seuzo:20100919140829p:image