electron-apps
Version:
A collection of apps built on Electron
246 lines (232 loc) • 6.27 kB
JavaScript
const categories = require('../lib/app-categories')
const fs = require('fs')
const path = require('path')
const yaml = require('yaml')
const slugs = fs
.readdirSync(path.join(__dirname, '../apps'))
.filter((filename) => {
return fs
.statSync(path.join(__dirname, `../apps/${filename}`))
.isDirectory()
})
const keywordMappings = {
book: 'Books',
developer: 'Developer Tools',
developers: 'Developer Tools',
development: 'Developer Tools',
ebook: 'Books',
facebook: 'Social Networking',
graphics: 'Photo & Video',
photo: 'Photo & Video',
'photo-manager': 'Photo & Video',
photos: 'Photo & Video',
photoshop: 'Photo & Video',
video: 'Photo & Video',
'video editing': 'Photo & Video',
'video editor': 'Photo & Video',
'video viewer': 'Photo & Video',
videos: 'Photo & Video',
editor: 'Productivity',
menubar: 'Utilities',
note: 'Productivity',
notes: 'Productivity',
utility: 'Utilities',
util: 'Utilities',
launcher: 'Utilities',
js: 'Developer Tools',
debug: 'Developer Tools',
browser: 'Productivity',
'web browser': 'Productivity',
database: 'Developer Tools',
excel: 'Productivity',
design: 'Productivity',
ide: 'Developer Tools',
search: 'Utilities',
messaging: 'Social Networking',
chat: 'Social Networking',
collaboration: 'Social Networking',
screenshot: 'Utilities',
api: 'Developer Tools',
clipboard: 'Utilities',
bitcoin: 'Finance',
markdown: 'Productivity',
notebook: 'Productivity',
youtube: 'Photo & Video',
testing: 'Developer Tools',
prototyping: 'Developer Tools',
pdf: 'Productivity',
aggregator: 'Utilities',
npm: 'Developer Tools',
mongodb: 'Developer Tools',
comic: 'Books',
comics: 'Books',
manager: 'Utilities',
sql: 'Developer Tools',
translation: 'Utilities',
google: 'Productivity',
email: 'Productivity',
twitter: 'Social Networking',
code: 'Developer Tools',
'3d printing': 'Utilities',
children: 'Education',
encryption: 'Utilities',
webinar: 'Business',
devdocs: 'Developer Tools',
docker: 'Developer Tools',
'music client': 'Music',
'music player': 'Music',
podcasts: 'News',
utorrent: 'Utilities',
torrent: 'Utilities',
'periodic-table': 'Utilities',
art: 'Photo & Video',
hardware: 'Utilities',
webgl: 'Photo & Video',
svg: 'Photo & Video',
collections: 'Productivity',
hosts: 'Developer Tools',
bookmarking: 'Productivity',
'blog editor': 'Productivity',
media: 'Photo & Video',
kanban: 'Productivity',
regex: 'Developer Tools',
data: 'Developer Tools',
onenote: 'Productivity',
photography: 'Photo & Video',
medicine: 'Medical',
'productivity tool': 'Productivity',
system: 'Utilities',
tournament: 'Games',
webrtc: 'Social Networking',
build: 'Developer Tools',
trading: 'Finance',
images: 'Photo & Video',
time: 'Productivity',
gif: 'Photo & Video',
nodejs: 'Developer Tools',
github: 'Developer Tools',
}
const keywordCounts = {}
const usedCategories = {}
function determineCategory(app, yamlPath) {
let guessingKeywords = false
let updateYaml = false
let matched = false
let matchedKeyword
if (!app.keywords) {
app.keywords = app.description.split(' ')
guessingKeywords = true
}
app.keywords.some((keyword, index) => {
matched = categories.find((category) => {
if (keyword.toLowerCase() === category.toLowerCase()) {
matchedKeyword = keyword
return true
}
})
return matched
})
if (!matched) {
// look in mappings
app.keywords.some((keyword, index) => {
let lowerKeyword = keyword.toLowerCase()
if (keywordMappings[lowerKeyword]) {
matched = keywordMappings[lowerKeyword]
matchedKeyword = keyword
return true
} else {
return false
}
})
}
if (matched) {
app.category = matched
updateYaml = true
if (!usedCategories[matched]) {
usedCategories[matched] = 1
} else {
usedCategories[matched]++
}
}
if (!updateYaml) {
app.keywords.forEach((keyword) => {
let lowerKeyword = keyword.toLowerCase()
if (keywordCounts[lowerKeyword]) {
keywordCounts[lowerKeyword]++
} else {
keywordCounts[lowerKeyword] = 1
}
})
}
if (updateYaml) {
if (guessingKeywords) {
app.keywords = [matchedKeyword]
console.log(
`SUCCESS ${app.name} has been given ${app.category} by guessing keyword: ${matchedKeyword}`
)
} else {
console.log(
`SUCCESS ${app.name} has been given ${app.category} by using keyword: ${matchedKeyword}`
)
}
saveYaml(app, yamlPath)
} else {
if (guessingKeywords) {
console.log(
`${app.name} does not have keywords, its description is: ${app.description}.`
)
} else {
console.log(
`Could not find category for ${
app.name
}, keywords are: ${app.keywords.join(',')}, description is: ${
app.description
}`
)
}
}
}
function removeElectron(app, yamlPath) {
if (app.keywords) {
let electronIndex = app.keywords.findIndex((keyword) => {
return keyword.toLowerCase() === 'electron'
})
if (electronIndex > -1) {
app.keywords.splice(electronIndex, 1)
saveYaml(app, yamlPath)
}
}
}
function saveYaml(app, yamlPath) {
const yamlContent = yaml.stringify(app, 2)
fs.writeFileSync(yamlPath, yamlContent)
}
slugs.forEach((slug) => {
const basedir = path.join(__dirname, `../apps/${slug}`)
const yamlFile = `${slug}.yml`
const yamlPath = path.join(basedir, yamlFile)
let app
let data
try {
data = fs.readFileSync(yamlPath, { encoding: 'utf-8' })
app = yaml.parse(data)
} catch (err) {
console.log(`Error loading ${yamlPath}`, err)
}
removeElectron(app, yamlPath)
if (!app.category) {
determineCategory(app, yamlPath)
}
})
let tags = []
Object.keys(keywordCounts).forEach((keyword) => {
tags.push({
tagName: `${keyword}`,
count: keywordCounts[keyword],
})
})
tags.sort((a, b) => {
return b.count - a.count
})
console.log(`Used categories: ${JSON.stringify(usedCategories, null, 2)}`)
console.log(`Keywords unmapped to categories: ${JSON.stringify(tags, null, 2)}`)