wikibase-cli
Version:
A command-line interface to Wikibase
79 lines (72 loc) • 2.65 kB
JavaScript
import { isMediaInfoId, isPropertyId } from 'wikibase-sdk'
import errors_ from '#lib/errors'
import { exitOnMissingInstance } from '#lib/exit_on_missing'
import { getSitelinkUrlFactory } from '#lib/get_sitelink_url'
import { getMediaInfoEntityTitle } from '#lib/mediainfo'
import { openUrl } from '#lib/open'
import program from '#lib/program'
import { tolerantIdParserFactory } from '#lib/tolerant_id_parser'
await program
.option('-p, --wikipedia', 'open the Wikipedia article')
.option('-y, --history', 'open the Wikidata history')
.option('-t, --talk', 'open the Talk page')
.option('-u, --url', 'simply generate the url')
.option('-r, --revision <id>', 'open a specific revision')
.process('open')
const getSitelinkUrl = getSitelinkUrlFactory(program)
const parseId = tolerantIdParserFactory()
const { instance, args, lang } = program
exitOnMissingInstance(instance)
let ids
try {
ids = args.map(parseId).filter(id => id != null)
} catch (err) {
// invalid ids: trigger a search
}
if (!ids || ids.length === 0) {
const search = encodeURIComponent(args.join(' '))
if (program.wikipedia) {
openUrl(`https://${lang}.wikipedia.org/w/index.php?title=Special:Search&search=${search}`)
} else {
openUrl(`${instance}/w/index.php?title=Special:Search&search=${search}`)
}
} else {
const openId = async id => {
if (program.wikipedia) {
try {
const url = await getSitelinkUrl(id, lang, 'wiki')
openUrl(url)
} catch (err) {
if (err.statusCode === 404) {
console.error('Wikipedia article not found: opening Wikidata page on sitelinks')
openUrl(`${instance}/wiki/${id}#sitelinks-wikipedia`)
} else {
throw err
}
}
} else if (program.history) {
if (isPropertyId(id)) {
openUrl(`${instance}/w/index.php?title=Property:${id}&action=history`)
} else if (isMediaInfoId(id)) {
const title = await getMediaInfoEntityTitle(id)
openUrl(`${instance}/w/index.php?title=${title}&action=history`)
} else {
// Will be redirected to title=${id} if Item is the main namespace
openUrl(`${instance}/w/index.php?title=Item:${id}&action=history`)
}
} else if (program.talk) {
if (isPropertyId(id)) {
openUrl(`${instance}/wiki/Property_talk:${id}`)
} else {
openUrl(`${instance}/wiki/Item_talk:${id}`)
}
} else if (program.revision) {
openUrl(`${instance}/w/index.php?title=${id}&oldid=${program.revision}`)
} else {
openUrl(`${instance}/entity/${id}`)
}
}
Promise.all(ids.map(openId))
.catch(errors_.exit)
}