Skip to content

Commit 768e9d2

Browse files
committed
Use babel instead of acorn + refactoring
Fixes #6
1 parent 45c4178 commit 768e9d2

File tree

12 files changed

+2233
-255
lines changed

12 files changed

+2233
-255
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

.eslintrc.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module.exports = {
2+
env: {
3+
commonjs: true,
4+
es6: true,
5+
node: true,
6+
},
7+
extends: ['airbnb-base', 'plugin:prettier/recommended'],
8+
globals: {
9+
Atomics: 'readonly',
10+
SharedArrayBuffer: 'readonly',
11+
},
12+
parserOptions: {
13+
ecmaVersion: 2018,
14+
},
15+
rules: {
16+
'prefer-destructuring': 'off',
17+
'prefer-template': 'off',
18+
'no-cond-assign': 'off',
19+
'no-console': 'off',
20+
},
21+
};

.prettierrc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"arrowParens": "always",
3+
"bracketSpacing": true,
4+
"htmlWhitespaceSensitivity": "css",
5+
"insertPragma": false,
6+
"jsxBracketSameLine": false,
7+
"jsxSingleQuote": false,
8+
"printWidth": 80,
9+
"proseWrap": "preserve",
10+
"quoteProps": "as-needed",
11+
"requirePragma": false,
12+
"semi": true,
13+
"singleQuote": true,
14+
"tabWidth": 2,
15+
"trailingComma": "all",
16+
"useTabs": false,
17+
"vueIndentScriptAndStyle": false
18+
}

.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"editor.formatOnSave": true,
3+
"eslint.enable": true,
4+
"editor.defaultFormatter": "esbenp.prettier-vscode"
5+
}

lib/get-partials.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
const fs = require('fs');
2+
const path = require('path');
3+
4+
module.exports = ({ source, template, options }) => {
5+
let match;
6+
const partials = [];
7+
let partialName = '';
8+
let partialContent = '';
9+
if (template !== null && options && options.partialsPath) {
10+
try {
11+
const partialPath = (options.partialsPath.trim() + '/').replace(
12+
'//',
13+
'/',
14+
);
15+
const partialExt = options.partialsExt || '.f7p.html';
16+
17+
const externalPartialRegex = /{{>\s*["']([^"']+)["']\s*}}/gm;
18+
19+
while ((match = externalPartialRegex.exec(template)) !== null) {
20+
// Avoid infinite loops with zero-width matches.
21+
if (match.index === externalPartialRegex.lastIndex) {
22+
externalPartialRegex.lastIndex += 1;
23+
}
24+
25+
partialName = match[1];
26+
27+
try {
28+
const partialFilePath = path.resolve(
29+
partialPath + partialName + partialExt,
30+
);
31+
32+
if (fs.existsSync(partialFilePath)) {
33+
const file = fs.readFileSync(partialFilePath, 'utf8');
34+
35+
this.addDependency(partialFilePath);
36+
37+
if (file.match(/<template[^>]*>/)) {
38+
partialContent = file
39+
.split(/<template[^>]*>/)
40+
.filter((item, index) => index > 0)
41+
.join('<template>')
42+
.split('</template>')
43+
.filter((item, index, arr) => index < arr.length - 1)
44+
.join('</template>')
45+
.replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template')
46+
.replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}')
47+
.replace(/([ \n])<template/g, '$1{{#raw}}<template')
48+
.replace(/\/template>([ \n])/g, '/template>{{/raw}}$1')
49+
.replace(/(\r\n|\n|\r)/gm, '')
50+
.replace(/'/g, "\\'")
51+
.trim();
52+
partials.push(
53+
`Template7.registerPartial('${partialName}', '${partialContent}');`,
54+
);
55+
}
56+
}
57+
} catch (err) {
58+
console.log(err);
59+
}
60+
}
61+
} catch (err) {
62+
console.log(err);
63+
}
64+
}
65+
66+
// Parse inline partials.
67+
const inlinePartialRegex = /<\s*template-partial[^>]*id="([^>]*)"[^>]*>([\s\S]*?)<\s*\/\s*template-partial>/gm;
68+
while ((match = inlinePartialRegex.exec(source)) !== null) {
69+
// Avoid infinite loops with zero-width matches.
70+
if (match.index === inlinePartialRegex.lastIndex) {
71+
inlinePartialRegex.lastIndex += 1;
72+
}
73+
partialName = match[1];
74+
partialContent = match[2]
75+
// Remove newlines.
76+
.replace(/(\r\n|\n|\r)/gm, '')
77+
// Escape single quotes.
78+
.replace(/'/g, "\\'")
79+
// Trim whitespace
80+
.trim();
81+
partials.push(
82+
`Template7.registerPartial('${partialName}', '${partialContent}');`,
83+
);
84+
}
85+
86+
return { partials };
87+
};

lib/get-script.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const transformScript = require('./transform-script');
2+
3+
module.exports = ({
4+
id,
5+
source,
6+
template,
7+
templateType,
8+
style,
9+
styleScoped,
10+
partials,
11+
}) => {
12+
// Parse Script
13+
let script;
14+
if (source.indexOf('<script>') >= 0) {
15+
const scripts = source.split('<script>');
16+
script = scripts[scripts.length - 1].split('</script>')[0].trim();
17+
} else {
18+
script = 'export default {}';
19+
}
20+
if (!script || !script.trim()) script = 'export default {}';
21+
22+
if (!template) {
23+
return script;
24+
}
25+
26+
const code = transformScript({
27+
id,
28+
script,
29+
template,
30+
templateType,
31+
style,
32+
styleScoped,
33+
partials,
34+
});
35+
return code;
36+
};

lib/get-style.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module.exports = ({ id, source }) => {
2+
let style = null;
3+
let styleScoped = false;
4+
5+
if (source.indexOf('<style>') >= 0) {
6+
style = source.split('<style>')[1].split('</style>')[0];
7+
} else if (source.indexOf('<style scoped>') >= 0) {
8+
styleScoped = true;
9+
style = source.split('<style scoped>')[1].split('</style>')[0];
10+
style = style
11+
.split('\n')
12+
.map((line) => {
13+
const trimmedLine = line.trim();
14+
if (trimmedLine.indexOf('@') === 0) return line;
15+
if (line.indexOf('{') >= 0) {
16+
if (line.indexOf('{{this}}') >= 0) {
17+
return line.replace('{{this}}', `[data-f7-${id}]`);
18+
}
19+
return `[data-f7-${id}] ${line.trim()}`;
20+
}
21+
return line;
22+
})
23+
.join('\n');
24+
}
25+
return {
26+
style,
27+
styleScoped,
28+
};
29+
};

lib/get-template.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module.exports = ({ source }) => {
2+
let template = null;
3+
const hasTemplate = source.match(/<template([ ]?)([a-z0-9-]*)>/);
4+
const templateType = hasTemplate[2] || 't7';
5+
if (hasTemplate) {
6+
template = source
7+
.split(/<template[ ]?[a-z0-9-]*>/)
8+
.filter((item, index) => index > 0)
9+
.join('<template>')
10+
.split('</template>')
11+
.filter((item, index, arr) => index < arr.length - 1)
12+
.join('</template>')
13+
.replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template')
14+
.replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}')
15+
.replace(/([ \n])<template/g, '$1{{#raw}}<template')
16+
.replace(/\/template>([ \n])/g, '/template>{{/raw}}$1');
17+
}
18+
return {
19+
template,
20+
templateType,
21+
};
22+
};

0 commit comments

Comments
 (0)