使用rails资产管道维护RTL版本的样式表

Jep*_*erg 9 ruby-on-rails right-to-left sprockets asset-pipeline

背景

我想启用从右到左的语言环境以及从左到右,但我只想维护一组样式表.

这个想法是调用application-rtl.css将服务于rtl转换版本application.css(使用r2).

此功能有两个用例:

  • 开发:动态提供,即时转换
  • 生产:预编译生成-rtl版本(扩展rake资产:预编译任务)

到目前为止,我已经设法实现了一个RTLConverter,使我可以将所有转换为RTL的样式表服务,而不必触及它们:

配置/初始化/ rtl_converter.rb:

require "r2"
require "tilt"

class RTLConverter < Tilt::Template
  def prepare; end

  def evaluate(context, locals, &block)
    R2.r2 @data
  end
end

Rails.application.assets.register_preprocessor 'text/css', RTLConverter
Run Code Online (Sandbox Code Playgroud)

您还可以将其实现为sprockets的引擎,以仅转换具有.rtl扩展名的文件:

Rails.application.assets.register_engine 'rtl', RTLConverter
Run Code Online (Sandbox Code Playgroud)

我的问题

如何挂钩资产管道以便:

  1. 使用名称后缀'-rtl'提供任何样式表的动态转换版本(查找没有后缀的文件并提供转换后的版本)?
  2. 在预编译期间使用所有样式表的名称后缀"-rtl"创建转换后的副本

笔记:

转换器不能与sass引擎一起使用,但似乎工作得很少.它已被应用于基于twitter-bootstrap的网站,并且像魅力一样工作.

转换器尚未在生产中进行测试.

如果我能找到解决这个问题的合适解决方案,我打算创建并维护一个gem并将其交还给社区.

Jes*_*sen 5

我的目标是直接使用CSS来处理LTR-RTL差异.CSS可以为您处理这项工作.如果你将CSS定义为LTR,那么,基于CSS类,你可以覆盖你想要的东西.

  1. 默认情况下,将整个CSS样式表定义为LTR.
  2. 在处理语言环境的主体上放置一个额外的css类.例如<body class="RTL">
  3. 通过覆盖前缀为" RTL"的CSS类来定义默认的所有异常.

一个简短的例子.原始"默认"样式:

body { direction: ltr; }
.sidebar { width: 200px; float: right; margin-left: 30px }
Run Code Online (Sandbox Code Playgroud)

然后,在css中稍后覆盖相关的样式:

body.rtl { direction: rtl; }
.rtl .sidebar { float: right; margin-right: 30px; }

/*remember to 'reset' all defaults for example: */
.rtl .sidebar { margin-left: 0; }
Run Code Online (Sandbox Code Playgroud)

使用sass,您有一个共同的位置来定义标准变量,例如上面示例中的margin.你的旅费可能会改变.但对我来说,这听起来比搞乱资产管道更简单.


Jep*_*erg 4

不幸的是,其他答案都没有真正提出我正在寻找的解决方案,因此在深入研究问题之后,我能够想出一个简单的宝石,可以根据文件名翻转样式表。

因此,通过包含该 gem 并提供名称后附加“-flipped”的样式表版本,我现在可以在开发和生产中提供自动翻转的版本。

在 ruby​​gems.org 上找到 gem:stylesheet_flipper

在 gihub 上找到使用说明:monibuds/stylesheet_flipper

  • 我什至写了一篇关于此的简短博客文章:http://jeppe.liisberg.dk/2012/08/08/stylesheet_flipper/ (2认同)