import marked from "marked"

const truncate = (str: string, num: number): string => {
  if (str.length <= num) {
    return str
  }
  return str.slice(0, num) + "..."
}

const MarkdownToText = (body: string, num: number) => {
  const renderer = {
    code() {
      return ""
    },
    blockquote(quote: string) {
      return quote
    },
    html() {
      return ""
    },
    heading() {
      return ""
    },
    hr() {
      return ""
    },
    list() {
      return ""
    },
    listitem(text: string) {
      return text
    },
    checkbox() {
      return ""
    },
    paragraph(text: string) {
      return text
    },
    table() {
      return ""
    },
    tablerow() {
      return ""
    },
    tablecell() {
      return ""
    },
    strong(text: string) {
      return text
    },
    em(text: string) {
      return text
    },
    codespan() {
      return ""
    },
    br() {
      return ""
    },
    del(text: string) {
      return text
    },
    link() {
      return ""
    },
    image() {
      return ""
    },
    text(text: string) {
      return text
    },
  }

  marked.use({ renderer })
  const text = marked(body)

  // HACK: Need to reset back to the default options.
  // Otherwise, the custom renderer will impact on the joint solution page like
  // https://pingcap.com/joint-solution-detail/distributed-database-aio-based-on-tidb-and-kuntai
  marked.use(marked.getDefaults())

  return num ? truncate(text, num) : text
}

export default MarkdownToText
