7

Я использую (Windows) шрифты TrueType на своей рабочей станции Ubuntu (подробности), и я в основном доволен тем, как выглядят шрифты, как в настольных приложениях, так и в Интернете (используя Firefox).

Однако на некоторых веб-страницах, таких как эта, шрифты полностью отстойны:

Скриншот

Я нашел причину быть Helvetica в CSS для этого сайта:

font-family: Helvetica,Arial,Tahoma,sans-serif;

Когда, используя Firebug, я удаляю Helvetica из этого списка, он использует Arial и снова выглядит элегантно:

альтернативный текст

У меня вопрос, как сделать так, чтобы веб-страницы, которые используют Helvetica (или Times, или другие подобные шрифты), выглядели автоматически? Другими словами, как сопоставить семейства шрифтов Times и Helvetica значениям по умолчанию с засечками и без засечек (в моем случае это были бы Times New Roman и Arial соответственно)?

Я заинтересован в любом решении, которое заставляет Firefox использовать шрифты MS TrueType в этом сценарии, независимо от того, основано ли оно на настройке контуров шрифтов Ubuntu или пользовательских правилах CSS в Firefox (или что-то еще, о чем я сейчас не имею понятия).

Обновление: теперь я полностью решил проблему - этот ответ описывает, что мне нужно было сделать.

5 ответов5

6

Изменить: я полностью обновил этот ответ после получения некоторых прорывных советов от коллеги.

Вот что я вставил в /etc/fonts/local.conf (внутри элемента <fontconfig> ):

<!-- Replace Helvetica with Arial -->
<match target="pattern">
    <test qual="any" name="family">
        <string>Helvetica</string>
    </test>
    <edit name="family" mode="assign" binding="strong">
        <string>Arial</string>
    </edit>
</match>    

Аналогично для Times -> Times New Roman. (Смотрите мой полный local.conf здесь.) Ключ должен был использовать binding = "strong" для элемента <edit> . (Кроме того, использование режима "assign_replace" вместо "assign" приводит к чему-то похожему, за исключением того, что это становится слишком агрессивным: также Verdana заменяется на Arial).

Изменения в конфигурации шрифта вступают в силу немедленно. Помимо тестирования в Firefox, вы можете проверить, что он работает так:

$ fc-match helvetica
Arial.ttf: "Arial" "Normal"

Если вы столкнетесь с проблемами, лучшая помощь будет рядом: man fonts-conf . (Хотя даже с документацией работа системы шрифтов казалась мне несколько сложной или громоздкой.) Вы также можете попытаться "отладить" то, что на самом деле происходит, с помощью такой команды:

FC_DEBUG=4 fc-match helvetica

Кроме того, FC_DEBUG=1024 fc-match helvetica показывает список файлов конфигурации, которые влияют на сопоставление шрифтов.

1

У меня была похожая проблема в Opera, решением которой было отключение "Core X Fonts" в конфиге. Я бы посоветовал посмотреть, есть ли подобная опция в Firefox.

Другие опции:

  • Убедитесь, что у вас определенно не установлен шрифт "Helvetica", подобные вещи случались со мной несколько раз. IIRC проблемные шрифты находились в папках с именами 100dpi и 75dpi в папке системных шрифтов (я думаю, /usr/local/share/fonts ). Я просто полностью переместил эти папки.
  • Проверьте значения по умолчанию в разделе « Система»> "Установки"> "Внешний вид"> "Шрифты".
  • Проверьте настройки Firefox по умолчанию в разделе « Настройки»> "Содержимое".

Если вы вносите изменения в основные папки, вам нужно перестроить кэш шрифтов с помощью:

sudo fc-cache -f -v
0

Вам нужно добавить "Грант" к этому сценарию в любом случае ...

Greasemonkey 1.0 добавляет специальный императив блока метаданных: @grant.

If a script does not specify any @grant values, Greasemonkey 1.0-1.9 will attempt to auto-detect the right settings. From GreaseMonkey 2.0, @grant none is assumed by default, if no other values are specified.[1]
If a script specifies any values (or they were auto detected), then it will be provided with only those API methods that it declares.
    The valid values are unsafeWindow, and the names of those GM_ prefixed values that you wish your script to be granted access to.
Otherwise the script will be granted no special API privileges, and thus run without the security constraints Greasemonkey scripts have traditionally had. If you want your script to operate in this mode, you should explicitly declare @grant none.

Примеры

