It can be possible to set tab names for project and plugin tabs
<& "/contenido/components/title.msn", %ARGS &>
<table width="100%" cellspacing="10" cellpadding="0" border="0" style="background-color:#445D82;" class="tatop">
<tr>
<td><b>Редакторский интерфейс\
% if( $style ne 'index' ) {
: <a href="/contenido/">На главную</a>
% }
</b></td>
<td align="right"><b><a href="/" style="text-decoration:none;"><% $pn_name %><span style="background-color:#efefef;color:#000000;margin:2px;"> <% uc($pn_domen) %> </span></a></b></td>
</tr>
<tr>
<td>
% my @TABS = ();
% my @plugins = ($state->project, split(/\s+/, $state->plugins));
% my %plugins = map { lc($_) => 1 } @plugins;
% for my $tab_id (keys(%{ $toopi })) {
% my ($b1, $b2) = $tab_id eq $profile ? ('<b>', '</b>') : ('', '');
% if ($r->uri() =~ /keywords\.html$/ || ($r->uri =~ /^\/contenido\/(\w+)\//i && exists $plugins{lc($1)} ) ) {
% ($b1, $b2) = ('', '');
% }
% next if $tab_id eq 'admin' && !$user->check_group(1);
% push (@TABS, $b1.'<a href="/contenido/?set_context=profile-'.$tab_id.'">'.$toopi->{$tab_id}->{name}.'</a>'.$b2);
% }
<% join(' | ', @TABS) %>\
% for my $plugin ($state->project, split(/\s+/, $state->plugins)) {
% my $l_plugin = lc($plugin);
% next if $state->{$l_plugin}->{contenido_notab};
% my $uri = "$plugin/";
% my $tab_name;
% if (exists $state->{$plugin}{tab_name} && $state->{$plugin}{tab_name}) {
% $tab_name = $state->{$plugin}{tab_name};
% } elsif ($plugin eq $state->project) {
% $tab_name = $state->project_name;
% } else {
% $tab_name = $plugin;
% }
% my ($b1, $b2) = $r->uri =~ /^\/contenido\/(\w+)\//i && lc($1) eq $l_plugin ? ('<b>','</b>') : ('','');
| <a href="/contenido/<% $uri %>"><% $b1.$tab_name.$b2 %></a>
% }
</td>
<td align="right">
<b>Пользователь:</b> <% $user->name() %> (<% $user->login() %>)
</td>
</tr>
</table>
<script>
<!--
function openWin(wUri, wName, wWidth, wHeight, wScroll, wMenu) {
var scrollBars = (wScroll!=0) ? 1 : 0;
var menuBars = (wMenu) ? 1 : 0;
var positionLeft = (screen.width - wWidth)/2;
var positionTop = (screen.height - wHeight)/2;
var myW = window.open(wUri,wName,'width='+wWidth+',height='+wHeight+',top='+positionTop+',left='+positionLeft+',location=0,menubar='+menuBars+',resizable=0,scrollbars='+scrollBars+',status=0,titlebar=0,toolbar=0,directories=0,hotkeys=0')
myW.focus();
}
-->
</script>
<%args>
$style => undef
$title => undef
</%args>
<%init>
my $pn = $state->project_name();
my ($pn_name, $pn_domen) = split(/\./, $pn);
my $toopi = $project->tabs();
my $profile = $m->comp('/contenido/components/context.msn', name => 'profile');
</%init>
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.