electron-apps
Version:
A collection of apps built on Electron
230 lines (217 loc) • 6.27 kB
JavaScript
const categories = require('../lib/app-categories')
const fs = require('fs')
const path = require('path')
const yaml = require('yamljs')
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
try {
app = yaml.load(yamlPath)
} 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)}`)