7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Qiitaのフィードのコメント数ごとに背景色を追加するユーザースクリプト

Last updated at Posted at 2016-01-18

概要

フィードに現れる記事ごとのコメント数を取得し、好きにします。
今回はコメント数箇所の背景をコメント数ごとに色分けし、視認性を良くします。

スクリーンショット

カラーコメント.png

いい感じに全色そろわなかった…

動作検証環境

  • Firefox 44
  • greasemonkey

動作ページ

  • フィード
  • すべての投稿
  • ストック
  • 自分の投稿

コード

GistスクリプトリンクQiita_add_background_color_to_comment.user.js

Qiita_add_background_color_to_comment.user.js

// ==UserScript==
// @name        Qiita add background color to comment
// @namespace   khsk
// @description フィードの投稿にコメントが付いているならば、背景色を追加する
// @include     http://qiita.com/
// @include     https://qiita.com/
// @include     http://qiita.com/items
// @include     https://qiita.com/items
// @include     http://qiita.com/stock
// @include     https://qiita.com/stock
// @include     http://qiita.com/mine
// @include     https://qiita.com/mine
// @version     1
// @grant       none
// ==/UserScript==

console.time('commentcolor')

// bootstrap3からやらわかめの色を
var HEAT_MAP = {
  NO_COMMENT    : '',
  COMMENT       : '#d9edf7', // 青
  DIALOGUE      : '#dff0d8', // 緑
  CONVERSASTION : '#fcf8e3', // 黄色
  DISCUSSION    : '#f2dede'  // 赤
}

// コメント数(テキスト)によって背景色を追加する
var changeCommentsBackGround = node => {
  var commentsNum = parseInt(node.text.trim())
  var bgcolor
  switch (true) {
    case commentsNum == 0:
      bgcolor = HEAT_MAP.NO_COMMENT
      break;
    case commentsNum == 1:
      bgcolor = HEAT_MAP.COMMENT
      break;
    case 2 <= commentsNum && commentsNum <= 5:
      bgcolor = HEAT_MAP.DIALOGUE
      break;
    case 6 <= commentsNum && commentsNum <= 9:
      bgcolor = HEAT_MAP.CONVERSASTION
      break;
    case 10 <= commentsNum:
      bgcolor = HEAT_MAP.DISCUSSION
      break;
    default:
      alert("想定外のコメント数です:" + commentsNum)
      break;
  }
  node.style.backgroundColor = bgcolor
}

// 変更を監視する。追加分だけには対応しておらず、毎回全チェック。
var mo = new MutationObserver((data1, data2) => {
  
  // フィードは.unstyled、すべての投稿は.list-unstyled。ただし、タグリストも.list-unstyledなので、notで弾かないと2個めのタグも変わってしまう
  var comments = document.querySelectorAll('ul.unstyled > li:nth-child(2) > a:nth-child(1), ul.list-unstyled:not(.item-box_tagList) > li:nth-child(2) > a:nth-child(1)')
  
  Array.prototype.forEach.call(comments, comment => {
    changeCommentsBackGround(comment)
  })
})

var items = document.getElementsByClassName('col-sm-9')[0]
var options = {childList: true, subtree:true}
mo.observe(items, options)

console.timeEnd('commentcolor')

ひとりごと

コメントが好きです。
長い記事でもより簡単な方法を簡潔に書いてあったり、
間違いを訂正していたり、
熱い議論がかわされていたり、
応援やアドバイスがあったり、
(勧められませんが)質問記事にさっと回答があったり。

コメントに価値があり、コメントされる記事に価値があります。
興味が無い記事でもコメントだけなんとなく眺めています。
なので、フィードでフォロータグの新着コメントとかあればいいなと思いました。


実装面では、記事全体の背景色を変えてもいいなと思いました。
ストック数にも使えるはずなので、合わせて盛り上がりを簡単に表せたらいいかもしれません。

色付けは変更を検知して行っていますが、増分に対してではないので、読み込みすぎると重くなると思います。
また、Qiitaでは、タブを切り替えるとURLも代わりますが、元々のページ扱いで、リロードするとその時開いていたページ扱いになります。
なので、ストック→フィードではストックページのURLでスクリプトが動かなければ、ストックからタブ切り替えしたフィードページで色付けできません。
なので、動作対象を全タブページにした結果、フィード以外のコメントも色付けされました。怪我の功名ですね。
フィードの読み込みが非同期だったので、監視要素を最初からある親の大きなdivにしたことも幸いしました。

CSSの:containsは実装見込みが無いので(取り下げられたし)、毎回探すのはやめよう。
そろそろ1 < hoge < 10のように書いてしまうことから卒業しよう。


そもそもコメント数に背景色をつけた理由は、0コメントが表示されるからなんですよね。
フィード以外は0コメントは表示されないので、コメントがある記事は右側がガタッとなって目立つのですが、フィードは0コメントも表示するので、コメントがあることが目立たないです。
レイアウトの不統一感もあるし、フィードも0コメントは非表示でいいんじゃないかなぁ。

ところで、最近は良い記事を自動で取り上げるところも増えて、
Qaleidospace

【毎日自動更新】Qiitaのデイリーストックランキング!ウィークリーもあるよ - Qiita(ttp://qiita.com/takeharu/items/bb154a4bc198fb102ff3)1
があるので、盛り上がっている記事をフィードで探すのは少し無駄手間かもしれませんね。

  1. 参照リンクで記事が重くなるので古きよきh抜き

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?