JSON對象與CSS轉(zhuǎn)換


/**
 * 將CSS形式的字符串轉(zhuǎn)換為JSON
 * 
 * @param {css字符串} css 
 */
function css2json(css) {

    // 移除CSS所有注釋
    while ((open = css.indexOf("/*")) !== -1 &&
        (close = css.indexOf("*/")) !== -1) {
        css = css.substring(0, open) + css.substring(close + 2);
    }

    // 初始化返回值
    let json = {};

    while (css.length > 0) {
        // 存儲第一個左/右花括號的下標
        const lbracket = css.indexOf('{');
        const rbracket = css.indexOf('}');

        // 第一步:將聲明轉(zhuǎn)換為Object手幢,如:
        // `font: 'Times New Roman' 1em; color: #ff0000; margin-top: 1em;` 
        //  ==>
        // `{"font": "'Times New Roman' 1em", "color": "#ff0000", "margin-top": "1em"}`
        
        // 輔助方法:將array轉(zhuǎn)為object
        function toObject(array) {
            let ret = {};
            array.forEach(e => {
                const index = e.indexOf(':');
                const property = e.substring(0, index).trim();
                const value = e.substring(index + 1).trim();
                ret[property] = value;
            });
            return ret;
        }

        // 切割聲明塊并移除空白符雹顺,然后放入數(shù)組中
        let declarations = css.substring(lbracket + 1, rbracket)
            .split(";")
            .map(e => e.trim())
            .filter(e => e.length > 0); // 移除所有""空值

        // 轉(zhuǎn)為Object對象
        declarations = toObject(declarations);



        // 第二步:選擇器處理,每個選擇器會與它對應(yīng)的聲明相關(guān)聯(lián),如:
        // `h1, p#bar {color: red}`
        // ==>
        // {"h1": {color: red}, "p#bar": {color: red}}

        let selectors = css.substring(0, lbracket)
            // 以,切割萍悴,并移除空格:`"h1, p#bar, span.foo"` => ["h1", "p#bar", "span.foo"]
            .split(",")
            .map(selector => selector.trim());

        // 迭代賦值
        selectors.forEach(selector => {
            // 若不存在,則先初始化
            if (!json[selector]) json[selector] = {};
            // 賦值到JSON
            Object.keys(declarations).forEach(key => {
                json[selector][key] = declarations[key];
            });
        });

        // 繼續(xù)下個聲明塊
        css = css.slice(rbracket + 1).trim();
    }
    
    // 返回JSON形式的結(jié)果串
    return json;
}

/**
 * 將json對象轉(zhuǎn)換為css
 * 
 * @param {json對象} json 
 */
function json2css(json) {
    return JSON.
    stringify(json,4).
    slice(1, JSON.stringify(json).length - 1).
    replace(new RegExp(',', 'gm'), '  ').
    replace(new RegExp('"', 'gm'), '').
    replace(/:{/ig, "{")
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诈茧,一起剝皮案震驚了整個濱河市泡垃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渠驼,老刑警劉巖蜈块,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡百揭,警方通過查閱死者的電腦和手機爽哎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器一,“玉大人课锌,你說我怎么就攤上這事∑盹酰” “怎么了渺贤?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長请毛。 經(jīng)常有香客問我志鞍,道長,這世上最難降的妖魔是什么获印? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任述雾,我火速辦了婚禮,結(jié)果婚禮上兼丰,老公的妹妹穿的比我還像新娘玻孟。我一直安慰自己,他們只是感情好鳍征,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布黍翎。 她就那樣靜靜地躺著,像睡著了一般艳丛。 火紅的嫁衣襯著肌膚如雪匣掸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天氮双,我揣著相機與錄音碰酝,去河邊找鬼。 笑死戴差,一個胖子當著我的面吹牛送爸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暖释,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼袭厂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了球匕?” 一聲冷哼從身側(cè)響起纹磺,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亮曹,沒想到半個月后橄杨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘症,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年讥珍,在試婚紗的時候發(fā)現(xiàn)自己被綠了历极。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衷佃,死狀恐怖趟卸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氏义,我是刑警寧澤锄列,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惯悠,受9級特大地震影響邻邮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜克婶,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一筒严、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧情萤,春花似錦鸭蛙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睁宰,卻和暖如春肪获,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柒傻。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工孝赫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人红符。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓寒锚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親违孝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容