Ako dostať Andreja Sládkoviča do C++

Zápisník experimentátora

Hierarchy: Node.js

Už dlhší čas som sa zapodieval myšlienkou na prenesenie diela Andreja Sládkoviča do počítača. V Banskej Bystrici má zvláštnu sochu v záhrade evanjelického kostola a na neďalekom cintoríne je aj pochovaný. Teraz cez sviatky som si našiel trochu voľného času a prekonvertoval som jeho báseň Marína do poľa v C++. Zatiaľ nebudem prezrádzať, na aké účely som to potreboval. Poďme si ukázať, ako sa dá takáto konverzia urobiť.

Marína

Marína je známa ľúbostná báseň nášho básnika o jeho nešťastnej láske. Má 291 strof a v škole sa úryvky z nej učí každý Slovák. Pretože Sládkovič umrel v roku 1872, je jeho dielo voľne dostupné. Ja som si podklady stiahol zo Zlatého fondu v podobe HTML.

Konverzia do poľa v C++

Báseň som prekonvertoval do poľa v C++ tak, aby každá strofa zodpovedala jednej položke poľa. Výsledkom je súbor dlhý 110 kB. Na konverziu som použil Node.js a balíček Cheerio. Napísal som tri programy.

  • index.js - Extrahovanie prvkov z HTML, ktoré obsahujú text samotnej básne.
  • array.js - Prevod podkladu do poľa a vypísanie poslednej strofy.
  • tocpp.js - Konverzia do C++.

index.js

Cheerio používa syntax podobnú jQuery. Takto sa vyberú prvky, ktoré majú nastavenú triedu 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 sa dajú predchádzajúce výsledky previesť do poľa. Program vypíše pre kontrolu poslednú strofu, ktorá je veľmi známa.

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 sa ju učil na hodine slovenčiny.

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 vyzerá prevod do C++. Jednotlivé prvky poľa sú pretransformované do podoby textového reťazca, zodpovedajúceho C++ a aby to bolo možné v C++ použiť, sú doplnené nevyhnutné úvodzovky, začiatok a koniec poľa.

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 sa nachádza na serveri GitHub.


26.12.2017


Menu