wikitext-dom
v0.1.5
Published
Document Object Model for MediaWiki Wikitext XML
Downloads
4
Maintainers
Readme
MediaWiki Wikitext XML DOM
JavaScript library for working with Wikitext XML of wikitext content model.
Starter example
import { Parser, Template } from 'wikitext-dom';
// XML String from MediaWiki API
// {{templateName|argName=argValue}}
const xmlContent = '<root><template><title>templateName</title><part><name>argName</name><equals>=</equals><value>argValue</value></part></template></root>';
// XML DOM from browser API
const doc = new DOMParser().parseFromString( xmlContent, 'application/xml' );
// Document model to work with
const dom = new Parser().parseDocument( doc );
// working with DOM here: replace all argument values of argName=argValue to argNewValue
dom.getChildByClass( Template )
.filter( template => template.findTitleText() === 'templateName' )
.map( template => template.findPartByNameText( 'argName' ) )
.filter( part => part != null )
.filter( part => part.getValueAsString() === 'argValue' )
.forEach( part => part.setValueAsString( 'argNewValue' ) );
// serializing to wikitext (not XML) string preserving comments
const newWikitext = toWikitext( false );
// expected result: {{templateName|argName=argNewValue}}
// Sending wikitext to server
/* mw.Api().postWithToken(...) */
Supported Elements
comment
(JavaScript classComment
)ext
(JavaScript classExtension
)h
(JavaScript classHeader
)ignore
(JavaScript classIgnore
)root
(JavaScript classRoot
)template
(JavaScript classTemplate
)tplarg
(JavaScript classTemplateArgument
)
Cookbook
Extract plot data from timeline inner with regexp
const plotDataLines = dom.getChildByClass( Extension )
.filter( ext => ext.getNameAsString() === 'timeline' )
.map( tl => tl.getInnerAsString() )
.filter( inner => !!inner )
.flatMap( inner => inner.split('\n') )
.map( line => line.trim() )
.filter( line => line.match(/^bar\:(\d+) from\:0 till:(\d+)$/) );
Extract population data from timeline inner with additional Timeline class
const populationItems = dom.getChildByClass( Extension )
.filter( ext => ext.getNameAsString() === 'timeline' )
.map( tl => tl.findPlotDataBarsAttributes() )
.filter( data => !!data )
.flatMap( data => Object.values( data ) )
.filter( attr => /^\d+$/.exec( attr.bar ) && "0" === attr.from && /^\d+$/.exec( attr.till ) )
.map( attr => ( { year: Number( attr.bar ), population: Number( attr.till ) } ) );
Extract population data from USCensusPop templates
const populationImtes = dom.getChildByClass( Template )
.filter( tpl => ( tpl.getTitleAsString() || '' ).trim() === 'USCensusPop' )
.flatMap( tpl => {
const result = [];
tpl.findPartNamesAsStrings()
.filter( name => isNumeric( name.trim() ) )
.filter( name => isNumeric( tpl.getValueByNameAsString( name ) ) )
.map( name => ( {
determinationMethod: 'census',
population: Number( tpl.getValueByNameAsString( name ) ),
year: Number( name ),
} ) )
.forEach( r => result.push( r ) );
const estPop = tpl.getValueByNameAsString( 'estimate' );
const estYear = tpl.getValueByNameAsString( 'estyear' );
if ( isNumeric( estPop ) && isNumeric( estYear ) ) {
result.push( {
determinationMethod: 'estimating',
population: Number( estPop ),
year: Number( estYear ),
} );
}
return result;
}