Commit d9686ab2 authored by Nigel Kukard's avatar Nigel Kukard

Added Gry files

parent f1188952
stages:
- deploy
publish:
stage: deploy
script:
- apt-get update
- apt-get dist-upgrade -y
- apt-get install -y lftp ca-certificates
- echo 'set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"' >> /etc/lftp.conf
- echo 'set net:max-retries "5"' >> /etc/lftp.conf
- echo 'set net:timeout "60"' >> /etc/lftp.conf
- lftp -e "mirror --exclude ^\.git.* --exclude \.gitlab-ci.yaml --delete --reverse --no-perms --verbose $CI_PROJECT_DIR .; quit;" -p $SERVER_PORT -u $CREDENTIALS https://$SERVER/
only:
- master
- test-site
- deploy-site
test:
stage: test-site
script:
- apt-get update
- apt-get dist-upgrade -y
- apt-get install -y jekyll
- bundle install
- mkdir build
- jekyll build --destination=build/
- cp .htaccess build/
# Artifacts
artifacts:
expire_in: 1 day
paths:
- build/
deploy:
stage: deploy-site
script:
- apt-get update
- apt-get dist-upgrade -y
- apt-get install -y lftp ca-certificates
- echo 'set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"' >> /etc/lftp.conf
- echo 'set net:max-retries "5"' >> /etc/lftp.conf
- echo 'set net:timeout "60"' >> /etc/lftp.conf
- lftp -e "mirror --exclude ^\.git.* --exclude \.gitlab-ci.yaml --delete --reverse --no-perms --verbose $CI_PROJECT_DIR/build .; quit;" -p $SERVER_PORT -u $CREDENTIALS https://$SERVER/
only:
- master@linux.community/linux-community-site
# Artifacts
artifacts:
expire_in: 1 day
paths:
- build/
source "https://rubygems.org"
ruby RUBY_VERSION
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "3.4.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
# gem "minima", "~> 2.0"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
gem 'kramdown'
gem 'jekyll-watch'
gem 'fast_gettext'
gem 'get_pomo'
gem 'pry'
gem 'addressable'
gem 'jekyll-gettext-plugin'
end
I recommend to install this jekyll site using rbenv.
1. git clone https://github.com/rbenv/rbenv.git ~/.rbenv
2. cd ~/.rbenv && src/configure && make -C src
3. echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile # or ~/.bashrc
4. ~/.rbenv/bin/rbenv init # Run for shell-specific instructions on how to initialize rbenv to enable shims and autocompletion.
5. Restart your shell so that PATH changes take effect.
6. Now check if rbenv was set up:
type rbenv
To proceed with using the site,
1. bundle install
2. jekyll build [--destination=/home/public/]
This builds the static website into _site directory, or in the path specified.
Add your translations and resources.
\ No newline at end of file
# the languages to look for
languages: ["en", "ru"]
# the name of the text domain.
# This is the name of the .pot and .po files.
text_domain: "website"
# the folder relative to the _config.yml
# where the translations are placed inside
translations_folder: "_i18n"
---
-
name: "##linux@freenode"
http: "http://freenode.linux.community"
irc: "##linux"
ircserver: "chat.freenode.net"
description: "GNU/Linux channel at freenode"
lang: English
type: chat
-
name: "##linux-ru"
http: "http://svetlana.nfshost.com/irc/freenode/channels/about/linux-ru/"
irc: "##linux-ru"
ircserver: "chat.freenode.net"
description: "Канал для вежливого обсуждения операционной системы Linux на русском языке."
lang: Русский, English
type: chat
-
name: "Archlinux forums"
http: "https://bbs.archlinux.org/"
description: "ArchLinux forums"
lang: English, more?
type: forum
distro: Archlinux
-
name: "Ubuntu Russian"
http: http://ubuntu.ru/
irc: "#ubuntu-ru"
ircserver: "chat.freenode.net"
description: "Ubuntu по-русски"
lang: Русский
type: forum, chat
distro: Ubuntu
-
name: "Debian Russian"
http:
irc: "#debian-russian"
ircserver: "irc.oftc.net"
description: "Debian по-русски"
lang: Русский
type:
distro: Debian
mail: debian-russian@lists.debian.org
\ No newline at end of file
msgid ""
msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en\n"
"X-Generator: Jekyll::PotLocalizationPlugin\n"
msgid "GNU/Linux® fora"
msgstr "Форумы (сообщества) GNU/Linux®"
msgid "May I view this page in another language?"
msgstr "Можно переключить язык?"
msgid "Russian"
msgstr "русский"
msgid "English"
msgstr "английский"
msgid "Yes"
msgstr "Да"
msgid "What resources are listed here?"
msgstr "Что я здесь вижу?"
msgid "An international directory of chat, wiki, forum GNU/Linux®-related resources."
msgstr "Сборник ссылок на чат, вики, форумы по линуксу на разных языках."
msgid "How do I submit a new or updated entry to this page?"
msgstr "Как добавить или обновить запись?"
msgid "Click here."
msgstr "Перейдите по ссылке."
msgid "Name"
msgstr "Название"
msgid "WWW"
msgstr "WWW"
msgid "IRC"
msgstr "IRC"
msgid "Distribution"
msgstr "Дистрибутив"
msgid "Description"
msgstr "Описание"
msgid "Type"
msgstr "Тип"
msgid "Language(s)"
msgstr "Язык(и)"
msgid "Webchat"
msgstr "Вебчат"
msgid "How do I search?"
msgstr "Как здесь искать?"
msgid "Type multiple keywords, such as distribution name, language, or word 'forum' or 'chat'. Do not type your GNU/Linux® question - this tool lists URLs only and does not search the forums or chats themselves."
msgstr "Вводите несколько ключевых слов, например, название дистрибутива, язык, слово «форум» или «вики» или «чат». Не пишите здесь текст своего вопроса - это только директория, а не поисковый моторчик."
\ No newline at end of file
<!--<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
-->
<script src="assets/js/sorttable.js"></script>
<script src="assets/js/filtertable.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GNU/Linux resources</title>
<link href="/assets/css/bootstrap.min.css" rel="stylesheet">
<link href="/assets/css/bootstrap-theme.min.css" rel="stylesheet">
<link href="/assets/css/style.css" rel="stylesheet">
</head>
<body>
{% include header.html %}
{{ content }}
{% include footer.html %}
I recommend to install this jekyll site using rbenv.
1. git clone https://github.com/rbenv/rbenv.git ~/.rbenv
2. cd ~/.rbenv && src/configure && make -C src
3. echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile # or ~/.bashrc
4. ~/.rbenv/bin/rbenv init # Run for shell-specific instructions on how to initialize rbenv to enable shims and autocompletion.
5. Restart your shell so that PATH changes take effect.
6. Now check if rbenv was set up:
type rbenv
To proceed with using the site,
1. bundle install
2. jekyll build
This diff is collapsed.
This diff is collapsed.
dd {
margin-bottom: 6px;
}
.version {
max-width: 8em;
word-wrap: break-word;
}
.authors {
max-width: 12em;
}
.modified {
max-width: 8em;
min-width: 8em;
}
table.sortable thead {
cursor: pointer;
}
table.sortable thead th:hover {
opacity: 0.8;
}
This diff is collapsed.
/*
LightTableFilter by Chris Coyier
http://codepen.io/chriscoyier/pen/tIuBL
*/
(function(document) {
'use strict';
var LightTableFilter = (function(Arr) {
var _input;
function _onInputEvent(e) {
_input = e.target;
var tables = document.getElementsByClassName(_input.getAttribute('data-table'));
Arr.forEach.call(tables, function(table) {
Arr.forEach.call(table.tBodies, function(tbody) {
Arr.forEach.call(tbody.rows, _filter);
});
});
}
function _filterExpr(val, text) {
return !val.split(' ').every(function(word) {
if (word.charAt(0) === '-') {
return text.indexOf(word.substring(1)) === -1;
} else {
return text.indexOf(word) !== -1;
}
});
}
function _filter(row) {
var text = row.textContent.toLowerCase(), val = _input.value.toLowerCase();
row.style.display = _filterExpr(val, text) ? 'none' : 'table-row';
}
return {
init: function() {
var inputs = document.getElementsByClassName('light-table-filter');
Arr.forEach.call(inputs, function(input) {
input.oninput = _onInputEvent;
});
}
};
})(Array.prototype);
document.addEventListener('readystatechange', function() {
if (document.readyState === 'complete') {
LightTableFilter.init();
}
});
})(document);
(function(document, $) {
'use strict';
function readhash() {
var kv = window.location.hash.substr(1).split('&');
for(var i = 0; i < kv.length; i++) {
var p = kv[i].split('=');
var e = $(':input').filter(function(i, e) {
return (e.dataset||{}).name === p[0];
});
if (e && e[0]) {
e[0].value = decodeURIComponent(p[1].replace(/[+]/g, '%20'));
if ('createEvent' in document) {
var ev = document.createEvent('HTMLEvents');
ev.initEvent('input', true, false);
e[0].dispatchEvent(ev);
}
}
}
}
if ('onhashchange' in window) {
$(window).bind('hashchange', readhash);
}
document.addEventListener('readystatechange', function() {
if (document.readyState === 'complete') {
readhash();
}
});
})(document, $);
This diff is collapsed.
/**
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
*
* @name timeago
* @version 1.4.1
* @requires jQuery v1.2.3+
* @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
*
* For usage and examples, visit:
* http://timeago.yarp.com/
*
* Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
$.timeago = function(timestamp) {
if (timestamp instanceof Date) {
return inWords(timestamp);
} else if (typeof timestamp === "string") {
return inWords($.timeago.parse(timestamp));
} else if (typeof timestamp === "number") {
return inWords(new Date(timestamp));
} else {
return inWords($.timeago.datetime(timestamp));
}
};
var $t = $.timeago;
$.extend($.timeago, {
settings: {
refreshMillis: 60000,
allowPast: true,
allowFuture: false,
localeTitle: false,
cutoff: 0,
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "from now",
inPast: 'any moment now',
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years",
wordSeparator: " ",
numbers: []
}
},
inWords: function(distanceMillis) {
if(!this.settings.allowPast && ! this.settings.allowFuture) {
throw 'timeago allowPast and allowFuture settings can not both be set to false.';
}
var $l = this.settings.strings;
var prefix = $l.prefixAgo;
var suffix = $l.suffixAgo;
if (this.settings.allowFuture) {
if (distanceMillis < 0) {
prefix = $l.prefixFromNow;
suffix = $l.suffixFromNow;
}
}
if(!this.settings.allowPast && distanceMillis >= 0) {
return this.settings.strings.inPast;
}
var seconds = Math.abs(distanceMillis) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;
function substitute(stringOrFunction, number) {
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
var value = ($l.numbers && $l.numbers[number]) || number;
return string.replace(/%d/i, value);
}
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
seconds < 90 && substitute($l.minute, 1) ||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
minutes < 90 && substitute($l.hour, 1) ||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
hours < 42 && substitute($l.day, 1) ||
days < 30 && substitute($l.days, Math.round(days)) ||
days < 45 && substitute($l.month, 1) ||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
years < 1.5 && substitute($l.year, 1) ||
substitute($l.years, Math.round(years));
var separator = $l.wordSeparator || "";
if ($l.wordSeparator === undefined) { separator = " "; }
return $.trim([prefix, words, suffix].join(separator));
},
parse: function(iso8601) {
var s = $.trim(iso8601);
s = s.replace(/\.\d+/,""); // remove milliseconds
s = s.replace(/-/,"/").replace(/-/,"/");
s = s.replace(/T/," ").replace(/Z/," UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
return new Date(s);
},
datetime: function(elem) {
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
return $t.parse(iso8601);
},
isTime: function(elem) {
// jQuery's `is()` doesn't play well with HTML5 in IE
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
}
});
// functions that can be called via $(el).timeago('action')
// init is default when no action is given
// functions are called with context of a single element
var functions = {
init: function(){
var refresh_el = $.proxy(refresh, this);
refresh_el();
var $s = $t.settings;
if ($s.refreshMillis > 0) {
this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
}
},
update: function(time){
var parsedTime = $t.parse(time);
$(this).data('timeago', { datetime: parsedTime });
if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString());
refresh.apply(this);
},
updateFromDOM: function(){
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
refresh.apply(this);
},
dispose: function () {
if (this._timeagoInterval) {
window.clearInterval(this._timeagoInterval);
this._timeagoInterval = null;
}
}
};
$.fn.timeago = function(action, options) {
var fn = action ? functions[action] : functions.init;
if(!fn){
throw new Error("Unknown function name '"+ action +"' for timeago");
}
// each over objects here and call the requested function
this.each(function(){
fn.call(this, options);
});
return this;
};
function refresh() {
var data = prepareData(this);
var $s = $t.settings;
if (!isNaN(data.datetime)) {
if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
$(this).text(inWords(data.datetime));
}
}
return this;
}
function prepareData(element) {
element = $(element);
if (!element.data("timeago")) {
element.data("timeago", { datetime: $t.datetime(element) });
var text = $.trim(element.text());
if ($t.settings.localeTitle) {
element.attr("title", element.data('timeago').datetime.toLocaleString());
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
element.attr("title", text);
}
}
return element.data("timeago");
}
function inWords(date) {
return $t.inWords(distance(date));
}
function distance(date) {
return (new Date().getTime() - date.getTime());
}
// fix for IE6 suckage
document.createElement("abbr");
document.createElement("time");
}));
This diff is collapsed.
(function(document, $){
'use strict';
var jsonpRe = /^\/\*[\s\S]*?\*\/jsonp\(([\s\S]*)\)$/m;
var ghLimits = {search: {}, core: {}};
var stopId = 0;
var queue = {search: [], core: []};
var todo = 1;
function requestLater(what, how, arg) {
var when = rateTimeout(what);
if (when >= 0) {
var empty = queue[what].length == 0;
queue[what].push([how, arg]);
if (empty) window.setTimeout(function(){reQueue(what);}, when);
} else {
ghLimits[what].remaining--;
how(arg);
}
}
function reQueue(what) {
limitsThen(what, function(q) {
q.forEach(function(e) {
requestLater(what, e[0], e[1]);
});
}, queue[what].splice(0, queue[what].length));
}
function signalDone() {
if (!todo) $("#th-votes").html("Votes");
}
function _jsonpToJson(dta, typ) {
if (typ == "json") {
return dta.replace(jsonpRe, "$1");
}
return dta;
}
function jj(url) {
return $.ajax({
accepts: { json: 'application/vnd.github.squirrel-girl-preview' },
dataType: 'json',
url: url + (url.indexOf('callback=') === -1
? (url.indexOf('?') === -1 ? '?' : ';') + 'callback=jsonp'
: ''),
jsonp: false,
jsonpCallback: 'jsonp',
dataFilter: _jsonpToJson
});
}
function searchVotes(url) {
var start = url.indexOf("//") !== -1 ? url
: 'https://api.github.com/search/issues?q=votes+in:title+state:closed+type:issue+'
+ 'repo:' + url + ';sort=updated';
jj(start).done(function(r) {
var hasMore = fetchNext('search', r.meta, searchVotes);
if (hasMore) todo++;
r.data.items.forEach(function(e) {
if (stopId && e.number > stopId) return;
if (e.title != "votes") return;
if (e.locked) { stopId = e.number; return; }
todo++;
requestLater('core', requestComments, e.comments_url);
todo++;
requestLater('core', requestComments, e.comments_url + '?page=2');
todo++;
requestLater('core', requestComments, e.comments_url + '?page=3');
//todo++;
//requestLater('core', requestComments, e.comments_url + '?page=4');
});
todo--;
signalDone();
});
}
function rateTimeout(what) {
if ($.isEmptyObject(ghLimits[what])) return -1;
var remaining = ghLimits[what].remaining;
var rateReset = ghLimits[what].reset;
var limit = ghLimits[what].limit;
var timeOut = -1;
if (remaining < Math.log(limit) + Math.sqrt(limit)) {
timeOut = 1000 + rateReset * 1000 - (new Date() / 1);
if (timeOut < -1) timeOut = 0;
}
return timeOut;
}
function updateLimits(what, meta) {
ghLimits[what].remaining = meta['X-RateLimit-Remaining'];
ghLimits[what].reset = meta['X-RateLimit-Reset'];
}
function fetchNext(what, meta, how) {
var hasMore = false;
updateLimits(what, meta);