j1-template 2021.2.2 → 2021.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,385 @@
1
+ /*
2
+ # -----------------------------------------------------------------------------
3
+ # ~/assets/themes/j1/modules/j1Deepl/js/j1deepl.js
4
+ # J1 core module for j1Deepl
5
+ #
6
+ # Product/Info:
7
+ # https://jekyll.one
8
+ #
9
+ # Copyright (C) 2021 Juergen Adams
10
+ #
11
+ # J1 Template is licensed under the MIT License.
12
+ # For details, see https://jekyll.one
13
+ # -----------------------------------------------------------------------------
14
+ # NOTE: Based on https://github.com/jquery-boilerplate/jquery-boilerplate
15
+ # See: https://www.dotnetcurry.com/jquery/1069/authoring-jquery-plugins
16
+ # -----------------------------------------------------------------------------
17
+ */
18
+
19
+ // the semi-colon before function invocation is a SAFETY method against
20
+ // concatenated scripts and/or other plugins which may NOT be closed
21
+ // properly.
22
+ //
23
+ ;(function($, window, document, undefined) {
24
+
25
+ 'use strict';
26
+
27
+ // Create the defaults
28
+ var pluginName = 'j1deepl',
29
+ defaults = {
30
+ api: 'free', // free (default) | pro
31
+ auth_key: false, // API authorization key.
32
+ source_lang: 'auto', // autodetection (default: auto)|supported language. Specifies the language for the input text.
33
+ target_lang: 'DE', // language to be tranlasted in.
34
+ max_chars: false, // false (unlimited) or number. Number of chars from the source text passed for translation.
35
+ split_sentences: '1', // enabled (1, default)|disabled (0)|nonewlines. Sets the translation engine to first split the input text into sentences.
36
+ preserve_formatting: '0', // disabled (0, default)|enabled (1). Sets the translation engine to respect the original formatting.
37
+ formality: 'default', // default|more|less. Sets the translated text should lean towards formal or informal language.
38
+ tag_handling: false, // false (value=0)|xml. Sets which kind of tags should be handled. If set, API is able to process structured XML content.
39
+ outline_detection: true, // false (value=0) or true (NO value passed). Controls the automatic mechanism on XML tags for splitting. If disabled, all splitting_tags are to be specified.
40
+ non_splitting_tags: false, // false or comma-separated list of XML tags. Disable automated splitting on the tags specified.
41
+ splitting_tags: false, // false or comma-separated list of XML tags which always cause splitting.
42
+ ignore_tags: false, // false or comma-separated list of XML tags that indicate text NOT to be translated.
43
+ onInit: function (){}, // callback after plugin has initialized.
44
+ onBeforeTranslation: function (){}, // callback before translation started.
45
+ onAfterTranslation: function (){} // callback after translation finished.
46
+ };
47
+
48
+ // -------------------------------------------------------------------------
49
+ // plugin constructor
50
+ // create the jquery plugin
51
+ // -------------------------------------------------------------------------
52
+ function Plugin (element, options) {
53
+ this.element = element;
54
+ this.settings = $.extend( {}, defaults, options);
55
+ this.settings.elementID = '#' + this.element.id;
56
+ this.xhr = new XMLHttpRequest();
57
+
58
+ // call the plugin initializer
59
+ this.init(this.settings);
60
+ }
61
+
62
+ // Avoid plugin prototype conflicts
63
+ $.extend(Plugin.prototype, {
64
+ // -----------------------------------------------------------------------
65
+ // init
66
+ // initialize the plugin
67
+ // -----------------------------------------------------------------------
68
+ init: function(options) {
69
+ var logger = log4javascript.getLogger('j1deepl.init');
70
+
71
+ logger.info('\n' + 'initializing plugin: started');
72
+ this.translate(options);
73
+ logger.info('\n' + 'initializing plugin: finished');
74
+ },
75
+ // -----------------------------------------------------------------------
76
+ // prepareXHR
77
+ // Prepare a XHR request according to DeepL API specification
78
+ // for the required HTTP header settings
79
+ // See: https://www.deepl.com/de/docs-api/simulator/
80
+ // -----------------------------------------------------------------------
81
+ // NOTE: "User-Agent" NOT used as the use is qualified UNSECURE
82
+ // -----------------------------------------------------------------------
83
+ prepareXHR: function (settings) {
84
+ if (settings.api === 'free') {
85
+ this.xhr.open("POST", "https://api-free.deepl.com/v2/translate", true);
86
+ } else if (settings.api === 'pro') {
87
+ this.xhr.open("POST", "https://api.deepl.com/v2/translate", true);
88
+ } else {
89
+ this.xhr.open("POST", "https://api-free.deepl.com/v2/translate", true);
90
+ }
91
+ // Set required header parameters
92
+ this.xhr.setRequestHeader("Accept", "*/*");
93
+ this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
94
+ },
95
+ // -----------------------------------------------------------------------
96
+ // prepareText
97
+ // Prepare text function used to parse, or arrange text, designed as
98
+ // a module. Currently it splits all text whenever a newline ("\n")
99
+ // is met, so that it preserves the original layout of the text, which
100
+ // would have otherwise been lost because of the way DeepL accepts
101
+ // multiple sentences.
102
+ // -----------------------------------------------------------------------
103
+ prepareText: function (source_text) {
104
+ return source_text.split("\n");
105
+ },
106
+ // -----------------------------------------------------------------------
107
+ // translate
108
+ // Translate text function which uses all the other modules, in order to
109
+ // create a request, which is sent to the DeepL API to translate, and
110
+ // then display the result, designed as a module.
111
+ // -----------------------------------------------------------------------
112
+ translate: function (settings) {
113
+ const logger = log4javascript.getLogger('j1deepl.translate');
114
+ const READYSTATE_DONE = 4;
115
+ const STATUS_OK = 200;
116
+ const SUPPORTED_LANG = ['BG', 'CS', 'DA', 'DE', 'EL', 'EN-GB', 'EN-US', 'EN', 'ES', 'ET', 'FI', 'FR', 'HU', 'IT', 'JA', 'LT', 'LV', 'NL', 'PL', 'PT-PT', 'PT-BR', 'PT', 'RO', 'RU', 'SK', 'SL', 'SV', 'ZH'];
117
+ const ALLOWED_FORMALITY_LANG = ['DE', 'FR', 'IT', 'ES', 'NL', 'PL', 'PT', 'PT-BR', 'RU'];
118
+ const ALLOWED_TAG_HANDLING = ['xml'];
119
+ const TARGET_ELEMENT = settings.targetElement;
120
+ const TARGET_ELEMENT_EXISTS = $(TARGET_ELEMENT).length;
121
+ const ERROR_TEXT = 'Translation failed.' + '\n' + 'Reason: ';
122
+ const WARNING_TEXT = 'Translation skipped.' + '\n' + 'Reason: ';
123
+
124
+ var BASE_TARGET_ELEMENT;
125
+ var ELEMENT_TYPE;
126
+ var SOURCE_TEXT_FOUND;
127
+
128
+ var API_RESPONSE = {};
129
+ API_RESPONSE['400'] = 'Bad request. Please check error message and your parameters.';
130
+ API_RESPONSE['401'] = 'Authorization failed. Please supply a valid DeepL-Auth-Key.';
131
+ API_RESPONSE['403'] = 'Forbidden. The access to the requested resource is denied, because of insufficient access rights.';
132
+ API_RESPONSE['404'] = 'The requested resource could not be found.';
133
+ API_RESPONSE['413'] = 'The request size exceeds the limit.';
134
+ API_RESPONSE['415'] = 'The requested entries format specified in the Accept header is not supported.';
135
+ API_RESPONSE['429'] = 'Too many requests. Please wait and resend your request.';
136
+ API_RESPONSE['456'] = 'Quota exceeded. The maximum amount of glossaries has been reached.';
137
+ API_RESPONSE['500'] = 'Internal server error';
138
+ API_RESPONSE['503'] = 'Resource currently unavailable. Try again later.';
139
+ API_RESPONSE['529'] = 'Too many requests. Please wait and resend your request.';
140
+
141
+ var reason_text;
142
+ var request = '';
143
+ var element = '';
144
+ var source_text = '';
145
+ var source_text_lines = '';
146
+ var source_lang;
147
+ var target_lang;
148
+
149
+ // check if passed HTML element or ID exists
150
+ if (TARGET_ELEMENT_EXISTS) {
151
+ BASE_TARGET_ELEMENT = (TARGET_ELEMENT.includes('.')||TARGET_ELEMENT.includes('#')) ? TARGET_ELEMENT.substring(1) : TARGET_ELEMENT;
152
+ ELEMENT_TYPE = $(TARGET_ELEMENT).get(0).nodeName;
153
+
154
+ // Read the text to be translated from the given HTML element
155
+ if (ELEMENT_TYPE === 'TEXTAREA') {
156
+ source_text = this.element.value;
157
+ } else if (ELEMENT_TYPE === 'P') {
158
+ element = this.element;
159
+ source_text = $(TARGET_ELEMENT).text();
160
+ }
161
+ SOURCE_TEXT_FOUND = source_text.length;
162
+ } else {
163
+ logger.error('\n' + 'target element does not exists: ' + TARGET_ELEMENT);
164
+ return false;
165
+ }
166
+
167
+ // limit the source text if required
168
+ if (settings.max_char && source_text.length > settings.max_char ) {
169
+ var source_text_limited = source_text.substring(0, settings.max_char -3);
170
+ source_text = source_text_limited + ' ...';
171
+ logger.info('\n' + 'limit for source text ' + '(max: ' + settings.max_char + ')' + ' reached: ' + source_text.length);
172
+ }
173
+ source_text_lines = this.prepareText(source_text);
174
+
175
+ // prepare the XHR request for the API (free/pro) requested
176
+ this.prepareXHR(settings);
177
+
178
+ // Makes a request with every line, as a new text to translate
179
+ var source_text_request = "";
180
+ for(var i = 0; i < source_text_lines.length; i++) {
181
+ source_text_request += "&text=" + source_text_lines[i];
182
+ }
183
+
184
+ this.xhr.onload = function () {
185
+ if (this.readyState === READYSTATE_DONE) {
186
+ if (this.status === STATUS_OK) {
187
+ // JSON parse the response
188
+ var result = JSON.parse(this.responseText);
189
+
190
+ // recreate the response as one text to keep its original layout
191
+ var translated_text = "";
192
+ for(var i = 0; i < result.translations.length; i++) {
193
+ translated_text += result.translations[i].text;
194
+ translated_text += "\n";
195
+ }
196
+
197
+ // update the HTM element (content) by the tranlation
198
+ if (ELEMENT_TYPE === 'TEXTAREA') {
199
+ $(TARGET_ELEMENT).val(translated_text);
200
+ } else if (ELEMENT_TYPE === 'P') {
201
+ $(TARGET_ELEMENT).text(translated_text);
202
+ }
203
+ } else {
204
+ logger.error('\n' + 'API returned ' + this.status + ': ' + API_RESPONSE[this.status]);
205
+ }
206
+ }
207
+ };
208
+
209
+ // ---------------------------------------------------------------------
210
+ // preflight (validity check) on given parameters
211
+ // ---------------------------------------------------------------------
212
+
213
+ // Check for SUPPORTED language by option source_lang|target_lang
214
+ source_lang = this.settings.source_lang;
215
+ target_lang = this.settings.target_lang;
216
+
217
+ if (this.settings.source_lang != 'auto') {
218
+ this.settings.source_lang = (SUPPORTED_LANG.indexOf(this.settings.source_lang) > -1) ? this.settings.source_lang : false;
219
+ }
220
+ this.settings.target_lang = (SUPPORTED_LANG.indexOf(this.settings.target_lang) > -1) ? this.settings.target_lang : false;
221
+
222
+ // stop processing if invalid language or NO AUTH key passed
223
+ if (!this.settings.auth_key || !this.settings.source_lang || !this.settings.target_lang) {
224
+ if (!this.settings.auth_key) {
225
+ reason_text = 'NO AUTH key passed.';
226
+ logger.error('\n' + 'invalid option found. ' + reason_text);
227
+ }
228
+ if (!this.settings.source_lang) {
229
+ reason_text = 'WRONG source language passed: ' + source_lang;
230
+ logger.error('\n' + 'invalid option found. ' + reason_text);
231
+ }
232
+ if (!this.settings.target_lang) {
233
+ reason_text = 'WRONG target language passed: ' + target_lang;
234
+ logger.error('\n' + 'invalid option found. ' + reason_text);
235
+ }
236
+
237
+ // update the HTML element (content) by an error text
238
+ if (ELEMENT_TYPE === 'TEXTAREA') {
239
+ $(TARGET_ELEMENT).val(ERROR_TEXT + reason_text);
240
+ } else if (ELEMENT_TYPE === 'P') {
241
+ $(TARGET_ELEMENT).text(ERROR_TEXT + reason_text);
242
+ }
243
+ return false;
244
+ }
245
+
246
+ if(!SOURCE_TEXT_FOUND) {
247
+ reason_text = 'NO text found for translation';
248
+ // update the HTML element (content) by an error text
249
+ if (ELEMENT_TYPE === 'TEXTAREA') {
250
+ $(TARGET_ELEMENT).val(WARNING_TEXT + reason_text);
251
+ } else if (ELEMENT_TYPE === 'P') {
252
+ $(TARGET_ELEMENT).text(WARNING_TEXT + reason_text);
253
+ }
254
+ logger.warn('\n' + 'no text found for translation');
255
+ return false;
256
+ }
257
+
258
+ // Check for VALID language supported by option 'formality'
259
+ if (this.settings.formality != 'default' ) {
260
+ if (!(ALLOWED_FORMALITY_LANG.indexOf(this.settings.target_lang) > -1)) {
261
+ logger.warn('\n' + 'wrong language found for formality setting: ' + this.settings.target_lang);
262
+ }
263
+ this.settings.formality = (ALLOWED_FORMALITY_LANG.indexOf(this.settings.target_lang) > -1) ? this.settings.formality : 'default';
264
+ }
265
+
266
+ // Check for VALID tag handling and options
267
+ if (this.settings.tag_handling) {
268
+ var tag_handling = this.settings.tag_handling;
269
+ // check for VALID method
270
+ this.settings.tag_handling = (ALLOWED_TAG_HANDLING.indexOf(this.settings.tag_handling) > -1) ? this.settings.tag_handling : false;
271
+ if (this.settings.tag_handling) {
272
+ this.settings.non_splitting_tags = this.settings.non_splitting_tags ? encodeURIComponent(this.settings.non_splitting_tags) : false;
273
+ this.settings.splitting_tags = this.settings.splitting_tags ? encodeURIComponent(this.settings.splitting_tags) : false;
274
+ this.settings.ignore_tags = this.settings.ignore_tags ? encodeURIComponent(this.settings.ignore_tags) : false;
275
+ } else {
276
+ logger.error('\n' + 'invalid option found for tag handling : ' + tag_handling);
277
+ logger.warn('\n' + 'disable option: ' + 'tag_handling');
278
+ // reset to defaults if WRONG method detected
279
+ if (this.settings.non_splitting_tags) {
280
+ logger.warn('\n' + 'disable option: ' + this.settings.non_splitting_tags);
281
+ this.settings.non_splitting_tags = false;
282
+ }
283
+ if (this.settings.splitting_tags) {
284
+ logger.warn('\n' + 'disable option : ' + this.settings.splitting_tags);
285
+ this.settings.splitting_tags = false;
286
+ }
287
+ if (this.settings.ignore_tags) {
288
+ logger.warn('\n' + 'disable option: ' + this.settings.ignore_tags);
289
+ this.settings.ignore_tags = false;
290
+ }
291
+ }
292
+ } else {
293
+ // reset tags to their defaults if NO tag_handling is enabled but settings passed
294
+ if (this.settings.non_splitting_tags) {
295
+ logger.warn('\n' + 'invalid option found: ' + this.settings.non_splitting_tags);
296
+ this.settings.non_splitting_tags = false;
297
+ }
298
+ if (this.settings.splitting_tags) {
299
+ logger.warn('\n' + 'invalid option found: ' + this.settings.splitting_tags);
300
+ this.settings.splitting_tags = false;
301
+ }
302
+ if (this.settings.ignore_tags) {
303
+ logger.warn('\n' + 'invalid option found: ' + this.settings.ignore_tags);
304
+ this.settings.ignore_tags = false;
305
+ }
306
+ }
307
+
308
+ // ---------------------------------------------------------------------
309
+ // construct the API request body
310
+ // ---------------------------------------------------------------------
311
+ request = "auth_key=" + this.settings.auth_key;
312
+ request += (this.settings.source_lang != 'auto' ) ? "&source_lang=" + this.settings.source_lang : '';
313
+ request += "&target_lang=" + this.settings.target_lang;
314
+ request += (this.settings.formality != 'default' ) ? "&formality=" + this.settings.formality : '';
315
+ request += (this.settings.split_sentences) ? "&split_sentences=" + this.settings.formality : '';
316
+ request += (this.settings.tag_handling) ? "&tag_handling=" + this.settings.tag_handling : "&tag_handling=0";
317
+ request += (this.settings.tag_handling && this.settings.non_splitting_tags) ? "&non_splitting_tags=" + this.settings.non_splitting_tags : '';
318
+ request += (this.settings.tag_handling && this.settings.splitting_tags) ? "&splitting_tags=" + this.settings.splitting_tags : '';
319
+ request += (this.settings.tag_handling && this.settings.ignore_tags) ? "&ignore_tags=" + this.settings.ignore_tags : '';
320
+ request += source_text_request;
321
+
322
+ // Send the constructed request to the API for translation
323
+ this.xhr.send(request);
324
+ } // END translate
325
+
326
+ }); // END prototype
327
+
328
+ // ---------------------------------------------------------------------------
329
+ // plugin wrapper
330
+ // A really lightweight plugin wrapper around the constructor,
331
+ // wrapper around the constructor to prevent multiple instantiations
332
+ // preventing against multiple instantiations and allowing any
333
+ // public function (ie. a function whose name doesn't start
334
+ // with an underscore) to be called via the jQuery plugin,
335
+ // e.g. $(element).defaultPluginName('functionName', arg1, arg2)
336
+ // ---------------------------------------------------------------------------
337
+ $.fn[pluginName] = function ( options ) {
338
+ var args = arguments;
339
+
340
+ // Is the first parameter an object (options), or was omitted,
341
+ // instantiate a new instance of the plugin.
342
+ //
343
+ if (options === undefined || typeof options === 'object') {
344
+ return this.each(function () {
345
+ // Only allow the plugin to be instantiated once,
346
+ // so we check that the element has no plugin instantiation yet
347
+ if (!$.data(this, 'plugin_' + pluginName)) {
348
+ // if it has no instance, create a new one, pass options to the
349
+ // plugin constructor, and store the plugin instance in the
350
+ // elements jQuery data object.
351
+ $.data(this, 'plugin_' + pluginName, new Plugin( this, options ));
352
+ }
353
+ });
354
+ } else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {
355
+ // If the first parameter is a string and it doesn't start
356
+ // with an underscore or "contains" the `init`-function,
357
+ // treat this as a call to a public method.
358
+
359
+ // Cache the method call to make it possible to return a value
360
+ var returns;
361
+
362
+ this.each(function () {
363
+ var instance = $.data(this, 'plugin_' + pluginName);
364
+
365
+ // Tests that there's already a plugin-instance
366
+ // and checks that the requested public method exists
367
+ if (instance instanceof Plugin && typeof instance[options] === 'function') {
368
+ // Call the method of our plugin instance,
369
+ // and pass it the supplied arguments.
370
+ returns = instance[options].apply( instance, Array.prototype.slice.call( args, 1 ) );
371
+ }
372
+
373
+ // Allow instances to be destroyed via the 'destroy' method
374
+ if (options === 'destroy') {
375
+ $.data(this, 'plugin_' + pluginName, null);
376
+ }
377
+ });
378
+
379
+ // If the earlier cached method gives a value back return the value,
380
+ // otherwise return "this" to preserve chainability.
381
+ return returns !== undefined ? returns : this;
382
+ }
383
+ }; // END plugin wrapper
384
+
385
+ })(jQuery, window, document);
@@ -0,0 +1,18 @@
1
+ /*
2
+ # -----------------------------------------------------------------------------
3
+ # ~/assets/themes/j1/modules/j1Deepl/js/j1deepl.min.js
4
+ # J1 core module for j1Deepl
5
+ #
6
+ # Product/Info:
7
+ # https://jekyll.one
8
+ #
9
+ # Copyright (C) 2021 Juergen Adams
10
+ #
11
+ # J1 Template is licensed under the MIT License.
12
+ # For details, see https://jekyll.one
13
+ # -----------------------------------------------------------------------------
14
+ # NOTE: Based on https://github.com/jquery-boilerplate/jquery-boilerplate
15
+ # See: https://www.dotnetcurry.com/jquery/1069/authoring-jquery-plugins
16
+ # -----------------------------------------------------------------------------
17
+ */
18
+ (function(e,c,a,g){var d="j1deepl",f={api:"free",auth_key:false,source_lang:"auto",target_lang:"DE",max_chars:false,split_sentences:"1",preserve_formatting:"0",formality:"default",tag_handling:false,outline_detection:true,non_splitting_tags:false,splitting_tags:false,ignore_tags:false,onInit:function(){},onBeforeTranslation:function(){},onAfterTranslation:function(){}};function b(i,h){this.element=i;this.settings=e.extend({},f,h);this.settings.elementID="#"+this.element.id;this.xhr=new XMLHttpRequest();this.init(this.settings)}e.extend(b.prototype,{init:function(i){var h=log4javascript.getLogger("j1deepl.init");h.info("\ninitializing plugin: started");this.translate(i);h.info("\ninitializing plugin: finished")},prepareXHR:function(h){if(h.api==="free"){this.xhr.open("POST","https://api-free.deepl.com/v2/translate",true)}else{if(h.api==="pro"){this.xhr.open("POST","https://api.deepl.com/v2/translate",true)}else{this.xhr.open("POST","https://api-free.deepl.com/v2/translate",true)}}this.xhr.setRequestHeader("Accept","*/*");this.xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")},prepareText:function(h){return h.split("\n")},translate:function(C){const H=log4javascript.getLogger("j1deepl.translate");const n=4;const t=200;const u=["BG","CS","DA","DE","EL","EN-GB","EN-US","EN","ES","ET","FI","FR","HU","IT","JA","LT","LV","NL","PL","PT-PT","PT-BR","PT","RO","RU","SK","SL","SV","ZH"];const h=["DE","FR","IT","ES","NL","PL","PT","PT-BR","RU"];const r=["xml"];const w=C.targetElement;const q=e(w).length;const D="Translation failed.\nReason: ";const o="Translation skipped.\nReason: ";var y;var F;var v;var x={};x["400"]="Bad request. Please check error message and your parameters.";x["401"]="Authorization failed. Please supply a valid DeepL-Auth-Key.";x["403"]="Forbidden. The access to the requested resource is denied, because of insufficient access rights.";x["404"]="The requested resource could not be found.";x["413"]="The request size exceeds the limit.";x["415"]="The requested entries format specified in the Accept header is not supported.";x["429"]="Too many requests. Please wait and resend your request.";x["456"]="Quota exceeded. The maximum amount of glossaries has been reached.";x["500"]="Internal server error";x["503"]="Resource currently unavailable. Try again later.";x["529"]="Too many requests. Please wait and resend your request.";var l;var k="";var j="";var B="";var E="";var m;var G;if(q){y=(w.includes(".")||w.includes("#"))?w.substring(1):w;F=e(w).get(0).nodeName;if(F==="TEXTAREA"){B=this.element.value}else{if(F==="P"){j=this.element;B=e(w).text()}}v=B.length}else{H.error("\ntarget element does not exists: "+w);return false}if(C.max_char&&B.length>C.max_char){var s=B.substring(0,C.max_char-3);B=s+" ...";H.info("\nlimit for source text (max: "+C.max_char+") reached: "+B.length)}E=this.prepareText(B);this.prepareXHR(C);var p="";for(var A=0;A<E.length;A++){p+="&text="+E[A]}this.xhr.onload=function(){if(this.readyState===n){if(this.status===t){var I=JSON.parse(this.responseText);var J="";for(var K=0;K<I.translations.length;K++){J+=I.translations[K].text;J+="\n"}if(F==="TEXTAREA"){e(w).val(J)}else{if(F==="P"){e(w).text(J)}}}else{H.error("\nAPI returned "+this.status+": "+x[this.status])}}};m=this.settings.source_lang;G=this.settings.target_lang;if(this.settings.source_lang!="auto"){this.settings.source_lang=(u.indexOf(this.settings.source_lang)>-1)?this.settings.source_lang:false}this.settings.target_lang=(u.indexOf(this.settings.target_lang)>-1)?this.settings.target_lang:false;if(!this.settings.auth_key||!this.settings.source_lang||!this.settings.target_lang){if(!this.settings.auth_key){l="NO AUTH key passed.";H.error("\ninvalid option found. "+l)}if(!this.settings.source_lang){l="WRONG source language passed: "+m;H.error("\ninvalid option found. "+l)}if(!this.settings.target_lang){l="WRONG target language passed: "+G;H.error("\ninvalid option found. "+l)}if(F==="TEXTAREA"){e(w).val(D+l)}else{if(F==="P"){e(w).text(D+l)}}return false}if(!v){l="NO text found for translation";if(F==="TEXTAREA"){e(w).val(o+l)}else{if(F==="P"){e(w).text(o+l)}}H.warn("\nno text found for translation");return false}if(this.settings.formality!="default"){if(!(h.indexOf(this.settings.target_lang)>-1)){H.warn("\nwrong language found for formality setting: "+this.settings.target_lang)}this.settings.formality=(h.indexOf(this.settings.target_lang)>-1)?this.settings.formality:"default"}if(this.settings.tag_handling){var z=this.settings.tag_handling;this.settings.tag_handling=(r.indexOf(this.settings.tag_handling)>-1)?this.settings.tag_handling:false;if(this.settings.tag_handling){this.settings.non_splitting_tags=this.settings.non_splitting_tags?encodeURIComponent(this.settings.non_splitting_tags):false;this.settings.splitting_tags=this.settings.splitting_tags?encodeURIComponent(this.settings.splitting_tags):false;this.settings.ignore_tags=this.settings.ignore_tags?encodeURIComponent(this.settings.ignore_tags):false}else{H.error("\ninvalid option found for tag handling : "+z);H.warn("\ndisable option: tag_handling");if(this.settings.non_splitting_tags){H.warn("\ndisable option: "+this.settings.non_splitting_tags);this.settings.non_splitting_tags=false}if(this.settings.splitting_tags){H.warn("\ndisable option : "+this.settings.splitting_tags);this.settings.splitting_tags=false}if(this.settings.ignore_tags){H.warn("\ndisable option: "+this.settings.ignore_tags);this.settings.ignore_tags=false}}}else{if(this.settings.non_splitting_tags){H.warn("\ninvalid option found: "+this.settings.non_splitting_tags);this.settings.non_splitting_tags=false}if(this.settings.splitting_tags){H.warn("\ninvalid option found: "+this.settings.splitting_tags);this.settings.splitting_tags=false}if(this.settings.ignore_tags){H.warn("\ninvalid option found: "+this.settings.ignore_tags);this.settings.ignore_tags=false}}k="auth_key="+this.settings.auth_key;k+=(this.settings.source_lang!="auto")?"&source_lang="+this.settings.source_lang:"";k+="&target_lang="+this.settings.target_lang;k+=(this.settings.formality!="default")?"&formality="+this.settings.formality:"";k+=(this.settings.split_sentences)?"&split_sentences="+this.settings.formality:"";k+=(this.settings.tag_handling)?"&tag_handling="+this.settings.tag_handling:"&tag_handling=0";k+=(this.settings.tag_handling&&this.settings.non_splitting_tags)?"&non_splitting_tags="+this.settings.non_splitting_tags:"";k+=(this.settings.tag_handling&&this.settings.splitting_tags)?"&splitting_tags="+this.settings.splitting_tags:"";k+=(this.settings.tag_handling&&this.settings.ignore_tags)?"&ignore_tags="+this.settings.ignore_tags:"";k+=p;this.xhr.send(k)}});e.fn[d]=function(i){var h=arguments;if(i===g||typeof i==="object"){return this.each(function(){if(!e.data(this,"plugin_"+d)){e.data(this,"plugin_"+d,new b(this,i))}})}else{if(typeof i==="string"&&i[0]!=="_"&&i!=="init"){var j;this.each(function(){var k=e.data(this,"plugin_"+d);if(k instanceof b&&typeof k[i]==="function"){j=k[i].apply(k,Array.prototype.slice.call(h,1))}if(i==="destroy"){e.data(this,"plugin_"+d,null)}});return j!==g?j:this}}}})(jQuery,window,document);
@@ -11,6 +11,9 @@
11
11
  # J1 Template is licensed under the MIT License.
12
12
  # For details, see https://jekyll.one
13
13
  # -----------------------------------------------------------------------------
14
+ # NOTE: Based on https://github.com/jquery-boilerplate/jquery-boilerplate
15
+ # See: https://www.dotnetcurry.com/jquery/1069/authoring-jquery-plugins
16
+ # -----------------------------------------------------------------------------
14
17
  */
15
18
 
16
19
  // the semi-colon before function invocation is a SAFETY method against
data/lib/j1/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module J1
2
- VERSION = '2021.2.2'
3
- end
1
+ module J1
2
+ VERSION = '2021.2.3'
3
+ end
@@ -53,7 +53,7 @@ gem 'jekyll', '~> 4.2'
53
53
 
54
54
  # Theme Rubies, default: J1 Template (NOT used for the development system)
55
55
  #
56
- gem 'j1-template', '~> 2021.2.2'
56
+ gem 'j1-template', '~> 2021.2.3'
57
57
 
58
58
  # ------------------------------------------------------------------------------
59
59
  # PRODUCTION: Gem needed for the Jekyll and J1 prod environment
@@ -53,7 +53,7 @@ environment: development
53
53
  # ------------------------------------------------------------------------------
54
54
  # Sets the build version of J1 Template Gem
55
55
  #
56
- version: 2021.2.2
56
+ version: 2021.2.3
57
57
 
58
58
  # version
59
59
  # ------------------------------------------------------------------------------
@@ -370,7 +370,7 @@ resources:
370
370
  modules/jquery/js/jquery,
371
371
  modules/jquery/js/jqueryUI,
372
372
  modules/popper/js/popper,
373
- core/js/template
373
+ core/js/template
374
374
  ]
375
375
  init_function: [ j1.init ]
376
376
 
@@ -1326,5 +1326,27 @@ resources:
1326
1326
  js: [ modules/j1Scroll/js/j1scroll ]
1327
1327
  init_function: [ j1.adapter.j1Scroll.init ]
1328
1328
 
1329
+ # ----------------------------------------------------------------------------
1330
+ # j1Deepl
1331
+ # NOTE: https://github.com/jquery-boilerplate/jquery-boilerplate
1332
+ #
1333
+ - name: j1Deepl
1334
+ resource:
1335
+ id: j1deepl
1336
+ enabled: true
1337
+ comment: j1Deepl
1338
+ region: head
1339
+ layout: [ home, page, post, collection, blog_archive ]
1340
+ required: ondemand # always | ondemand
1341
+ preload: false # property currently unused
1342
+ script_load: defer
1343
+ dependencies: false
1344
+ pass_init_data: false
1345
+ data:
1346
+ css: []
1347
+ files: []
1348
+ js: [ modules/j1Deepl/js/j1deepl ]
1349
+ init_function: []
1350
+
1329
1351
  # ------------------------------------------------------------------------------
1330
1352
  # END config
@@ -428,7 +428,7 @@ end::tables[]
428
428
  // -----------------------------------------------------------------------------
429
429
  tag::products[]
430
430
  :j1--license: MIT License
431
- :j1--version: 2021.2.2
431
+ :j1--version: 2021.2.3
432
432
  :j1--site-name: Jekyll One
433
433
  end::products[]
434
434
 
@@ -364,6 +364,6 @@ end
364
364
 
365
365
  module Jekyll
366
366
  module J1LunrSearch
367
- VERSION = '2021.2.2'
367
+ VERSION = '2021.2.3'
368
368
  end
369
369
  end
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "j1_starter",
4
- "version": "2021.2.2",
4
+ "version": "2021.2.3",
5
5
  "description": "J1 Template Starter Web",
6
6
  "homepage": "https://your.site",
7
7
  "author": {
@@ -141,7 +141,7 @@
141
141
  "if-env": "^1.0.4",
142
142
  "j1-cli": "^2019.0.3",
143
143
  "npm-delay": "^1.0.4",
144
- "opn-cli": "^3.1.0"
144
+ "opn-cli": "^5.0.0"
145
145
  },
146
146
  "devDependencies": {
147
147
  "cross-env": "^7.0.3",
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  layout: page
3
- title: Creators Blog
4
- tagline: articles by category
3
+ title: Disruptors Blog
4
+ tagline: artikel nach kategorie
5
5
  date: 2023-01-01 01:00:00 +100
6
- description: >
7
- articles by category
6
+ description: Artikel nach Kategorie
8
7
 
9
8
  categories: [ Blog ]
10
9
  tags: [ Navigator, Categories ]
@@ -24,7 +23,7 @@ comments: false
24
23
  exclude_from_search: true
25
24
  regenerate: true
26
25
 
27
- resources: []
26
+ resources: [ animate ]
28
27
  resource_options:
29
28
  - attic:
30
29
  padding_top: 400
@@ -221,22 +220,22 @@ site_category_word_list: {{site_category_word_list | debug}}
221
220
 
222
221
  {% if post.date %}
223
222
  {% if language == "en" %}
224
- <i class="mdi mdi-calendar-blank md-grey-900 mr-1"></i>{{post.date | localize: "%Y %B, %e"}}
223
+ <i class="mdi mdi-calendar-blank md-grey-600 mr-1"></i>{{post.date | localize: "%Y %B, %e"}}
225
224
  {% endif %}
226
225
  {% if language == "de" %}
227
- <i class="mdi mdi-calendar-blank md-grey-900 mr-1"></i>{{post.date | localize: "%-d. %B %Y"}}
226
+ <i class="mdi mdi-calendar-blank md-grey-600 mr-1"></i>{{post.date | localize: "%-d. %B %Y"}}
228
227
  {% endif %}
229
228
  {% endif %}
230
229
  {% if likes_count %}
231
230
  <span class="font-weight-bold"> · </span>
232
- <i class="mdi mdi-heart md-grey-900 mr-1"></i> {{likes_count}}
231
+ <i class="mdi mdi-heart mr-1"></i> {{likes_count}}
233
232
  {% endif %}
234
233
  {% if comment_count %}
235
234
  <span class="font-weight-bold"> · </span>
236
- <i class="mdi mdi-comment md-grey-900 mr-1"></i> {{comment_count}}
235
+ <i class="mdi mdi-comment mr-1"></i> {{comment_count}}
237
236
  {% endif %}
238
237
  </div>
239
- <a class="card-link md-grey-900 text-lowercase"
238
+ <a class="card-link text-muted text-lowercase"
240
239
  href="{{post.url}}#readmore">
241
240
  {{readmore_text}} · {{post.tagline}}
242
241
  </a>
@@ -248,25 +247,3 @@ site_category_word_list: {{site_category_word_list | debug}}
248
247
  {% endfor %}
249
248
  {% endfor %}
250
249
  </div>
251
-
252
- <!-- [INFO ] [j1.page.{{page.title}} ] [Save the current page to cookieUserState cookie: {{browser_page_url}}] -->
253
- {% comment %} Update cookie for lastpage
254
- -------------------------------------------------------------------------------- {% endcomment %}
255
- <script>
256
- function setLastPage() {
257
- var logger = log4javascript.getLogger('j1.BlogNavigator');
258
- var cookie_names = j1.getCookieNames();
259
- const user_state_cookie_name = cookie_names.user_session;
260
- var user_state = j1.readCookie(user_state_cookie_name);
261
- var user_state_last_page = "{{browser_page_url}}";
262
- user_state.last_page = user_state_last_page;
263
-
264
- j1.writeCookie({
265
- name: user_state_cookie_name,
266
- data: user_state,
267
- samesite: 'Strict'
268
- });
269
- logger.info('Saved current Post Browser page to cookie: {{browser_page_url}}');
270
- }
271
- window.onload = setLastPage();
272
- </script>
@@ -237,25 +237,3 @@ site_category_word_list: {{site_category_word_list | debug}}
237
237
  {{closeList}}
238
238
 
239
239
  </div>
240
-
241
- <!-- [INFO ] [j1.page.{{page.title}} ] [Save the current page to cookieUserState cookie: {{browser_page_url}}] -->
242
- {% comment %} Update cookie for lastpage
243
- -------------------------------------------------------------------------------- {% endcomment %}
244
- <script type="text/javascript">
245
- function setLastPage() {
246
- var logger = log4javascript.getLogger('j1.BlogNavigator');
247
- var cookie_names = j1.getCookieNames();
248
- const user_state_cookie_name = cookie_names.user_session;
249
- var user_state = j1.readCookie(user_state_cookie_name);
250
- var user_state_last_page = "{{browser_page_url}}";
251
- user_state.last_page = user_state_last_page;
252
-
253
- j1.writeCookie({
254
- name: user_state_cookie_name,
255
- data: user_state,
256
- samesite: 'Strict'
257
- });
258
- logger.info('Saved current Post Browser page to cookie: {{browser_page_url}}');
259
- }
260
- window.onload = setLastPage();
261
- </script>