Skip to content

Commit eccfb50

Browse files
committed
v.2.0.0
- Добавлена возможность ведения наглядного лог-файла. - Добавлена защита от прямого вызова файла. - Компилятор теперь выполняется только под админом, в целях экономии ресурсов. - Мелкие исправления.
1 parent 3c9e045 commit eccfb50

File tree

2 files changed

+197
-80
lines changed

2 files changed

+197
-80
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
LessForDle
1+
LessForBitrix
22
===================
33

44
LessForBitrix - примочка для подключения класса phpless в шаблон bitrix.
@@ -14,14 +14,15 @@ LessForBitrix - примочка для подключения класса phpl
1414

1515
Для чего это?
1616
-------------------
17-
* Для нормального использования LESS при вёрстке под Bitrix
17+
* Для нормального использования LESS при вёрстке под Bitrix.
1818
* И как следствие - для удобной, быстрой и эффективной разработки сайта.
1919

2020
Возможности:
2121
-------------------
2222
* Автоматическая компиляция less при изменении файла, при этом отслеживаются изменения и в импортированных файлах.
2323
* Сжатие выходного css-файла (с возможностью отключать сжатие)
2424
* Вывод ошибок компиляции.
25+
* Ведение наглядного лога с временем выполнения компиляции.
2526

2627
Установка:
2728
-------------------
@@ -33,4 +34,5 @@ LessForBitrix - примочка для подключения класса phpl
3334
* По умолчанию подключается файл template_styles.less текущего шаблона сайта.
3435
* При компиляции рядом записывается одноимённый css-файл (который и используется в bitrix по умолчанию).
3536
* При возникновении ошибок - они будут выведены в начале страницы, а компиляция не произойдёт.
37+
* Компиляция выполняется только если пользователь - админ, это сделано для снижения нагрузки т.к. компилятор расходует оперативу неплохо, да и нет смысла его дёргать каждый раз для каждого юзера.
3638
* Все настройки (если они нужны) в файле less/less.php

YOUR_TEMPLATE/less/less.php

