Skip to content

Instantly share code, notes, and snippets.

@greendog
Created February 13, 2013 21:30
Show Gist options
  • Save greendog/4948494 to your computer and use it in GitHub Desktop.
Save greendog/4948494 to your computer and use it in GitHub Desktop.

Revisions

  1. greendog created this gist Feb 13, 2013.
    85 changes: 85 additions & 0 deletions liquor_samle1.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    module LiquorTemplateLoader
    def self.namespace_to_params(pack, namespace)
    if namespace == :html
    scope = pack.html_templates
    externals = [ :site, :request ]
    elsif namespace == :email
    scope = pack.email_templates
    externals = [ :site, :subscription ]
    end

    [ scope, externals ]
    end

    def self.load(pack, namespace)
    manager = Liquor::Manager.new(import: [
    # Plugins
    Liquor::Pagination,
    FeedbackTag,
    EmailTag,

    # Core and plugin functions
    CoreFunctions,

    # Functions by model classes
    VideoFunctions,
    PostFunctions,
    MobileFunctions,
    EventFunctions,
    MarkupFunctions
    ])

    scope, scope_externals = namespace_to_params(pack, namespace)
    template_externals_map = scope.system_templates

    ActiveSupport::Notifications.instrument("load.liquor") do
    scope.includes(:site).turned_on.each do |template|
    name, body = template.name, template.body

    if manager.partial? name
    manager.register_partial name, body
    else
    ActiveSupport::Notifications.instrument("load_template.liquor", name: name) do
    if template_externals_map.include? name
    externals = scope_externals + template_externals_map[name]
    else
    externals = scope_externals
    end

    manager.register_template name, body, externals
    end
    end
    end
    end

    ActiveSupport::Notifications.instrument("compile.liquor") do
    manager.compile
    end

    manager
    end

    def self.try_load(pack, namespace)
    manager = load(pack, namespace)

    manager.errors
    end

    @cache = {}
    @cache_timestamps = {}

    def self.load_with_caching(pack, namespace)
    cache_key = "#{pack.id}_#{namespace}"

    scope, = namespace_to_params(pack, namespace)
    last_updated_at = scope.maximum('updated_at') || Time.now

    if !@cache_timestamps.has_key?(cache_key) ||
    @cache_timestamps[cache_key] < last_updated_at
    @cache[cache_key] = load(pack, namespace)
    @cache_timestamps[cache_key] = last_updated_at
    end

    @cache[cache_key]
    end
    end
    137 changes: 137 additions & 0 deletions liquor_samle2.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,137 @@
    class PublicController < ApplicationController
    def render_template(name, locals={}, options={})
    environment = {
    site: @current_site.to_drop,
    request: LiquorRequest.new(request, self),
    }.merge(locals)

    if production_domain?
    pack = @current_site.production_pack
    else
    pack = @current_site.development_pack
    end

    manager = LiquorTemplateLoader.load_with_caching(pack, :html)

    if !manager.success?
    show_errors_with_splash_page(manager, name, manager.errors)

    return
    end

    if !manager.has_template?(name)
    if name == '404'
    render file: Rails.root.join('public', '404.html'), status: :not_found, layout: false
    else
    render_404
    end

    return
    end

    with_layout = options.delete(:layout)
    with_layout = true if with_layout.nil?

    if with_layout
    layout_name = 'layout'
    end

    headers["Content-Type"] ||= 'text/html; charset=utf-8'

    handle_liquor_errors(manager, name) do
    render :liquor => {
    :manager => manager,
    :template => name,
    :layout => layout_name,
    :environment => environment,
    }
    end
    end

    rescue_from ActiveRecord::RecordNotFound, with: :render_404
    rescue_from ActionController::RoutingError, with: :render_404

    def render_404(error=nil)
    # UserResourcesController:
    # 1) Gets invoked when used from the main site,
    # 2) Needs to render templates, thus subclasses PublicController,
    # 3) Raises AC::RoutingError even when on the main site.

    if on_the_main_site?
    raise error
    else
    render_template '404'
    end
    end

    protected

    def handle_liquor_errors(manager, template_name)
    if production_domain?
    errors = Liquor::Runtime.capture_errors do
    yield
    end

    if errors.any?
    # Type errors are caught here. They are posted to ErrorApp and
    # appended as console.log() to response body.
    enqueue_liquor_error(manager, template_name, errors, false)

    append_errors_to_response_body(manager, template_name, errors)
    end
    else
    yield
    end

    # rescue Liquor::HostError => e
    # In the future, HostErrors should be handled distinctively, as they
    # signify that _we_ fucked up, as opposed to the template author.
    # For now, everything is posted into our Airbrake anyway.

    rescue Liquor::SourceMappedError => e
    if production_domain?
    # Type errors will be caught and munged in the code above. If a
    # Liquor::SourceMappedError falls through, then it's more severe,
    # cannot be munged and so the app should show 500 instead.
    enqueue_liquor_error(manager, template_name, [ e ], true)

    render file: Rails.root.join('public', '500.html'), status: :internal_server_error, layout: false
    else
    # If we have arrived here from development mode, then this is
    # any template error, as type errors are not munged in developer mode.
    # Show splashscreen to the user.
    show_errors_with_splash_page(manager, template_name, [ e ])
    end
    end

    def enqueue_liquor_error(manager, template_name, errors, is_500=true)
    job = LiquorRuntimeErrorJob.new(
    @current_site, request.url,
    template_name, errors, is_500)
    Delayed::Job.enqueue(job)
    end

    def show_errors_with_splash_page(manager, template_name, errors)
    @manager = manager
    @errors = errors

    render 'public/liquor_errors', layout: 'dev'
    end

    def append_errors_to_response_body(manager, template_name, errors)
    log_statements = errors.map do |e|
    %Q{console.log("Liquor error: " + #{e.message.inspect} + "\\n" + #{manager.decorate(e).join("\\n").inspect});}
    end.join("\n ")

    script = <<-SCRIPT
    <script type="text/javascript">
    if(console !== undefined) {
    #{log_statements}
    }
    </script>
    SCRIPT

    response.body = response.body.sub %r{(</html>)}, "#{script}\\1"
    end

    end
    522 changes: 522 additions & 0 deletions liquor_samle3.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,522 @@
    {% content_for "title" capture: %}{{ artist.name }} - Respect Production (Респект Продакшн){% end content_for %}
    {% assign is_full_bio = !is_empty(request.param("bio")) %}
    <!--BEGIN .wrap -->
    <div class="wrap wrap-alt" id="artist-row">
    <!--BEGIN .col1 -->
    <div class="col1">
    <dl class="artists">
    <dt>Артисты</dt>
    <dd>
    <ul>
    {% for current_artist in: site.self_and_descendant_artists.active.with_orders.sort_by_human_order(site) do: %}
    <li {% if current_artist == artist then: %}class="here"{% end if %}><a href="{{ current_artist.url(site) }}">{{ current_artist.name }}</a></li>
    {% end for %}
    </ul>
    </dd>
    </dl>
    {% include "radio_and_subscribe_vertical" %}
    {% include "donate" %}
    {% assign artist_name = "Respect Production" %}
    {% assign vk_url = "http://vkontakte.ru/club9525" %}
    {% assign tw_url = "http://twitter.com/Respect_Pro" %}
    {% assign fb_url = "" %}
    {% assign artist_name = "Respect production" %}
    {% assign vk_url = "http://vkontakte.ru/club9525" %}
    {% assign tw_url = "http://twitter.com/Respect_Pro" %}
    {% assign fb_url = null %}
    {! Влади !}
    {% if artist.id == 3 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/id3883830" %}
    {% assign tw_url = "http://twitter.com/vlady__kasta" %}
    {% assign fb_url = "http://www.facebook.com/vladykasta" %}
    {% end if %}
    {! Змей !}
    {% if artist.id == 6 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/zigizmey" %}
    {% assign tw_url = "http://twitter.com/zmey__kasta" %}
    {% assign fb_url = "http://www.facebook.com/profile.php?id=100000124267163&fref=ts" %}
    {% end if %}
    {! Хамиль !}
    {% if artist.id == 5 then: %}
    {% assign artist_name = artist.name %}
    {% assign tw_url = "http://twitter.com/Hamil__kasta" %}
    {% end if %}
    {! Шым !}
    {% if artist.id == 4 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/id6012030" %}
    {% assign tw_url = "http://twitter.com/shym__kasta" %}
    {% end if %}
    {! Каста !}
    {% if artist.id == 2 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/club9525" %}
    {% assign tw_url = "https://twitter.com/#!/kasta_ru" %}
    {% assign fb_url = "https://www.facebook.com/kastanews" %}
    {% end if %}
    {! Песочные люди !}
    {% if artist.id == 17 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/sandmen_official" %}
    {% end if %}
    {! Жара !}
    {% if artist.id == 51 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/jara_sandman" %}
    {% assign tw_url = "http://twitter.com/Jara_Sandman" %}
    {% end if %}
    {! Кравц !}
    {% if artist.id == 34 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/id13641471" %}
    {% assign tw_url = "https://twitter.com/#!/kravz1" %}
    {% assign fb_url = "https://www.facebook.com/pages/Kravz/193475877340584" %}
    {% end if %}
    {! Маринесса !}
    {% if artist.id == 26 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/club12116101" %}
    {% assign tw_url = "http://twitter.com/MarinessaP" %}
    {% assign fb_url = "http://www.facebook.com/profile.php?id=100001101726963&fref=ts" %}
    {% end if %}
    {! Корж !}
    {% if artist.id == 42 then: %}
    {% assign artist_name = artist.name %}
    {% assign vk_url = "http://vk.com/max_korzh" %}
    {% assign tw_url = "http://twitter.com/#!/MAX_KORZH_mus" %}
    {% assign fb_url = "http://www.facebook.com/max.korzh?fref=ts" %}
    <style>
    body {
    background: url('/img/backgrounds/max_korzh.jpg') !important;
    }
    .page {
    padding: 10px;
    background: rgba(255, 255, 255, 0.5 );
    }
    </style>
    {% end if %}
    {% if !is_empty(fb_url) || !is_empty(tw_url) || !is_empty(vk_url) then: %}
    <p class="social"><span>{{ artist_name }} в сети</span>
    {% if !is_empty(fb_url) then: %}
    <a href="{{ fb_url }}"><img src="/img/facebook.png" alt="" /></a>
    {% end if %}
    {% if !is_empty(vk_url) then: %}
    <a href="{{ vk_url }}"><img src="/img/vkontakte.png" alt="" /></a>
    {% end if %}
    {% if !is_empty(tw_url) then: %}
    <a href="{{ tw_url }}"><img src="/img/twitter.png" alt="" /></a>
    {% end if %}
    </p>
    {% end if %}
    </div>
    <!--END .col1 -->
    <!--BEGIN .col2 -->
    <div class="col2">
    <div class="megahead">
    <h1>{{ artist.name }}</h1>
    {% assign url = artist.url_to_external_or_site %}
    {% if !is_empty(url) then: %}<p class="link"><a href="{{ url }}">на сайт артиста</a></p>{% end if %}
    </div>
    {% assign playlist_array = site.playlists.find_all_by(name:artist.name) %}
    {% if !is_empty(playlist_array) && is_empty(request.param('bio')) then: %}
    {% assign playlist = playlist_array[0] %}
    {% if !is_empty(playlist.playlist_items) then: %}
    <!--BEGIN .tracks -->
    <div class="tracks tracks_highlight">
    <div class="mediaholder">
    {% for item in: playlist.playlist_items do: %}
    <div {% unless item_loop.is_first then: %}style="display: none"{% end unless %}>
    {% if item.video then: %}
    {{ resize_embed_html(item.item.code width: 568 height: 341) }}
    {% else: %}
    <img src='{{ image_url(item.item.release size: '568x316') }}'>
    <object type="application/x-shockwave-flash" data="/player_mp3_multi.swf" width="568" height="25">
    <param name="bgcolor" value="#000000" />
    <param name="movie" value="/player_mp3_multi.swf" />
    <param value="mp3={{ url_escape(url_escape(item.item.preview_file_url)) }}&amp;width=568&amp;height=25&amp;showvolume=1&amp;showlist=0&amp;bgcolor=000000&amp;bgcolor1=000000&amp;loadingcolor=D5D5D5&amp;sliderovercolor=D5D5D5&amp;buttonovercolor=D5D5D5&amp;currentmp3color=D5D5D5&amp;scrollbarovercolor=D5D5D5" name="FlashVars" />
    </object>
    {% end if %}
    </div>
    {% end for %}
    </div>
    <!--BEGIN .playlist -->
    <div class="playlist pager_container">
    {% assign groups = in_groups_of(playlist.playlist_items size:6) %}
    <h2>Актуальный плейлист</h2>
    {% assign global_index = 0 %}
    {% for group in: groups do: %}
    <div class="track_playlist pagetolist {% if group_loop.is_first then: %}first current{% end if %} {% if group_loop.is_last then: %}last{% end if %}" {% unless group_loop.is_first then: %}style="display:none"{% end unless %}>
    <ul>
    {% for item in: group do: %}
    {% if !is_empty(item) then: %}
    {% if item.video then: %}
    <li class="video" rel="{{ global_index }}"><a href="#"><strong>{{ item.item.title }}</strong>{{ join(item.item.artist_names with:", ") }}<i></i></a></li>
    {% else: %}
    <li rel="{{ global_index }}"><a href="#"><strong>{{ item.item.title }}</strong> {{ item.item.plain_artists_title_html }}<i></i></a></li>
    {% end if %}
    {% assign global_index = global_index + 1 %}
    {% end if %}
    {% end for %}
    </ul>
    </div>
    {% end for %}
    <p class="pagi"><span class="pages"><strong class="currentpage">1</strong> / <span class="numberofpages">{{ size(groups) }}</span></span> <span class="prev disabled"></span> <span class="next {% if size(groups) == 1 then: %}disabled{% end if %}"></span></p>
    </div>
    <!--END .playlist -->
    </div>
    <!--END .tracks -->
    {% end if %}
    {% end if %}
    <!--BEGIN .subwrap -->
    <div class="subwrap">
    <!--BEGIN .col21 -->
    <div class="col21 {% if is_empty(request.param('bio')) then: %}bordertop{% end if %}">
    {% if !is_empty(request.param('bio')) then: %}
    <div class="post border bottom">
    {{ clean_media(artist.description) }}
    </div>
    {% else: %}
    <!--BEGIN .col21-left -->
    <div class="col21-left">
    <!--BEGIN .concerts -->
    {% assign events = artist.events.reverse.around_current(limit: 20 from_past: 1) %}
    {% assign event_groups = group_by_handled_at(events) %}
    <div class="concerts pager_container">
    <h2>Концерты</h2>
    {% if is_empty(event_groups) then: %}
    Текущих концертов нет
    {% else: %}
    <div class="pagetolist current first">
    {% for group in: event_groups do: %}
    {% unless group_loop.is_first && is_empty(group[0]) then: %}
    <h3>{{ strftime(group[0].handled_at_date format: "%B") }}</h3>
    {% end unless %}
    <ul class="concdates">
    {% for event in: group do: %}
    {% if !is_empty(event) then: %}
    <li>
    <span><strong>{{ strftime(event.handled_at_date format: "%d") }}</strong> {{ strftime(event.handled_at_date format: "%b") }}</span>
    <div class="cc">
    <abbr>
    <strong>{{ event.artist_names|join with:", " }}</strong> {% if !is_empty(event.external_url) then: %} <a href="{{absolute_url(event.external_url)}}" target="_blank">{{ event.address }}, {{ event.title }}</a> {% else: %} {{ event.address }}, {{ event.title }} {% end if %}
    </abbr>
    </div>
    </li>
    {% end if %}
    {% end for %}
    <ul>
    {% end for %}
    </div>
    {% end if %}
    </div>
    <!--END .concerts -->
    </div>
    <!--END .col21-left -->
    <!--BEGIN .col21-right -->
    {% assign posts = site.blog.aggregated_posts.scoped_to_artist(artist).limit(25) %}
    {% assign post_groups = in_groups_of(posts size:5) %}
    <div class="col21-right">
    <h2 class="h2">Новости артиста</h2>
    <div class="pager_container">
    {% if is_empty(posts) then: %}
    Новостей нет
    {% end if %}
    {% for post_group in: post_groups do: %}
    <div class="pagetolist {% if post_group_loop.is_first then: %}first current{% end if %}{% if post_group_loop.is_last then: %}last{% end if %}" {% unless post_group_loop.is_first then: %}style="display: none"{% end unless %}>
    {% for post in: post_group do: %}
    {% if !is_empty(post) then: %}
    <!--BEGIN .hentry -->
    <div class="hentry hentry-bigpic">
    <a href="{{ post.url(site) }}">{{ image_tag(post size: '220x143') }}</a>
    <h3><a href="{{ post.url(site) }}">{{ post.title }}</a></h3>
    <p class="published">{{ strftime(post.published_at format: "%d.%m.%y") }}</p>
    <p>{{ post.preface }}</p>
    </div>
    <!--END .hentry -->
    {% end if %}
    {% end for %}
    </div>
    {% end for %}
    {% if size(post_groups) > 1 then: %}
    <p class="pagi">
    <span class="pages">
    <span class="currentpage">1</span> / <span class="numberofpages">{{ size(post_groups) }}</span>
    </span>
    <span class="prev disabled"></span> <span class="next "></span>
    </p>
    {% end if %}
    </div>
    </div>
    <!--END .col22-right -->
    {% end if %}
    </div>
    <!--END .col21 -->
    <!--BEGIN .col22 -->
    <div class="col22">
    {% include "sidebar_banner" %}
    {% include "twitter" %}
    </div>
    <!--END .col22 -->
    </div>
    <!--END .subwrap -->
    </div>
    <!--END .col2 -->
    </div>
    <!--END .wrap-alt -->
    {% unless is_full_bio then: %}
    <!--BEGIN .cc1 -->
    <div class="cc1">
    {% include "shop" %}
    {% include "mobile_offers" %}
    </div>
    <!--END .cc1 -->
    <!--BEGIN .cc2 -->
    <div class="cc2">
    <!--BEGIN .artist-media -->
    <div class="artist-media">
    {% assign albums = artist.photoalbums %}
    {% unless includes(albums element: artist.primary_photoalbum) then: %}
    {% assign albums = compact(albums + [artist.primary_photoalbum]) %}
    {% end unless %}
    {% if size(albums) > 0 then: %}
    <!--BEGIN .gallery -->
    <div class="gallery pager_container">
    <h2 class="h2">Галерея</h2>
    <div class="gall-wrap">
    {% assign photo_groups = in_groups_of(albums size:4) %}
    {% for photo_group in: photo_groups do: %}
    <div class="pagetolist {% if photo_group_loop.is_first then: %}first current{% end if %} {% if photo_group_loop.is_last then: %}last{% end if %}" {% unless photo_group_loop.is_first then: %}style="display: none"{% end unless %}>
    <ul>
    {% for photoalbum in: photo_group do: %}
    {% if !is_empty(photoalbum) then: %}
    {% assign photo = photoalbum.cover %}
    {% if is_empty(photo) && size(photoalbum.photos) > 0 then: %}
    {% assign photo = photoalbum.photos[0] %}
    {% end if %}
    {% if !is_empty(photo) then: %}
    <li><a href="{{photoalbum.url}}">{{ thumbnail_tag(photo size: '115x75') }}</a></li>
    {% end if %}
    {% end if %}
    {% end for %}
    </ul>
    </div>
    {% end for %}
    </div>
    {% if size(photo_groups) > 1 then: %}
    <p class="pagi">
    <span class="pages">
    <span class="currentpage">1</span> / <span class="numberofpages">{{ size(photo_groups) }}</span>
    </span>
    <span class="prev disabled"></span> <span class="next "></span>
    </p>
    {% end if %}
    </div>
    <!--END .gallery -->
    {% end if %}
    {% assign dvd_releases = artist.releases.recent.scoped_to_media_kind('dvd') %}
    {% assign not_dvd_releases = artist.releases.recent.scoped_to_not_media_kind('dvd') %}
    {% if !is_empty(not_dvd_releases) || !is_empty(dvd_releases) then: %}
    {% assign groups = in_columns(not_dvd_releases count:2) %}
    <!-- BEGIN releases -->
    <div class="releases">
    <h2>Релизы</h2>
    <!--BEGIN .releases-wrap -->
    <div class="releases-wrap">
    <!-- BEGIN release col -->
    <div class="release-col">
    {% for release in: groups[0] do: %}
    {% if !is_empty(release) then: %}
    <!--BEGIN .release -->
    <div class="release">
    <a href="{{ release.url(site) }}">
    {{ image_tag(release size: '85x85') }}
    </a>
    <div class="cc">
    <h3><a href="{{ release.url(site) }}">{{ release.title }}</a></h3>
    <p class="title">{{ release.plain_artists_title_html }}</p>
    {% if release.is_released then: %}
    <p class="published">{{ strftime(release.released_at format:"%Y") }}</p>
    {% if !is_empty(release.store_url) then: %}
    <p class="published"><a href="{{ release.store_url }}">Скачать альбом</a></p>
    {% end if %}
    {% if release.has_audio then: %}
    <p class="act"><a href="{{ release.url(site) }}"><img src="/img/audio.png" alt="" /></a></p>
    {% end if %}
    {% else: %}
    <p class="published">{{ strftime(release.released_at format: "%d.%m.%Y") }}</p>
    {% end if %}
    </div>
    </div>
    <!--END .releases -->
    {% end if %}
    {% end for %}
    </div>
    <!-- end release-col -->
    {% if size(not_dvd_releases) > 1 then: %}
    <!-- BEGIN release col -->
    <div class="release-col release-col-right">
    {% for release in: groups[1] do: %}
    {% if !is_empty(release) then: %}
    <!--BEGIN .release -->
    <div class="release">
    <a href="{{ release.url(site) }}">
    {{ image_tag(release size: '85x85') }}
    </a>
    <div class="cc">
    <h3><a href="{{ release.url(site) }}">{{ release.title }}</a></h3>
    <p class="title">{{ release.plain_artists_title_html }}</p>
    {% if release.is_released then: %}
    <p class="published">{{ strftime(release.released_at format:"%Y") }}</p>
    {% if release.has_audio then: %}
    <p class="act"><a href="{{ release.url(site) }}"><img src="/img/audio.png" alt="" /></a></p>
    {% end if %}
    {% else: %}
    <p class="published">{{ strftime(release.released_at format: "%d.%m.%Y") }}</p>
    {% end if %}
    </div>
    </div>
    <!--END .releases -->
    {% end if %}
    {% end for %}
    </div>
    <!-- end release-col -->
    {% end if %}
    </div>
    <!--END .releases-wrap -->
    {% assign groups = in_columns(dvd_releases count:2) %}
    <!--BEGIN .releases-wrap -->
    <div class="releases-wrap">
    {% if !is_empty(groups[0]) then: %}
    <!-- BEGIN release col -->
    <div class="release-col">
    {% for release in: groups[0] do: %}
    {% if !is_empty(release) then: %}
    <!--BEGIN .release -->
    <div class="release">
    <a href="{{ release.url(site) }}">
    {{ image_tag(release size: '60x85') }}
    </a>
    <div class="cc dvd">
    <h3><a href="{{ release.url(site) }}">{{ release.title }}</a></h3>
    <p class="title">{{ release.plain_artists_title_html }}</p>
    {% if release.is_released then: %}
    <p class="published">{{ strftime(release.released_at format:"%Y") }}</p>
    {% if release.has_audio then: %}
    <p class="act"><a href="{{ release.url(site) }}"><img src="/img/audio.png" alt="" /></a></p>
    {% end if %}
    {% else: %}
    <p class="published">{{ strftime(release.released_at format: "%d.%m.%Y") }}</p>
    {% end if %}
    </div>
    </div>
    <!--END .releases -->
    {% end if %}
    {% end for %}
    </div>
    <!-- end release-col -->
    {% end if %}
    {% if size(dvd_releases) > 1 then: %}
    <!-- BEGIN release col -->
    <div class="release-col release-col-right">
    {% for release in: groups[1] do: %}
    {% if !is_empty(release) then: %}
    <!--BEGIN .release -->
    <div class="release">
    <a href="{{ release.url(site) }}">
    {{ image_tag(release size: '60x85') }}
    </a>
    <div class="cc dvd">
    <h3><a href="{{ release.url(site) }}">{{ release.title }}</a></h3>
    <p class="title">{{ release.plain_artists_title_html }}</p>
    {% if release.is_released then: %}
    <p class="published">{{ strftime(release.released_at format:"%Y") }}</p>
    {% if release.has_audio then: %}
    <p class="act"><a href="{{ release.url(site) }}"><img src="/img/audio.png" alt="" /></a></p>
    {% end if %}
    {% else: %}
    <p class="published">{{ strftime(release.released_at format: "%d.%m.%Y") }}</p>
    {% end if %}
    </div>
    </div>
    <!--END .releases -->
    {% end if %}
    {% end for %}
    </div>
    <!-- end release-col -->
    {% end if %}
    </div>
    <!--END .releases-wrap -->
    </div>
    <!-- releases -->
    {% end if %}
    </div>
    <!--END .artist-media -->
    <!--BEGIN .b-static -->
    <div class="b-static" id="artist-bio">
    <div class="clr"></div>
    <h2>{{ artist.name }}</h2>
    <div class="bio-short">
    {{ truncate_words(clean_media(artist.description) words:50) }}
    </div>
    <a class="more show-full" href="?bio=full">Читать полностью</a>
    </div>
    <!--END .b-static -->
    </div>
    <!--END .cc2 -->
    {% end unless %}
    <div class="clr"></div>