イラストレーターで使われている色とフォントの一覧を抽出するjsx

AIに任せたらかんたんだった、JSX関係独自のルールとかだるいのでこのあたりは便利

(function() {
    if (app.documents.length === 0) {
        alert("ドキュメントが開かれていません。");
        return;
    }

    var doc = app.activeDocument;
    var output = [];
    output.push("// ========================================");
    output.push("// Generated from Illustrator: " + doc.name);
    output.push("// Date: " + new Date().toLocaleString());
    output.push("// ========================================\n");

    // --- 補助関数 (16進数変換) ---
    function toHex(n) {
        var hex = Math.max(0, Math.min(255, Math.round(n))).toString(16);
        return hex.length === 1 ? "0" + hex : hex;
    }

    function cmykToHex(c, m, y, k) {
        var r = 255 * (1 - c/100) * (1 - k/100);
        var g = 255 * (1 - m/100) * (1 - k/100);
        var b = 255 * (1 - y/100) * (1 - k/100);
        return "#" + toHex(r) + toHex(g) + toHex(b);
    }

    // --- 1. カラー抽出セクション ---
    output.push("// COLORS");
    var swatches = doc.swatches;
    var colorCounts = {};

    for (var i = 0; i < swatches.length; i++) {
        var sw = swatches[i];
        if (sw.name.indexOf("[") !== -1) continue;

        var hexVal = "";
        var baseLabel = "color";

        try {
            var color = sw.color;
            if (color.typename === "RGBColor") {
                hexVal = "#" + toHex(color.red) + toHex(color.green) + toHex(color.blue);
                if (color.red > color.green && color.red > color.blue) baseLabel = "red";
                else if (color.green > color.red && color.green > color.blue) baseLabel = "green";
                else if (color.blue > color.red && color.blue > color.green) baseLabel = "blue";
                else if (color.red === color.green && color.red === color.blue) baseLabel = "gray";
            } 
            else if (color.typename === "CMYKColor") {
                hexVal = cmykToHex(color.cyan, color.magenta, color.yellow, color.black);
                var c = color.cyan, m = color.magenta, y = color.yellow, k = color.black;
                if (k > 50) baseLabel = "black";
                else if (c > m && c > y) baseLabel = "cyan";
                else if (m > c && m > y) baseLabel = "magenta";
                else if (y > c && y > m) baseLabel = "yellow";
            }

            if (hexVal !== "") {
                if (!colorCounts[baseLabel]) colorCounts[baseLabel] = 0;
                colorCounts[baseLabel]++;
                output.push("$" + baseLabel + "-" + colorCounts[baseLabel] + ": " + hexVal);
            }
        } catch (e) {}
    }

    // --- 2. フォント抽出セクション ---
    output.push("\n// FONTS");
    var textFrames = doc.textFrames;
    var fontMap = {};
    var fontIndex = 1;

    for (var j = 0; j < textFrames.length; j++) {
        try {
            var ranges = textFrames[j].textRanges;
            for (var k = 0; k < ranges.length; k++) {
                var fontName = ranges[k].characterAttributes.textFont.name;
                if (!fontMap[fontName]) {
                    fontMap[fontName] = true;
                    var varName = fontName.replace(/[\s\.]+/g, "-").toLowerCase();
                    output.push("$font-family-" + fontIndex + ": \"" + fontName + "\" // " + varName);
                    fontIndex++;
                }
            }
        } catch (e) {}
    }

    // --- 3. ファイル出力 ---
    var file = new File(Folder.desktop + "/_style-variables.sass");
    file.encoding = "UTF-8";
    file.open("w");
    file.write(output.join("\n"));
    file.close();

    alert("デスクトップに '_style-variables.sass' を出力しました。");
})();