Для сценариев (более половины, когда они учитывались в последний раз) характерно вообще не использовать никаких специальных API. Для таких сценариев явный запрос на отсутствие специальных привилегий означает, что сценарий будет выполняться непосредственно на странице содержимого. Это означает отсутствие изолированной программной среды безопасности и ее ограничений, поэтому доступ к переменным на странице просто работает, вызов функций и чтение их результатов также работает. Для этого просто:

// ==UserScript==
// @name        Grant None Example (can be omitted since GM 2.0)
// @include     http*
// @grant       none
// ==/UserScript==
console.log('This script grants no special privileges, so it runs without security limitations.');

Если вы используете один из API Greasemonkey, вам следует явно попросить предоставить его вашему сценарию:

// ==UserScript==
// @name        Grant Some Example
// @include     http*
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==

var counter = GM_getValue('counter', 0);
console.log('This script has been run ' + counter + ' times.');
GM_setValue('counter', ++counter);

В этом случае скрипт запрашивает доступ как к GM_getValue и к GM_setValue , по одному в каждой строке @grant . Укажите имя любого API Greasemonkey, которому будет предоставлен доступ к нему. (Все сценарии всегда получают GM_info без специального запроса.) Временно это также будет работать:

// ==UserScript==
// @name        Grant Legacy Example
// @include     http*
// ==/UserScript==

var counter = GM_getValue('counter', 0);
console.log('This script has been run ' + counter + ' times.');
GM_setValue('counter', ++counter);

Этот пример будет работать в Greasemonkey версии 1.0. Когда строк @grant нет, Greasemonkey пытается определить, какие API используются, и действует так, как если бы эти строки @grant были указаны. В некоторых случаях это обнаружение может быть неудачным, особенно при использовании eval() .

Из-за этого все скрипты, написанные до @grant, должны продолжать работать, но вы должны изменить свои скрипты, указав @grant при первой возможности, чтобы они не сломались в будущем. Уровень совместимости

Многие из API Greasemonkey были продублированы веб-стандартами, такими как DOM Storage. Если вы ожидаете, что ваш скрипт будет работать только в одном домене, вы можете использовать @grant none и его повышенную совместимость без каких-либо недостатков. Просто используйте библиотеку @require для эмуляции API Greasemonkey с помощью стандартных функций браузера:

// ==UserScript==
// @name        Grant None Example, With Shim
// @include     http://www.example.com/*
// @grant       none
// @require     https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js
// ==/UserScript==

var counter = GM_getValue('counter', 0);
console.log('This script has been run ' + counter + ' times.');
GM_setValue('counter', ++counter);

Этот сценарий будет работать так же, как и в примере выше, за исключением того, что грант без ограничений обеспечивает эмуляцию API со стандартными функциями браузера. Когда слой совместимости shim работает достаточно хорошо для вашего сценария, это лучшее из обоих миров. Объем

В случае отсутствия разрешения пользовательский сценарий по-прежнему имеет собственную глобальную область, отличную от глобальной области страницы содержимого. Это означает, что верхний уровень var x = 1; не будет виден в области содержимого и, таким образом, не будет разбивать страницу (т. е. если это зависит от переменной x, имеющей другое значение). Чтобы записать значения в область содержимого, выполните window.x = 1; ,

Если вы @require версию jQuery, она будет неявно назначена window.$ И window.jQuery . Если страница, на которой вы работаете, зависит от другой версии jQuery, это может привести к поломке страницы. Чтобы обойти эту проблему, в любом месте на верхнем уровне вашего скрипта выполните:

this.$ = this.jQuery = jQuery.noConflict(true);

Этот код сохранит ссылку jQuery (в эту глобальную область действия скрипта при запуске в режиме предоставления без), удалив ее из окна (глобальная область содержимого) и восстановив все, что там изначально хранилось.

0

Просто интересно, не могли бы вы использовать локальные шрифты и @font face css?

0

Greasemonkey будет одним из решений вашего вопроса. Установите это дополнение, и вы сможете настраивать веб-страницы и изменять шрифты.

и один пример сценария, который меняет шрифт на Helvita

// ==UserScript==
// @name           Google Reader Font in Helvetica and enlarged
// @version        1.0
// @creator        Joe
// @description    Changes the font family and size from Google Reader page
// @namespace      userscripts.org
// @include        https://www.google.com/reader/*
// @include        http://www.google.com/reader/*

// ==/UserScript==

function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}

addGlobalStyle('.entry-body{font-family:Helvetica;font-size:110%;line-height:150%;}');
addGlobalStyle('A.entry-title-link {font-family:Helvetica;font-size: 20px;}');

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .