Generate Variable Definetion with ASDoc
♥5 |
Line 228 |
Modified 2015-11-22 20:09:39 |
MIT License
archived:2017-03-08 03:47:48
ActionScript3 source code
/**
* Copyright clockmaker ( http://wonderfl.net/user/clockmaker )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/4W9O
*/
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
<!-- =====================================================
仕様書から自動的にASDocコメントと変数定義を作るジェネレーター。
バリューオブジェクトを作るときに便利!
===================================================== -->
<fx:Script>
<![CDATA[
import mx.controls.*;
/**
* 整形メソッド
*/
private function doArrange():void
{
// 改行コードを統一する
var str:String = orijinal.text;
str = str.split("\n\r").join("\n").split("\r").join("\n")
var csv_str:String = str;
var csv_ary:Array = CsvToArray_spl(csv_str, "\t"); // CSV→Array
var temp:String = "";
var tabStr = "";
for (var j:int = 0; j < tabs.value; j++)
{
tabStr += "\t";
}
for (var i:int = 0; i < csv_ary.length; i++)
{
var comment:String = tabStr + "/** " + csv_ary[i][1] + "です。 */";
var variable:String = tabStr + "public var " + csv_ary[i][0];
var type:String;
if (csv_ary[i][2] == "文字列")
type = ":String;";
else if (csv_ary[i][2] == "数字")
type = ":Number;";
else if (csv_ary[i][2] == "日付")
type = ":Data;";
else if (csv_ary[i][2] == "真偽値")
type = ":Boolean;";
else
type = ":" + csv_ary[i][2] + ";";
temp += comment + "\n";
temp += variable;
temp += type;
temp += i < csv_ary.length - 1 ? "\n\n" : "\n";
}
output.text = temp;
}
private function copy():void
{
System.setClipboard(output.text);
Alert.show("Copied Output Script")
}
// 静的メソッド
/** CSV の列の区切り記号(1文字のみ対応) */
public static var DEFAULT_SPLITTER:String = ",";
/** 行の区切り記号は \n で固定 */
public static const LINE_SPLLITER:String = "\n";
/** CSV を配列に変換する関数
* @param csv_str CSV文字列
* @return 二次元配列変数
*/
public function CsvToArray(csv_str:String):Array {
return CsvToArray_spl(csv_str, DEFAULT_SPLITTER);
}
/**
* TSVを配列に変換する関数
* @param tsv_str TSV文字列
* @return 二次元配列変数
*/
public function TsvToArray(tsv_str:String):Array {
return CsvToArray_spl(tsv_str, "\t");
}
/** 任意の区切り記号のCSVを配列に変換する関数 */
public function CsvToArray_spl(csv_str:String, splitter:String):Array {
return split(csv_str, splitter);
}
public static function replaceStr(str:String, a:String, b:String):String {
var o:Array = str.split(a);
return o.join(b);
}
/**
* 二次元配列をCSV形式に変換する
* @param csv_ary 配列変数
* @param splitter 区切り記号
* @param use_escape 必ず ダブルコーテーションで囲う場合
* @return CSV形式の文字列
*/
public static function ArrayToCsv(csv_ary:Array, splitter:String,
use_escape:Boolean = false):String {
var res:String = "";
for (var row:int = 0; row < csv_ary.length; row++) {
var cols:Array = csv_ary[row];
for (var col:int = 0; col < cols.length; col++) {
var cell:String = cols[col];
if (use_escape || hasEscapeChar(cell, splitter)) {
cell = escapeCell(cell);
}
res += cell + splitter;
}
if (cols.length > 0) res = res.substr(0, res.length -1);
res += LINE_SPLLITER;
}
if (csv_ary.length > 0) res = res.substr(0, res.length - 1);
return res;
}
/**
* 文字列を ".." で括る必要があるかチェックする
*/
public static function hasEscapeChar(cell:String, splitter:String):Boolean {
if (cell.indexOf('"') >= 0) return true;
if (cell.indexOf("\n") >= 0) return true;
if (cell.indexOf("\r") >= 0) return true;
if (cell.indexOf("\t") >= 0) return true;
if (cell.indexOf(" ") >= 0) return true;
if (cell.indexOf(splitter) >= 0) return true;
return false;
}
/**
* CSVのセル(文字列)を ".." で括ってエスケープする
*/
public static function escapeCell(cell:String):String {
cell = replaceStr(cell, '"', '""');
cell = '"' + cell + '"';
return cell;
}
// ------------------
// CSVUtils クラス
private var csv_str:String;
private var splitter:String;
private var index:int;
public function split(csv_str:String, splitter:String):Array {
// 改行を統一する
csv_str = replaceStr(csv_str, "\r\n", LINE_SPLLITER);
csv_str = replaceStr(csv_str, "\r", LINE_SPLLITER);
//
this.csv_str = csv_str;
this.splitter = splitter;
//
return splitLoop();
}
private function splitLoop():Array {
var result:Array = [];
while (csv_str.length > 0) {
var cols:Array = getCols();
result.push(cols);
}
return result;
}
private function getCols():Array {
var cols:Array = [];
index = 0;
while (index < csv_str.length) {
var c:String = csv_str.charAt(index);
var col:String;
if (c == LINE_SPLLITER) {
index++;
break;
}
if (c == '"') {
col = getColStr();
}
else {
col = getColSimple();
}
skipSpace();
cols.push(col);
}
// 切り取る
csv_str = csv_str.substr(index);
return cols;
}
private function getColSimple():String {
var col:String = "";
while (index < csv_str.length) {
if (csv_str.substr(index, 2) == '""') {
col += '"';
index += 2;
continue;
}
var c:String = csv_str.charAt(index);
if (c == splitter) {
index++;
break;
}
if (c == LINE_SPLLITER) {
break;
}
col += c;
index++;
}
return col;
}
private function getColStr():String {
// "str" の文字列
index++; // skip '"'
var col:String = "";
while (index < csv_str.length) {
if (csv_str.substr(index, 2) == '""') {
col += '"';
index += 2;
continue;
}
var c:String = csv_str.charAt(index);
if (c == '"') { // 終端 '"' の可能性
index++;
skipSpace();
// 終端のはず、もし違えば、壊れた形式の可能性があるが継続する
if (csv_str.charAt(index) == ",") {
index++;
}
break;
}
col += c;
index++;
}
return col;
}
private function skipSpace():void {
if (csv_str.charAt(index) == " ") {
index++;
}
}
]]>
</fx:Script>
<fx:Style>
@namespace s "library://ns.adobe.com/flex/spark";
s|TextArea {
fontFamily: Courier;
}
</fx:Style>
<s:Panel title="Generate Variable definition with ASDoc"
width="100%"
height="100%">
<s:layout>
<s:VerticalLayout horizontalAlign="center"
paddingBottom="10"
paddingLeft="10"
paddingRight="10"
paddingTop="10"
gap="10" />
</s:layout>
<s:TextArea id="orijinal"
width="100%"
height="100%"
focusIn="orijinal.selectAll()"
text="name	ユーザー名	数字
level	レベル	数字
exp	経験値	数字
hp_point	現在の体力	数字
attack_point	攻撃力	数字
defense_point	防御力	数字
likeAKB48	AKB48が好きかどうか	真偽値" />
<s:HGroup>
<s:VGroup>
<s:Label text="Tabs" />
<s:NumericStepper id="tabs"
value="2"
minimum="0" />
</s:VGroup>
</s:HGroup>
<s:Button click="doArrange()"
label="Start" />
<s:TextArea id="output"
width="100%"
height="100%"
focusIn="output.selectAll()" />
<s:Button click="copy()"
label="Copy Clipboard" />
</s:Panel>
</s:Application>