mirror of
https://github.com/jaywcjlove/awesome-mac.git
synced 2026-04-11 02:11:46 +08:00
chore: update devDependencies.
This commit is contained in:
parent
a6d062f247
commit
bb961d8538
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
@ -7,27 +7,17 @@ jobs:
|
|||||||
build-deploy:
|
build-deploy:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-18.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
|
||||||
- name: Setup Node
|
- run: npm install
|
||||||
uses: actions/setup-node@v1
|
- run: npm run create:html
|
||||||
with:
|
- run: npm run create:ast
|
||||||
node-version: '10.x'
|
|
||||||
|
|
||||||
# - name: Cache dependencies
|
- name: Deploy
|
||||||
# uses: actions/cache@v1
|
uses: peaceiris/actions-gh-pages@v3
|
||||||
# with:
|
with:
|
||||||
# path: ~/.npm
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
# key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
publish_dir: ./dist
|
||||||
# restore-keys: |
|
|
||||||
# ${{ runner.os }}-node-
|
|
||||||
|
|
||||||
- run: npm install
|
|
||||||
- run: npm run start
|
|
||||||
|
|
||||||
- name: Build and Deploy
|
|
||||||
uses: peaceiris/actions-gh-pages@v2.5.0
|
|
||||||
env:
|
|
||||||
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
|
||||||
PUBLISH_BRANCH: gh-pages
|
|
||||||
PUBLISH_DIR: ./dist
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
dist
|
dist/*.html
|
||||||
|
dist/*.json
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
Awesome Mac
|
Awesome Mac
|
||||||
----
|
----
|
||||||
|
<!--rehype:style=font-size: 38px; border-bottom: 0; padding-bottom: 20px; padding-top: 26px;-->
|
||||||
|
|
||||||
[](https://github.com/sindresorhus/awesome) [](README.md) [](https://gitter.im/awesome-mac/en?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) [](https://segmentfault.com/g/1570000010622746) [](http://weibo.com/pc175) [](#backers) [](#sponsors)
|
[](https://github.com/sindresorhus/awesome) [](README.md) [](https://gitter.im/awesome-mac/en?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) [](https://segmentfault.com/g/1570000010622746) [](http://weibo.com/pc175) [](#backers) [](#sponsors)
|
||||||
|
|
||||||
@ -77,7 +78,7 @@ Awesome Mac
|
|||||||
- [Sponsors](#sponsors)
|
- [Sponsors](#sponsors)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
|
|
||||||
|
<!--start-->
|
||||||
|
|
||||||
## 开发者工具
|
## 开发者工具
|
||||||
|
|
||||||
@ -968,6 +969,8 @@ Awesome Mac
|
|||||||
* 威锋网:~~`https://bbs.feng.com/forum.php?mod=forumdisplay&fid=19&page=`~~
|
* 威锋网:~~`https://bbs.feng.com/forum.php?mod=forumdisplay&fid=19&page=`~~
|
||||||
* MAC萌新网:~~`https://www.macxin.com`~~
|
* MAC萌新网:~~`https://www.macxin.com`~~
|
||||||
|
|
||||||
|
<!--end-->
|
||||||
|
|
||||||
**[⬆ 返回顶部](#目录)**
|
**[⬆ 返回顶部](#目录)**
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
13
README.md
13
README.md
@ -1,5 +1,6 @@
|
|||||||
Awesome Mac
|
Awesome Mac
|
||||||
----
|
----
|
||||||
|
<!--rehype:style=font-size: 38px; border-bottom: 0; padding-bottom: 20px; padding-top: 26px;-->
|
||||||
|
|
||||||
[](https://github.com/sindresorhus/awesome) [](README-zh.md) [](https://gitter.im/awesome-mac/en?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge)
|
[](https://github.com/sindresorhus/awesome) [](README-zh.md) [](https://gitter.im/awesome-mac/en?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge)
|
||||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fjaywcjlove%2Fawesome-mac?ref=badge_shield)
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fjaywcjlove%2Fawesome-mac?ref=badge_shield)
|
||||||
@ -93,6 +94,8 @@ Any comments, suggestions? [Let us know!](https://github.com/jaywcjlove/awesome-
|
|||||||
- [Sponsors](#sponsors)
|
- [Sponsors](#sponsors)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
|
|
||||||
|
<!--start-->
|
||||||
|
|
||||||
## Reading and Writing Tools
|
## Reading and Writing Tools
|
||||||
|
|
||||||
*Applications to edit text, I suggest the open-source editors*
|
*Applications to edit text, I suggest the open-source editors*
|
||||||
@ -1001,10 +1004,7 @@ If you come across websites offering pirated software or cracks, please post [HE
|
|||||||
|
|
||||||
**[⬆ back to top](#contents)**
|
**[⬆ back to top](#contents)**
|
||||||
|
|
||||||
[OSS Icon]: https://jaywcjlove.github.io/sb/ico/min-oss.svg "Open Source Software"
|
<!--end-->
|
||||||
[Freeware Icon]: https://jaywcjlove.github.io/sb/ico/min-free.svg "Freeware"
|
|
||||||
[app-store Icon]: https://jaywcjlove.github.io/sb/ico/min-app-store.svg "App Store Software"
|
|
||||||
[awesome-list Icon]: https://jaywcjlove.github.io/sb/ico/min-awesome.svg "Awesome List"
|
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
@ -1031,3 +1031,8 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
|
|||||||
[](https://creativecommons.org/licenses/by/4.0/)
|
[](https://creativecommons.org/licenses/by/4.0/)
|
||||||
|
|
||||||
This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).
|
This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).
|
||||||
|
|
||||||
|
[OSS Icon]: https://jaywcjlove.github.io/sb/ico/min-oss.svg "Open Source Software"
|
||||||
|
[Freeware Icon]: https://jaywcjlove.github.io/sb/ico/min-free.svg "Freeware"
|
||||||
|
[app-store Icon]: https://jaywcjlove.github.io/sb/ico/min-app-store.svg "App Store Software"
|
||||||
|
[awesome-list Icon]: https://jaywcjlove.github.io/sb/ico/min-awesome.svg "Awesome List"
|
||||||
|
|||||||
135
build/ast.mjs
Normal file
135
build/ast.mjs
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
import { toVFile } from 'to-vfile'
|
||||||
|
import remark from 'remark'
|
||||||
|
import gfm from 'remark-gfm'
|
||||||
|
import FS from 'fs-extra'
|
||||||
|
|
||||||
|
const getHeadingText = (arr = [], title = '') => {
|
||||||
|
arr.forEach(child => {
|
||||||
|
title += child.value
|
||||||
|
if (child.children && Array.isArray(child.children)) {
|
||||||
|
title += getHeadingText(child.children, title)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
const getSoftwareName = (obj, result = { title: '' }) => {
|
||||||
|
if (obj.value) {
|
||||||
|
result.title += obj.value
|
||||||
|
}
|
||||||
|
if (obj.url) {
|
||||||
|
result.url = obj.url
|
||||||
|
}
|
||||||
|
if (obj.type === 'delete') {
|
||||||
|
result.delete = true
|
||||||
|
}
|
||||||
|
if (obj.children && Array.isArray(obj.children)) {
|
||||||
|
obj.children.forEach(child => {
|
||||||
|
result = getSoftwareName(child, result)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
const getIconDetail = (data, url = '') => {
|
||||||
|
if (data.type === 'imageReference' && data.identifier && /^(freeware\s+icon|oss\s+icon|app-store\s+icon|awesome-list\s+icon)/.test(data.identifier.toLocaleLowerCase())) {
|
||||||
|
let type = ''
|
||||||
|
if (/^(freeware\s+icon)/.test(data.identifier.toLocaleLowerCase())) {
|
||||||
|
type = 'freeware'
|
||||||
|
}
|
||||||
|
if (/^(oss\s+icon)/.test(data.identifier.toLocaleLowerCase())) {
|
||||||
|
type = 'oss'
|
||||||
|
}
|
||||||
|
if (/^(app-store\s+icon)/.test(data.identifier.toLocaleLowerCase())) {
|
||||||
|
type = 'app-store'
|
||||||
|
}
|
||||||
|
if (/^(awesome-list\s+icon)/.test(data.identifier.toLocaleLowerCase())) {
|
||||||
|
type = 'awesome-list'
|
||||||
|
}
|
||||||
|
return { type, url }
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ```markdown
|
||||||
|
* * [Atom](https://atom.io) - xxxxxxx. [![Open-Source Software][OSS Icon]](https://xxx) ![Freeware][Freeware Icon] [![Awesome List][awesome-list Icon]](https://xxx)
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
const getMarkIcons = (arr = [], parent = {}) => {
|
||||||
|
let mark = { icons: [] }
|
||||||
|
if (arr && Array.isArray(arr) && arr[1] && arr[1].type === 'text' && /^([\s]+)?-\s/.test(arr[1].value)) {
|
||||||
|
mark = { ...mark, ...getSoftwareName(arr[0]) }
|
||||||
|
arr = arr.filter(child => {
|
||||||
|
const data = getIconDetail(child)
|
||||||
|
if (data) {
|
||||||
|
mark.icons.push(data)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (child.type === 'link' && child.children && Array.isArray(child.children)) {
|
||||||
|
const childArr = child.children.filter(d => getIconDetail(d))
|
||||||
|
if (childArr.length > 0) {
|
||||||
|
childArr.forEach((item) => {
|
||||||
|
mark.icons.push(getIconDetail(item, child.url))
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (child.type === 'text' && child.value.replace(/\s/g, '') === '') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return { children: [...arr], mark: { ...mark } }
|
||||||
|
}
|
||||||
|
|
||||||
|
const getMdToAST = (data = [], parent = {}) => {
|
||||||
|
data = data.map((child) => {
|
||||||
|
if (child.position) {
|
||||||
|
delete child.position
|
||||||
|
if (child.type === 'listItem') {
|
||||||
|
delete child.checked
|
||||||
|
delete child.spread;
|
||||||
|
}
|
||||||
|
if (child.type === 'paragraph' && parent.type === 'listItem') {
|
||||||
|
const result = getMarkIcons(child.children, child)
|
||||||
|
child = { ...child, ...result }
|
||||||
|
}
|
||||||
|
if (child.type === 'heading') {
|
||||||
|
child.value = getHeadingText(child.children)
|
||||||
|
delete child.children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (child.children && Array.isArray(child.children)) {
|
||||||
|
child.children = getMdToAST(child.children, child)
|
||||||
|
}
|
||||||
|
return child
|
||||||
|
})
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
remark()
|
||||||
|
.use(gfm)
|
||||||
|
.use(() => (tree) => {
|
||||||
|
const startIndex = tree.children.findIndex(item => item.type === 'html' && /<!--start-->/.test(item.value))
|
||||||
|
const endIndex = tree.children.findIndex(item => item.type === 'html' && /<!--end-->/.test(item.value))
|
||||||
|
const data = tree.children.slice(startIndex + 1, endIndex)
|
||||||
|
const dataAST = getMdToAST([...data])
|
||||||
|
FS.outputJsonSync('./dist/awesome-mac.json', dataAST)
|
||||||
|
console.log(' create file: ./dist/awesome-mac.json')
|
||||||
|
})
|
||||||
|
.processSync(toVFile.readSync('README.md'))
|
||||||
|
|
||||||
|
|
||||||
|
remark()
|
||||||
|
.use(gfm)
|
||||||
|
.use(() => (tree) => {
|
||||||
|
const startIndex = tree.children.findIndex(item => item.type === 'html' && /<!--start-->/.test(item.value))
|
||||||
|
const endIndex = tree.children.findIndex(item => item.type === 'html' && /<!--end-->/.test(item.value))
|
||||||
|
const data = tree.children.slice(startIndex + 1, endIndex)
|
||||||
|
const dataAST = getMdToAST([...data])
|
||||||
|
FS.outputJsonSync('./dist/awesome-mac.zh.json', dataAST)
|
||||||
|
console.log(' create file: ./dist/awesome-mac.zh.json')
|
||||||
|
})
|
||||||
|
.processSync(toVFile.readSync('README-zh.md'))
|
||||||
278
build/build.js
278
build/build.js
@ -1,278 +0,0 @@
|
|||||||
const path = require('path');
|
|
||||||
const ejs = require('ejs');
|
|
||||||
const FS = require('fs-extra');
|
|
||||||
const marked = require('marked');
|
|
||||||
const loading = require('loading-cli');
|
|
||||||
const ghpages = require('gh-pages');
|
|
||||||
const minify = require("html-minifier").minify;
|
|
||||||
const markdownParse = require("@textlint/markdown-to-ast").parse;
|
|
||||||
const colors = require('colors-cli/toxic');
|
|
||||||
const pkg = require('../package.json');
|
|
||||||
|
|
||||||
const deployDir = path.resolve(process.cwd(), 'dist');
|
|
||||||
const templatePath = path.resolve(process.cwd(), 'build', 'template.ejs');
|
|
||||||
const faviconPath = path.resolve(process.cwd(), 'build', 'favicon.ico');
|
|
||||||
|
|
||||||
mkdirs(deployDir)
|
|
||||||
.then(dir => emptyDir(dir))
|
|
||||||
.then(dir => markdownToAst(path.resolve(process.cwd(), 'README.md')))
|
|
||||||
// Output `awesome-mac-data.json` file, https://github.com/jaywcjlove/amac
|
|
||||||
.then(ast => outputFile(path.resolve(deployDir, 'awesome-mac-data.json'), JSON.stringify(ast)))
|
|
||||||
.then(dir => MarkedToHTMLOutputFile(
|
|
||||||
path.resolve(process.cwd(), 'README.md'),
|
|
||||||
path.resolve(deployDir, 'index.html')
|
|
||||||
))
|
|
||||||
.then(dir => MarkedToHTMLOutputFile(
|
|
||||||
path.resolve(process.cwd(), 'README-zh.md'),
|
|
||||||
path.resolve(deployDir, 'index.zh.html')
|
|
||||||
))
|
|
||||||
.then(dir => MarkedToHTMLOutputFile(
|
|
||||||
path.resolve(process.cwd(), 'editor-plugin.md'),
|
|
||||||
path.resolve(deployDir, 'editor-plugin.html')
|
|
||||||
))
|
|
||||||
.then(dir => MarkedToHTMLOutputFile(
|
|
||||||
path.resolve(process.cwd(), 'editor-plugin-zh.md'),
|
|
||||||
path.resolve(deployDir, 'editor-plugin-zh.html')
|
|
||||||
))
|
|
||||||
.then(() => FS.copySync(faviconPath, path.resolve(deployDir, 'favicon.ico') ))
|
|
||||||
// .then(() => PushGhpage(deployDir, {
|
|
||||||
// repo: 'git@github.com:jaywcjlove/awesome-mac.git',
|
|
||||||
// message: `MacOSX software list update, Compiler generation page. ${new Date()}`
|
|
||||||
// }))
|
|
||||||
// .then(() => console.log(`\n Push Success!!\n`.green))
|
|
||||||
.catch((err) => {
|
|
||||||
if (err && err.message) {
|
|
||||||
console.log(`\n ERROR :> ${err.message.red_bt}\n`)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a directory
|
|
||||||
* @param {String} dir
|
|
||||||
*/
|
|
||||||
function mkdirs(dir) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
FS.ensureDir(dir, err => {
|
|
||||||
err ? reject(err) : resolve(dir);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Empty a directory
|
|
||||||
* @param {String} dir
|
|
||||||
*/
|
|
||||||
function emptyDir(dir) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
FS.emptyDir(dir, err => {
|
|
||||||
err ? reject(err) : resolve(dir);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Output file.
|
|
||||||
* @param {String} filePath
|
|
||||||
* @param {String} html
|
|
||||||
*/
|
|
||||||
function outputFile(filePath, html) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
FS.outputFileSync(filePath, minify(html, {
|
|
||||||
minifyCSS: true,
|
|
||||||
minifyJS: true,
|
|
||||||
collapseWhitespace: true,
|
|
||||||
conservativeCollapse: true
|
|
||||||
}));
|
|
||||||
resolve();
|
|
||||||
} catch (err) {
|
|
||||||
reject(err)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Markdown to HTML
|
|
||||||
* @param {String} file Markdown path
|
|
||||||
*/
|
|
||||||
function MarkedToHTML(file) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
const markdownStr = FS.readFileSync(file);
|
|
||||||
const renderer = new marked.Renderer();
|
|
||||||
renderer.heading = function (text, level) {
|
|
||||||
text = text.replace(/<+.*>/, '');
|
|
||||||
if (/[\u4E00-\u9FA5]/i.test(text)) {
|
|
||||||
return '<h' + level + ' id="' + text.toLowerCase() + '">' + text + '</h' + level + '>';
|
|
||||||
}
|
|
||||||
const escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
|
|
||||||
return '<h' + level + ' id="' + escapedText + '">' + text + '</h' + level + '>';
|
|
||||||
}
|
|
||||||
marked.setOptions({ renderer });
|
|
||||||
resolve(marked(markdownStr.toString()));
|
|
||||||
} catch (err) {
|
|
||||||
reject(err)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace 'README.md' => 'index.html'
|
|
||||||
* @param {String} html HTML code
|
|
||||||
* @param {Object} options
|
|
||||||
*/
|
|
||||||
function MDhrefToPath(html, options = {}) {
|
|
||||||
const reg = new RegExp('<*href="(.*?)"*>', 'ig');
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
const htmlResult = html.replace(reg, (a, st) => {
|
|
||||||
Object.keys(options).forEach((key) => {
|
|
||||||
if (st.indexOf(key) > -1) {
|
|
||||||
a = a.replace(st, options[key]);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return a
|
|
||||||
});
|
|
||||||
resolve(htmlResult);
|
|
||||||
} catch (err) {
|
|
||||||
reject(err)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function ejsRenderFile(ejsPath, data, options = {}) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
ejs.renderFile(ejsPath, data, options, (err, str) => {
|
|
||||||
err ? reject(err) : resolve(str);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function MarkedToHTMLOutputFile(mdpath, toPath) {
|
|
||||||
return MarkedToHTML(mdpath)
|
|
||||||
.then(html => MDhrefToPath(html, {
|
|
||||||
'README.md': 'index.html',
|
|
||||||
'README-zh.md': 'index.zh.html',
|
|
||||||
'editor-plugin.md': 'editor-plugin.html',
|
|
||||||
'editor-plugin-zh.md': 'editor-plugin-zh.html',
|
|
||||||
}))
|
|
||||||
.then(html => ejsRenderFile(
|
|
||||||
templatePath,
|
|
||||||
{
|
|
||||||
lang: toPath.indexOf('zh.html') > 0 ? 'zh' : 'en',
|
|
||||||
html
|
|
||||||
}
|
|
||||||
))
|
|
||||||
.then(html => outputFile(toPath, html))
|
|
||||||
.then(() => {
|
|
||||||
console.log(`${'Success:'.green} ${mdpath.replace(process.cwd(), '').blue} -> ${toPath.replace(process.cwd(), '').blue}`)
|
|
||||||
return toPath;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function PushGhpage(dirPath, options = {}) {
|
|
||||||
if (!options.branch) options.branch = 'gh-pages';
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const load = loading(' Pushing code!!');
|
|
||||||
load.start();
|
|
||||||
return ghpages.publish(dirPath, options, (err) => {
|
|
||||||
load.stop();
|
|
||||||
err ? reject(err) : resolve(str);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function arrayToJsonAst(arr, depth = 2, result = []) {
|
|
||||||
const getArrayItems = (items) => {
|
|
||||||
const itemsLink = [];
|
|
||||||
for (let a = 0; a < items.length; a += 1) {
|
|
||||||
if (a !== 0 && items[a].type == 'Header' && items[a].depth <= depth) {
|
|
||||||
break;
|
|
||||||
} else if (a !== 0 && items[a].type == 'List') {
|
|
||||||
items[a].children.forEach((child) => {
|
|
||||||
if (child.children[0] && child.children[0].children.length > 0) {
|
|
||||||
const itemChild = {};
|
|
||||||
child.children[0].children.forEach((_item, idx) => {
|
|
||||||
if (idx === 0 && _item.type === 'Link') {
|
|
||||||
itemChild.link = _item.url;
|
|
||||||
itemChild.name = '';
|
|
||||||
if (_item.children && _item.children.length > 0) {
|
|
||||||
itemChild.name = _item.children[0].value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (idx === 1 && _item.type === 'Str') {
|
|
||||||
itemChild.des = _item.value.replace(/^(-|\s-\s|\s-|-\s)/g, '');
|
|
||||||
}
|
|
||||||
if (idx > 1 && /(Link|imageReference)/.test(_item.type)) {
|
|
||||||
if (!itemChild.tag) itemChild.tag = [];
|
|
||||||
if (/(awesome-list\ icon|app-store\ icon|freeware\ icon|oss\ icon)/.test(_item.identifier)) {
|
|
||||||
itemChild.tag.push({
|
|
||||||
alt: _item.alt,
|
|
||||||
identifier: _item.identifier,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if (/(Link)/.test(_item.type) && _item.children && _item.children[0] && /(awesome-list\ icon|app-store\ icon|freeware\ icon|oss\ icon)/.test(_item.children[0].identifier)) {
|
|
||||||
itemChild.tag.push({
|
|
||||||
url: _item.url,
|
|
||||||
alt: _item.children[0].alt,
|
|
||||||
identifier: _item.children[0].identifier,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (itemChild.des) itemsLink.push(itemChild);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return itemsLink;
|
|
||||||
}
|
|
||||||
|
|
||||||
arr.forEach((item, idx) => {
|
|
||||||
if (item.type == 'Header' && item.depth === depth) {
|
|
||||||
const title = item.children.filter(_item => _item.type === 'Str')[0];
|
|
||||||
let des = '';
|
|
||||||
if (arr[idx + 1] && arr[idx + 1].type === 'Paragraph') {
|
|
||||||
des = arr[idx + 1].raw;
|
|
||||||
}
|
|
||||||
const props = {
|
|
||||||
title: title.value,
|
|
||||||
des,
|
|
||||||
key: title.value.toLowerCase().replace(/\s/g, '-'),
|
|
||||||
items: getArrayItems(arr.slice(idx, arr.length)),
|
|
||||||
};
|
|
||||||
if (props.items && props.items.length > 0) {
|
|
||||||
result.push(props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (depth <= 6 && result.length === 0) {
|
|
||||||
result = arrayToJsonAst(arr, depth + 1);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Markdown to JSON
|
|
||||||
* @param {String} markdownPath
|
|
||||||
*/
|
|
||||||
function markdownToAst(markdownPath) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
const markdownStr = FS.readFileSync(markdownPath);
|
|
||||||
const AST = markdownParse(markdownStr.toString());
|
|
||||||
const ASTData = {
|
|
||||||
version: pkg.version,
|
|
||||||
name: pkg.name,
|
|
||||||
description: pkg.description,
|
|
||||||
data: [],
|
|
||||||
};
|
|
||||||
if (AST && AST.children && AST.children.length > 0) {
|
|
||||||
ASTData.data = arrayToJsonAst(AST.children);
|
|
||||||
}
|
|
||||||
resolve(ASTData);
|
|
||||||
} catch (err) {
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
227
build/create.mjs
Normal file
227
build/create.mjs
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
import FS from 'fs-extra'
|
||||||
|
import unified from 'unified'
|
||||||
|
import { toVFile } from 'to-vfile'
|
||||||
|
import { reporter } from 'vfile-reporter'
|
||||||
|
import markdown from 'remark-parse'
|
||||||
|
import slug from 'remark-slug'
|
||||||
|
import headings from 'remark-autolink-headings'
|
||||||
|
import { html, template, doctype } from 'rehype-template'
|
||||||
|
import stringify from 'rehype-stringify'
|
||||||
|
import remark2rehype from 'remark-rehype'
|
||||||
|
import rehypeAttrs from 'rehype-attr'
|
||||||
|
import rehypeRaw from 'rehype-raw'
|
||||||
|
import rehypeRewrite from 'rehype-rewrite'
|
||||||
|
import rehypeUrls from 'rehype-urls'
|
||||||
|
|
||||||
|
FS.ensureDirSync('./dist');
|
||||||
|
|
||||||
|
const styles = `
|
||||||
|
body,html{padding: 0;margin:0;}
|
||||||
|
body{font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; line-height: 1.5; word-wrap: break-word; }
|
||||||
|
p,blockquote,ul,ol,dl,table,pre{margin-top: 0; margin-bottom: 16px; }
|
||||||
|
blockquote{margin-right: 0; margin-left: 0; padding: 0 1em; color: #777; border-left: 0.25em solid #ddd; }
|
||||||
|
a { color: #4078c0; text-decoration: none; }
|
||||||
|
.markdown-body{ padding: 25px; padding-top: 43px;}
|
||||||
|
.markdown-body>*:first-child { margin-top: 0 !important; }
|
||||||
|
.markdown-body .anchor { float: left; padding-right: 4px; margin-left: -20px; line-height: 1; }
|
||||||
|
.markdown-body .anchor svg.octicon-link { vertical-align: middle; visibility: hidden; }
|
||||||
|
.markdown-body h1:hover .anchor svg.octicon-link,
|
||||||
|
.markdown-body h2:hover .anchor svg.octicon-link,
|
||||||
|
.markdown-body h3:hover .anchor svg.octicon-link,
|
||||||
|
.markdown-body h4:hover .anchor svg.octicon-link,
|
||||||
|
.markdown-body h5:hover .anchor svg.octicon-link,
|
||||||
|
.markdown-body h6:hover .anchor svg.octicon-link { visibility: visible; }
|
||||||
|
h1, h2, h3, h4, h5, h6{margin-top: 24px; margin-bottom: 16px; font-weight: 600; line-height: 1.25; }
|
||||||
|
h1{padding-bottom: 0.3em; font-size: 2em; border-bottom: 1px solid #eee; }
|
||||||
|
h2{padding-bottom: 0.3em; font-size: 1.5em; border-bottom: 1px solid #eee; }
|
||||||
|
ul, ol {padding-left: 1.2em; }
|
||||||
|
li>p {margin-top: 16px; }
|
||||||
|
code, tt{padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(0,0,0,0.04); border-radius: 3px; }
|
||||||
|
code{white-space: normal; }
|
||||||
|
code, pre{font-family: Consolas, "Liberation Mono", Courier, monospace; }
|
||||||
|
del code{text-decoration: inherit; }
|
||||||
|
code:before, code:after, tt:before, tt:after { letter-spacing: -0.2em; content: "\\00a0"; }
|
||||||
|
del{color: #727272; }
|
||||||
|
ul {list-style-type: square;}
|
||||||
|
ul ul{list-style-type:circle;}
|
||||||
|
ul ul ul{list-style-type:disc; }
|
||||||
|
.totop{ position: fixed; bottom: 20px; right: 20px; display: inline-block; background: rgba(0, 0, 0, 0.74); padding: 10px; border-radius: 3px; z-index: 9999; color: #fff; font-size: 10px; }
|
||||||
|
a.github-corner {position: fixed; top: 0; right: 0; }
|
||||||
|
.github-corner svg{fill:#e1e1e1;color:#000;position:absolute;top:0;border:0;right:0;z-index:99;width:4.375rem;height:4.375rem}
|
||||||
|
.github-corner:hover .octo-arm{-webkit-animation:octocat-wave 560ms ease-in-out;animation:octocat-wave 560ms ease-in-out}
|
||||||
|
@-webkit-keyframes octocat-wave{
|
||||||
|
0%,100%{-webkit-transform:rotate(0);transform:rotate(0)}
|
||||||
|
20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}
|
||||||
|
40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}
|
||||||
|
}
|
||||||
|
@keyframes octocat-wave{
|
||||||
|
0%,100%{-webkit-transform:rotate(0);transform:rotate(0)}
|
||||||
|
20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}
|
||||||
|
40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}
|
||||||
|
}
|
||||||
|
|
||||||
|
#awesome-mac { padding: 37px 0px 40px 0; text-align: center; color: #686868; }
|
||||||
|
|
||||||
|
.topmenu { position: fixed; left: 5px; }
|
||||||
|
.topmenu a { background: #00000073; display: inline-block; padding: 1px 5px; font-size: 12px; border-radius: 2px; margin-right: 5px; color: #fff; }
|
||||||
|
.topmenu a:hover{ background: #2186ff; color: #fff; }
|
||||||
|
#gitalk-container { padding: 15px; }
|
||||||
|
`
|
||||||
|
|
||||||
|
const t = (node, frontmatter) => html`
|
||||||
|
${doctype}
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||||
|
<title>Awesome Mac application sharing recommendation - Awesome Mac</title>
|
||||||
|
<meta name="description" content="A curated list of awesome applications, softwares, tools and shiny things for Mac osx. - Awesome Mac" />
|
||||||
|
<meta name="keywords" content="mac,osx,app,softwares,applications,mac softwares,awesome mac,free softwares,Freeware" />
|
||||||
|
<link rel="shortcut icon" href="./favicon.ico" />
|
||||||
|
<link rel="stylesheet" href="//unpkg.com/gitalk/dist/gitalk.css" />
|
||||||
|
<style>${styles}</style>
|
||||||
|
</head>
|
||||||
|
<body id="totop">
|
||||||
|
<div class="topmenu">
|
||||||
|
<a href="https://github.com/jaywcjlove/awesome-mac/issues">
|
||||||
|
Recommended
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/jaywcjlove/awesome-mac/issues">Link failure Report</a>
|
||||||
|
</div>
|
||||||
|
<a href="https://github.com/jaywcjlove/awesome-mac" target="_blank" class="github-corner">
|
||||||
|
<svg viewBox="0 0 250 250">
|
||||||
|
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
||||||
|
<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
|
||||||
|
<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<div class="markdown-body">
|
||||||
|
${node}
|
||||||
|
</div>
|
||||||
|
<div id="gitalk-container"></div>
|
||||||
|
<script src="https://utteranc.es/client.js" repo="jaywcjlove/awesome-mac" issue-term="homepage" crossorigin theme="github-light" async></script>
|
||||||
|
<a href="#totop" class="totop">Top</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`
|
||||||
|
|
||||||
|
const tZh = (node, frontmatter) => html`
|
||||||
|
${doctype}
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||||
|
<title>Awesome Mac application sharing recommendation - Awesome Mac</title>
|
||||||
|
<meta name="description" content="收集分享大量非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。 - Awesome Mac" />
|
||||||
|
<meta name="keywords" content="mac,osx,app,mac软件,awesome mac,苹果软件下载,免费软件,mac免费软件下载,精品mac应用" />
|
||||||
|
<link rel="shortcut icon" href="./favicon.ico" />
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css" />
|
||||||
|
<style>${styles}</style>
|
||||||
|
</head>
|
||||||
|
<body id="totop">
|
||||||
|
<div class="topmenu">
|
||||||
|
<a href="https://github.com/jaywcjlove/awesome-mac/issues">
|
||||||
|
Recommended
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/jaywcjlove/awesome-mac/issues">Link failure Report</a>
|
||||||
|
</div>
|
||||||
|
<a href="https://github.com/jaywcjlove/awesome-mac" target="_blank" class="github-corner">
|
||||||
|
<svg viewBox="0 0 250 250">
|
||||||
|
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
||||||
|
<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
|
||||||
|
<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<div class="markdown-body">
|
||||||
|
${node}
|
||||||
|
</div>
|
||||||
|
<div id="gitalk-container"></div>
|
||||||
|
<script src="https://utteranc.es/client.js" repo="jaywcjlove/awesome-mac" issue-term="homepage" crossorigin theme="github-light" async></script>
|
||||||
|
<a href="#totop" class="totop">Top</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`
|
||||||
|
|
||||||
|
const rehypeRewriteHandle = (node, index, parent) => {
|
||||||
|
if (node.type === 'element' && parent.type === 'root' && /h(1|2|3|4|5|6)/.test(node.tagName) && index !== 0) {
|
||||||
|
const child = node.children && node.children[0] ? node.children[0] : null
|
||||||
|
if (child && child.properties && child.properties.ariaHidden === 'true') {
|
||||||
|
child.properties = { class: 'anchor', ...child.properties }
|
||||||
|
child.children = [
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
tagName: "svg",
|
||||||
|
properties: {
|
||||||
|
class: "octicon octicon-link",
|
||||||
|
viewBox: "0 0 16 16",
|
||||||
|
version: "1.1",
|
||||||
|
width: "16",
|
||||||
|
height: "16",
|
||||||
|
ariaHidden: "true",
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
type: "element",
|
||||||
|
tagName: "path",
|
||||||
|
properties: {
|
||||||
|
fillRule: "evenodd",
|
||||||
|
d: "M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function processorHandle(templ) {
|
||||||
|
var processor = unified()
|
||||||
|
.use(markdown)
|
||||||
|
.use(slug)
|
||||||
|
.use(headings)
|
||||||
|
.use(remark2rehype, { allowDangerousHtml: true })
|
||||||
|
.use(rehypeRaw)
|
||||||
|
.use(rehypeAttrs, { properties: 'attr' })
|
||||||
|
.use(rehypeRewrite, rehypeRewriteHandle)
|
||||||
|
.use(rehypeUrls, (url) => {
|
||||||
|
if (/README-zh.md$/.test(url.href)) {
|
||||||
|
url.path = 'index.zh.html'
|
||||||
|
return url.path
|
||||||
|
}
|
||||||
|
if (/README.md$/.test(url.href)) {
|
||||||
|
url.path = 'index.html'
|
||||||
|
return url.path
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.use(template, { template: templ })
|
||||||
|
.use(stringify)
|
||||||
|
return processor
|
||||||
|
}
|
||||||
|
|
||||||
|
processorHandle(tZh).process(toVFile.readSync('README-zh.md'), (err, file) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(reporter(err || file))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
file.extname = '.html'
|
||||||
|
toVFile.writeSync({
|
||||||
|
value: file.contents,
|
||||||
|
path: './dist/index.zh.html'
|
||||||
|
})
|
||||||
|
console.log(' create file: ./dist/index.zh.html')
|
||||||
|
})
|
||||||
|
|
||||||
|
processorHandle(t).process(toVFile.readSync('README.md'), (err, file) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(reporter(err || file))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
file.extname = '.html'
|
||||||
|
toVFile.writeSync({
|
||||||
|
value: file.contents,
|
||||||
|
path: './dist/index.html'
|
||||||
|
})
|
||||||
|
console.log(' create file: ./dist/index.html')
|
||||||
|
})
|
||||||
@ -1,110 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
|
|
||||||
<title><% if(lang=='zh'){ %> 精品Mac应用分享推荐 - Awesome Mac <% }else{ %> Awesome Mac application sharing recommendation - Awesome Mac <% } %></title>
|
|
||||||
<meta name="description" content="<% if(lang=='zh'){ %> 收集分享大量非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。 - Awesome Mac <% }else{ %> A curated list of awesome applications, softwares, tools and shiny things for Mac osx. - Awesome Mac <% } %>" />
|
|
||||||
<meta name="keywords" content="<% if(lang=='zh'){ %> mac,osx,app,mac软件,awesome mac,苹果软件下载,免费软件,mac免费软件下载,精品mac应用 <% }else{ %> mac,osx,app,softwares,applications,mac softwares,awesome mac,free softwares,Freeware <% } %>" />
|
|
||||||
<link rel="shortcut icon" href="./favicon.ico" />
|
|
||||||
<link rel="stylesheet" href="//unpkg.com/gitalk/dist/gitalk.css">
|
|
||||||
<style type="text/css">
|
|
||||||
* {box-sizing: border-box; }
|
|
||||||
body,html{padding: 0;margin:0;}
|
|
||||||
body{font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; line-height: 1.5; word-wrap: break-word; }
|
|
||||||
p,blockquote,ul,ol,dl,table,pre{margin-top: 0; margin-bottom: 16px; }
|
|
||||||
blockquote{margin-right: 0; margin-left: 0; padding: 0 1em; color: #777; border-left: 0.25em solid #ddd; }
|
|
||||||
a {color: #4078c0; text-decoration: none; }
|
|
||||||
.markdown-body{padding: 15px; }
|
|
||||||
.markdown-body>*:first-child {margin-top: 0 !important; }
|
|
||||||
h1, h2, h3, h4, h5, h6{margin-top: 24px; margin-bottom: 16px; font-weight: 600; line-height: 1.25; }
|
|
||||||
h1{padding-bottom: 0.3em; font-size: 2em; border-bottom: 1px solid #eee; }
|
|
||||||
h2{padding-bottom: 0.3em; font-size: 1.5em; border-bottom: 1px solid #eee; }
|
|
||||||
ul, ol {padding-left: 1.2em; }
|
|
||||||
li>p {margin-top: 16px; }
|
|
||||||
code, tt{padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(0,0,0,0.04); border-radius: 3px; }
|
|
||||||
code{white-space: normal; }
|
|
||||||
code, pre{font-family: Consolas, "Liberation Mono", Courier, monospace; }
|
|
||||||
del code{text-decoration: inherit; }
|
|
||||||
code::before, code::after, tt::before, tt::after{letter-spacing: -0.2em; content: "\00a0"; }
|
|
||||||
del{color: #727272; }
|
|
||||||
ul{list-style-type: square;}
|
|
||||||
ul ul{list-style-type:circle;}
|
|
||||||
ul ul ul{list-style-type:disc; }
|
|
||||||
.totop{
|
|
||||||
position: fixed;
|
|
||||||
bottom: 20px;
|
|
||||||
right: 20px;
|
|
||||||
display: inline-block;
|
|
||||||
background: rgba(0, 0, 0, 0.74);
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 3px;
|
|
||||||
z-index: 9999;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 10px;
|
|
||||||
}
|
|
||||||
a.github-corner {position: fixed; top: 0; right: 0; }
|
|
||||||
.github-corner svg{fill:#e1e1e1;color:#000;position:absolute;top:0;border:0;right:0;z-index:99;width:4.375rem;height:4.375rem}
|
|
||||||
.github-corner:hover .octo-arm{-webkit-animation:octocat-wave 560ms ease-in-out;animation:octocat-wave 560ms ease-in-out}
|
|
||||||
@-webkit-keyframes octocat-wave{
|
|
||||||
0%,100%{-webkit-transform:rotate(0);transform:rotate(0)}
|
|
||||||
20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}
|
|
||||||
40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}
|
|
||||||
}
|
|
||||||
@keyframes octocat-wave{
|
|
||||||
0%,100%{-webkit-transform:rotate(0);transform:rotate(0)}
|
|
||||||
20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}
|
|
||||||
40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}
|
|
||||||
}
|
|
||||||
|
|
||||||
#awesome-mac {
|
|
||||||
padding: 37px 0px 40px 0;
|
|
||||||
text-align: center;
|
|
||||||
color: #686868;
|
|
||||||
}
|
|
||||||
|
|
||||||
.topmenu{
|
|
||||||
position: fixed;
|
|
||||||
left: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.topmenu a{
|
|
||||||
background: #ebebeb;
|
|
||||||
display: inline-block;
|
|
||||||
padding: 1px 5px;
|
|
||||||
font-size: 12px;
|
|
||||||
border-radius: 2px;
|
|
||||||
color:#757575;
|
|
||||||
}
|
|
||||||
|
|
||||||
.topmenu a:hover{
|
|
||||||
background: #2186ff;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
#gitalk-container {
|
|
||||||
padding: 15px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body id="totop">
|
|
||||||
<a href="https://github.com/jaywcjlove/awesome-mac" target="_blank" class="github-corner">
|
|
||||||
<svg viewBox="0 0 250 250">
|
|
||||||
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
|
|
||||||
<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
|
|
||||||
<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
<div class="topmenu">
|
|
||||||
<a href="https://github.com/jaywcjlove/awesome-mac/issues">
|
|
||||||
<% if(lang=='zh'){ %> 推荐软件 <% }else{ %> Recommended <% } %>
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/jaywcjlove/awesome-mac/issues"><% if(lang=='zh'){ %> 链接失效报告 <% }else{ %> Link failure Report <% } %></a>
|
|
||||||
</div>
|
|
||||||
<article class="markdown-body">
|
|
||||||
<%- html %>
|
|
||||||
</article>
|
|
||||||
<div id="gitalk-container"></div>
|
|
||||||
<script src="https://utteranc.es/client.js" repo="jaywcjlove/awesome-mac" issue-term="homepage" crossorigin theme="github-light" async></script>
|
|
||||||
<a href="#totop" class="totop">Top</a>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
0
build/favicon.ico → dist/favicon.ico
vendored
0
build/favicon.ico → dist/favicon.ico
vendored
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
1443
package-lock.json
generated
1443
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
29
package.json
29
package.json
@ -4,8 +4,9 @@
|
|||||||
"description": " This repo is a collection of awesome Mac applications and tools for developers and designers. ",
|
"description": " This repo is a collection of awesome Mac applications and tools for developers and designers. ",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"start": "npm run create:html && npm run create:ast",
|
||||||
"start": "node build/build.js"
|
"create:html": "node build/create.mjs",
|
||||||
|
"create:ast": "node build/ast.mjs"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -25,13 +26,21 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://jaywcjlove.github.io/awesome-mac",
|
"homepage": "https://jaywcjlove.github.io/awesome-mac",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@textlint/markdown-to-ast": "^6.0.9",
|
"fs-extra": "10.0.0",
|
||||||
"colors-cli": "^1.0.20",
|
"rehype-attr": "1.1.7",
|
||||||
"ejs": "^2.6.1",
|
"rehype-raw": "5.1.0",
|
||||||
"fs-extra": "^7.0.0",
|
"rehype-rewrite": "1.0.0",
|
||||||
"gh-pages": "^2.0.1",
|
"rehype-stringify": "8.0.0",
|
||||||
"html-minifier": "^3.5.20",
|
"rehype-template": "0.3.0",
|
||||||
"loading-cli": "^1.0.8",
|
"rehype-urls": "1.1.1",
|
||||||
"marked": "^2.0.0"
|
"remark": "13.0.0",
|
||||||
|
"remark-autolink-headings": "6.0.1",
|
||||||
|
"remark-parse": "9.0.0",
|
||||||
|
"remark-gfm": "1.0.0",
|
||||||
|
"remark-rehype": "8.1.0",
|
||||||
|
"remark-slug": "6.0.0",
|
||||||
|
"to-vfile": "7.0.0",
|
||||||
|
"unified": "9.2.1",
|
||||||
|
"vfile-reporter": "7.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user