ねぇうしくんうしくん

今週のまとめ (一週間で自分が見た技術系サイトのログ)が今のところメインです。プログラミング言語、人工知能、セキュリティ 等

TweetDeckの配色を元のものに戻す

2月の初め頃、TweetDeck のダークテーマの色が全体的に変わりました。

f:id:z_kro:20180204043532p:plain

彩度が2倍になり、非常に目が疲れる配色となりました。 このままでは視力が無限に下がるのでユーザーCSSで元の彩度に戻したいと思います。

解決策1. Filter を使う

CSS3 には filter というプロパティがあり簡単な画像処理を行うことができます。 filter - CSS | MDN この場合全体の彩度を半分にすればいいだけです。画像については彩度を元に戻します。

body { filter: saturate(50%) !important; }
img  { filter: saturate(200%) !important; }

一応これでも良さげなんですが、全体にフィルタをかけているのでやはり動作が遅くなる問題点があります。あと画像が元の色と若干違って見えます。

解決策2. CSS プロパティの色の定義を上書きする

元々の CSS 定義されている色の彩度を下げて全て再定義するという力技です。 力技なのでプログラミングで解決します。

方針としては、ダークテーマを識別するクラス .dark が含まれるルールの全ての色の値を書き換えることをします。 幸い css をパースするツールや、Webにおける色定義を扱うツール等は npm に転がっているのでそれを用います。

やり方

前準備として最新の node の環境を用意しましょう。 そして適当なディレクトリを作り、 npm install color css でライブラリをインストールします。 そのディレクトリに対し以下のプログラムを gen_css.js のように適当な名前をつけて保存してください。

// gen_css.js
const fs = require('fs');
const css = require('css');
const Color = require('color');

let cssText = fs.readFileSync('bundle.css', 'utf-8');
let cssObj  = css.parse(cssText);
let rules   = cssObj.stylesheet.rules;

const colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d\.]+%?\))/ig;
let output = '';

function procColor(colText) {
  return Color(colText).desaturate(0.5).rgb()
}

for(let rule of rules) {
  if(rule.type === 'rule') {
    if(rule.selectors.some(s => s.includes('.dark'))) {
      let colorProps = 
        rule.declarations.filter(d => d.value.match(colorRegex));
      if(colorProps.length > 0) {
        output += `${rule.selectors.join(', ')} {\n`
        output += colorProps.map(m => `    ${m.property}: ${m.value.replace(colorRegex, procColor)};`).join('\n');
        output += `\n}\n`;
      }
    }
  }
}

fs.writeFileSync('bundle.out.css', output);

その後、 https://ton.twimg.com/tweetdeck-web/web/dist/bundle.????.css (TweetDeckのHTMLソースに書いてあります) をダウンロードしてきて、 bundle.css として同ディレクトリに配置します。あとは node gen_css.js と実行すれば、 bundle.out.css として出力されます。 出力されたCSSは、Stylish などのブラウザ拡張でユーザー定義を行えばOKです。

f:id:z_kro:20180204045929p:plain 適用後はこんな感じです。若干おかしい部分がありますが動作自体に影響がないので大丈夫かと思います。細かい点は自分で修正してください。

一応2/4 5:00時点での出力結果はこちらにありますが、TweetDeck は頻繁に更新されているためすぐ使い物にならなくなる可能性が高いです。

††† この記事は需要があれば詳細を追記いたします。 †††