Rails-engine для редактирования блоков текста
Начальная идея изложена в посте «Турборедактирование кусков текста», Texter
развивает эту идею.
- Лёгкий вывод блочных и инлайновых текстов, отформатированных с помощью Textile, Markdown или simple_format или своего форматтера
- Дефолтные тексты в
I18n
- При редактировании тексты сохраняются в базе
- Подключаемые обработчики (препроцессоры) — можно легко подключить Типограф Лебедева или другой
- Удобный, встроенный в сайт интерфейс редактирования
Подключение
# Gemfile
gem 'texter'
# config/routes.rb
mount Texter::Engine => '/texter'
Миграция
rake texter:install:migrations
rake db:migrate
В assets pipeline нужно добавить texter/texts.js
и texter/_texts.scss
соответственно.
Должен быть подключен gem jquery-rails
.
Texter
по-умолчанию не имеет ограничений доступа.
Как пользоваться
Пользоваться приходится следующими хелперами:
-
block(path, options = {})
— возвращает отформатированный текст для блочного элемента; -
inline(path, options = {})
— для инлайнового (особенности вывода указаны для каждого форматтера по отдельности).
path
— I18n
-идентификатор текста в скопе texter
:
ru:
texter:
pages:
index:
header: Песня Винни-Пуха
intro: |
Вот горшок пустой!
Он предмет простой!
в pages/index
аналогично стандартному хелперу translate
можно использовать полную версию или сокращённую:
<h1><%= inline "pages.index.header" %></h1>
<div><%= block ".intro" %></div>
получим, предсказуемо:
<h1>Песня Винни-Пуха</h1>
<div><p>Вот горшок пустой!</p><p>Он предмет простой!</p></div>
В options
-хеше можно передать :locale
и :formatter
.
Форматтеры
Texter
может форматировать текст следующими способами:
:simple — включен по умолчанию
Использует хелпер simple_format.
Хелпер inline
выдаёт текст без обработки.
:textile
Использует RedCloth (можно настроить rules и restrictions, смотрите Texter::TextileFormatter
).
Нужно установить джем:
# Gemfile
gem 'RedCloth', '~> 4.2.9'
Хелпер inline
выдаёт весь текст, обработанный с помощью :lite_mode
restriction.
:markdown
Использует RDiscount (можно настроить расширения, смотрите Texter::MarkdownFormatter
).
Нужно установить джем:
# Gemfile
gem 'rdiscount'
Хелпер inline
выдаёт содержимое первого <p>
или <h\d>
.
Установить глобальный форматтер можно так:
# config/initializers/texter.rb
Texter.formatter = :textile
Для создания других форматтеров смотрите базовый класс Texter::Formatter
.
Обработчики
Texter
позволяет подключить несколько последовательных обработчиков текста (например для типографики), обработка происходит перед сохранением текста в базу.
По дефолту используется единственный Texter::CleanPreprocessor
(:clean
), который просто удаляет символы \r
.
Также Texter
имеет встроенную поддержку Типографа Лебедева, подключить можно следующим образом:
# Gemfile
gem 'art_typograph', '~> 0.1.1'
# config/initializers/texter.rb
Texter.preprocessors << :art_typograph
Для создания других обработчиков смотрите базовый класс Texter::Preprocessor
.
Ограничение доступа
Чтобы выяснить и показать на сайте, можно ли редактировать текст, Texter
вызывает метод can_be_edited?
презентера Texter::TextPresenter
(по-дефолту true
, то есть все могут редактировать).
Пример настройки доступа на уровне контроллера:
# app/controllers/texter/texts_controller.rb
require_dependency Texter::Engine.root.join("app/controllers/texter/texts_controller").to_s
class Texter::TextsController
before_filter :authenticate_user!
end
Многоязычность
По умолчанию Texter
редактирует текст в текущей локали, но его можно быстро подкрутить для работы с несколькими. Русская и английская версия минимальными усилиями:
После установки миграции поправим её:
class CreateTexterTexts < ActiveRecord::Migration
def change
create_table :texter_texts do |t|
t.string :path, :null => false
t.text :body_ru
t.text :body_en
end
add_index :texter_texts, :path, :unique => true
end
end
Настроим модель:
# config/initializers/texter.rb
Texter.bodies = %w{body_ru body_en}
# app/models/texter/text.rb
require_dependency Texter::Engine.root.join("app/models/texter/text").to_s
class Texter::Text
def body
send("body_#{I18n.locale}")
end
def default_attributes
{
:body_ru => get_body(:locale => :ru),
:body_en => get_body(:locale => :en)
}
end
end
Обновления
Читайте твитторд Прогерского говна.