Как я могу заставить CQ5.5 игнорировать схемы CSS data-uri?

Я пытаюсь включить собственный шрифт в css, используя схему data-uri. CQ5 (я использую версию 5.5) добавляет путь из каталога clientlib в место, где находится файл css с данными шрифта data-uri-scheme.

Итак, вместо того, чтобы просто игнорировать свойство css:

@font-face {
  font-family: 'CustomFont';
  src: url(data:application/x-font-woff;...
  ...
}

CQ5 делает следующее:

@font-face {
  font-family: 'CustomFont';
  src: url(desktop/css/data:application/x-font-woff;...
  ...
}

Является ли это ошибкой в ​​CQ5.5 или я могу добавить/сделать что-то, чтобы предотвратить добавление "desktop/css"?

В результате я получаю статус HTTP 404, потому что шрифт «не найден».

[ОБНОВЛЕНИЕ]:

Файл css включен в base.jsp в разделе <head> html.

<link rel="stylesheet" 
    href="/etc/designs/myproject/clientlib/desktop.css" type="text/css"/ >

Местонахождение base.jsp:

/apps/myproject/pages/base/base.jsp

Местонахождение css.txt:

/etc/designs/myproject/clientlib/desktop/css.txt

person T. Junghans    schedule 18.12.2012    source источник
comment
Не могли бы вы добавить более подробную информацию о том, как именно вы включаете этот css на свою страницу? Например, это в файле css, включенном в clientlib? Если да, то каково соответствующее содержимое этого файла css и каков фрагмент кода, который включает клиентские библиотеки в ваш HTML (например, currentDesign.writeCssIncludes(pageContext);). Является ли это встроенным в ваш cq:Page HTML JSP? Вы выводите вышеперечисленное на одной из ваших страниц или компонентов JSP? Я спрашиваю, чтобы продублировать проблему и посмотреть, может ли это быть проблемой проверки ссылок или HtmlLibraryManager, переписывающей URL-адрес для вас.   -  person Jason Day    schedule 22.12.2012
comment
@JasonDay Я обновил свой вопрос, чтобы ответить на ваши вопросы. Дайте мне знать, если есть что-то еще, что мне не хватает. Спасибо.   -  person T. Junghans    schedule 22.12.2012


Ответы (4)


Это ошибка, будет исправлена ​​в 5.6. Включение отдельного файла css напрямую (как уже упоминалось) позволяет избежать перезаписи clientlib, в противном случае я не знаю обходного пути внутри clientlib.

Причина в том, что клиентские библиотеки переписывают относительные пути, потому что база изменяется с отдельного файла css на конкатенированный clientlib css. "данные:" uri здесь просто не учитывались должным образом.

person Alexander Klimetschek    schedule 03.01.2013
comment
Я согласен с этим ответом, так как это также то, что Джастин Эдельсон написал в Твиттере. Спасибо. - person T. Junghans; 03.01.2013

Это похоже на ошибку. CSS передается через метод, который специально ищет url('{}') в файлах CSS, объединенных вместе для создания объединенного файла CSS — CssFileBuilder#resolveUrl(String[], String[], String). Этот метод не учитывает схему данных, вместо этого он пропускает изменение URL-адреса только в том случае, если он имеет длину 0, начинается с косой черты (/) или соответствует шаблону "^[A-Za-z][]. A-Za-z0-9+\-.]://." (фактически внешние ссылки). Мое предположение состоит в том, что он делает это для изменения относительных значений url('{}'), но они не учитывали схему данных.

Я бы рекомендовал открыть билет Daycare с Adobe, чтобы обновить этот метод для поддержки схемы data-uri.

person Jason Day    schedule 22.12.2012
comment
Привет Джейсон, спасибо за подробный анализ. Я предположил, что это будет ошибка. Если вы не возражаете, я спрошу, вы работаете в Adobe или работали на клиента, использующего Day? - person T. Junghans; 23.12.2012
comment
Вовсе нет, я работаю в компании, которая использует CQ5 для нескольких наших веб-сайтов. - person Jason Day; 25.12.2012
comment
Я присудил награду за этот ответ, потому что я предполагал, что это будет так, и открытие билета в детский сад — это следующий шаг, который я предприму. - person T. Junghans; 28.12.2012

Две стратегии обхода (обычно полезной) перезаписи ссылок CQ5:

(1) Поместите код @font-face во внешний файл (файлы) .css, который CQ5 собрал для вас. Вместо использования ‹cq:includeClientLib >, чтобы включить его в свой HTML, может оказаться, что вам придется явно закодировать тег ‹link>, например:

<link rel="stylesheet" href="<%= currentDesign.getPath() %>/clientlibs/themes/default.css" type="text/css" media="screen" />

(2) Вставьте код @font-face с вызовом document.write():

<script type="text/javascript">
    document.write("@font-face { font-family: 'CustomFont'; src: url(data:application/x-font-woff;
    ...}");
</script>
person David Gorsline    schedule 18.12.2012
comment
Привет Дэвид, спасибо за предложения. Я знаю об обоих этих решениях. Я бы, вероятно, выбрал первый или использовал встроенный css (‹style›) для включения шрифтов. Я работаю над веб-сайтом с высоким трафиком, где учитывается каждый http-запрос, и я надеюсь найти решение, которое позволит мне использовать схему data-uri. - person T. Junghans; 18.12.2012

Не проверив, что вызвало неуместное переписывание, я предполагаю, что это был Day CQ Link Checker Service.

Возможно, вы захотите добавить Special Link Prefix или Special Link Pattern, чтобы этот шаблон не был идентифицирован как ссылка и вообще не был перезаписан.

Так что просто добавьте свою пользовательскую конфигурацию проверки ссылок в /apps/.. (наложение соответствующей конфигурации в libs) с указанными изменениями, и все будет в порядке.

person Dominik Süß    schedule 02.01.2013
comment
Нет, это не связано с проверкой ссылок. Клиентские библиотеки переписывают относительные пути, потому что база изменяется с отдельного файла css на объединенный css clientlib. - person Alexander Klimetschek; 03.01.2013