Jak dostat Andreje Sládkoviče do C++

Zápisník experimentátora

Hierarchy: Node.js

Už delší dobu jsem se zabýval myšlenkou na přenesení díla Andreje Sládkoviče do počítače. V Banské Bystrici má zvláštní sochu v zahradě evangelického kostela a na nedalekém hřbitově je i pohřben. Teď přes svátky jsem si našel trochu volného času a překonvertovat jsem jeho báseň Marína do pole v C++. Zatím nebudu prozrazovat, pro jaké účely jsem to potřeboval. Pojďme si ukázat, jak se dá taková konverze udělat.

Marína

Marína je známá milostná báseň našeho básníka o jeho nešťastné lásce. Má 291 strof a ve škole se úryvky z ní učí každý Slovák. Protože Sládkovič umřel v roce 1872, je jeho dílo volně dostupné. Já jsem si podklady stáhl ze Zlatého fondu v podobě HTML.

Konverze do pole v C++

Báseň jsem překonvertovat do pole v C++ tak, aby každá strofa odpovídala jedné položce pole. Výsledkem je soubor dlouhý 110 kB. Na konverzi jsem použil Node.js a balíček Cheerio. Napsal jsem tři programy.

  • index.js - Extrahování prvků z HTML, které obsahují text samotné básně.
  • array.js - Převod podkladu do pole a vypsání poslední strofy.
  • tocpp.js - Konverze do C++.

index.js

Cheerio používá syntaxi podobnou jQuery. Takto se vyberou prvky, které mají nastavenou třídu literallayout.

var fs = require('fs');
const cheerio = require('cheerio');

var content = fs.readFileSync(__dirname + '/sladkovic-andrej_marina_txt.html');
const $ = cheerio.load(content);

var txt = $('.literallayout').text();
console.log(txt);

array.js

Takto se dají předchozí výsledky převést do pole. Program vypíše pro kontrolu poslední sloku, která je velmi známá.

Marína moja! teda tak sme my
ako tie božie plamene,
ako tie kvety v chladnej zemi,
ako tie drahé kamene;
padajú hviezdy, aj my padneme,
vädnú tie kvety, aj my zvädneme,
a klenoty hruda kryje:
Ale tie hviezdy predsa svietili,
a pekný život tie kvety žili,
a diamant v hrude nezhnije!

Každý z nás se ji učil na hodině slovenštiny.

var fs = require('fs');
const cheerio = require('cheerio');

var content = fs.readFileSync(__dirname + '/sladkovic-andrej_marina_txt.html');
const $ = cheerio.load(content);

var ar = $('.literallayout').toArray();
console.log('Length:', ar.length);
console.log('Verse 291:', $(ar[290]).text());

tocpp.js

Takto vypadá převod do C++. Jednotlivé prvky pole jsou převedeny do podoby textového řetězce, odpovídajícího C++ a aby to bylo možné v C++ použít, jsou doplněny nezbytné uvozovky, začátek a konec pole.

var fs = require('fs');
const cheerio = require('cheerio');

var content = fs.readFileSync(__dirname + '/sladkovic-andrej_marina_txt.html');
const $ = cheerio.load(content);

var ar = $('.literallayout').toArray();

var ws = fs.createWriteStream('marina.h');
ws.write('const char PROGMEM *marina[] = {\n');

for(var i=0;i<ar.length;i++) {
  ws.write('  "' + $(ar[i]).text().trim().split('\n').join('\\n') + '",\n');
  }

ws.write('};\n');
ws.write('const int marinalen = ' + ar.length + ';\n');

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


26.12.2017


Menu