mediawiki-extensions-Math/modules/ve-math/tools/makeSvgsAndCss.js

115 lines
2.6 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/* jshint node: true */
var i, count, group, symbols, symbolObject,
symbolList = [],
symbolsFile = '../symbols.json',
cssFile = '../ve.ui.MWMathSymbols.css',
fs = require( 'fs' ),
http = require( 'http' ),
querystring = require( 'querystring' ),
SVGO = require( 'svgo' ),
svgo = new SVGO( {
plugins: [
{ convertTransform: false }
]
} ),
mathoidMaxConnections = 5;
fs.readFile( symbolsFile, function ( err, data ) {
function encodeURIComponentForCSS( str ) {
return encodeURIComponent( str )
.replace( /[!'\(\)\*]/g, function ( chr ) {
return '%' + chr.charCodeAt( 0 ).toString( 16 );
} );
}
function makeRequest( symbol ) {
var request,
data = querystring.stringify( {
q: symbol
} ),
// API call to mathoid
options = {
host: '192.168.37.177',
port: '10044',
path: '/',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength( data )
}
};
// Populate and make the API call
request = http.request( options, function ( res ) {
var body = '';
res.setEncoding( 'utf8' );
res.on( 'data', function ( data ) {
body += data;
} );
res.on( 'end', function () {
var classname, svg;
// Make the classname, replacing any non-alphanumerics with their character code
classname = symbol.replace( /[^\w]/g, function ( c ) {
return '_' + c.charCodeAt( 0 ) + '_';
} );
svg = JSON.parse( body ).svg;
if ( !svg ) {
console.log( symbol + ' FAILED: ' + body );
onEnd();
return;
}
svgo.optimize( svg, function ( result ) {
// write to the css file
fs.appendFileSync(
cssFile,
'\n.ve-ui-mwMathSymbol-' + classname + ' {\n' +
'\tbackground-image: url(data:image/svg+xml,' + encodeURIComponentForCSS( result.data ) + ');\n' +
'}\n'
);
} );
console.log( symbol + ' -> ' + classname );
onEnd();
} );
} );
request.setTimeout( 10000 );
request.write( data );
request.end();
runNext();
}
function onEnd() {
count--;
runNext();
}
function runNext() {
if ( count < mathoidMaxConnections && symbolList.length ) {
count++;
makeRequest( symbolList.shift() );
}
}
symbolObject = JSON.parse( data.toString() );
for ( group in symbolObject ) {
symbols = symbolObject[ group ];
for ( i = 0; i < symbols.length; i++ ) {
symbolList.push( symbols[ i ].tex );
}
}
fs.writeFileSync( cssFile, '/*!\n * This file is GENERATED by tools/makeSvgsAndCss.js\n * DO NOT EDIT\n */\n' );
count = 0;
runNext();
} );