summaryrefslogtreecommitdiff
path: root/public/assets/js/lesson-features.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/js/lesson-features.js')
-rw-r--r--public/assets/js/lesson-features.js164
1 files changed, 164 insertions, 0 deletions
diff --git a/public/assets/js/lesson-features.js b/public/assets/js/lesson-features.js
new file mode 100644
index 0000000..369c8f7
--- /dev/null
+++ b/public/assets/js/lesson-features.js
@@ -0,0 +1,164 @@
+const valid_codeblocks = [ // supported sort-code keys
+ 'youtube'
+];
+
+
+const symbol_escapes = [
+ { esc: '>', chr: '>' },
+ { esc: '&lt;', chr: '<' },
+ { esc: '&amp;', chr: '&' },
+ { esc: '&quot;', chr: '\"' },
+ { esc: '&apos;', chr: '\'' },
+ { esc: '&euro;', chr: '€' },
+ { esc: '&copy;', chr: '©' },
+ { esc: '&reg;', chr: '®' }
+];
+
+
+var youtube_template = ( id => {
+ return '<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/'+ id +'?rel=0&controls=0" title="YouTube video player" frameborder="0" allow="clipboard-write; encrypted-media; picture-in-picture; web-share" allowfullscreen></iframe>'
+});
+
+/*
+
+
+<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/6EA-MIYY1bg?controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
+
+
+
+*/
+
+
+/** 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:
+ * `<a class='modal-toggler view-product' data-id='1507175'>Coca Cola Zero</a>`
+ *
+ * @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] : `{{youtube=6EA-MIYY1bg}}`
+ // match[1] : `youtube=6EA-MIYY1bg`
+ // match[3] : the (source) code string
+ let blockparts = unescaped_str( match[1] ).trim().split('=');
+ let target = blockparts[0].toLowerCase();
+ let id = blockparts[1];
+ // let label = escaped_str(blockparts[1]);
+ if (valid_codeblocks.includes(target)) {
+
+ if (target == 'youtube') {
+ var codeblock = youtube_template(id);
+ }
+ 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 = $('.main-content .article-body').html(); // get code with shorts
+ $('.main-content .article-body').html( inject_codeblocks(content) ); // put code with blocks
+
+
+
+ /** modal listeners
+ * -------------------------------------------------------------------------
+ */
+/* DEPRICATED: not needed
+ // 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('<i class="glyphicon glyphicon-info-sign"></i> Υπήρξε κάποιο πρόβλημα, παρακαλώ προσπαθήστε ξανά.');
+ $('#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('<i class="glyphicon glyphicon-info-sign"></i> Υπήρξε κάποιο πρόβλημα, παρακαλώ προσπαθήστε ξανά.');
+ $('#modal-loader').hide();
+
+ });
+ });
+*/
+});