Passed
Push — master ( 4e9ce4...688eec )
by Jean-Christophe
03:36
created

JsUtilsInternalTrait   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Importance

Changes 6
Bugs 1 Features 1
Metric Value
eloc 42
c 6
b 1
f 1
dl 0
loc 107
rs 10
wmc 17

12 Methods

Rating   Name   Duplication   Size   Complexity  
A _compileLibrary() 0 5 3
A ready() 0 4 1
A addToCompile() 0 2 1
A onNonce() 0 1 1
A minify() 0 23 2
A defer() 0 4 1
A conflict() 0 2 1
A _addToCompile() 0 2 1
A _open_script() 0 8 3
A getNonce() 0 2 1
A generateNonce() 0 3 1
A _close_script() 0 2 1
1
<?php
2
namespace Ajax\common\traits;
3
4
use Ajax\common\BaseGui;
5
6
trait JsUtilsInternalTrait {
7
8
	protected $jquery_code_for_compile = array();
9
10
	protected $jquery_code_for_compile_at_last = array();
11
	
12
	protected $nonce;
13
14
	protected function _addToCompile($jsScript) {
15
		$this->jquery_code_for_compile[] = $jsScript;
16
	}
17
18
	/**
19
	 *
20
	 * @param BaseGui $library
21
	 * @param mixed $view
22
	 */
23
	protected function _compileLibrary(BaseGui $library, &$view = NULL) {
24
		if (isset($view))
25
			$library->compileHtml($this, $view);
26
		if ($library->isAutoCompile()) {
27
			$library->compile(true);
28
		}
29
	}
30
31
	protected function defer($script) {
32
		$result = "window.defer=function (method) {if (window.jQuery) method(); else setTimeout(function() { defer(method) }, 50);};";
33
		$result .= "window.defer(function(){" . $script . "})";
34
		return $result;
35
	}
36
37
	protected function ready($script) {
38
		$result = '$(document).ready(function() {' . "\n";
39
		$result .= $script . '})';
40
		return $result;
41
	}
42
43
	protected function minify($input) {
44
		if (trim($input) === "")
45
			return $input;
46
		$input = preg_replace(array(
47
			// Remove comment(s)
48
			'#\s*("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')\s*|\s*\/\*(?!\!|@cc_on)(?>[\s\S]*?\*\/)\s*|\s*(?<![\:\=])\/\/.*(?=[\n\r]|$)|^\s*|\s*$#',
49
			// Remove white-space(s) outside the string and regex
50
			'#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/)|\/(?!\/)[^\n\r]*?\/(?=[\s.,;]|[gimuy]|$))|\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#s',
51
			// Remove the last semicolon
52
			// '#;+\}#',
53
			// Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}`
54
			'#([\{,])([\'])(\d+|[a-z_][a-z0-9_]*)\2(?=\:)#i',
55
			// --ibid. From `foo['bar']` to `foo.bar`
56
			'#([a-z0-9_\)\]])\[([\'"])([a-z_][a-z0-9_]*)\2\]#i'
57
		), array(
58
			'$1',
59
			'$1$2',
60
			// '}',
61
			'$1$3',
62
			'$1.$3'
63
		), $input);
64
		$input = str_replace("}$", "};$", $input);
65
		return $input;
66
	}
67
68
	/**
69
	 * Outputs an opening <script>
70
	 *
71
	 * @param string $src
72
	 * @return string
73
	 */
74
	protected function _open_script($src = '') {
75
		$str = '<script ';
76
		if(isset($this->params['nonce'])){
77
			$str.=' nonce="'.$this->generateNonce($this->params['nonce']).'" ';
78
			$this->onNonce();
79
		}
80
		$str .= ($src == '') ? '>' : ' src="' . $src . '">';
81
		return $str;
82
	}
83
	
84
	protected function onNonce(){
85
		
86
	}
87
	
88
	protected function generateNonce($value=null): string {
89
		$bytes = \random_bytes((int) ($value ?? 32));
90
		return $this->nonce=\base64_encode($bytes);
91
	}
92
	
93
	public function getNonce(){
94
		return $this->nonce;
95
	}
96
97
	/**
98
	 * Outputs an closing </script>
99
	 *
100
	 * @param string $extra
101
	 * @return string
102
	 */
103
	protected function _close_script($extra = "\n") {
104
		return "</script>$extra";
105
	}
106
107
	protected function conflict() {
108
		$this->_addToCompile("var btn = $.fn.button.noConflict();$.fn.btn = btn;");
109
	}
110
111
	public function addToCompile($jsScript) {
112
		$this->_addToCompile($jsScript);
113
	}
114
}
115