nodejs で百本ノックを受けてみる 第3章

たまたま 見かけた 言語処理100本ノック2015。せっかくなので 勉強中のnodejsで試してみる

環境は Win[7|10] Pro x64 と node.js の 8.x系

コードがクズなのは、JSも勉強中だから ということで

次に第3章: 正規表現

20. JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

var async = require('async');
var fs    = require('fs');
async.forEachSeries(fs.readFileSync('jawiki-country.json','utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        var obj = JSON.parse(line);
        if (obj.title == 'イギリス') {
            fs.appendFileSync('UK.txt', obj.text , 'utf8');
        }
    }
    cb();
}, function() {
    console.log('end');
});

21. カテゴリ名を含む行を抽出

記事中でカテゴリ名を宣言している行を抽出せよ.(これでいいのかな?)

var async = require('async');
var fs    = require('fs');

async.forEachSeries(fs.readFileSync('UK.txt',
'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        if (line.match(/\[\[/)) {
            console.log(line);
        }
    }
    cb();
}, function() {
    console.log('end');
});

22. カテゴリ名の抽出

記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.

リカーシブで書くべきなんだけど、promise版でどう書けば良いのか現在 わからない・・

\[\[ が入れ子になってるところは、現在抜いているんだけど、どっちが正解なのかね??

var async = require('async');
var fs    = require('fs');

async.forEachSeries(fs.readFileSync('UK.txt', 'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        if (line.match(/\[\[/)) {
            let lv   = 0;
            let out2 = '';
            let out4 = '';
            for (let i = 0; i < line.length; i++) {
                if (line[i] == '[') {
                    lv = lv + 1;
                    if (lv == 2) {
                        out2 = '';
                    } else if (lv == 4) {
                        out4 = '';
                    }
                } else if (line[i] ==']') {
                    lv = lv - 1;
                    if (lv == 0) {
                        fs.appendFileSync('UK2.txt', out2 + '\n', 'utf8');
                        out2 = '';
                    } else if (lv == 2) {
                        fs.appendFileSync('UK2.txt', out4 + '\n', 'utf8');
                        out4 = '';
                    }
                } else if ( lv == 2 ) {
                    out2 = out2 + line[i];
                } else if ( lv == 4) {
                    out4 = out4 + line[i];
                }
            }
        }
    }
    cb();
}, function() {
    console.log('end');
});

23. セクション構造

記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ.

これもリカーシブで書くべきコードだよなぁ・・

var async = require('async');
var fs    = require('fs');
async.forEachSeries(fs.readFileSync('UK.txt', 'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        if (line.match(/^==(?!=).*==$/)) {
            console.log("1. " + line.replace(/=/g, ''));
        } else if (line.match(/^===(?!=).*===$/)) {
            console.log("2. " + line.replace(/=/g, ''));
        } else if (line.match(/^====(?!=).*====$/)) {
            console.log("3. " + line.replace(/=/g, ''));
        }
    }
    cb();
}, function() {
    console.log('end');
});

26. 強調マークアップの除去

25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)を除去してテキストに変換せよ(参考: マークアップ早見表).(単体で作ってみる)

// 対象は以下で良いのかな??
// 斜字体           ''弱い強調''        弱い強調
// 太字             '''強調'''          強調
// 太字+斜字体     '''''強い強調'''''  強い強調
//
var async = require('async');
var fs    = require('fs');
let fileName = './RES.txt';
//fs.access(fileName, (err) => {
//  if (!err) {
//    fs.unlinkSync(fileName);
//  }
//});
let pos = 0;
async.forEachSeries(fs.readFileSync('UK.txt', 'utf8').toString().split('\n'), function (line, cb) {
    if (line.length > 0 ) {
        if (line.match(/''(?!').*''/)) {
            pos = line.indexOf("'''''", 0);
            while (pos != -1) {
                line = line.replace(/'''''/, '     ');
                pos  = line.indexOf("'''''", pos + 1);
            }
            pos = line.indexOf("'''", 0);
            while (pos != -1) {
                line = line.replace(/'''/, '   ');
                pos  = line.indexOf("'''", pos + 1);
            }
            pos = line.indexOf("''", 0);
            while (pos != -1) {
                line = line.replace(/''/, '  ');
                pos  = line.indexOf("''",  pos + 1);
            }
        }
        //console.log(line);
        fs.appendFileSync(fileName, line + '\n', 'utf8');
    } else {
        //console.log('\n');
        fs.appendFileSync(fileName, '\n', 'utf8');
    }
    cb();
}, function() {
    console.log('end');
});