async read(obj) {
    const { target } = obj
    const results = (text = '', baseUrl = '') => {
      const hash = this.hash(text)
      const changed =
        this.root.querySelector(`.markdown-${target}`)?.getAttribute('data-hash') !== hash
      return { ...obj, text, hash, changed, baseUrl }
    }
    switch (target) {
      case 'styles': {
        const get = (query = '') => this.querySelector(query)?.innerHTML
        return results(
          (get('template[data-prepend]') ?? '') +
            (get('template:not([data-prepend],[data-append])') ?? this.template) +
            (get('template[data-append]') ?? '')
        )
      }
      case 'body': {
        if (this.src) {
          const response = await fetch(this.src)
          if (response.ok) {
            const getBaseUrl = () => {
              const a = document.createElement('a')
              a.href = this.src || ''
              return a.href.substring(0, a.href.lastIndexOf('/') + 1)
            }
            return results(await response.text(), getBaseUrl())
          } else {
            console.warn('[zero-md] error reading src', this.src)
          }
        }
        /** @type {HTMLScriptElement|null} */
        const script = this.querySelector('script[type="text/markdown"]')
        return results(script?.text || '')
      }
      default:
        return results()
    }
  }
Retrieve raw style templates and markdown strings
@param {ZeroMdRenderObject} obj
@returns {Promise<ZeroMdRenderObject>}