ウィジェット自動分離css

3031 ワード

に質問


仕事の中でいつも小さいプログラムのページを书く必要があるため、しかし1つのページを书く时通常htmlの构造を书いて更にcssを书くことができて、过程の中で要素の类名を忘れないではいけなくて、2つのファイルの中で时々の切替は切り替えていって、しかし直接行内の様式の书き方を使うならば、どんな悪いことがありますみんなはすべて知っています...そこで私にとって行内スタイルの書き方を採用し、htmlとcssを分離できるようになれば出てくるので、何時間もかけて小さなツールを書きました.https://www.npmjs.com/package/onetotwo.△まだ完備していないので、私の最も基礎的な需要を一時的に満たすしかありません.キックアスたちを忘れて許してください.

紹介する


そこで、ここで解決しなければならない一般的な問題はhtml構造をどのように解析し、私が望んでいるデータ構造に変換するかです.以下は簡易版実装です.主な実装はhtml文字列を1つずつ読み取ることです.<文字がラベル解析として扱われ、>文字に出会うまで、ラベルのstyleとclass属性を解析し始めます.コードは次のとおりです.

const [Node, Tree] = require('./tree');

function parse(html, _callback) {

    //    html         

    html = html.replace(//g, '');

    html = html.replace(/>\s+([^\s$1') {

                const style_regex = /\bstyle\s*=\s*(?:"([^"]*)"|'([^']*)'|([^'">\s]+))/ig;

                const class_regex = /\bclass\s*=\s*(?:"([^"]*)"|'([^']*)'|([^'">\s]+))/ig;

                const class_result = class_regex.exec(__tag_all_content);

                const style_result = style_regex.exec(__tag_all_content);

                const tag_name = __tag_all_content.replace(/\s.*/g, '');

                const class_name = class_result && (class_result[1] || class_result[2] || class_result[3]);

                const style = style_result && (style_result[1] || style_result[2] || style_result[3]);

                if (!__have_root) {

                    __tree.root = { tag: tag_name, parent: null, child: [], hierarchy: 0 };

                    __current_node = __tree.root;

                    __have_root = true;

                }else {

                    let new_node = { tag: tag_name, parent: __current_node, child: [], hierarchy: __stack.length};

                    __current_node.child.push(new_node);

                    __current_node = new_node;

                }

                class_name && (__current_node.class_name = class_name);

                style && (__current_node.style = style);

                __stack.push(__current_node);

                __tag_all_content = '';

                return parse_text;

            }

            __tag_all_content += token;

            return parse_begin_tag;

        }

        //       
        function parse_end_tag(token) {

            if (token === '>') {

                if (__current_node.tag !== __tag) {

                    console.log('\x1b[31m >>>' + 'Wrong closed tag at char ' + __i + '\x1b[39m');

                }

                __tag = '';

                __stack.pop();

                __current_node = __current_node.parent;

                return parse_text;

            }

            __tag += token;

            return parse_end_tag;

        }

        function parse_text(token) {

            if (token === '