Generate Variable Definetion with ASDoc

by clockmaker
♥5 | Line 228 | Modified 2015-11-22 20:09:39 | MIT License
play

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&#x9;ユーザー名&#x9;数字&#xa;level&#x9;レベル&#x9;数字&#xa;exp&#x9;経験値&#x9;数字&#xa;hp_point&#x9;現在の体力&#x9;数字&#xa;attack_point&#x9;攻撃力&#x9;数字&#xa;defense_point&#x9;防御力&#x9;数字&#xa;likeAKB48&#x9;AKB48が好きかどうか&#x9;真偽値" />

        <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>