Actualizacion maquina principal
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / postcss-html / lib / html-parser.js
diff --git a/.config/coc/extensions/node_modules/coc-prettier/node_modules/postcss-html/lib/html-parser.js b/.config/coc/extensions/node_modules/coc-prettier/node_modules/postcss-html/lib/html-parser.js
new file mode 100644 (file)
index 0000000..25937ad
--- /dev/null
@@ -0,0 +1,103 @@
+"use strict";
+
+const htmlparser = require("htmlparser2");
+
+function iterateCode (source, onStyleTag, onStyleAttribute) {
+       let currentStyle = null;
+       let level = 0;
+       let isFirstTag = true;
+
+       function onFirstTag () {
+               // Found a tag, the structure is now confirmed as HTML
+               if (isFirstTag) {
+                       if (parser.startIndex <= 0 || !source.slice(0, parser.startIndex).trim()) {
+                               level = 2;
+                       }
+                       isFirstTag = false;
+               }
+       }
+
+       const parser = new htmlparser.Parser({
+               oncomment: onFirstTag,
+               onprocessinginstruction: onFirstTag,
+               onopentag (name, attribute) {
+                       onFirstTag();
+
+                       if (!level) {
+                               level = 1;
+                       }
+
+                       // Test if current tag is a valid <style> tag.
+                       if (name !== "style") {
+                               return;
+                       }
+                       currentStyle = {
+                               attribute,
+                               startIndex: parser.endIndex + 1,
+                       };
+               },
+
+               onclosetag (name) {
+                       if (name !== "style" || currentStyle === null) {
+                               return;
+                       }
+                       currentStyle.content = source.slice(currentStyle.startIndex, parser.startIndex);
+                       onStyleTag(currentStyle);
+                       currentStyle = null;
+               },
+
+               onattribute (name, value) {
+                       if (name !== "style") {
+                               return;
+                       }
+                       onStyleAttribute(value, parser.endIndex);
+               },
+       });
+
+       parser.parseComplete(source);
+
+       return level;
+}
+
+function getSubString (str, regexp) {
+       const subStr = str && regexp.exec(str);
+       if (subStr) {
+               return subStr[1].toLowerCase();
+       }
+}
+
+function getLang (attribute) {
+       return getSubString(attribute.type, /^\w+\/(?:x-)?(\w+)$/i) || getSubString(attribute.lang, /^(\w+)(?:\?.+)?$/) || "css";
+}
+
+function htmlParser (source, opts) {
+       const styles = [];
+       function onStyleTag (style) {
+               const firstNewLine = /^[ \t]*\r?\n/.exec(style.content);
+               style.lang = getLang(style.attribute);
+               if (firstNewLine) {
+                       const offset = firstNewLine[0].length;
+                       style.startIndex += offset;
+                       style.content = style.content.slice(offset);
+               }
+               style.content = style.content.replace(/[ \t]*$/, "");
+               style.isHTMLTag = true;
+               styles.push(style);
+       }
+       function onStyleAttribute (content, index) {
+               styles.push({
+                       content: content,
+                       startIndex: source.indexOf(content, index),
+                       isHTMLAttribute: true,
+               });
+       }
+       const level = iterateCode(source, onStyleTag, onStyleAttribute);
+
+       if (opts.from ? !level : level < 2) {
+               return;
+       }
+
+       return styles;
+}
+
+module.exports = htmlParser;