Lines changed: 193 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,194 @@
1-
<?php
2-
/**
3-
* ===============================================================
4-
* LessForBitrix - примочка для подключения класса phpless в шаблон bitrix
5-
* Примочка писалась для своих нужд и для удобства разработки.
6-
* Что эта хрень умеет делать:
7-
* - Автоматическая компиляция less при изменении файла, при этом отслеживаются изменения и в импортированных файлах.
8-
* - Сжатие выходного css-файла (с возможностью отключать сжатие).
9-
* - Вывод ошибок компиляции (особо не проверял какие ошибки выводятся, но если будет явный косяк - класс скажет в какой строке искать и не станет делать компиляцию, но может и не точно сказать т.к. защиты от кривых рук там нет).
10-
* ===============================================================
11-
* Файл: less.php
12-
* ---------------------------------------------------------------
13-
* Версия: 1.1.0 (30.04.2013)
14-
* ===============================================================
15-
*
16-
* Использование:
17-
* ---------------------------------------------------------------
18-
* Где нибудь в начале header.php прописать:
19-
<?require_once('less/less.php');?>
20-
*
21-
* По умолчанию подключается файл template_styles.less текущего шаблона сайта.
22-
* туда же записывается одноимённый css-файл (который и используется в bitrix).
23-
* Все настройки чуть ниже.
24-
*/
25-
26-
27-
// Определяем входящий и выходящий файлы и определяем сжимать или нет выходящий файл.
28-
$inputFile = $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH."/template_styles.less"; //Файл template_styles.less, лежащий в текущем шаблоне сайта
29-
$outputFile = str_ireplace('.less', '.css', $inputFile); //Файл template_styles.css - который подключается к шаблону
30-
$normal = false; // true для отключения сжатия.
31-
32-
// Выполняем функцию компиляции
33-
try {
34-
autoCompileLess($inputFile, $outputFile, $normal);
35-
} catch (exception $e) {
36-
// Если что-то пошло не так - скажем об этом пользователю.
37-
echo '<div style="text-align: center; background: #fff; color: red; padding: 5px;">Less error: '.$e->getMessage().'</div>';
38-
}
39-
40-
/**
41-
* Функция автокомпиляции less, запускается даже если изменён импортированный файл - очень удобно.
42-
* функция взята из документации к классу.
43-
* @param string $inpFile - входной файл (в котором могут быть и импортированные файлы)
44-
* @param string $outFile - выходной файл
45-
* @param string $nocompress - отключает сжатие выходного файла
46-
* @return file
47-
*/
48-
function autoCompileLess($inpFile, $outFile, $nocompress = false) {
49-
50-
$cacheFile = $inpFile.".cache";
51-
52-
if (file_exists($cacheFile)) {
53-
$cache = unserialize(file_get_contents($cacheFile));
54-
} else {
55-
$cache = $inpFile;
56-
}
57-
58-
// Подключаем класс для компиляции less
59-
require "lessphp.class.php";
60-
$less = new lessc;
61-
if ($nocompress) {
62-
// Если запрещено сжатие - форматируем по нормальному с табами вместо пробелов.
63-
$formatter = new lessc_formatter_classic;
64-
$formatter->indentChar = "\t";
65-
$less->setFormatter($formatter);
66-
} else {
67-
// Иначе сжимаем всё в одну строку.
68-
$less->setFormatter('compressed');
69-
}
70-
71-
$newCache = $less->cachedCompile($cache);
72-
73-
if (!is_array($cache) || $newCache["updated"] > $cache["updated"]) {
74-
file_put_contents($cacheFile, serialize($newCache));
75-
file_put_contents($outFile, $newCache['compiled']);
76-
}
77-
}
78-
1+
<?php
2+
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
3+
global $USER;
4+
if (!$USER->IsAdmin()) return;
5+
6+
/**
7+
* ===============================================================
8+
* LessForBitrix - примочка для подключения класса phpless в шаблон bitrix
9+
* Примочка писалась для своих нужд и для удобства разработки.
10+
* Что эта хрень умеет делать:
11+
* - Автоматическая компиляция less при изменении файла, при этом отслеживаются изменения и в импортированных файлах.
12+
* - Сжатие выходного css-файла (с возможностью отключать сжатие).
13+
* - Вывод ошибок компиляции (особо не проверял какие ошибки выводятся, но если будет явный косяк - класс скажет в какой строке искать и не станет делать компиляцию, но может и не точно сказать т.к. защиты от кривых рук там нет).
14+
* - Ведение наглядного лога
15+
* ===============================================================
16+
* Файл: less.php
17+
* ---------------------------------------------------------------
18+
* Версия: 2.0.0 (19.06.2013)
19+
* ===============================================================
20+
*
21+
* Использование:
22+
* ---------------------------------------------------------------
23+
* Где нибудь в начале header.php прописать:
24+
<?require_once('less/less.php');?>
25+
*
26+
* По умолчанию подключается файл template_styles.less текущего шаблона сайта.
27+
* туда же записывается одноимённый css-файл (который и используется в bitrix).
28+
* Все настройки чуть ниже.
29+
* ===============================================================
30+
*/
31+
32+
33+
/**
34+
* Настройки компиляции
35+
*/
36+
37+
// Ведение лог-файла
38+
$lessLog = false; // Вести лог-файл с отображением времени выполнения компиляции. true включит ведение лога.
39+
$lessFileSize = '15'; // максимальный размер файла лога, в килобайтах (если размер файла будет больше, он удалится).
40+
$lessLogFile = 'less-log'; // Имя лог-файла. Файл является html-страницей и записывается в корень сайта.
41+
42+
// Определяем входящий и выходящий файлы и определяем сжимать или нет выходящий файл.
43+
$inputFile = $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH."/template_styles.less"; // Файл template_styles.less, лежащий в текущем шаблоне сайта
44+
$outputFile = str_ireplace('.less', '.css', $inputFile); // Файл template_styles.css - который подключается к шаблону
45+
$normal = false; // true для отключения сжатия выходящего файла.
46+
47+
48+
/**
49+
* Конец настроек
50+
*/
51+
// Если включено логирование - "запускаем счётчик времени".
52+
if($lessLog) {
53+
$timeStart = microtime(true);
54+
}
55+
56+
57+
// Выполняем функцию компиляции
58+
try {
59+
autoCompileLess($inputFile, $outputFile, $normal);
60+
} catch (exception $e) {
61+
// Если что-то пошло не так - скажем об этом пользователю.
62+
echo '<div style="text-align: center; background: #fff; color: red; padding: 5px;">Less error: '.$e->getMessage().'</div>';
63+
}
64+
65+
// Если разрешено, то пишем лог-файл с временем выполнения компиляции less-файлов :)
66+
if($lessLog) {
67+
$timeStop = microtime(true);
68+
$lessLog = round(($timeStop - $timeStart), 6);
69+
$textColor = ($lessLog > '0.001') ? 'red' : 'green';
70+
$mem_usg = '';
71+
$lessLogFile = $_SERVER['DOCUMENT_ROOT'].'/'.$lessLogFile.'.html';
72+
if(function_exists("memory_get_peak_usage")) $mem_usg = round(memory_get_peak_usage()/(1024*1024),2)."Мб";
73+
if ((file_exists($lessLogFile) && filesize($lessLogFile) > $lessFileSize*1024)) {
74+
unlink($lessLogFile);
75+
}
76+
if (!file_exists($lessLogFile)) {
77+
$cLessFile = fopen($lessLogFile, "wb");
78+
$firstText = "
79+
<!DOCTYPE html>
80+
<html lang='ru'>
81+
<head>
82+
<title>Лог времени выполнения компиляции LESS</title>
83+
<meta charset='".LANG_CHARSET."'>
84+
<style>
85+
a {display: inline-block;margin-bottom: 5px;}
86+
.red {color: red;}
87+
.green {color: green;}
88+
table {margin: 50px auto; border-collapse: collapse;border: solid 1px #ccc; font: normal 14px Arial, Helvetica, sans-serif;}
89+
th b {cursor: help; color: #c00;}
90+
td {text-align: right;}
91+
th, td {font-size: 12px; border: solid 1px #ccc; padding: 5px 8px;}
92+
td:first-child {text-align: left;}
93+
tr:hover {background: #f0f0f0; color: #1d1d1d;}
94+
</style>
95+
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>
96+
<script>
97+
// Скрипт посчета среднего значения
98+
$.fn.getZnach = function (prop) {
99+
var options = $.extend({
100+
source: 'с',
101+
ins: '',
102+
quant: '5'
103+
}, prop);
104+
105+
var summ = 0;
106+
this.each(function (i) {
107+
summ += +($(this).text().replace(/,/, '.').replace(options.source, ''));
108+
});
109+
$(options.ins).append('<br /><b title=\"Cреднее значение\">' + (summ / this.length).toFixed(options.quant) + options.source + '</b>');
110+
}
111+
// Инициализация скрипта
112+
jQuery(function ($) {
113+
$('td.timer').getZnach({
114+
ins: 'th.timer'
115+
});
116+
$('td.mem_usg').getZnach({
117+
source: 'Мб',
118+
ins: 'th.mem_usg',
119+
quant: '2'
120+
});
121+
});
122+
</script>
123+
</head>
124+
<body>
125+
<table class='stattable'>
126+
<tr>
127+
<th scope='col' class='queries'>Дата записи</th>
128+
<th scope='col' class='timer'>Вемя выполнения компилятора</th>
129+
<th scope='col' class='mem_usg'>Затраты памяти</th>
130+
</tr>
131+
\r\n</table></body></html>";
132+
fwrite($cLessFile, $firstText);
133+
fclose($cLessFile);
134+
135+
} else {
136+
$cLessFileArr = file($lessLogFile);
137+
$lastLine = array_pop($cLessFileArr);
138+
$newText = implode("", $cLessFileArr);
139+
140+
$newTextAdd = "добавляем строку, не спрашивайте, так надо!\r\n";
141+
$newTextAdd = "
142+
<tr>
143+
<td class='queries'>".date('Y-m-d H:i:s')."</td>
144+
<td class='timer ".$textColor."'><b>".$lessLog."с</b></td>
145+
<td class='mem_usg'>".$mem_usg."</td>
146+
</tr>\r\n";
147+
148+
$cLessFile = fopen($lessLogFile, "w");
149+
150+
fwrite($cLessFile, $newText.$newTextAdd.$lastLine);
151+
fclose($cLessFile);
152+
}
153+
}
154+
155+
/**
156+
* Функция автокомпиляции less, запускается даже если изменён импортированный файл - очень удобно.
157+
* функция взята из документации к классу и на просторах интернета.
158+
* @param string $inpFile - входной файл (в котором могут быть и импортированные файлы)
159+
* @param string $outFile - выходной файл
160+
* @param string $nocompress - отключает сжатие выходного файла
161+
* @return file
162+
*/
163+
function autoCompileLess($inpFile, $outFile, $nocompress = false) {
164+
165+
$cacheFile = $inpFile.".cache";
166+
167+
if (file_exists($cacheFile)) {
168+
$cache = unserialize(file_get_contents($cacheFile));
169+
} else {
170+
$cache = $inpFile;
171+
}
172+
173+
// Подключаем класс для компиляции less
174+
require "lessphp.class.php";
175+
$less = new lessc;
176+
if ($nocompress) {
177+
// Если запрещено сжатие - форматируем по нормальному с табами вместо пробелов.
178+
$formatter = new lessc_formatter_classic;
179+
$formatter->indentChar = "\t";
180+
$less->setFormatter($formatter);
181+
} else {
182+
// Иначе сжимаем всё в одну строку.
183+
$less->setFormatter('compressed');
184+
}
185+
186+
$newCache = $less->cachedCompile($cache);
187+
188+
if (!is_array($cache) || $newCache["updated"] > $cache["updated"]) {
189+
file_put_contents($cacheFile, serialize($newCache));
190+
file_put_contents($outFile, $newCache['compiled']);
191+
}
192+
}
193+
79194
?>

0 commit comments

Comments
 (0)