Shopify SCSS с синтаксисом Liquid не может быть преобразован в CSS

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.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
0
34
1

Ответы 1

Насколько мне известно, нет программы, которая могла бы конвертировать scss.liquid. scss.liquid обычно имеет переменную, которая ссылается на settings_data.json в вашем магазине, которая уникальна, плюс многочисленные функции микширования. Я не вижу никакого целостного пути, кроме:

  1. Получите обновленную тему.

  2. захватить файл из источника страницы при его визуализации.

  3. Удалите все liquid из SCSS и конвертируйте.

  4. Перекодируйте файл с помощью 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 }};
     }
    

Другие вопросы по теме