Greasy Fork is available in English.

zhihu one

知乎代码高亮

// ==UserScript==
// @name         zhihu one
// @version      0.1.4
// @description  知乎代码高亮
// @author       Limboer
// @match        *://*.zhihu.com/*
// @resource     darkCSS https://gitee.com/limboer/zhihu-highlight/raw/master/dark.css
// @resource     lightCSS https://gitee.com/limboer/zhihu-highlight/raw/master/light.css
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @namespace    https://greasyfork.org/users/443935
// ==/UserScript==


(function() {
const createDOMFromString = (html) => {
  const div = document.createElement('div')
  div.insertAdjacentHTML('beforeend', html)
  return div
}

const mount = (component, root, position='beforeend') => {
  root.insertAdjacentElement(position, component.renderDOM())
  component.onStateChange = (oldEl, newEl) => {
    root.insertAdjacentElement(position, newEl)
    root.removeChild(oldEl)
  }
}

class Component {
  constructor(props={}) {
    this.props = props
    this.el = null
    this.state = {}
  }

  onStateChange(oldEl, newEl) {
    console.log('state changed')
  }

  setState(newState) {
    const oldEl = this.el
    this.state = newState
    this.el = this.renderDOM()
    this.onStateChange(oldEl, this.el)
  }

  handleClick() {
    console.log('clicked')
  }

  render() {
    return '<div></div>'
  }

  renderDOM() {
    this.el = createDOMFromString(this.render())
    this.el.addEventListener('click', e => this.handleClick(e), false)

    return this.el
  }
}

class ThemeToogleButton extends Component {
  constructor(props) {
    super(props)
    this.state = {
      theme: document.querySelector('html').getAttribute('data-theme') || 'light'
    }
    this.toogleTheme()
    console.log('state', this.state)
  }

  toogleTheme() {
    const darkMode = GM_getResourceText("darkCSS")
    const lightMode = GM_getResourceText("lightCSS")
    if (this.state.theme === 'dark') {
      GM_addStyle(darkMode)
    } else {
      GM_addStyle(lightMode)
    }
    // 发送改变主题的请求, 在用户下一次刷新页面的时候更新该 url 下的主题
    fetch(`/?theme=${this.state.theme}`)
      .then(res => document.querySelector('html').setAttribute('data-theme', this.state.theme))
      .catch(error => console.error('error', error))
  }

  handleClick(e) {
    this.setState({
      theme: this.state.theme === 'light' ? 'dark' : 'light'
    })
    this.toogleTheme()
  }

  render() {
    return `
      <div class="CornerAnimayedFlex">
        <button
          data-tooltip=${this.state.theme === "dark" ? "日常模式" : "黑暗模式"}
          data-tooltip-position="left"
          type="button"
          class="Button CornerButton Button--plain"
        >
          ${this.state.theme === "dark" ? "Light" : "Dark"}
        </button>
      </div>
    `
  }
}

const root = document.querySelector('.CornerButtons')
const themeToogleButton = new ThemeToogleButton()
mount(themeToogleButton, root, 'afterbegin')

})();