Shopify недавно решил прекратить поддерживать SCSS в своих темах. Я хотел бы изменить все файлы SCSS на CSS, но это стало кошмаром из-за наличия в них жидкого синтаксиса. Вот пример:
// Overlays
$color-overlay-title-text: {{ settings.color_image_overlay_text }};
$color-image-overlay: {{ settings.color_image_overlay }};
$opacity-image-overlay: {{ settings.image_overlay_opacity | divided_by: 100.00 }};
{%- comment -%}
Based on the image overlay opacity, either lighten or darken the image on hover
{%- endcomment -%}
{% assign image_overlay_opacity = settings.image_overlay_opacity | divided_by: 100.00 %};
{% if image_overlay_opacity > 0.85 %}
{% assign image_overlay_opacity_hover = image_overlay_opacity | minus: 0.3 %};
{% else %}
{% assign image_overlay_opacity_hover = image_overlay_opacity | plus: 0.4 %};
{% endif %}
$hover-overlay-opacity: {{ image_overlay_opacity_hover | at_most: 1 }};
Когда я пытаюсь запустить это через компилятор scss, найденный в Интернете, он терпит неудачу на первом {{, {% или {%-, поскольку это недопустимый синтаксис scss. Конечным результатом, который я хотел бы, был действующий файл css, который сохраняет жидкий синтаксис.
Моя следующая мысль заключалась в том, чтобы предварительно скомпилировать файл и обернуть жидкий синтаксис внутри unquote("") или комментария css, который будет удален позже, а затем передать его компилятору ruby scss, разветвленному из здесь. Что-то вроде этого:
require 'tempfile'
require 'fileutils'
files = ARGV[0]
input_file, output_file = [files.split(":")[0], files.split(":")[1]]
puts "Converting file: #{input_file}"
path_to_compiler = "./lib/ruby-sass/bin/scss"
tmp_path = "./tmp"
# Replace liquid syntax with something SCSS can parse
temp_file = Tempfile.new('tmpscss')
begin
File.open(input_file, 'r') do |file|
file.each_line do |temp_line|
line = temp_line
# Trying to account for edge cases in liquid syntax
if line[0..1] == "{{"
line = line.gsub("{{", "/*lsc {{").gsub("}}", "}} lsc*/")
else
line = line.gsub("{{", "unquote(\"{{").gsub("}}", "}}\")")
end
if line.include?("comment")
line = line.gsub("{%- comment -%}", "/*lsc {%- comment -%}").gsub("{%- endcomment -%}", "{%- endcomment -%} lsc*/")
else
line = line.gsub("{%", "/*lsc {%").gsub("%}", "%} lsc*/")
end
temp_file.puts line
end
end
temp_file.close
FileUtils.mv(temp_file.path, tmp_path)
puts "#{temp_file.path}:#{output_file}"
# Pass to SCSS compiler
system "ruby #{path_to_compiler} -C .#{temp_file.path}:#{output_file}"
ensure
temp_file.close
temp_file.unlink
end
puts "Output file to: #{Dir.pwd}/#{output_file}"
Это успешно для нескольких строк, но слишком много крайних случаев для примитивной логики, которую я пытался проанализировать, и преобразование scss в css неизбежно завершится ошибкой. Должен быть способ сделать это лучше. У кого-нибудь есть идеи? Я бы хотел, чтобы Shopify позволил нам использовать их компилятор SCSS.






Насколько мне известно, нет программы, которая могла бы конвертировать scss.liquid. scss.liquid обычно имеет переменную, которая ссылается на settings_data.json в вашем магазине, которая уникальна, плюс многочисленные функции микширования. Я не вижу никакого целостного пути, кроме:
Получите обновленную тему.
захватить файл из источника страницы при его визуализации.
Удалите все liquid из SCSS и конвертируйте.
Перекодируйте файл с помощью CSS и жидкости. Вместо переменной в sass используйте var (). Это самый болезненный способ.
{% assign image_overlay_opacity = settings.image_overlay_opacity | divided_by: 100.00 %};
{% if image_overlay_opacity > 0.85 %}
{% assign image_overlay_opacity_hover = image_overlay_opacity | minus: 0.3 %};
{% else %}
{% assign image_overlay_opacity_hover = image_overlay_opacity | plus: 0.4 %};
{% endif %}
// Overlays
:root {
--color-overlay-title-text: {{ settings.color_image_overlay_text }};
--color-image-overlay: {{ settings.color_image_overlay }};
--opacity-image-overlay: {{ settings.image_overlay_opacity | divided_by: 100.00 }};
--hover-overlay-opacity: {{ image_overlay_opacity_hover | at_most: 1 }};
}