const valid_modals = [ // supported sort-code keys 'product', 'store' ]; const symbol_escapes = [ { esc: '>', chr: '>' }, { esc: '<', chr: '<' }, { esc: '&', chr: '&' }, { esc: '"', chr: '\"' }, { esc: ''', chr: '\'' }, { esc: '€', chr: '€' }, { esc: '©', chr: '©' }, { esc: '®', chr: '®' } ]; /** inject_codeblocks * --- -- -- - - - * * NOTE: * a short-code is a mustache block of 3 parametres: * {{ object = someID ; some label description }} * ex. `{{product=1507175; Coca Cola Zero}}` * * The short-code is parsed to a code-block: * an `a` modal-toggler link with certain data-attributes (+label), ex: * `Coca Cola Zero` * * @param code (string): original content html with short-codes * @returns (string): html content with code-blocks */ function inject_codeblocks(code) { // isolate all mustache blocks const regexp = /{{(.*?)}}/g; // regex makes multiple-matching easier const matches = [...code.matchAll(regexp)]; // console.log(matches); var output = code; // use a copy of (source) code matches.forEach( match => { // parse (every) match // NOTE: // match array has 3 items; example: // match[0] : `{{store=247; Pasalimani Market}}` // match[1] : `store=247; Pasalimani Market` // match[3] : the (source) code string let blockparts = unescaped_str( match[1] ).split(';'); let main_unit = blockparts[0].replaceAll(' ','').split('='); let target = main_unit[0].toLowerCase(); let id = main_unit[1]; let label = escaped_str(blockparts[1]); if (valid_modals.includes(target)) { let codeblock = `${label}`; output = output.replaceAll(match[0], codeblock); } }); return output; } // pair of function to escepe/unescape special html symbols // --- -- -- - - - function unescaped_str(txt) { symbol_escapes.forEach( pair => { txt = txt.replaceAll(pair.esc, pair.chr); }) return txt; } function escaped_str(txt) { symbol_escapes.forEach( pair => { txt = txt.replaceAll(pair.chr, pair.esc); }) return txt; } $(document).ready(function() { /** translate short-codes to code-blocks * ------------------------------------------------------------------------- */ var content = $('.content .article-body').html(); // get code with shorts $('.content .article-body').html( inject_codeblocks(content) ); // put code with blocks /** modal listeners * ------------------------------------------------------------------------- */ // open store modal listener // --- -- -- - - - $(document).on('click', '.js-get_store', function (e) { e.preventDefault(); var id = $(this).data('id'); // id for requesting content via ajax $('#dynamic-content').html(''); $('#modal-loader').show(); $.ajax({ url: '/libs/modals/modalStore.php', type: 'POST', cache: false, data: 'id=' + id, dataType: 'html' }) .done(function (data) { $('#dynamic-content').html(''); $('#dynamic-content').html(data); $('#modal-loader').hide(); }) .fail(function () { $('#dynamic-content').html(' Υπήρξε κάποιο πρόβλημα, παρακαλώ προσπαθήστε ξανά.'); $('#modal-loader').hide(); }); }); // open product modal listener // --- $(document).on('click', '.js-get_product', function (e) { e.preventDefault(); var id = $(this).data('id'); // id for requesting content via ajax $('#dynamic-product').html(''); $('#modal-loader').show(); $.ajax({ url: '/products/ajax/get_product_full', cache: false, type: 'POST', data: { id: id }, dataType: 'html' }) .done(function (data) { $('#dynamic-product').html(''); $('#dynamic-product').html(data); $('#modal-loader').hide(); }) .fail(function () { $('#dynamic-product').html(' Υπήρξε κάποιο πρόβλημα, παρακαλώ προσπαθήστε ξανά.'); $('#modal-loader').hide(); }); }); });