DEV: Незначительные измененеия
This commit is contained in:
parent
3f8de724e9
commit
477efebed9
|
@ -2,10 +2,11 @@
|
|||
|
||||
namespace App\Controllers;
|
||||
|
||||
use Hleb\Scheme\App\Controllers\MainController;
|
||||
use Hleb\Constructor\Handlers\Request;
|
||||
use Data, Content, Translate;
|
||||
use Data, Content;
|
||||
|
||||
class ArticleController extends \MainController
|
||||
class ArticleController extends MainController
|
||||
{
|
||||
public function index($slug)
|
||||
{
|
||||
|
@ -14,26 +15,25 @@ class ArticleController extends \MainController
|
|||
}
|
||||
|
||||
Data::lang($lang);
|
||||
|
||||
|
||||
if (!$file = 'files/' . $lang . '/' . $slug . '.md') {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$contents = Content::text($file);
|
||||
|
||||
|
||||
preg_match_all("/<h1>(.*?)<\/h1>/", $contents, $matches);
|
||||
$title = $matches[1][0];
|
||||
|
||||
$telo = explode("\n", $contents);
|
||||
$desc = strip_tags($telo[1]);
|
||||
|
||||
|
||||
$cnt = Content::headings($contents, $lang, $slug);
|
||||
$head = $cnt['head'];
|
||||
if ($slug == 'welcome') {
|
||||
$head = false;
|
||||
$head = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Request::getResources()->addBottomStyles('/assets/js/prism/prism.css');
|
||||
Request::getResources()->addBottomScript('/assets/js/prism/prism.js');
|
||||
|
||||
|
@ -49,9 +49,5 @@ class ArticleController extends \MainController
|
|||
],
|
||||
],
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -2,13 +2,14 @@
|
|||
|
||||
namespace App\Controllers;
|
||||
|
||||
use Hleb\Scheme\App\Controllers\MainController;
|
||||
use Translate;
|
||||
|
||||
class HomeController extends \MainController
|
||||
class HomeController extends MainController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view(
|
||||
return view(
|
||||
'/index',
|
||||
[
|
||||
'title' => Translate::get('index.title'),
|
||||
|
@ -18,6 +19,4 @@ class HomeController extends \MainController
|
|||
],
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
<?php
|
||||
|
||||
use App\Models\ContentModel;
|
||||
|
||||
class Content
|
||||
{
|
||||
public static function text($path)
|
||||
{
|
||||
if (!$path) {
|
||||
if (!$path) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$content = file_get_contents(HLEB_DIR . $path);
|
||||
|
||||
return self::parser($content, 'text');
|
||||
|
@ -24,15 +22,17 @@ class Content
|
|||
if ($type == 'text') {
|
||||
return $Parsedown->text($content);
|
||||
}
|
||||
|
||||
|
||||
return $Parsedown->line($content);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Parsedown
|
||||
public static function headings($html_string, $lang, $slug)
|
||||
public static function headings($html_string, $lang, $slug)
|
||||
{
|
||||
// Let's make at least 1 h1, h2... heading, mandatory
|
||||
if (!preg_match_all('#<h([1-5])>(.*?)</h[1-5]>#', $html_string, $resultats)) {return;}
|
||||
if (!preg_match_all('#<h([1-5])>(.*?)</h[1-5]>#', $html_string, $resultats)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$base = '/' . $lang . '/';
|
||||
$from = $to = array();
|
||||
|
@ -44,18 +44,17 @@ class Content
|
|||
$header = preg_replace('#\s+#', ' ', trim(rtrim($header, ':!.?;')));
|
||||
$anchor = str_replace(' ', '-', $header);
|
||||
$header = "<a href=\"{$base}/{$slug}#{$anchor}\">{$header}</a>";
|
||||
|
||||
|
||||
if ($depth > 0) {
|
||||
if ($resultats[1][$i] > $depth) {
|
||||
while ($resultats[1][$i] > $depth) {
|
||||
$head .= '<ul>';
|
||||
$depth ++;
|
||||
$depth++;
|
||||
}
|
||||
}
|
||||
elseif ($resultats[1][$i] < $depth) {
|
||||
} elseif ($resultats[1][$i] < $depth) {
|
||||
while ($resultats[1][$i] < $depth) {
|
||||
$head .= '</ul>';
|
||||
$depth --;
|
||||
$depth--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,17 +63,17 @@ class Content
|
|||
$start = $depth;
|
||||
}
|
||||
$head .= '<li>' . $header . '</li>';
|
||||
|
||||
|
||||
$from[$i] = $resultats[0][$i];
|
||||
$to[$i] = '<a class="anchor" name="' . $anchor . '">' . $resultats[0][$i] . '</a>';
|
||||
}
|
||||
// Closing all open lists
|
||||
for ($i = 0; $i <= ($depth - $start); $i ++) {
|
||||
for ($i = 0; $i <= ($depth - $start); $i++) {
|
||||
$head .= "</ul>";
|
||||
}
|
||||
// Adding Anchors to Headings
|
||||
$text = str_replace($from, $to, $html_string);
|
||||
|
||||
|
||||
return $data = ['head' => $head, 'text' => $text];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,14 +5,15 @@ class Data
|
|||
{
|
||||
const LANG = ['ru', 'en'];
|
||||
const DEFAULT_LANG = ['ru', 'en'];
|
||||
|
||||
|
||||
const NAME = 'LibArea';
|
||||
|
||||
const LOGO_BIG = '<img class="logo" alt="LibArea" src="/assets/images/LibArea_limpid.png">';
|
||||
const LOGO_SMALL = '<a title="LibArea" href="/">LibArea</a>';
|
||||
|
||||
|
||||
public static function lang($lang = 'ru'){
|
||||
|
||||
|
||||
public static function lang($lang = 'ru')
|
||||
{
|
||||
$lang = $lang ?? self::DEFAULT_LANG;
|
||||
Translate::setLang($lang);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
# How to add counter code?
|
||||
|
||||
*Documentation under development ...*
|
||||
|
||||
—> [**Go to home page**](/ru/)
|
|
@ -2,4 +2,6 @@
|
|||
|
||||
We welcome minimalism and try to follow this concept on the website as well.
|
||||
|
||||
*Documentation under development ...*
|
||||
*Documentation under development ...*
|
||||
|
||||
—> [**Go to home page**](/ru/)
|
|
@ -4,11 +4,12 @@ We welcome minimalism and try to follow this concept on the website as well.
|
|||
|
||||
Easy and fast. Server side: php + mysql
|
||||
|
||||
|
||||
![LibArea](/assets/images/libarea-home.jpg)
|
||||
|
||||
Currently, Agouti fully supports localization in English, Romanian and Russian logicalization. Work on other languages continues.
|
||||
|
||||
A demo is available on the Agouti website (in Russian): https://libarea.ru
|
||||
|
||||
GitHub: https://github.com/LibArea
|
||||
|
||||
*Documentation under development ...*
|
|
@ -1,43 +0,0 @@
|
|||
# Философия сайта
|
||||
Мы приветствуем минимализм и стараемся следовать этой концепции и на сайте.
|
||||
|
||||
Средний размер файла и «вес» веб-сайтов стали немного смешными. В апреле 2016 года [было отмечено](https://mobiforge.com/research-analysis/the-web-is-doom), что средняя страница теперь больше, чем в игре DOOM.
|
||||
|
||||
Это не дело!
|
||||
|
||||
## Минимальный javascript - не переворачивайте веб-пирамиду
|
||||
|
||||
Существует концепция «пирамиды», которая использовалась много лет, когда люди говорят о строительстве для Интернета. Обычно он показывает прочную основу HTML, слой CSS, а вершиной пирамиды является javascript.
|
||||
|
||||
![Пирамида html, css и js](/uploads/content/html-css-js.jpeg)
|
||||
|
||||
Однако современная веб-разработка фактически перевернула эту пирамиду с ног на голову. Для клиентского javascript стало стандартом доставлять и даже генерировать HTML и CSS. Многие базовые текстовые сайты (например, блоги) больше ничего не отображают без javascript.
|
||||
|
||||
Мы считаю, что полагаться на javascript на этом уровне - принципиально неправильный подход к сети, поэтому этот сайт построен «традиционным» способом. Javascript используется как можно меньше и в идеале только тогда, когда это единственный вариант для чего-то. И из-за этого...
|
||||
|
||||
### Полностью функциональный для просмотра без javascript
|
||||
|
||||
Данный сайт всегда будет работоспособен для просмотра без включенного javascript. Кто-то с отключенным javascript должен иметь возможность просматривать все списки на сайте, читать все типы сообщений и так далее.
|
||||
|
||||
Взаимодействие без javascript не будет приоритетом. Некоторые функции могут в конечном итоге не работать естественным образом из-за того, как они реализованы, но мы не будем беспокоиться о том, чтобы сделать такие вещи, как голосование, функциональными, когда javascript отключен.
|
||||
|
||||
### Отсутствие голосов против
|
||||
|
||||
На сайте нет отрицательных голосов ни за темы, ни за комментарии. Причина этого в том, что я считаю, что мы можем реализовать различные механизмы, которые заменят «правильное» использование голосов против, не допуская при этом всех злоупотреблений ими.
|
||||
|
||||
Идеальное использование отрицательного голоса - это общий способ выразить «это не способствует», но на практике они чаще используются как **«я не согласен» или «мне это не нравится»**.
|
||||
|
||||
За качественные публикации часто голосуют против, потому что другие пользователи не согласны с этим мнением, а в сообществах, основанных на вкусе (например, связанных с музыкой), целые категории допустимых публикаций могут оказаться нежизнеспособными, потому что за них просто проголосуют против пользователей с другими вкусами.
|
||||
|
||||
### Какие технологии использует сайт?
|
||||
С технической стороны сайт стремится использовать современные версии простых, надежных, «скучных» технологий. Это особенно важно для проекта с открытым исходным кодом, рассчитывающего на участие извне, поскольку это означает, что людям гораздо легче участвовать.
|
||||
|
||||
Основными технологиями являются php (с использованием веб-фреймворка HLEB), css, html и разметка Markdown.
|
||||
|
||||
> HLEB — это PHP-фреймворк с очень маленьким размером, созданный для разработчиков, которым нужен простой и элегантный инструментарий для создания полнофункциональных веб-приложений.
|
||||
|
||||
[phphleb.ru](https://phphleb.ru/)
|
||||
|
||||
Несколько других систем используются для конкретных нужд.
|
||||
|
||||
*Документация в стадии разработки...*
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Сайт LibArea использует технологию *Content Security Policy*. Чтобы добавить счетчик выполните следующие действия...
|
||||
|
||||
В дириктории: `/views/default/` вашего шаблона создайте файл: `metrica.php`, а в диритории: `/assets/js/` файл `metrica.js`.
|
||||
В дириктории: `/views/default/` вашего шаблона создайте файл: `metrica.php`.
|
||||
|
||||
В подвал (`footer.php` шаблона) вашего сайте подключите файл `metrica.php` следующим образом:
|
||||
|
||||
|
@ -10,34 +10,26 @@
|
|||
<?= Tpl::import('/metrica'); ?>
|
||||
```
|
||||
|
||||
В файле `metriсa.php` необходимо разместить код:
|
||||
В файле `metriсa.php` необходимо разместить код, в данном случае код Яндекс.Счетчика:
|
||||
|
||||
```php
|
||||
<script src="/assets/js/metrica.js"></script>
|
||||
<noscript><div>
|
||||
<noscript>
|
||||
<script nonce="<?= $_SERVER['nonce']; ?>">
|
||||
(function(m,e,t,r,i,k,a){m[i] и т.д.
|
||||
</script>
|
||||
<noscript>
|
||||
<img src="https://mc.yandex.ru/watch/XXXXXX" class="yandex" /></div>
|
||||
</noscript>
|
||||
```
|
||||
|
||||
Заменив XXXXXX на номер своего счетчика.
|
||||
Обратите внимание, что мы добавляем к `script` конструкцию:
|
||||
|
||||
А в файл `metrica.js` добавить:
|
||||
|
||||
```javascript
|
||||
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
|
||||
m[i].l=1*new Date();
|
||||
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,
|
||||
k.src=r,a.parentNode.insertBefore(k,a)})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(XXXXXXXX, "init", {
|
||||
clickmap:true,
|
||||
trackLinks:true,
|
||||
accurateTrackBounce:true
|
||||
});
|
||||
```php
|
||||
nonce="<?= $_SERVER['nonce']; ?>"
|
||||
```
|
||||
|
||||
Где за XXXXXXXX номер вашего счетчика в системе Яндекс.Метрика.
|
||||
Проверьте корректность вашего подключения.
|
||||
|
||||
|
||||
См. более подробно: [ЯндексСправка, Установка счетчика на сайт с CSP](https://yandex.ru/support/metrica/code/install-counter-csp.html)
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
# Философия сайта
|
||||
|
||||
Мы приветствуем минимализм и стараемся следовать этой концепции и на сайте.
|
||||
|
||||
Средний размер файла и «вес» веб-сайтов стали немного смешными. В апреле 2016 года [было отмечено](https://mobiforge.com/research-analysis/the-web-is-doom), что средняя страница теперь больше, чем в игре DOOM.
|
||||
|
|
|
@ -9,8 +9,10 @@ http://libarea.ru
|
|||
В настоящее время LibArea полностью поддерживает локализацию на английском языке, румынскую и русскую логизацию. Работа над другими языками продолжается.
|
||||
|
||||
|
||||
[Философия сайта](./philosophy)
|
||||
* [Философия сайта](./philosophy)
|
||||
|
||||
[Как добавить код счетчика Яндекс.Метрики?](./yandex-metrica)
|
||||
* [Как добавить код счетчика Яндекс.Метрики?](./metrica)
|
||||
|
||||
На GitHub: https://github.com/LibArea
|
||||
|
||||
*Документация в стадии разработки...*
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<div id="contentWrapper" class="wrap">
|
||||
<main>
|
||||
<?= $data['contents']; ?>
|
||||
</main>
|
||||
<?php if($data['headings']) { ?>
|
||||
<?php if($data['headings']) { ?>
|
||||
<?= $data['contents']; ?>
|
||||
</main>
|
||||
<?php if ($data['headings']) { ?>
|
||||
<?php if ($data['headings']) { ?>
|
||||
<aside>
|
||||
<?= $data['headings']; ?>
|
||||
<?= $data['headings']; ?>
|
||||
</aside>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
</div>
|
||||
|
||||
<?= includeTemplate('footer'); ?>
|
||||
<?= includeTemplate('footer'); ?>
|
|
@ -1,4 +1,5 @@
|
|||
</body>
|
||||
<?= getRequestResources()->getBottomStyles(); ?>
|
||||
<?= getRequestResources()->getBottomScripts(); ?>
|
||||
|
||||
</html>
|
|
@ -1,29 +1,34 @@
|
|||
<?php
|
||||
Request::getHead()->addStyles('/assets/css/style.css?1');
|
||||
Request::getResources()->addBottomScript('/assets/js/app.js?1');
|
||||
<?php
|
||||
use Hleb\Constructor\Handlers\Request;
|
||||
Request::getHead()->addStyles('/assets/css/style.css?1');
|
||||
Request::getResources()->addBottomScript('/assets/js/app.js?1');
|
||||
$bg = $type == 'main' ? 'bg' : 'no';
|
||||
$logo = $type == 'main' ? '<div class="p40"></div>' : Data::LOGO_SMALL;
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<meta name="description" content="<?= $desc; ?>" />
|
||||
<meta name="theme-color" content="#ff786c">
|
||||
<?php getRequestHead()->output(); ?>
|
||||
<link rel="icon" href= "/favicon.ico" type="image/x-icon">
|
||||
<title><?= $title; ?> | <?= Data::NAME; ?></title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<meta name="description" content="<?= $desc; ?>" />
|
||||
<meta name="theme-color" content="#ff786c">
|
||||
<?php getRequestHead()->output(); ?>
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon">
|
||||
<title><?= $title; ?> | <?= Data::NAME; ?></title>
|
||||
</head>
|
||||
|
||||
<body class="<?= $bg; ?><?php if (Request::getCookie('dayNight') == 'dark') { ?> dark<?php } ?>">
|
||||
<header>
|
||||
<div class="wrap">
|
||||
<nav class="navbar">
|
||||
<?= $logo; ?>
|
||||
<div id="toggledark">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px"><path d="M 11 0 L 11 3 L 13 3 L 13 0 L 11 0 z M 4.2226562 2.8085938 L 2.8085938 4.2226562 L 4.9296875 6.34375 L 6.34375 4.9296875 L 4.2226562 2.8085938 z M 19.777344 2.8085938 L 17.65625 4.9296875 L 19.070312 6.34375 L 21.191406 4.2226562 L 19.777344 2.8085938 z M 12 5 C 8.1458514 5 5 8.1458514 5 12 C 5 15.854149 8.1458514 19 12 19 C 15.854149 19 19 15.854149 19 12 C 19 8.1458514 15.854149 5 12 5 z M 12 7 C 14.773268 7 17 9.2267316 17 12 C 17 14.773268 14.773268 17 12 17 C 9.2267316 17 7 14.773268 7 12 C 7 9.2267316 9.2267316 7 12 7 z M 0 11 L 0 13 L 3 13 L 3 11 L 0 11 z M 21 11 L 21 13 L 24 13 L 24 11 L 21 11 z M 4.9296875 17.65625 L 2.8085938 19.777344 L 4.2226562 21.191406 L 6.34375 19.070312 L 4.9296875 17.65625 z M 19.070312 17.65625 L 17.65625 19.070312 L 19.777344 21.191406 L 21.191406 19.777344 L 19.070312 17.65625 z M 11 21 L 11 24 L 13 24 L 13 21 L 11 21 z"/></svg>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<header>
|
||||
<div class="wrap">
|
||||
<nav class="navbar">
|
||||
<?= $logo; ?>
|
||||
<div id="toggledark">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px">
|
||||
<path d="M 11 0 L 11 3 L 13 3 L 13 0 L 11 0 z M 4.2226562 2.8085938 L 2.8085938 4.2226562 L 4.9296875 6.34375 L 6.34375 4.9296875 L 4.2226562 2.8085938 z M 19.777344 2.8085938 L 17.65625 4.9296875 L 19.070312 6.34375 L 21.191406 4.2226562 L 19.777344 2.8085938 z M 12 5 C 8.1458514 5 5 8.1458514 5 12 C 5 15.854149 8.1458514 19 12 19 C 15.854149 19 19 15.854149 19 12 C 19 8.1458514 15.854149 5 12 5 z M 12 7 C 14.773268 7 17 9.2267316 17 12 C 17 14.773268 14.773268 17 12 17 C 9.2267316 17 7 14.773268 7 12 C 7 9.2267316 9.2267316 7 12 7 z M 0 11 L 0 13 L 3 13 L 3 11 L 0 11 z M 21 11 L 21 13 L 24 13 L 24 11 L 21 11 z M 4.9296875 17.65625 L 2.8085938 19.777344 L 4.2226562 21.191406 L 6.34375 19.070312 L 4.9296875 17.65625 z M 19.070312 17.65625 L 17.65625 19.070312 L 19.777344 21.191406 L 21.191406 19.777344 L 19.070312 17.65625 z M 11 21 L 11 24 L 13 24 L 13 21 L 11 21 z" />
|
||||
</svg>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
|
@ -2,13 +2,13 @@
|
|||
<div class="box-flex">
|
||||
<?= Data::LOGO_BIG; ?>
|
||||
<div class="text-max-w500">
|
||||
<?= $help; ?>.
|
||||
</div>
|
||||
</div>
|
||||
<?= $help; ?>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box-flex">
|
||||
<a class="button-large" href="<?= getUrlByName('welcome', ['lang' => 'ru']); ?>">Русский</a>
|
||||
<a class="button-large" href="<?= getUrlByName('welcome', ['lang' => 'en']); ?>">English</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?= includeTemplate('footer'); ?>
|
||||
<?= includeTemplate('footer'); ?>
|
|
@ -4,4 +4,4 @@ Route::get('/')->controller('HomeController', ['index']);
|
|||
|
||||
Route::get('/{lang}')->controller('ArticleController', ['welcome'])->name('welcome');
|
||||
Route::get('/{lang}/philosophy')->controller('ArticleController', ['philosophy']);
|
||||
Route::get('/{lang}/yandex-metrica')->controller('ArticleController', ['yandex-metrica']);
|
||||
Route::get('/{lang}/metrica')->controller('ArticleController', ['metrica']);
|
||||
|
|
Loading…
Reference in New Issue