aboutsummaryrefslogtreecommitdiff
path: root/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/@vue/component-compiler-utils/lib/templateCompilerModules
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/@vue/component-compiler-utils/lib/templateCompilerModules')
-rw-r--r--node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/assetUrl.ts51
-rw-r--r--node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/srcset.ts66
-rw-r--r--node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/utils.ts54
3 files changed, 171 insertions, 0 deletions
diff --git a/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/assetUrl.ts b/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/assetUrl.ts
new file mode 100644
index 00000000..b74b0596
--- /dev/null
+++ b/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/assetUrl.ts
@@ -0,0 +1,51 @@
+// vue compiler module for transforming `<tag>:<attribute>` to `require`
+
+import { urlToRequire, ASTNode, Attr } from './utils'
+
+export interface AssetURLOptions {
+ [name: string]: string | string[]
+}
+
+const defaultOptions: AssetURLOptions = {
+ video: ['src', 'poster'],
+ source: 'src',
+ img: 'src',
+ image: ['xlink:href', 'href']
+}
+
+export default (userOptions?: AssetURLOptions) => {
+ const options = userOptions
+ ? Object.assign({}, defaultOptions, userOptions)
+ : defaultOptions
+
+ return {
+ postTransformNode: (node: ASTNode) => {
+ transform(node, options)
+ }
+ }
+}
+
+function transform(node: ASTNode, options: AssetURLOptions) {
+ for (const tag in options) {
+ if ((tag === '*' || node.tag === tag) && node.attrs) {
+ const attributes = options[tag]
+ if (typeof attributes === 'string') {
+ node.attrs.some(attr => rewrite(attr, attributes))
+ } else if (Array.isArray(attributes)) {
+ attributes.forEach(item => node.attrs.some(attr => rewrite(attr, item)))
+ }
+ }
+ }
+}
+
+function rewrite(attr: Attr, name: string) {
+ if (attr.name === name) {
+ const value = attr.value
+ // only transform static URLs
+ if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') {
+ attr.value = urlToRequire(value.slice(1, -1))
+ return true
+ }
+ }
+ return false
+}
diff --git a/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/srcset.ts b/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/srcset.ts
new file mode 100644
index 00000000..7cb7544e
--- /dev/null
+++ b/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/srcset.ts
@@ -0,0 +1,66 @@
+// vue compiler module for transforming `img:srcset` to a number of `require`s
+
+import { urlToRequire, ASTNode } from './utils'
+
+interface ImageCandidate {
+ require: string
+ descriptor: string
+}
+
+export default () => ({
+ postTransformNode: (node: ASTNode) => {
+ transform(node)
+ }
+})
+
+// http://w3c.github.io/html/semantics-embedded-content.html#ref-for-image-candidate-string-5
+const escapedSpaceCharacters = /( |\\t|\\n|\\f|\\r)+/g
+
+function transform(node: ASTNode) {
+ const tags = ['img', 'source']
+
+ if (tags.indexOf(node.tag) !== -1 && node.attrs) {
+ node.attrs.forEach(attr => {
+ if (attr.name === 'srcset') {
+ // same logic as in transform-require.js
+ const value = attr.value
+ const isStatic =
+ value.charAt(0) === '"' && value.charAt(value.length - 1) === '"'
+ if (!isStatic) {
+ return
+ }
+
+ const imageCandidates: ImageCandidate[] = value
+ .substr(1, value.length - 2)
+ .split(',')
+ .map(s => {
+ // The attribute value arrives here with all whitespace, except
+ // normal spaces, represented by escape sequences
+ const [url, descriptor] = s
+ .replace(escapedSpaceCharacters, ' ')
+ .trim()
+ .split(' ', 2)
+ return { require: urlToRequire(url), descriptor }
+ })
+
+ // "require(url1)"
+ // "require(url1) 1x"
+ // "require(url1), require(url2)"
+ // "require(url1), require(url2) 2x"
+ // "require(url1) 1x, require(url2)"
+ // "require(url1) 1x, require(url2) 2x"
+ const code = imageCandidates
+ .map(
+ ({ require, descriptor }) =>
+ `${require} + "${descriptor ? ' ' + descriptor : ''}, " + `
+ )
+ .join('')
+ .slice(0, -6)
+ .concat('"')
+ .replace(/ \+ ""$/, '')
+
+ attr.value = code
+ }
+ })
+ }
+}
diff --git a/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/utils.ts b/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/utils.ts
new file mode 100644
index 00000000..893d8a41
--- /dev/null
+++ b/node_modules/@vue/component-compiler-utils/lib/templateCompilerModules/utils.ts
@@ -0,0 +1,54 @@
+export interface Attr {
+ name: string
+ value: string
+}
+
+export interface ASTNode {
+ tag: string
+ attrs: Attr[]
+}
+
+import { UrlWithStringQuery, parse as uriParse } from 'url'
+
+export function urlToRequire(url: string): string {
+ const returnValue = `"${url}"`
+ // same logic as in transform-require.js
+ const firstChar = url.charAt(0)
+ if (firstChar === '.' || firstChar === '~' || firstChar === '@') {
+ if (firstChar === '~') {
+ const secondChar = url.charAt(1)
+ url = url.slice(secondChar === '/' ? 2 : 1)
+ }
+
+ const uriParts = parseUriParts(url)
+
+ if (!uriParts.hash) {
+ return `require("${url}")`
+ } else {
+ // support uri fragment case by excluding it from
+ // the require and instead appending it as string;
+ // assuming that the path part is sufficient according to
+ // the above caseing(t.i. no protocol-auth-host parts expected)
+ return `require("${uriParts.path}") + "${uriParts.hash}"`
+ }
+ }
+ return returnValue
+}
+
+/**
+ * vuejs/component-compiler-utils#22 Support uri fragment in transformed require
+ * @param urlString an url as a string
+ */
+function parseUriParts(urlString: string): UrlWithStringQuery {
+ // initialize return value
+ const returnValue: UrlWithStringQuery = uriParse('')
+ if (urlString) {
+ // A TypeError is thrown if urlString is not a string
+ // @see https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
+ if ('string' === typeof urlString) {
+ // check is an uri
+ return uriParse(urlString) // take apart the uri
+ }
+ }
+ return returnValue
+}