{"version":3,"file":"Artalk.mjs","sources":["../src/api/v2.ts","../src/api/fetch.ts","../src/api/handler.ts","../src/api/index.ts","../../../node_modules/.pnpm/marked@14.1.2/node_modules/marked/lib/marked.esm.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/she.js","../../../node_modules/.pnpm/assignment@2.0.0/node_modules/assignment/assignment.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/lowercase.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/toMap.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/attributes.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/elements.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/parser.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/sanitizer.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/defaults.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/insane.js","../src/lib/sanitizer.ts","../../../node_modules/.pnpm/hanabi@0.4.0/node_modules/hanabi/dist/hanabi.js","../src/lib/highlight.ts","../src/lib/marked-renderer.ts","../src/lib/marked.ts","../src/lib/merge-deep.ts","../src/data.ts","../src/lib/utils.ts","../src/i18n/en.ts","../src/i18n/zh-CN.ts","../src/i18n/external.ts","../src/i18n/index.ts","../src/lib/event-manager.ts","../src/defaults.ts","../src/config.ts","../src/lib/watch-conf.ts","../src/context.ts","../src/lib/ui.ts","../src/components/checker/captcha-renders.ts","../src/components/checker/captcha.ts","../src/components/checker/admin.ts","../src/components/dialog.ts","../src/components/checker/index.ts","../src/lib/component.ts","../src/editor/editor.html?raw","../src/editor/ui.ts","../src/plugins/editor/_plug.ts","../src/plugins/editor/mover.ts","../src/editor/state.ts","../src/editor/editor.ts","../src/layer/sidebar-layer.html?raw","../src/layer/sidebar-layer.ts","../src/list/list.html?raw","../src/list/nest.ts","../src/list/layout/nest.ts","../src/list/layout/flat.ts","../src/list/layout/index.ts","../src/lib/detect.ts","../src/comment/height-limit.ts","../src/comment/comment.html?raw","../src/comment/renders/avatar.ts","../src/comment/renders/header.ts","../src/comment/renders/content.ts","../src/comment/renders/reply-at.ts","../src/comment/renders/reply-to.ts","../src/comment/renders/pending.ts","../src/components/action-btn.ts","../src/comment/renders/actions.ts","../src/comment/renders/index.ts","../src/comment/render.ts","../src/comment/actions.ts","../src/comment/comment-node.ts","../src/list/comment.ts","../src/components/read-more-btn.ts","../src/list/paginator/read-more.ts","../src/components/pagination.ts","../src/list/paginator/up-down.ts","../src/list/page.ts","../src/list/list.ts","../src/layer/scrollbar-helper.ts","../src/layer/layer.ts","../src/layer/wrap.ts","../src/layer/layer-manager.ts","../src/lib/user.ts","../src/service.ts","../src/plugins/stat.ts","../src/plugins/markdown.ts","../src/plugins/editor/local-storage.ts","../src/plugins/editor/textarea.ts","../src/plugins/editor/submit-btn.ts","../src/plugins/editor/submit-add.ts","../src/plugins/editor/submit.ts","../src/plugins/editor/state-reply.ts","../src/plugins/editor/state-edit.ts","../src/plugins/editor/closable.ts","../src/plugins/editor/header-event.ts","../src/plugins/editor/header-user.ts","../src/plugins/editor/header-link.ts","../src/plugins/editor/emoticons.ts","../src/plugins/editor/upload.ts","../src/plugins/editor/preview.ts","../src/plugins/editor/index.ts","../src/plugins/editor/_kit.ts","../src/plugins/editor-kit.ts","../src/plugins/list/with-editor.ts","../src/plugins/list/unread.ts","../src/plugins/list/count.ts","../src/plugins/list/sidebar-btn.ts","../src/plugins/list/unread-badge.ts","../src/plugins/list/goto-dispatcher.ts","../src/plugins/list/goto-focus.ts","../src/plugins/list/copyright.ts","../src/plugins/list/no-comment.ts","../src/plugins/list/dropdown.ts","../src/plugins/list/time-ticking.ts","../src/components/error-dialog.ts","../src/plugins/list/error-dialog.ts","../src/plugins/list/loading.ts","../src/plugins/list/fetch.ts","../src/plugins/list/reach-bottom.ts","../src/plugins/list/goto-first.ts","../src/plugins/list/index.ts","../src/plugins/notifies.ts","../src/plugins/version-check.ts","../src/plugins/admin-only-elem.ts","../src/plugins/dark-mode.ts","../src/plugins/index.ts","../src/load.ts","../src/artalk.ts","../src/main.ts"],"sourcesContent":["/* eslint-disable */\n/* tslint:disable */\n/*\n * ---------------------------------------------------------------\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API        ##\n * ##                                                           ##\n * ## AUTHOR: acacode                                           ##\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\n * ---------------------------------------------------------------\n */\n\nexport interface AuthAuthProviderInfo {\n  icon: string\n  label: string\n  name: string\n  path?: string\n}\n\nexport interface CommonApiVersionData {\n  app: string\n  commit_hash: string\n  version: string\n}\n\nexport interface CommonConfData {\n  frontend_conf: CommonMap\n  version: CommonApiVersionData\n}\n\nexport interface CommonJSONResult {\n  /** Data */\n  data: any\n  /** Message */\n  msg: string\n}\n\nexport type CommonMap = Record<string, any>\n\nexport interface EntityCookedComment {\n  badge_color: string\n  badge_name: string\n  content: string\n  content_marked: string\n  date: string\n  email_encrypted: string\n  id: number\n  ip_region: string\n  is_allow_reply: boolean\n  is_collapsed: boolean\n  is_pending: boolean\n  is_pinned: boolean\n  is_verified: boolean\n  link: string\n  nick: string\n  page_key: string\n  page_url: string\n  rid: number\n  site_name: string\n  ua: string\n  user_id: number\n  visible: boolean\n  vote_down: number\n  vote_up: number\n}\n\nexport interface EntityCookedNotify {\n  comment_id: number\n  id: number\n  is_emailed: boolean\n  is_read: boolean\n  read_link: string\n  user_id: number\n}\n\nexport interface EntityCookedPage {\n  admin_only: boolean\n  date: string\n  id: number\n  key: string\n  pv: number\n  site_name: string\n  title: string\n  url: string\n  vote_down: number\n  vote_up: number\n}\n\nexport interface EntityCookedSite {\n  first_url: string\n  id: number\n  name: string\n  urls: string[]\n  urls_raw: string\n}\n\nexport interface EntityCookedUser {\n  badge_color: string\n  badge_name: string\n  email: string\n  id: number\n  is_admin: boolean\n  link: string\n  name: string\n  receive_email: boolean\n}\n\nexport interface EntityCookedUserForAdmin {\n  badge_color: string\n  badge_name: string\n  comment_count: number\n  email: string\n  id: number\n  is_admin: boolean\n  is_in_conf: boolean\n  last_ip: string\n  last_ua: string\n  link: string\n  name: string\n  receive_email: boolean\n}\n\nexport type HandlerMap = Record<string, any>\n\nexport interface HandlerParamsCaptchaVerify {\n  /** The captcha value to check */\n  value: string\n}\n\nexport interface HandlerParamsCommentCreate {\n  /** The comment content */\n  content: string\n  /** The comment email */\n  email: string\n  /** The comment link */\n  link?: string\n  /** The comment name */\n  name: string\n  /** The comment page_key */\n  page_key: string\n  /** The comment page_title */\n  page_title?: string\n  /** The comment rid */\n  rid?: number\n  /** The site name of your content scope */\n  site_name: string\n  /** The comment ua */\n  ua?: string\n}\n\nexport interface HandlerParamsCommentUpdate {\n  /** The comment content */\n  content: string\n  /** The comment email */\n  email?: string\n  /** The comment ip */\n  ip?: string\n  /** The comment is_collapsed */\n  is_collapsed: boolean\n  /** The comment is_pending */\n  is_pending: boolean\n  /** The comment is_pinned */\n  is_pinned: boolean\n  /** The comment link */\n  link?: string\n  /** The comment nick */\n  nick?: string\n  /** The comment page_key */\n  page_key: string\n  /** The comment rid */\n  rid: number\n  /** The site name of your content scope */\n  site_name: string\n  /** The comment ua */\n  ua?: string\n}\n\nexport interface HandlerParamsEmailSend {\n  /** The body of email */\n  body: string\n  /** The subject of email */\n  subject: string\n  /** The email address of the receiver */\n  to_addr: string\n}\n\nexport interface HandlerParamsNotifyReadAll {\n  /** The user email */\n  email: string\n  /** The username */\n  name: string\n}\n\nexport interface HandlerParamsPageFetchAll {\n  /** If not empty, only fetch pages of this site */\n  site_name?: string\n}\n\nexport interface HandlerParamsPagePV {\n  /** The page key */\n  page_key: string\n  /** The page title */\n  page_title?: string\n  /** The site name of your content scope */\n  site_name?: string\n}\n\nexport interface HandlerParamsPageUpdate {\n  /** Updated page admin_only option */\n  admin_only: boolean\n  /** Updated page key */\n  key: string\n  /** The site name of your content scope */\n  site_name: string\n  /** Updated page title */\n  title: string\n}\n\nexport interface HandlerParamsSettingApply {\n  /** The content of the config file in YAML format */\n  yaml: string\n}\n\nexport interface HandlerParamsSiteCreate {\n  /** The site name */\n  name: string\n  /** The site urls */\n  urls: string[]\n}\n\nexport interface HandlerParamsSiteUpdate {\n  /** Updated site name */\n  name: string\n  /** Updated site urls */\n  urls: string[]\n}\n\nexport interface HandlerParamsTransferImport {\n  /** Automatically answer yes for all questions */\n  assumeyes?: boolean\n  /** The JSON data */\n  json_data?: string\n  /** The JSON file path */\n  json_file?: string\n  /** The target site name */\n  target_site_name?: string\n  /** The target site url */\n  target_site_url?: string\n  /** Keep domain */\n  url_keep_domain?: boolean\n  /** Enable URL resolver */\n  url_resolver?: boolean\n}\n\nexport interface HandlerParamsUserCreate {\n  /** The user badge color (hex format) */\n  badge_color?: string\n  /** The user badge name */\n  badge_name?: string\n  /** The user email */\n  email: string\n  /** The user is an admin */\n  is_admin: boolean\n  /** The user link */\n  link?: string\n  /** The user name */\n  name: string\n  /** The user password */\n  password?: string\n  /** The user receive email */\n  receive_email: boolean\n}\n\nexport interface HandlerParamsUserLogin {\n  /** The user email */\n  email: string\n  /** The username */\n  name?: string\n  /** The user password */\n  password: string\n}\n\nexport interface HandlerParamsUserUpdate {\n  /** The user badge color (hex format) */\n  badge_color?: string\n  /** The user badge name */\n  badge_name?: string\n  /** The user email */\n  email: string\n  /** The user is an admin */\n  is_admin: boolean\n  /** The user link */\n  link?: string\n  /** The user name */\n  name: string\n  /** The user password */\n  password?: string\n  /** The user receive email */\n  receive_email: boolean\n}\n\nexport interface HandlerParamsVote {\n  /** The user email */\n  email?: string\n  /** The username */\n  name?: string\n}\n\nexport interface HandlerRequestAuthDataMergeApply {\n  user_name: string\n}\n\nexport interface HandlerRequestAuthEmailLogin {\n  code?: string\n  email: string\n  password?: string\n}\n\nexport interface HandlerRequestAuthEmailRegister {\n  code: string\n  email: string\n  link?: string\n  name?: string\n  password: string\n}\n\nexport interface HandlerRequestAuthEmailSend {\n  email: string\n}\n\nexport interface HandlerRequestUserInfoUpdate {\n  code?: string\n  email: string\n  link?: string\n  name: string\n}\n\nexport interface HandlerResponseAdminUserList {\n  count: number\n  users: EntityCookedUserForAdmin[]\n}\n\nexport interface HandlerResponseAuthDataMergeApply {\n  deleted_user_count: number\n  update_comments_count: number\n  update_notifies_count: number\n  update_votes_count: number\n  /** Empty if login user is target user no need to re-login */\n  user_token: string\n}\n\nexport interface HandlerResponseAuthDataMergeCheck {\n  need_merge: boolean\n  user_names: string[]\n}\n\nexport interface HandlerResponseCaptchaGet {\n  img_data: string\n}\n\nexport interface HandlerResponseCaptchaStatus {\n  is_pass: boolean\n}\n\nexport interface HandlerResponseCommentCreate {\n  badge_color: string\n  badge_name: string\n  content: string\n  content_marked: string\n  date: string\n  email_encrypted: string\n  id: number\n  ip_region: string\n  is_allow_reply: boolean\n  is_collapsed: boolean\n  is_pending: boolean\n  is_pinned: boolean\n  is_verified: boolean\n  link: string\n  nick: string\n  page_key: string\n  page_url: string\n  rid: number\n  site_name: string\n  ua: string\n  user_id: number\n  visible: boolean\n  vote_down: number\n  vote_up: number\n}\n\nexport interface HandlerResponseCommentGet {\n  /** The comment detail */\n  comment: EntityCookedComment\n  /** The reply comment if exists (like reply) */\n  reply_comment: EntityCookedComment\n}\n\nexport interface HandlerResponseCommentList {\n  comments: EntityCookedComment[]\n  count: number\n  page: EntityCookedPage\n  roots_count: number\n}\n\nexport interface HandlerResponseCommentUpdate {\n  badge_color: string\n  badge_name: string\n  content: string\n  content_marked: string\n  date: string\n  email_encrypted: string\n  id: number\n  ip_region: string\n  is_allow_reply: boolean\n  is_collapsed: boolean\n  is_pending: boolean\n  is_pinned: boolean\n  is_verified: boolean\n  link: string\n  nick: string\n  page_key: string\n  page_url: string\n  rid: number\n  site_name: string\n  ua: string\n  user_id: number\n  visible: boolean\n  vote_down: number\n  vote_up: number\n}\n\nexport interface HandlerResponseConfAuthProviders {\n  anonymous: boolean\n  providers: AuthAuthProviderInfo[]\n}\n\nexport interface HandlerResponseConfDomain {\n  /** Is the domain trusted */\n  is_trusted: boolean\n  /** The origin of the domain */\n  origin: string\n}\n\nexport interface HandlerResponseNotifyList {\n  count: number\n  notifies: EntityCookedNotify[]\n}\n\nexport interface HandlerResponsePageFetch {\n  admin_only: boolean\n  date: string\n  id: number\n  key: string\n  pv: number\n  site_name: string\n  title: string\n  url: string\n  vote_down: number\n  vote_up: number\n}\n\nexport interface HandlerResponsePageFetchStatus {\n  /** The number of pages that have been fetched */\n  done: number\n  /** If the task is in progress */\n  is_progress: boolean\n  /** The message of the task status */\n  msg: string\n  /** The total number of pages */\n  total: number\n}\n\nexport interface HandlerResponsePageList {\n  count: number\n  pages: EntityCookedPage[]\n}\n\nexport interface HandlerResponsePagePV {\n  pv: number\n}\n\nexport interface HandlerResponsePageUpdate {\n  admin_only: boolean\n  date: string\n  id: number\n  key: string\n  pv: number\n  site_name: string\n  title: string\n  url: string\n  vote_down: number\n  vote_up: number\n}\n\nexport interface HandlerResponseSettingGet {\n  envs: string[]\n  yaml: string\n}\n\nexport interface HandlerResponseSettingTemplate {\n  yaml: string\n}\n\nexport interface HandlerResponseSiteCreate {\n  first_url: string\n  id: number\n  name: string\n  urls: string[]\n  urls_raw: string\n}\n\nexport interface HandlerResponseSiteList {\n  count: number\n  sites: EntityCookedSite[]\n}\n\nexport interface HandlerResponseSiteUpdate {\n  first_url: string\n  id: number\n  name: string\n  urls: string[]\n  urls_raw: string\n}\n\nexport interface HandlerResponseTransferExport {\n  /** The exported data which is a JSON string */\n  artrans: string\n}\n\nexport interface HandlerResponseTransferUpload {\n  /** The uploaded file name which can be used to import */\n  filename: string\n}\n\nexport interface HandlerResponseUpload {\n  file_name: string\n  file_type: string\n  public_url: string\n}\n\nexport interface HandlerResponseUserCreate {\n  badge_color: string\n  badge_name: string\n  comment_count: number\n  email: string\n  id: number\n  is_admin: boolean\n  is_in_conf: boolean\n  last_ip: string\n  last_ua: string\n  link: string\n  name: string\n  receive_email: boolean\n}\n\nexport interface HandlerResponseUserInfo {\n  is_login: boolean\n  notifies: EntityCookedNotify[]\n  notifies_count: number\n  user: EntityCookedUser\n}\n\nexport interface HandlerResponseUserInfoUpdate {\n  user: EntityCookedUser\n}\n\nexport interface HandlerResponseUserLogin {\n  token: string\n  user: EntityCookedUser\n}\n\nexport interface HandlerResponseUserStatus {\n  is_admin: boolean\n  is_login: boolean\n}\n\nexport interface HandlerResponseUserUpdate {\n  badge_color: string\n  badge_name: string\n  comment_count: number\n  email: string\n  id: number\n  is_admin: boolean\n  is_in_conf: boolean\n  last_ip: string\n  last_ua: string\n  link: string\n  name: string\n  receive_email: boolean\n}\n\nexport interface HandlerResponseVote {\n  down: number\n  up: number\n}\n\nexport type QueryParamsType = Record<string | number, any>\nexport type ResponseFormat = keyof Omit<Body, 'body' | 'bodyUsed'>\n\nexport interface FullRequestParams extends Omit<RequestInit, 'body'> {\n  /** set parameter to `true` for call `securityWorker` for this request */\n  secure?: boolean\n  /** request path */\n  path: string\n  /** content type of request body */\n  type?: ContentType\n  /** query params */\n  query?: QueryParamsType\n  /** format of response (i.e. response.json() -> format: \"json\") */\n  format?: ResponseFormat\n  /** request body */\n  body?: unknown\n  /** base url */\n  baseUrl?: string\n  /** request cancellation token */\n  cancelToken?: CancelToken\n}\n\nexport type RequestParams = Omit<FullRequestParams, 'body' | 'method' | 'query' | 'path'>\n\nexport interface ApiConfig<SecurityDataType = unknown> {\n  baseUrl?: string\n  baseApiParams?: Omit<RequestParams, 'baseUrl' | 'cancelToken' | 'signal'>\n  securityWorker?: (\n    securityData: SecurityDataType | null,\n  ) => Promise<RequestParams | void> | RequestParams | void\n  customFetch?: typeof fetch\n}\n\nexport interface HttpResponse<D extends unknown, E extends unknown = unknown> extends Response {\n  data: D\n  error: E\n}\n\ntype CancelToken = Symbol | string | number\n\nexport enum ContentType {\n  Json = 'application/json',\n  FormData = 'multipart/form-data',\n  UrlEncoded = 'application/x-www-form-urlencoded',\n  Text = 'text/plain',\n}\n\nexport class HttpClient<SecurityDataType = unknown> {\n  public baseUrl: string = '/api/v2'\n  private securityData: SecurityDataType | null = null\n  private securityWorker?: ApiConfig<SecurityDataType>['securityWorker']\n  private abortControllers = new Map<CancelToken, AbortController>()\n  private customFetch = (...fetchParams: Parameters<typeof fetch>) => fetch(...fetchParams)\n\n  private baseApiParams: RequestParams = {\n    credentials: 'same-origin',\n    headers: {},\n    redirect: 'follow',\n    referrerPolicy: 'no-referrer',\n  }\n\n  constructor(apiConfig: ApiConfig<SecurityDataType> = {}) {\n    Object.assign(this, apiConfig)\n  }\n\n  public setSecurityData = (data: SecurityDataType | null) => {\n    this.securityData = data\n  }\n\n  protected encodeQueryParam(key: string, value: any) {\n    const encodedKey = encodeURIComponent(key)\n    return `${encodedKey}=${encodeURIComponent(typeof value === 'number' ? value : `${value}`)}`\n  }\n\n  protected addQueryParam(query: QueryParamsType, key: string) {\n    return this.encodeQueryParam(key, query[key])\n  }\n\n  protected addArrayQueryParam(query: QueryParamsType, key: string) {\n    const value = query[key]\n    return value.map((v: any) => this.encodeQueryParam(key, v)).join('&')\n  }\n\n  protected toQueryString(rawQuery?: QueryParamsType): string {\n    const query = rawQuery || {}\n    const keys = Object.keys(query).filter((key) => 'undefined' !== typeof query[key])\n    return keys\n      .map((key) =>\n        Array.isArray(query[key])\n          ? this.addArrayQueryParam(query, key)\n          : this.addQueryParam(query, key),\n      )\n      .join('&')\n  }\n\n  protected addQueryParams(rawQuery?: QueryParamsType): string {\n    const queryString = this.toQueryString(rawQuery)\n    return queryString ? `?${queryString}` : ''\n  }\n\n  private contentFormatters: Record<ContentType, (input: any) => any> = {\n    [ContentType.Json]: (input: any) =>\n      input !== null && (typeof input === 'object' || typeof input === 'string')\n        ? JSON.stringify(input)\n        : input,\n    [ContentType.Text]: (input: any) =>\n      input !== null && typeof input !== 'string' ? JSON.stringify(input) : input,\n    [ContentType.FormData]: (input: any) =>\n      Object.keys(input || {}).reduce((formData, key) => {\n        const property = input[key]\n        formData.append(\n          key,\n          property instanceof Blob\n            ? property\n            : typeof property === 'object' && property !== null\n              ? JSON.stringify(property)\n              : `${property}`,\n        )\n        return formData\n      }, new FormData()),\n    [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input),\n  }\n\n  protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams {\n    return {\n      ...this.baseApiParams,\n      ...params1,\n      ...(params2 || {}),\n      headers: {\n        ...(this.baseApiParams.headers || {}),\n        ...(params1.headers || {}),\n        ...((params2 && params2.headers) || {}),\n      },\n    }\n  }\n\n  protected createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => {\n    if (this.abortControllers.has(cancelToken)) {\n      const abortController = this.abortControllers.get(cancelToken)\n      if (abortController) {\n        return abortController.signal\n      }\n      return void 0\n    }\n\n    const abortController = new AbortController()\n    this.abortControllers.set(cancelToken, abortController)\n    return abortController.signal\n  }\n\n  public abortRequest = (cancelToken: CancelToken) => {\n    const abortController = this.abortControllers.get(cancelToken)\n\n    if (abortController) {\n      abortController.abort()\n      this.abortControllers.delete(cancelToken)\n    }\n  }\n\n  public request = async <T = any, E = any>({\n    body,\n    secure,\n    path,\n    type,\n    query,\n    format,\n    baseUrl,\n    cancelToken,\n    ...params\n  }: FullRequestParams): Promise<HttpResponse<T, E>> => {\n    const secureParams =\n      ((typeof secure === 'boolean' ? secure : this.baseApiParams.secure) &&\n        this.securityWorker &&\n        (await this.securityWorker(this.securityData))) ||\n      {}\n    const requestParams = this.mergeRequestParams(params, secureParams)\n    const queryString = query && this.toQueryString(query)\n    const payloadFormatter = this.contentFormatters[type || ContentType.Json]\n    const responseFormat = format || requestParams.format\n\n    return this.customFetch(\n      `${baseUrl || this.baseUrl || ''}${path}${queryString ? `?${queryString}` : ''}`,\n      {\n        ...requestParams,\n        headers: {\n          ...(requestParams.headers || {}),\n          ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}),\n        },\n        signal: (cancelToken ? this.createAbortSignal(cancelToken) : requestParams.signal) || null,\n        body: typeof body === 'undefined' || body === null ? null : payloadFormatter(body),\n      },\n    ).then(async (response) => {\n      const r = response.clone() as HttpResponse<T, E>\n      r.data = null as unknown as T\n      r.error = null as unknown as E\n\n      const data = !responseFormat\n        ? r\n        : await response[responseFormat]()\n            .then((data) => {\n              if (r.ok) {\n                r.data = data\n              } else {\n                r.error = data\n              }\n              return r\n            })\n            .catch((e) => {\n              r.error = e\n              return r\n            })\n\n      if (cancelToken) {\n        this.abortControllers.delete(cancelToken)\n      }\n\n      if (!response.ok) throw data\n      return data\n    })\n  }\n}\n\n/**\n * @title Artalk API\n * @version 2.0\n * @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE)\n * @baseUrl /api/v2\n * @contact API Support <artalkjs@gmail.com> (https://artalk.js.org)\n *\n * Artalk is a modern comment system based on Golang.\n */\nexport class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {\n  auth = {\n    /**\n * @description Login by email with verify code (Need send email verify code first) or password\n *\n * @tags Auth\n * @name LoginByEmail\n * @summary Login by email\n * @request POST:/auth/email/login\n * @response `200` `HandlerResponseUserLogin` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    loginByEmail: (data: HandlerRequestAuthEmailLogin, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseUserLogin,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/auth/email/login`,\n        method: 'POST',\n        body: data,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Register by email and verify code (if user exists, will update user, like forget or change password. Need send email verify code first)\n *\n * @tags Auth\n * @name RegisterByEmail\n * @summary Register by email\n * @request POST:/auth/email/register\n * @response `200` `HandlerResponseUserLogin` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    registerByEmail: (data: HandlerRequestAuthEmailRegister, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseUserLogin,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/auth/email/register`,\n        method: 'POST',\n        body: data,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Send email including verify code to user\n *\n * @tags Auth\n * @name SendVerifyEmail\n * @summary Send verify email\n * @request POST:/auth/email/send\n * @response `200` `(HandlerMap & {\n    msg?: string,\n\n})` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    sendVerifyEmail: (data: HandlerRequestAuthEmailSend, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap & {\n          msg?: string\n        },\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/auth/email/send`,\n        method: 'POST',\n        body: data,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Get all users with same email, if there are more than one user with same email, need merge\n *\n * @tags Auth\n * @name CheckDataMerge\n * @summary Check data merge\n * @request GET:/auth/merge\n * @secure\n * @response `200` `HandlerResponseAuthDataMergeCheck` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    checkDataMerge: (params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseAuthDataMergeCheck,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/auth/merge`,\n        method: 'GET',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description This function is to solve the problem of multiple users with the same email address, should be called after user login and then check, and perform data merge.\n *\n * @tags Auth\n * @name ApplyDataMerge\n * @summary Apply data merge\n * @request POST:/auth/merge\n * @secure\n * @response `200` `HandlerResponseAuthDataMergeApply` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    applyDataMerge: (data: HandlerRequestAuthDataMergeApply, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseAuthDataMergeApply,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/auth/merge`,\n        method: 'POST',\n        body: data,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n  cache = {\n    /**\n * @description Flush all cache on the server\n *\n * @tags Cache\n * @name FlushCache\n * @summary Flush Cache\n * @request POST:/cache/flush\n * @secure\n * @response `200` `(HandlerMap & {\n    msg?: string,\n\n})` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n */\n    flushCache: (params: RequestParams = {}) =>\n      this.request<\n        HandlerMap & {\n          msg?: string\n        },\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/cache/flush`,\n        method: 'POST',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Cache warming helps you to pre-load the cache to improve the performance of the first request\n *\n * @tags Cache\n * @name WarmUpCache\n * @summary Warm-Up Cache\n * @request POST:/cache/warm_up\n * @secure\n * @response `200` `(HandlerMap & {\n    msg?: string,\n\n})` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n */\n    warmUpCache: (params: RequestParams = {}) =>\n      this.request<\n        HandlerMap & {\n          msg?: string\n        },\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/cache/warm_up`,\n        method: 'POST',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n  }\n  captcha = {\n    /**\n * @description Get a base64 encoded captcha image or a HTML page to verify for user\n *\n * @tags Captcha\n * @name GetCaptcha\n * @summary Get Captcha\n * @request GET:/captcha\n * @response `200` `HandlerResponseCaptchaGet` OK\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    getCaptcha: (params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseCaptchaGet,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/captcha`,\n        method: 'GET',\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Get the status of the user's captcha verification\n     *\n     * @tags Captcha\n     * @name GetCaptchaStatus\n     * @summary Get Captcha Status\n     * @request GET:/captcha/status\n     * @response `200` `HandlerResponseCaptchaStatus` OK\n     */\n    getCaptchaStatus: (params: RequestParams = {}) =>\n      this.request<HandlerResponseCaptchaStatus, any>({\n        path: `/captcha/status`,\n        method: 'GET',\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Verify user enters correct captcha code\n *\n * @tags Captcha\n * @name VerifyCaptcha\n * @summary Verify Captcha\n * @request POST:/captcha/verify\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    img_data?: string,\n\n})` Forbidden\n */\n    verifyCaptcha: (data: HandlerParamsCaptchaVerify, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          img_data?: string\n        }\n      >({\n        path: `/captcha/verify`,\n        method: 'POST',\n        body: data,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n  comments = {\n    /**\n * @description Get a list of comments by some conditions\n *\n * @tags Comment\n * @name GetComments\n * @summary Get Comment List\n * @request GET:/comments\n * @secure\n * @response `200` `HandlerResponseCommentList` OK\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    getComments: (\n      query: {\n        /** The user email */\n        email?: string\n        /** Enable flat_mode */\n        flat_mode?: boolean\n        /** The limit for pagination */\n        limit?: number\n        /** The username */\n        name?: string\n        /** The offset for pagination */\n        offset?: number\n        /** The comment page_key */\n        page_key: string\n        /** The scope of comments */\n        scope?: 'page' | 'user' | 'site'\n        /** Search keywords */\n        search?: string\n        /** The site name of your content scope */\n        site_name?: string\n        /** Sort by condition */\n        sort_by?: 'date_asc' | 'date_desc' | 'vote'\n        /** Message center show type */\n        type?: 'all' | 'mentions' | 'mine' | 'pending'\n        /** Only show comments by admin */\n        view_only_admin?: boolean\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseCommentList,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/comments`,\n        method: 'GET',\n        query: query,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Create a new comment\n *\n * @tags Comment\n * @name CreateComment\n * @summary Create Comment\n * @request POST:/comments\n * @secure\n * @response `200` `HandlerResponseCommentCreate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    createComment: (comment: HandlerParamsCommentCreate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseCommentCreate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/comments`,\n        method: 'POST',\n        body: comment,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Get the detail of a comment by comment id\n *\n * @tags Comment\n * @name GetComment\n * @summary Get a comment\n * @request GET:/comments/{id}\n * @response `200` `HandlerResponseCommentGet` OK\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    getComment: (id: number, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseCommentGet,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/comments/${id}`,\n        method: 'GET',\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Update a specific comment\n *\n * @tags Comment\n * @name UpdateComment\n * @summary Update Comment\n * @request PUT:/comments/{id}\n * @secure\n * @response `200` `HandlerResponseCommentUpdate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    updateComment: (id: number, comment: HandlerParamsCommentUpdate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseCommentUpdate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/comments/${id}`,\n        method: 'PUT',\n        body: comment,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Delete a specific comment\n *\n * @tags Comment\n * @name DeleteComment\n * @summary Delete Comment\n * @request DELETE:/comments/{id}\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    deleteComment: (id: number, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/comments/${id}`,\n        method: 'DELETE',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n  }\n  conf = {\n    /**\n     * @description Get System Configs for UI\n     *\n     * @tags System\n     * @name Conf\n     * @summary Get System Configs\n     * @request GET:/conf\n     * @response `200` `CommonConfData` OK\n     */\n    conf: (params: RequestParams = {}) =>\n      this.request<CommonConfData, any>({\n        path: `/conf`,\n        method: 'GET',\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Get social login providers\n *\n * @tags System\n * @name GetSocialLoginProviders\n * @summary Get Social Login Providers\n * @request GET:/conf/auth/providers\n * @response `200` `HandlerResponseConfAuthProviders` OK\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n */\n    getSocialLoginProviders: (params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseConfAuthProviders,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/conf/auth/providers`,\n        method: 'GET',\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Get Domain Info\n     *\n     * @tags System\n     * @name GetDomain\n     * @summary Get Domain Info\n     * @request GET:/conf/domain\n     * @response `200` `HandlerResponseConfDomain` OK\n     */\n    getDomain: (\n      query?: {\n        /** Domain URL */\n        url?: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<HandlerResponseConfDomain, any>({\n        path: `/conf/domain`,\n        method: 'GET',\n        query: query,\n        format: 'json',\n        ...params,\n      }),\n  }\n  notifies = {\n    /**\n * @description Get a list of notifies for user\n *\n * @tags Notify\n * @name GetNotifies\n * @summary Get Notifies\n * @request GET:/notifies\n * @response `200` `HandlerResponseNotifyList` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    getNotifies: (\n      query: {\n        /** The user email */\n        email: string\n        /** The user name */\n        name: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseNotifyList,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/notifies`,\n        method: 'GET',\n        query: query,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Mark all notifies as read for user\n *\n * @tags Notify\n * @name MarkAllNotifyRead\n * @summary Mark All Notifies as Read\n * @request POST:/notifies/read\n * @response `200` `HandlerMap` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    markAllNotifyRead: (options: HandlerParamsNotifyReadAll, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/notifies/read`,\n        method: 'POST',\n        body: options,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Mark specific notification as read for user\n *\n * @tags Notify\n * @name MarkNotifyRead\n * @summary Mark Notify as Read\n * @request POST:/notifies/{comment_id}/{notify_key}\n * @response `200` `HandlerMap` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    markNotifyRead: (commentId: number, notifyKey: string, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/notifies/${commentId}/${notifyKey}`,\n        method: 'POST',\n        format: 'json',\n        ...params,\n      }),\n  }\n  pages = {\n    /**\n * @description Get a list of pages by some conditions\n *\n * @tags Page\n * @name GetPages\n * @summary Get Page List\n * @request GET:/pages\n * @secure\n * @response `200` `HandlerResponsePageList` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n */\n    getPages: (\n      query?: {\n        /** The limit for pagination */\n        limit?: number\n        /** The offset for pagination */\n        offset?: number\n        /** Search keywords */\n        search?: string\n        /** The site name of your content scope */\n        site_name?: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponsePageList,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/pages`,\n        method: 'GET',\n        query: query,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Fetch the data of all pages\n *\n * @tags Page\n * @name FetchAllPages\n * @summary Fetch All Pages Data\n * @request POST:/pages/fetch\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    fetchAllPages: (options: HandlerParamsPageFetchAll, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/pages/fetch`,\n        method: 'POST',\n        body: options,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Get the status of the task of fetching all pages\n     *\n     * @tags Page\n     * @name GetPageFetchStatus\n     * @summary Get Pages Fetch Status\n     * @request GET:/pages/fetch/status\n     * @secure\n     * @response `200` `HandlerResponsePageFetchStatus` OK\n     */\n    getPageFetchStatus: (params: RequestParams = {}) =>\n      this.request<HandlerResponsePageFetchStatus, any>({\n        path: `/pages/fetch/status`,\n        method: 'GET',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Increase and get the number of page views\n     *\n     * @tags Page\n     * @name LogPv\n     * @summary Increase Page Views (PV)\n     * @request POST:/pages/pv\n     * @response `200` `HandlerResponsePagePV` OK\n     */\n    logPv: (page: HandlerParamsPagePV, params: RequestParams = {}) =>\n      this.request<HandlerResponsePagePV, any>({\n        path: `/pages/pv`,\n        method: 'POST',\n        body: page,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Update a specific page\n *\n * @tags Page\n * @name UpdatePage\n * @summary Update Page\n * @request PUT:/pages/{id}\n * @secure\n * @response `200` `HandlerResponsePageUpdate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    updatePage: (id: number, page: HandlerParamsPageUpdate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponsePageUpdate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/pages/${id}`,\n        method: 'PUT',\n        body: page,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Delete a specific page\n *\n * @tags Page\n * @name DeletePage\n * @summary Delete Page\n * @request DELETE:/pages/{id}\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    deletePage: (id: number, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/pages/${id}`,\n        method: 'DELETE',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Fetch the data of a specific page\n *\n * @tags Page\n * @name FetchPage\n * @summary Fetch Page Data\n * @request POST:/pages/{id}/fetch\n * @secure\n * @response `200` `HandlerResponsePageFetch` OK\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    fetchPage: (id: number, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponsePageFetch,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/pages/${id}/fetch`,\n        method: 'POST',\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n  sendEmail = {\n    /**\n * @description Send an email to test the email sender\n *\n * @tags System\n * @name SendEmail\n * @summary Send Email\n * @request POST:/send_email\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `500` `HandlerMap` Internal Server Error\n */\n    sendEmail: (email: HandlerParamsEmailSend, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        | (HandlerMap & {\n            msg?: string\n          })\n        | HandlerMap\n      >({\n        path: `/send_email`,\n        method: 'POST',\n        body: email,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n  settings = {\n    /**\n * @description Get settings from app config file\n *\n * @tags System\n * @name GetSettings\n * @summary Get Settings\n * @request GET:/settings\n * @secure\n * @response `200` `HandlerResponseSettingGet` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    getSettings: (params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseSettingGet,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/settings`,\n        method: 'GET',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Apply settings and restart the server\n *\n * @tags System\n * @name ApplySettings\n * @summary Save and apply Settings\n * @request PUT:/settings\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    applySettings: (settings: HandlerParamsSettingApply, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/settings`,\n        method: 'PUT',\n        body: settings,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Get config templates in different languages for rendering the settings page in the frontend\n     *\n     * @tags System\n     * @name GetSettingsTemplate\n     * @summary Get Settings Template\n     * @request GET:/settings/template/{locale}\n     * @secure\n     * @response `200` `HandlerResponseSettingTemplate` OK\n     */\n    getSettingsTemplate: (locale: string, params: RequestParams = {}) =>\n      this.request<HandlerResponseSettingTemplate, any>({\n        path: `/settings/template/${locale}`,\n        method: 'GET',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n  }\n  sites = {\n    /**\n     * @description Get a list of sites by some conditions\n     *\n     * @tags Site\n     * @name GetSites\n     * @summary Get Site List\n     * @request GET:/sites\n     * @secure\n     * @response `200` `HandlerResponseSiteList` OK\n     */\n    getSites: (params: RequestParams = {}) =>\n      this.request<HandlerResponseSiteList, any>({\n        path: `/sites`,\n        method: 'GET',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Create a new site\n *\n * @tags Site\n * @name CreateSite\n * @summary Create Site\n * @request POST:/sites\n * @secure\n * @response `200` `HandlerResponseSiteCreate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    createSite: (site: HandlerParamsSiteCreate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseSiteCreate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/sites`,\n        method: 'POST',\n        body: site,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Update a specific site\n     *\n     * @tags Site\n     * @name UpdateSite\n     * @summary Update Site\n     * @request PUT:/sites/{id}\n     * @secure\n     * @response `200` `HandlerResponseSiteUpdate` OK\n     */\n    updateSite: (id: number, site: HandlerParamsSiteUpdate, params: RequestParams = {}) =>\n      this.request<HandlerResponseSiteUpdate, any>({\n        path: `/sites/${id}`,\n        method: 'PUT',\n        body: site,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Delete a specific site\n *\n * @tags Site\n * @name DeleteSite\n * @summary Site Delete\n * @request DELETE:/sites/{id}\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    deleteSite: (id: number, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/sites/${id}`,\n        method: 'DELETE',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n  }\n  stats = {\n    /**\n * @description Get the statistics of various data analysis\n *\n * @tags Statistic\n * @name GetStats\n * @summary Statistic\n * @request GET:/stats/{type}\n * @response `200` `CommonJSONResult` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    getStats: (\n      type:\n        | 'latest_comments'\n        | 'latest_pages'\n        | 'pv_most_pages'\n        | 'comment_most_pages'\n        | 'page_pv'\n        | 'site_pv'\n        | 'page_comment'\n        | 'site_comment'\n        | 'rand_comments'\n        | 'rand_pages',\n      query?: {\n        /** The limit for pagination */\n        limit?: number\n        /** multiple page keys separated by commas */\n        page_keys?: string\n        /** The site name of your content scope */\n        site_name?: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        CommonJSONResult,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/stats/${type}`,\n        method: 'GET',\n        query: query,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n  transfer = {\n    /**\n * @description Export data from Artalk\n *\n * @tags Transfer\n * @name ExportArtrans\n * @summary Export Artrans\n * @request GET:/transfer/export\n * @secure\n * @response `200` `HandlerResponseTransferExport` OK\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    exportArtrans: (params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseTransferExport,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/transfer/export`,\n        method: 'GET',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Import data to Artalk\n     *\n     * @tags Transfer\n     * @name ImportArtrans\n     * @summary Import Artrans\n     * @request POST:/transfer/import\n     * @secure\n     * @response `200` `string` OK\n     */\n    importArtrans: (data: HandlerParamsTransferImport, params: RequestParams = {}) =>\n      this.request<string, any>({\n        path: `/transfer/import`,\n        method: 'POST',\n        body: data,\n        secure: true,\n        type: ContentType.Json,\n        ...params,\n      }),\n\n    /**\n * @description Upload a file to prepare to import\n *\n * @tags Transfer\n * @name UploadArtrans\n * @summary Upload Artrans\n * @request POST:/transfer/upload\n * @secure\n * @response `200` `(HandlerResponseTransferUpload & {\n    filename?: string,\n\n})` OK\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    uploadArtrans: (\n      data: {\n        /**\n         * Upload file in preparation for import task\n         * @format binary\n         */\n        file: File\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseTransferUpload & {\n          filename?: string\n        },\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/transfer/upload`,\n        method: 'POST',\n        body: data,\n        secure: true,\n        type: ContentType.FormData,\n        format: 'json',\n        ...params,\n      }),\n  }\n  upload = {\n    /**\n * @description Upload file from this endpoint\n *\n * @tags Upload\n * @name Upload\n * @summary Upload\n * @request POST:/upload\n * @secure\n * @response `200` `HandlerResponseUpload` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    upload: (\n      data: {\n        /**\n         * Upload file\n         * @format binary\n         */\n        file: File\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseUpload,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/upload`,\n        method: 'POST',\n        body: data,\n        secure: true,\n        type: ContentType.FormData,\n        format: 'json',\n        ...params,\n      }),\n  }\n  user = {\n    /**\n * @description Get user info to prepare for login or check current user status\n *\n * @tags Auth\n * @name GetUser\n * @summary Get User Info\n * @request GET:/user\n * @secure\n * @response `200` `HandlerResponseUserInfo` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n */\n    getUser: (\n      query?: {\n        /** The user email */\n        email?: string\n        /** The username */\n        name?: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseUserInfo,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/user`,\n        method: 'GET',\n        query: query,\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Update user profile when user is logged in\n *\n * @tags Auth\n * @name UpdateProfile\n * @summary Update user profile\n * @request POST:/user\n * @secure\n * @response `200` `HandlerResponseUserInfoUpdate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    updateProfile: (data: HandlerRequestUserInfoUpdate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseUserInfoUpdate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/user`,\n        method: 'POST',\n        body: data,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Login user by name or email\n *\n * @tags Auth\n * @name Login\n * @summary Get Access Token\n * @request POST:/user/access_token\n * @response `200` `HandlerResponseUserLogin` OK\n * @response `400` `(HandlerMap & {\n    data?: {\n    need_name_select?: (string)[],\n\n},\n    msg?: string,\n\n})` Multiple users with the same email address are matched\n * @response `401` `(HandlerMap & {\n    msg?: string,\n\n})` Unauthorized\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    login: (user: HandlerParamsUserLogin, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseUserLogin,\n        | (HandlerMap & {\n            data?: {\n              need_name_select?: string[]\n            }\n            msg?: string\n          })\n        | (HandlerMap & {\n            msg?: string\n          })\n      >({\n        path: `/user/access_token`,\n        method: 'POST',\n        body: user,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n     * @description Get user login status by header Authorization\n     *\n     * @tags Auth\n     * @name GetUserStatus\n     * @summary Get Login Status\n     * @request GET:/user/status\n     * @secure\n     * @response `200` `HandlerResponseUserStatus` OK\n     */\n    getUserStatus: (\n      query?: {\n        /** The user email */\n        email?: string\n        /** The username */\n        name?: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<HandlerResponseUserStatus, any>({\n        path: `/user/status`,\n        method: 'GET',\n        query: query,\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n  }\n  users = {\n    /**\n * @description Create a new user\n *\n * @tags User\n * @name CreateUser\n * @summary Create User\n * @request POST:/users\n * @secure\n * @response `200` `HandlerResponseUserCreate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    createUser: (user: HandlerParamsUserCreate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseUserCreate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/users`,\n        method: 'POST',\n        body: user,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Update a specific user\n *\n * @tags User\n * @name UpdateUser\n * @summary Update User\n * @request PUT:/users/{id}\n * @secure\n * @response `200` `HandlerResponseUserUpdate` OK\n * @response `400` `(HandlerMap & {\n    msg?: string,\n\n})` Bad Request\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    updateUser: (id: number, user: HandlerParamsUserUpdate, params: RequestParams = {}) =>\n      this.request<\n        HandlerResponseUserUpdate,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/users/${id}`,\n        method: 'PUT',\n        body: user,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Delete a specific user\n *\n * @tags User\n * @name DeleteUser\n * @summary Delete User\n * @request DELETE:/users/{id}\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    deleteUser: (id: number, params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/users/${id}`,\n        method: 'DELETE',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Get a list of users by some conditions\n *\n * @tags User\n * @name GetUsers\n * @summary Get User List\n * @request GET:/users/{type}\n * @secure\n * @response `200` `HandlerResponseAdminUserList` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n */\n    getUsers: (\n      type?: 'all' | 'admin' | 'in_conf',\n      query?: {\n        /** The limit for pagination */\n        limit?: number\n        /** The offset for pagination */\n        offset?: number\n        /** Search keywords */\n        search?: string\n      },\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseAdminUserList,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/users/${type}`,\n        method: 'GET',\n        query: query,\n        secure: true,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n  version = {\n    /**\n     * @description Get the version of Artalk\n     *\n     * @tags System\n     * @name GetVersion\n     * @summary Get Version Info\n     * @request GET:/version\n     * @response `200` `CommonApiVersionData` OK\n     */\n    getVersion: (params: RequestParams = {}) =>\n      this.request<CommonApiVersionData, any>({\n        path: `/version`,\n        method: 'GET',\n        format: 'json',\n        ...params,\n      }),\n  }\n  votes = {\n    /**\n * @description Sync the number of votes in the `comments` or `pages` data tables to keep them the same as the `votes` table\n *\n * @tags Vote\n * @name SyncVotes\n * @summary Sync Vote Data\n * @request POST:/votes/sync\n * @secure\n * @response `200` `HandlerMap` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n */\n    syncVotes: (params: RequestParams = {}) =>\n      this.request<\n        HandlerMap,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/votes/sync`,\n        method: 'POST',\n        secure: true,\n        format: 'json',\n        ...params,\n      }),\n\n    /**\n * @description Vote for a specific comment or page\n *\n * @tags Vote\n * @name Vote\n * @summary Vote\n * @request POST:/votes/{type}/{target_id}\n * @response `200` `HandlerResponseVote` OK\n * @response `403` `(HandlerMap & {\n    msg?: string,\n\n})` Forbidden\n * @response `404` `(HandlerMap & {\n    msg?: string,\n\n})` Not Found\n * @response `500` `(HandlerMap & {\n    msg?: string,\n\n})` Internal Server Error\n */\n    vote: (\n      type: 'comment_up' | 'comment_down' | 'page_up' | 'page_down',\n      targetId: number,\n      vote: HandlerParamsVote,\n      params: RequestParams = {},\n    ) =>\n      this.request<\n        HandlerResponseVote,\n        HandlerMap & {\n          msg?: string\n        }\n      >({\n        path: `/votes/${type}/${targetId}`,\n        method: 'POST',\n        body: vote,\n        type: ContentType.Json,\n        format: 'json',\n        ...params,\n      }),\n  }\n}\n","import { ApiOptions } from './options'\nimport { FetchError } from '@/types'\n\nexport const Fetch = async (\n  opts: ApiOptions,\n  input: string | URL | Request,\n  init?: RequestInit,\n) => {\n  const apiToken = opts.getApiToken && opts.getApiToken()\n\n  const headers = new Headers({\n    Authorization: apiToken ? `Bearer ${apiToken}` : '',\n    ...init?.headers,\n  })\n\n  if (!headers.get('Authorization')) headers.delete('Authorization')\n\n  // 请求操作\n  const resp = await fetch(input, {\n    ...init,\n    headers,\n  })\n\n  if (!resp.ok) {\n    // Deserialize response body (if it is JSON, otherwise returns `{}`)\n    const json: any = (await resp.json().catch(() => {})) || {}\n\n    let retry = false\n    opts.handlers &&\n      (await opts.handlers.get().reduce(async (promise, item) => {\n        await promise\n        if (json[item.action] === true) {\n          await item.handler(json)\n          retry = true\n        }\n      }, Promise.resolve()))\n\n    if (retry) return Fetch(opts, input, init)\n    throw createError(resp.status, json)\n  }\n\n  return resp\n}\n\nexport class FetchException extends Error implements FetchError {\n  code: number = 0\n  message: string = 'fetch error'\n  data?: any\n}\n\nfunction createError(code: number, data: any): FetchException {\n  const err = new FetchException()\n  err.message = data.msg || data.message || 'fetch error'\n  err.code = code\n  err.data = data\n  console.error(err)\n  return err\n}\n","export interface ApiHandlerPayload {\n  need_captcha: { img_data?: string; iframe?: string }\n  need_login: object\n  need_auth_login: object\n}\n\ntype PayloadKey = keyof ApiHandlerPayload\n\nexport interface ApiHandler<T extends PayloadKey = PayloadKey> {\n  action: T\n  handler: (data: ApiHandlerPayload[T]) => Promise<void>\n}\n\nexport interface ApiHandlers {\n  add: <T extends PayloadKey>(\n    action: T,\n    handler: (data: ApiHandlerPayload[T]) => Promise<void>,\n  ) => void\n  remove: (action: PayloadKey) => void\n  get: () => ApiHandler[]\n}\n\nexport function createApiHandlers(): ApiHandlers {\n  const handlers: ApiHandler[] = []\n  return {\n    add: (action, handler) => {\n      handlers.push({ action, handler })\n    },\n    remove: (action) => {\n      const index = handlers.findIndex((h) => h.action === action)\n      if (index !== -1) handlers.splice(index, 1)\n    },\n    get: () => handlers,\n  }\n}\n","import { ApiOptions } from './options'\nimport { Api as ApiV2 } from './v2'\nimport { Fetch } from './fetch'\n\nexport * from './options'\nexport * from './handler'\n\nexport class Api extends ApiV2<void> {\n  private _opts: ApiOptions\n\n  constructor(opts: ApiOptions) {\n    super({\n      baseUrl: opts.baseURL,\n      customFetch: (input, init) => Fetch(opts, input, init),\n    })\n\n    this._opts = opts\n  }\n\n  /**\n   * Get user info as params for request\n   *\n   * @returns Request params with user info\n   */\n  getUserFields() {\n    const user = this._opts.userInfo\n    if (!user?.name || !user?.email) return undefined\n    return { name: user.name, email: user.email }\n  }\n}\n","/**\n * marked v14.1.2 - a markdown parser\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n    return {\n        async: false,\n        breaks: false,\n        extensions: null,\n        gfm: true,\n        hooks: null,\n        pedantic: false,\n        renderer: null,\n        silent: false,\n        tokenizer: null,\n        walkTokens: null,\n    };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n    _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape$1(html, encode) {\n    if (encode) {\n        if (escapeTest.test(html)) {\n            return html.replace(escapeReplace, getEscapeReplacement);\n        }\n    }\n    else {\n        if (escapeTestNoEncode.test(html)) {\n            return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n        }\n    }\n    return html;\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n    let source = typeof regex === 'string' ? regex : regex.source;\n    opt = opt || '';\n    const obj = {\n        replace: (name, val) => {\n            let valSource = typeof val === 'string' ? val : val.source;\n            valSource = valSource.replace(caret, '$1');\n            source = source.replace(name, valSource);\n            return obj;\n        },\n        getRegex: () => {\n            return new RegExp(source, opt);\n        },\n    };\n    return obj;\n}\nfunction cleanUrl(href) {\n    try {\n        href = encodeURI(href).replace(/%25/g, '%');\n    }\n    catch {\n        return null;\n    }\n    return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n    // ensure that every cell-delimiting pipe has a space\n    // before it to distinguish it from an escaped pipe\n    const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n        let escaped = false;\n        let curr = offset;\n        while (--curr >= 0 && str[curr] === '\\\\')\n            escaped = !escaped;\n        if (escaped) {\n            // odd number of slashes means | is escaped\n            // so we leave it alone\n            return '|';\n        }\n        else {\n            // add space before unescaped |\n            return ' |';\n        }\n    }), cells = row.split(/ \\|/);\n    let i = 0;\n    // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n    if (!cells[0].trim()) {\n        cells.shift();\n    }\n    if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n        cells.pop();\n    }\n    if (count) {\n        if (cells.length > count) {\n            cells.splice(count);\n        }\n        else {\n            while (cells.length < count)\n                cells.push('');\n        }\n    }\n    for (; i < cells.length; i++) {\n        // leading or trailing whitespace is ignored per the gfm spec\n        cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n    }\n    return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n    const l = str.length;\n    if (l === 0) {\n        return '';\n    }\n    // Length of suffix matching the invert condition.\n    let suffLen = 0;\n    // Step left until we fail to match the invert condition.\n    while (suffLen < l) {\n        const currChar = str.charAt(l - suffLen - 1);\n        if (currChar === c && !invert) {\n            suffLen++;\n        }\n        else if (currChar !== c && invert) {\n            suffLen++;\n        }\n        else {\n            break;\n        }\n    }\n    return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n    if (str.indexOf(b[1]) === -1) {\n        return -1;\n    }\n    let level = 0;\n    for (let i = 0; i < str.length; i++) {\n        if (str[i] === '\\\\') {\n            i++;\n        }\n        else if (str[i] === b[0]) {\n            level++;\n        }\n        else if (str[i] === b[1]) {\n            level--;\n            if (level < 0) {\n                return i;\n            }\n        }\n    }\n    return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n    const href = link.href;\n    const title = link.title ? escape$1(link.title) : null;\n    const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n    if (cap[0].charAt(0) !== '!') {\n        lexer.state.inLink = true;\n        const token = {\n            type: 'link',\n            raw,\n            href,\n            title,\n            text,\n            tokens: lexer.inlineTokens(text),\n        };\n        lexer.state.inLink = false;\n        return token;\n    }\n    return {\n        type: 'image',\n        raw,\n        href,\n        title,\n        text: escape$1(text),\n    };\n}\nfunction indentCodeCompensation(raw, text) {\n    const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n    if (matchIndentToCode === null) {\n        return text;\n    }\n    const indentToCode = matchIndentToCode[1];\n    return text\n        .split('\\n')\n        .map(node => {\n        const matchIndentInNode = node.match(/^\\s+/);\n        if (matchIndentInNode === null) {\n            return node;\n        }\n        const [indentInNode] = matchIndentInNode;\n        if (indentInNode.length >= indentToCode.length) {\n            return node.slice(indentToCode.length);\n        }\n        return node;\n    })\n        .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n    options;\n    rules; // set by the lexer\n    lexer; // set by the lexer\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(src) {\n        const cap = this.rules.block.newline.exec(src);\n        if (cap && cap[0].length > 0) {\n            return {\n                type: 'space',\n                raw: cap[0],\n            };\n        }\n    }\n    code(src) {\n        const cap = this.rules.block.code.exec(src);\n        if (cap) {\n            const text = cap[0].replace(/^(?: {1,4}| {0,3}\\t)/gm, '');\n            return {\n                type: 'code',\n                raw: cap[0],\n                codeBlockStyle: 'indented',\n                text: !this.options.pedantic\n                    ? rtrim(text, '\\n')\n                    : text,\n            };\n        }\n    }\n    fences(src) {\n        const cap = this.rules.block.fences.exec(src);\n        if (cap) {\n            const raw = cap[0];\n            const text = indentCodeCompensation(raw, cap[3] || '');\n            return {\n                type: 'code',\n                raw,\n                lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n                text,\n            };\n        }\n    }\n    heading(src) {\n        const cap = this.rules.block.heading.exec(src);\n        if (cap) {\n            let text = cap[2].trim();\n            // remove trailing #s\n            if (/#$/.test(text)) {\n                const trimmed = rtrim(text, '#');\n                if (this.options.pedantic) {\n                    text = trimmed.trim();\n                }\n                else if (!trimmed || / $/.test(trimmed)) {\n                    // CommonMark requires space before trailing #s\n                    text = trimmed.trim();\n                }\n            }\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[1].length,\n                text,\n                tokens: this.lexer.inline(text),\n            };\n        }\n    }\n    hr(src) {\n        const cap = this.rules.block.hr.exec(src);\n        if (cap) {\n            return {\n                type: 'hr',\n                raw: rtrim(cap[0], '\\n'),\n            };\n        }\n    }\n    blockquote(src) {\n        const cap = this.rules.block.blockquote.exec(src);\n        if (cap) {\n            let lines = rtrim(cap[0], '\\n').split('\\n');\n            let raw = '';\n            let text = '';\n            const tokens = [];\n            while (lines.length > 0) {\n                let inBlockquote = false;\n                const currentLines = [];\n                let i;\n                for (i = 0; i < lines.length; i++) {\n                    // get lines up to a continuation\n                    if (/^ {0,3}>/.test(lines[i])) {\n                        currentLines.push(lines[i]);\n                        inBlockquote = true;\n                    }\n                    else if (!inBlockquote) {\n                        currentLines.push(lines[i]);\n                    }\n                    else {\n                        break;\n                    }\n                }\n                lines = lines.slice(i);\n                const currentRaw = currentLines.join('\\n');\n                const currentText = currentRaw\n                    // precede setext continuation with 4 spaces so it isn't a setext\n                    .replace(/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g, '\\n    $1')\n                    .replace(/^ {0,3}>[ \\t]?/gm, '');\n                raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n                text = text ? `${text}\\n${currentText}` : currentText;\n                // parse blockquote lines as top level tokens\n                // merge paragraphs if this is a continuation\n                const top = this.lexer.state.top;\n                this.lexer.state.top = true;\n                this.lexer.blockTokens(currentText, tokens, true);\n                this.lexer.state.top = top;\n                // if there is no continuation then we are done\n                if (lines.length === 0) {\n                    break;\n                }\n                const lastToken = tokens[tokens.length - 1];\n                if (lastToken?.type === 'code') {\n                    // blockquote continuation cannot be preceded by a code block\n                    break;\n                }\n                else if (lastToken?.type === 'blockquote') {\n                    // include continuation in nested blockquote\n                    const oldToken = lastToken;\n                    const newText = oldToken.raw + '\\n' + lines.join('\\n');\n                    const newToken = this.blockquote(newText);\n                    tokens[tokens.length - 1] = newToken;\n                    raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n                    text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n                    break;\n                }\n                else if (lastToken?.type === 'list') {\n                    // include continuation in nested list\n                    const oldToken = lastToken;\n                    const newText = oldToken.raw + '\\n' + lines.join('\\n');\n                    const newToken = this.list(newText);\n                    tokens[tokens.length - 1] = newToken;\n                    raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n                    text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n                    lines = newText.substring(tokens[tokens.length - 1].raw.length).split('\\n');\n                    continue;\n                }\n            }\n            return {\n                type: 'blockquote',\n                raw,\n                tokens,\n                text,\n            };\n        }\n    }\n    list(src) {\n        let cap = this.rules.block.list.exec(src);\n        if (cap) {\n            let bull = cap[1].trim();\n            const isordered = bull.length > 1;\n            const list = {\n                type: 'list',\n                raw: '',\n                ordered: isordered,\n                start: isordered ? +bull.slice(0, -1) : '',\n                loose: false,\n                items: [],\n            };\n            bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n            if (this.options.pedantic) {\n                bull = isordered ? bull : '[*+-]';\n            }\n            // Get next list item\n            const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n            let endsWithBlankLine = false;\n            // Check if current bullet point can start a new List Item\n            while (src) {\n                let endEarly = false;\n                let raw = '';\n                let itemContents = '';\n                if (!(cap = itemRegex.exec(src))) {\n                    break;\n                }\n                if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n                    break;\n                }\n                raw = cap[0];\n                src = src.substring(raw.length);\n                let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n                let nextLine = src.split('\\n', 1)[0];\n                let blankLine = !line.trim();\n                let indent = 0;\n                if (this.options.pedantic) {\n                    indent = 2;\n                    itemContents = line.trimStart();\n                }\n                else if (blankLine) {\n                    indent = cap[1].length + 1;\n                }\n                else {\n                    indent = cap[2].search(/[^ ]/); // Find first non-space char\n                    indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n                    itemContents = line.slice(indent);\n                    indent += cap[1].length;\n                }\n                if (blankLine && /^[ \\t]*$/.test(nextLine)) { // Items begin with at most one blank line\n                    raw += nextLine + '\\n';\n                    src = src.substring(nextLine.length + 1);\n                    endEarly = true;\n                }\n                if (!endEarly) {\n                    const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n                    const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n                    const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n                    const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n                    const htmlBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}<[a-z].*>`, 'i');\n                    // Check if following lines should be included in List Item\n                    while (src) {\n                        const rawLine = src.split('\\n', 1)[0];\n                        let nextLineWithoutTabs;\n                        nextLine = rawLine;\n                        // Re-align to follow commonmark nesting rules\n                        if (this.options.pedantic) {\n                            nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n                            nextLineWithoutTabs = nextLine;\n                        }\n                        else {\n                            nextLineWithoutTabs = nextLine.replace(/\\t/g, '    ');\n                        }\n                        // End list item if found code fences\n                        if (fencesBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new heading\n                        if (headingBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of html block\n                        if (htmlBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new bullet\n                        if (nextBulletRegex.test(nextLine)) {\n                            break;\n                        }\n                        // Horizontal rule found\n                        if (hrRegex.test(nextLine)) {\n                            break;\n                        }\n                        if (nextLineWithoutTabs.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n                            itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n                        }\n                        else {\n                            // not enough indentation\n                            if (blankLine) {\n                                break;\n                            }\n                            // paragraph continuation unless last line was a different block level element\n                            if (line.replace(/\\t/g, '    ').search(/[^ ]/) >= 4) { // indented code block\n                                break;\n                            }\n                            if (fencesBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (headingBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (hrRegex.test(line)) {\n                                break;\n                            }\n                            itemContents += '\\n' + nextLine;\n                        }\n                        if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n                            blankLine = true;\n                        }\n                        raw += rawLine + '\\n';\n                        src = src.substring(rawLine.length + 1);\n                        line = nextLineWithoutTabs.slice(indent);\n                    }\n                }\n                if (!list.loose) {\n                    // If the previous item ended with a blank line, the list is loose\n                    if (endsWithBlankLine) {\n                        list.loose = true;\n                    }\n                    else if (/\\n[ \\t]*\\n[ \\t]*$/.test(raw)) {\n                        endsWithBlankLine = true;\n                    }\n                }\n                let istask = null;\n                let ischecked;\n                // Check for task list items\n                if (this.options.gfm) {\n                    istask = /^\\[[ xX]\\] /.exec(itemContents);\n                    if (istask) {\n                        ischecked = istask[0] !== '[ ] ';\n                        itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n                    }\n                }\n                list.items.push({\n                    type: 'list_item',\n                    raw,\n                    task: !!istask,\n                    checked: ischecked,\n                    loose: false,\n                    text: itemContents,\n                    tokens: [],\n                });\n                list.raw += raw;\n            }\n            // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n            list.items[list.items.length - 1].raw = list.items[list.items.length - 1].raw.trimEnd();\n            list.items[list.items.length - 1].text = list.items[list.items.length - 1].text.trimEnd();\n            list.raw = list.raw.trimEnd();\n            // Item child tokens handled here at end because we needed to have the final item to trim it first\n            for (let i = 0; i < list.items.length; i++) {\n                this.lexer.state.top = false;\n                list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n                if (!list.loose) {\n                    // Check if list should be loose\n                    const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n                    const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n                    list.loose = hasMultipleLineBreaks;\n                }\n            }\n            // Set all items to loose if list is loose\n            if (list.loose) {\n                for (let i = 0; i < list.items.length; i++) {\n                    list.items[i].loose = true;\n                }\n            }\n            return list;\n        }\n    }\n    html(src) {\n        const cap = this.rules.block.html.exec(src);\n        if (cap) {\n            const token = {\n                type: 'html',\n                block: true,\n                raw: cap[0],\n                pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n                text: cap[0],\n            };\n            return token;\n        }\n    }\n    def(src) {\n        const cap = this.rules.block.def.exec(src);\n        if (cap) {\n            const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n            const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n            const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n            return {\n                type: 'def',\n                tag,\n                raw: cap[0],\n                href,\n                title,\n            };\n        }\n    }\n    table(src) {\n        const cap = this.rules.block.table.exec(src);\n        if (!cap) {\n            return;\n        }\n        if (!/[:|]/.test(cap[2])) {\n            // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n            return;\n        }\n        const headers = splitCells(cap[1]);\n        const aligns = cap[2].replace(/^\\||\\| *$/g, '').split('|');\n        const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : [];\n        const item = {\n            type: 'table',\n            raw: cap[0],\n            header: [],\n            align: [],\n            rows: [],\n        };\n        if (headers.length !== aligns.length) {\n            // header and align columns must be equal, rows can be different.\n            return;\n        }\n        for (const align of aligns) {\n            if (/^ *-+: *$/.test(align)) {\n                item.align.push('right');\n            }\n            else if (/^ *:-+: *$/.test(align)) {\n                item.align.push('center');\n            }\n            else if (/^ *:-+ *$/.test(align)) {\n                item.align.push('left');\n            }\n            else {\n                item.align.push(null);\n            }\n        }\n        for (let i = 0; i < headers.length; i++) {\n            item.header.push({\n                text: headers[i],\n                tokens: this.lexer.inline(headers[i]),\n                header: true,\n                align: item.align[i],\n            });\n        }\n        for (const row of rows) {\n            item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n                return {\n                    text: cell,\n                    tokens: this.lexer.inline(cell),\n                    header: false,\n                    align: item.align[i],\n                };\n            }));\n        }\n        return item;\n    }\n    lheading(src) {\n        const cap = this.rules.block.lheading.exec(src);\n        if (cap) {\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[2].charAt(0) === '=' ? 1 : 2,\n                text: cap[1],\n                tokens: this.lexer.inline(cap[1]),\n            };\n        }\n    }\n    paragraph(src) {\n        const cap = this.rules.block.paragraph.exec(src);\n        if (cap) {\n            const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n                ? cap[1].slice(0, -1)\n                : cap[1];\n            return {\n                type: 'paragraph',\n                raw: cap[0],\n                text,\n                tokens: this.lexer.inline(text),\n            };\n        }\n    }\n    text(src) {\n        const cap = this.rules.block.text.exec(src);\n        if (cap) {\n            return {\n                type: 'text',\n                raw: cap[0],\n                text: cap[0],\n                tokens: this.lexer.inline(cap[0]),\n            };\n        }\n    }\n    escape(src) {\n        const cap = this.rules.inline.escape.exec(src);\n        if (cap) {\n            return {\n                type: 'escape',\n                raw: cap[0],\n                text: escape$1(cap[1]),\n            };\n        }\n    }\n    tag(src) {\n        const cap = this.rules.inline.tag.exec(src);\n        if (cap) {\n            if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n                this.lexer.state.inLink = true;\n            }\n            else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n                this.lexer.state.inLink = false;\n            }\n            if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n                this.lexer.state.inRawBlock = true;\n            }\n            else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n                this.lexer.state.inRawBlock = false;\n            }\n            return {\n                type: 'html',\n                raw: cap[0],\n                inLink: this.lexer.state.inLink,\n                inRawBlock: this.lexer.state.inRawBlock,\n                block: false,\n                text: cap[0],\n            };\n        }\n    }\n    link(src) {\n        const cap = this.rules.inline.link.exec(src);\n        if (cap) {\n            const trimmedUrl = cap[2].trim();\n            if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n                // commonmark requires matching angle brackets\n                if (!(/>$/.test(trimmedUrl))) {\n                    return;\n                }\n                // ending angle bracket cannot be escaped\n                const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n                if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n                    return;\n                }\n            }\n            else {\n                // find closing parenthesis\n                const lastParenIndex = findClosingBracket(cap[2], '()');\n                if (lastParenIndex > -1) {\n                    const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n                    const linkLen = start + cap[1].length + lastParenIndex;\n                    cap[2] = cap[2].substring(0, lastParenIndex);\n                    cap[0] = cap[0].substring(0, linkLen).trim();\n                    cap[3] = '';\n                }\n            }\n            let href = cap[2];\n            let title = '';\n            if (this.options.pedantic) {\n                // split pedantic href and title\n                const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n                if (link) {\n                    href = link[1];\n                    title = link[3];\n                }\n            }\n            else {\n                title = cap[3] ? cap[3].slice(1, -1) : '';\n            }\n            href = href.trim();\n            if (/^</.test(href)) {\n                if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n                    // pedantic allows starting angle bracket without ending angle bracket\n                    href = href.slice(1);\n                }\n                else {\n                    href = href.slice(1, -1);\n                }\n            }\n            return outputLink(cap, {\n                href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n                title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n            }, cap[0], this.lexer);\n        }\n    }\n    reflink(src, links) {\n        let cap;\n        if ((cap = this.rules.inline.reflink.exec(src))\n            || (cap = this.rules.inline.nolink.exec(src))) {\n            const linkString = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n            const link = links[linkString.toLowerCase()];\n            if (!link) {\n                const text = cap[0].charAt(0);\n                return {\n                    type: 'text',\n                    raw: text,\n                    text,\n                };\n            }\n            return outputLink(cap, link, cap[0], this.lexer);\n        }\n    }\n    emStrong(src, maskedSrc, prevChar = '') {\n        let match = this.rules.inline.emStrongLDelim.exec(src);\n        if (!match)\n            return;\n        // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n        if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n            return;\n        const nextChar = match[1] || match[2] || '';\n        if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n            // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n            const lLength = [...match[0]].length - 1;\n            let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n            const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n            endReg.lastIndex = 0;\n            // Clip maskedSrc to same section of string as src (move to lexer?)\n            maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n            while ((match = endReg.exec(maskedSrc)) != null) {\n                rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n                if (!rDelim)\n                    continue; // skip single * in __abc*abc__\n                rLength = [...rDelim].length;\n                if (match[3] || match[4]) { // found another Left Delim\n                    delimTotal += rLength;\n                    continue;\n                }\n                else if (match[5] || match[6]) { // either Left or Right Delim\n                    if (lLength % 3 && !((lLength + rLength) % 3)) {\n                        midDelimTotal += rLength;\n                        continue; // CommonMark Emphasis Rules 9-10\n                    }\n                }\n                delimTotal -= rLength;\n                if (delimTotal > 0)\n                    continue; // Haven't found enough closing delimiters\n                // Remove extra characters. *a*** -> *a*\n                rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n                // char length can be >1 for unicode characters;\n                const lastCharLength = [...match[0]][0].length;\n                const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n                // Create `em` if smallest delimiter has odd char count. *a***\n                if (Math.min(lLength, rLength) % 2) {\n                    const text = raw.slice(1, -1);\n                    return {\n                        type: 'em',\n                        raw,\n                        text,\n                        tokens: this.lexer.inlineTokens(text),\n                    };\n                }\n                // Create 'strong' if smallest delimiter has even char count. **a***\n                const text = raw.slice(2, -2);\n                return {\n                    type: 'strong',\n                    raw,\n                    text,\n                    tokens: this.lexer.inlineTokens(text),\n                };\n            }\n        }\n    }\n    codespan(src) {\n        const cap = this.rules.inline.code.exec(src);\n        if (cap) {\n            let text = cap[2].replace(/\\n/g, ' ');\n            const hasNonSpaceChars = /[^ ]/.test(text);\n            const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n            if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n                text = text.substring(1, text.length - 1);\n            }\n            text = escape$1(text, true);\n            return {\n                type: 'codespan',\n                raw: cap[0],\n                text,\n            };\n        }\n    }\n    br(src) {\n        const cap = this.rules.inline.br.exec(src);\n        if (cap) {\n            return {\n                type: 'br',\n                raw: cap[0],\n            };\n        }\n    }\n    del(src) {\n        const cap = this.rules.inline.del.exec(src);\n        if (cap) {\n            return {\n                type: 'del',\n                raw: cap[0],\n                text: cap[2],\n                tokens: this.lexer.inlineTokens(cap[2]),\n            };\n        }\n    }\n    autolink(src) {\n        const cap = this.rules.inline.autolink.exec(src);\n        if (cap) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = escape$1(cap[1]);\n                href = 'mailto:' + text;\n            }\n            else {\n                text = escape$1(cap[1]);\n                href = text;\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text,\n                    },\n                ],\n            };\n        }\n    }\n    url(src) {\n        let cap;\n        if (cap = this.rules.inline.url.exec(src)) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = escape$1(cap[0]);\n                href = 'mailto:' + text;\n            }\n            else {\n                // do extended autolink path validation\n                let prevCapZero;\n                do {\n                    prevCapZero = cap[0];\n                    cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n                } while (prevCapZero !== cap[0]);\n                text = escape$1(cap[0]);\n                if (cap[1] === 'www.') {\n                    href = 'http://' + cap[0];\n                }\n                else {\n                    href = cap[0];\n                }\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text,\n                    },\n                ],\n            };\n        }\n    }\n    inlineText(src) {\n        const cap = this.rules.inline.text.exec(src);\n        if (cap) {\n            let text;\n            if (this.lexer.state.inRawBlock) {\n                text = cap[0];\n            }\n            else {\n                text = escape$1(cap[0]);\n            }\n            return {\n                type: 'text',\n                raw: cap[0],\n                text,\n            };\n        }\n    }\n}\n\n/**\n * Block-Level Grammar\n */\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/)\n    .replace(/bull/g, bullet) // lists can interrupt\n    .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n    .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n    .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n    .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n    .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n    .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n    .replace('label', _blockLabel)\n    .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n    .getRegex();\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n    .replace(/bull/g, bullet)\n    .getRegex();\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n    + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n    + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n    + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n    + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n    + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit('^ {0,3}(?:' // optional indentation\n    + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n    + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n    + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n    + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n    + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n    + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n    + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n    + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n    + ')', 'i')\n    .replace('comment', _comment)\n    .replace('tag', _tag)\n    .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n    .getRegex();\nconst paragraph = edit(_paragraph)\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n    .replace('|table', '')\n    .replace('blockquote', ' {0,3}>')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n    .getRegex();\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n    .replace('paragraph', paragraph)\n    .getRegex();\n/**\n * Normal Block Grammar\n */\nconst blockNormal = {\n    blockquote,\n    code: blockCode,\n    def,\n    fences,\n    heading,\n    hr,\n    html,\n    lheading,\n    list,\n    newline,\n    paragraph,\n    table: noopTest,\n    text: blockText,\n};\n/**\n * GFM Block Grammar\n */\nconst gfmTable = edit('^ *([^\\\\n ].*)\\\\n' // Header\n    + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n    + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('blockquote', ' {0,3}>')\n    .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n    .getRegex();\nconst blockGfm = {\n    ...blockNormal,\n    table: gfmTable,\n    paragraph: edit(_paragraph)\n        .replace('hr', hr)\n        .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n        .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n        .replace('table', gfmTable) // interrupt paragraphs with table\n        .replace('blockquote', ' {0,3}>')\n        .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n        .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n        .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n        .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n        .getRegex(),\n};\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nconst blockPedantic = {\n    ...blockNormal,\n    html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n        + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n        + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n        .replace('comment', _comment)\n        .replace(/tag/g, '(?!(?:'\n        + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n        + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n        + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n        .getRegex(),\n    def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n    heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n    fences: noopTest, // fences not supported\n    lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n    paragraph: edit(_paragraph)\n        .replace('hr', hr)\n        .replace('heading', ' *#{1,6} *[^\\n]')\n        .replace('lheading', lheading)\n        .replace('|table', '')\n        .replace('blockquote', ' {0,3}>')\n        .replace('|fences', '')\n        .replace('|list', '')\n        .replace('|html', '')\n        .replace('|tag', '')\n        .getRegex(),\n};\n/**\n * Inline-Level Grammar\n */\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = '\\\\p{P}\\\\p{S}';\nconst punctuation = edit(/^((?![*_])[\\spunctuation])/, 'u')\n    .replace(/punctuation/g, _punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\nconst emStrongLDelim = edit(/^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/, 'u')\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n    + '|[^*]+(?=[^*])' // Consume to delim\n    + '|(?!\\\\*)[punct](\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n    + '|[^punct\\\\s](\\\\*+)(?!\\\\*)(?=[punct\\\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter\n    + '|(?!\\\\*)[punct\\\\s](\\\\*+)(?=[^punct\\\\s])' // (3) #***a, ***a can only be Left Delimiter\n    + '|[\\\\s](\\\\*+)(?!\\\\*)(?=[punct])' // (4) ***# can only be Left Delimiter\n    + '|(?!\\\\*)[punct](\\\\*+)(?!\\\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter\n    + '|[^punct\\\\s](\\\\*+)(?=[^punct\\\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter\n    .replace(/punct/g, _punctuation)\n    .getRegex();\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit('^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n    + '|[^_]+(?=[^_])' // Consume to delim\n    + '|(?!_)[punct](_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n    + '|[^punct\\\\s](_+)(?!_)(?=[punct\\\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter\n    + '|(?!_)[punct\\\\s](_+)(?=[^punct\\\\s])' // (3) #___a, ___a can only be Left Delimiter\n    + '|[\\\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter\n    + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst anyPunctuation = edit(/\\\\([punct])/, 'gu')\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n    .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n    .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n    .getRegex();\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit('^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n    .replace('comment', _inlineComment)\n    .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n    .getRegex();\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/)\n    .replace('label', _inlineLabel)\n    .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/)\n    .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n    .getRegex();\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n    .replace('label', _inlineLabel)\n    .replace('ref', _blockLabel)\n    .getRegex();\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n    .replace('ref', _blockLabel)\n    .getRegex();\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n    .replace('reflink', reflink)\n    .replace('nolink', nolink)\n    .getRegex();\n/**\n * Normal Inline Grammar\n */\nconst inlineNormal = {\n    _backpedal: noopTest, // only used for GFM url\n    anyPunctuation,\n    autolink,\n    blockSkip,\n    br,\n    code: inlineCode,\n    del: noopTest,\n    emStrongLDelim,\n    emStrongRDelimAst,\n    emStrongRDelimUnd,\n    escape,\n    link,\n    nolink,\n    punctuation,\n    reflink,\n    reflinkSearch,\n    tag,\n    text: inlineText,\n    url: noopTest,\n};\n/**\n * Pedantic Inline Grammar\n */\nconst inlinePedantic = {\n    ...inlineNormal,\n    link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n        .replace('label', _inlineLabel)\n        .getRegex(),\n    reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n        .replace('label', _inlineLabel)\n        .getRegex(),\n};\n/**\n * GFM Inline Grammar\n */\nconst inlineGfm = {\n    ...inlineNormal,\n    escape: edit(escape).replace('])', '~|])').getRegex(),\n    url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n        .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n        .getRegex(),\n    _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n    del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n    text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/,\n};\n/**\n * GFM + Line Breaks Inline Grammar\n */\nconst inlineBreaks = {\n    ...inlineGfm,\n    br: edit(br).replace('{2,}', '*').getRegex(),\n    text: edit(inlineGfm.text)\n        .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n        .replace(/\\{2,\\}/g, '*')\n        .getRegex(),\n};\n/**\n * exports\n */\nconst block = {\n    normal: blockNormal,\n    gfm: blockGfm,\n    pedantic: blockPedantic,\n};\nconst inline = {\n    normal: inlineNormal,\n    gfm: inlineGfm,\n    breaks: inlineBreaks,\n    pedantic: inlinePedantic,\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n    tokens;\n    options;\n    state;\n    tokenizer;\n    inlineQueue;\n    constructor(options) {\n        // TokenList cannot be created in one go\n        this.tokens = [];\n        this.tokens.links = Object.create(null);\n        this.options = options || _defaults;\n        this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n        this.tokenizer = this.options.tokenizer;\n        this.tokenizer.options = this.options;\n        this.tokenizer.lexer = this;\n        this.inlineQueue = [];\n        this.state = {\n            inLink: false,\n            inRawBlock: false,\n            top: true,\n        };\n        const rules = {\n            block: block.normal,\n            inline: inline.normal,\n        };\n        if (this.options.pedantic) {\n            rules.block = block.pedantic;\n            rules.inline = inline.pedantic;\n        }\n        else if (this.options.gfm) {\n            rules.block = block.gfm;\n            if (this.options.breaks) {\n                rules.inline = inline.breaks;\n            }\n            else {\n                rules.inline = inline.gfm;\n            }\n        }\n        this.tokenizer.rules = rules;\n    }\n    /**\n     * Expose Rules\n     */\n    static get rules() {\n        return {\n            block,\n            inline,\n        };\n    }\n    /**\n     * Static Lex Method\n     */\n    static lex(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.lex(src);\n    }\n    /**\n     * Static Lex Inline Method\n     */\n    static lexInline(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.inlineTokens(src);\n    }\n    /**\n     * Preprocessing\n     */\n    lex(src) {\n        src = src\n            .replace(/\\r\\n|\\r/g, '\\n');\n        this.blockTokens(src, this.tokens);\n        for (let i = 0; i < this.inlineQueue.length; i++) {\n            const next = this.inlineQueue[i];\n            this.inlineTokens(next.src, next.tokens);\n        }\n        this.inlineQueue = [];\n        return this.tokens;\n    }\n    blockTokens(src, tokens = [], lastParagraphClipped = false) {\n        if (this.options.pedantic) {\n            src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n        }\n        let token;\n        let lastToken;\n        let cutSrc;\n        while (src) {\n            if (this.options.extensions\n                && this.options.extensions.block\n                && this.options.extensions.block.some((extTokenizer) => {\n                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                        src = src.substring(token.raw.length);\n                        tokens.push(token);\n                        return true;\n                    }\n                    return false;\n                })) {\n                continue;\n            }\n            // newline\n            if (token = this.tokenizer.space(src)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.length === 1 && tokens.length > 0) {\n                    // if there's a single \\n as a spacer, it's terminating the last line,\n                    // so move it there so that we don't get unnecessary paragraph tags\n                    tokens[tokens.length - 1].raw += '\\n';\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.code(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                // An indented code block cannot interrupt a paragraph.\n                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // fences\n            if (token = this.tokenizer.fences(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // heading\n            if (token = this.tokenizer.heading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // hr\n            if (token = this.tokenizer.hr(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // blockquote\n            if (token = this.tokenizer.blockquote(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // list\n            if (token = this.tokenizer.list(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // html\n            if (token = this.tokenizer.html(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // def\n            if (token = this.tokenizer.def(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.raw;\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else if (!this.tokens.links[token.tag]) {\n                    this.tokens.links[token.tag] = {\n                        href: token.href,\n                        title: token.title,\n                    };\n                }\n                continue;\n            }\n            // table (gfm)\n            if (token = this.tokenizer.table(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // lheading\n            if (token = this.tokenizer.lheading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // top-level paragraph\n            // prevent paragraph consuming extensions by clipping 'src' to extension start\n            cutSrc = src;\n            if (this.options.extensions && this.options.extensions.startBlock) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startBlock.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n                lastToken = tokens[tokens.length - 1];\n                if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                lastParagraphClipped = (cutSrc.length !== src.length);\n                src = src.substring(token.raw.length);\n                continue;\n            }\n            // text\n            if (token = this.tokenizer.text(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && lastToken.type === 'text') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        this.state.top = true;\n        return tokens;\n    }\n    inline(src, tokens = []) {\n        this.inlineQueue.push({ src, tokens });\n        return tokens;\n    }\n    /**\n     * Lexing/Compiling\n     */\n    inlineTokens(src, tokens = []) {\n        let token, lastToken, cutSrc;\n        // String with links masked to avoid interference with em and strong\n        let maskedSrc = src;\n        let match;\n        let keepPrevChar, prevChar;\n        // Mask out reflinks\n        if (this.tokens.links) {\n            const links = Object.keys(this.tokens.links);\n            if (links.length > 0) {\n                while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n                    if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n                        maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n                    }\n                }\n            }\n        }\n        // Mask out other blocks\n        while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n        }\n        // Mask out escaped characters\n        while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n        }\n        while (src) {\n            if (!keepPrevChar) {\n                prevChar = '';\n            }\n            keepPrevChar = false;\n            // extensions\n            if (this.options.extensions\n                && this.options.extensions.inline\n                && this.options.extensions.inline.some((extTokenizer) => {\n                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                        src = src.substring(token.raw.length);\n                        tokens.push(token);\n                        return true;\n                    }\n                    return false;\n                })) {\n                continue;\n            }\n            // escape\n            if (token = this.tokenizer.escape(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // tag\n            if (token = this.tokenizer.tag(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // link\n            if (token = this.tokenizer.link(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // reflink, nolink\n            if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // em & strong\n            if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.codespan(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // br\n            if (token = this.tokenizer.br(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // del (gfm)\n            if (token = this.tokenizer.del(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // autolink\n            if (token = this.tokenizer.autolink(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // url (gfm)\n            if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // text\n            // prevent inlineText consuming extensions by clipping 'src' to extension start\n            cutSrc = src;\n            if (this.options.extensions && this.options.extensions.startInline) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startInline.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (token = this.tokenizer.inlineText(cutSrc)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n                    prevChar = token.raw.slice(-1);\n                }\n                keepPrevChar = true;\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        return tokens;\n    }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n    options;\n    parser; // set by the parser\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(token) {\n        return '';\n    }\n    code({ text, lang, escaped }) {\n        const langString = (lang || '').match(/^\\S*/)?.[0];\n        const code = text.replace(/\\n$/, '') + '\\n';\n        if (!langString) {\n            return '<pre><code>'\n                + (escaped ? code : escape$1(code, true))\n                + '</code></pre>\\n';\n        }\n        return '<pre><code class=\"language-'\n            + escape$1(langString)\n            + '\">'\n            + (escaped ? code : escape$1(code, true))\n            + '</code></pre>\\n';\n    }\n    blockquote({ tokens }) {\n        const body = this.parser.parse(tokens);\n        return `<blockquote>\\n${body}</blockquote>\\n`;\n    }\n    html({ text }) {\n        return text;\n    }\n    heading({ tokens, depth }) {\n        return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n`;\n    }\n    hr(token) {\n        return '<hr>\\n';\n    }\n    list(token) {\n        const ordered = token.ordered;\n        const start = token.start;\n        let body = '';\n        for (let j = 0; j < token.items.length; j++) {\n            const item = token.items[j];\n            body += this.listitem(item);\n        }\n        const type = ordered ? 'ol' : 'ul';\n        const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n        return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n';\n    }\n    listitem(item) {\n        let itemBody = '';\n        if (item.task) {\n            const checkbox = this.checkbox({ checked: !!item.checked });\n            if (item.loose) {\n                if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                    item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                    if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                        item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                    }\n                }\n                else {\n                    item.tokens.unshift({\n                        type: 'text',\n                        raw: checkbox + ' ',\n                        text: checkbox + ' ',\n                    });\n                }\n            }\n            else {\n                itemBody += checkbox + ' ';\n            }\n        }\n        itemBody += this.parser.parse(item.tokens, !!item.loose);\n        return `<li>${itemBody}</li>\\n`;\n    }\n    checkbox({ checked }) {\n        return '<input '\n            + (checked ? 'checked=\"\" ' : '')\n            + 'disabled=\"\" type=\"checkbox\">';\n    }\n    paragraph({ tokens }) {\n        return `<p>${this.parser.parseInline(tokens)}</p>\\n`;\n    }\n    table(token) {\n        let header = '';\n        // header\n        let cell = '';\n        for (let j = 0; j < token.header.length; j++) {\n            cell += this.tablecell(token.header[j]);\n        }\n        header += this.tablerow({ text: cell });\n        let body = '';\n        for (let j = 0; j < token.rows.length; j++) {\n            const row = token.rows[j];\n            cell = '';\n            for (let k = 0; k < row.length; k++) {\n                cell += this.tablecell(row[k]);\n            }\n            body += this.tablerow({ text: cell });\n        }\n        if (body)\n            body = `<tbody>${body}</tbody>`;\n        return '<table>\\n'\n            + '<thead>\\n'\n            + header\n            + '</thead>\\n'\n            + body\n            + '</table>\\n';\n    }\n    tablerow({ text }) {\n        return `<tr>\\n${text}</tr>\\n`;\n    }\n    tablecell(token) {\n        const content = this.parser.parseInline(token.tokens);\n        const type = token.header ? 'th' : 'td';\n        const tag = token.align\n            ? `<${type} align=\"${token.align}\">`\n            : `<${type}>`;\n        return tag + content + `</${type}>\\n`;\n    }\n    /**\n     * span level renderer\n     */\n    strong({ tokens }) {\n        return `<strong>${this.parser.parseInline(tokens)}</strong>`;\n    }\n    em({ tokens }) {\n        return `<em>${this.parser.parseInline(tokens)}</em>`;\n    }\n    codespan({ text }) {\n        return `<code>${text}</code>`;\n    }\n    br(token) {\n        return '<br>';\n    }\n    del({ tokens }) {\n        return `<del>${this.parser.parseInline(tokens)}</del>`;\n    }\n    link({ href, title, tokens }) {\n        const text = this.parser.parseInline(tokens);\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = '<a href=\"' + href + '\"';\n        if (title) {\n            out += ' title=\"' + title + '\"';\n        }\n        out += '>' + text + '</a>';\n        return out;\n    }\n    image({ href, title, text }) {\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = `<img src=\"${href}\" alt=\"${text}\"`;\n        if (title) {\n            out += ` title=\"${title}\"`;\n        }\n        out += '>';\n        return out;\n    }\n    text(token) {\n        return 'tokens' in token && token.tokens ? this.parser.parseInline(token.tokens) : token.text;\n    }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n    // no need for block level renderers\n    strong({ text }) {\n        return text;\n    }\n    em({ text }) {\n        return text;\n    }\n    codespan({ text }) {\n        return text;\n    }\n    del({ text }) {\n        return text;\n    }\n    html({ text }) {\n        return text;\n    }\n    text({ text }) {\n        return text;\n    }\n    link({ text }) {\n        return '' + text;\n    }\n    image({ text }) {\n        return '' + text;\n    }\n    br() {\n        return '';\n    }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n    options;\n    renderer;\n    textRenderer;\n    constructor(options) {\n        this.options = options || _defaults;\n        this.options.renderer = this.options.renderer || new _Renderer();\n        this.renderer = this.options.renderer;\n        this.renderer.options = this.options;\n        this.renderer.parser = this;\n        this.textRenderer = new _TextRenderer();\n    }\n    /**\n     * Static Parse Method\n     */\n    static parse(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parse(tokens);\n    }\n    /**\n     * Static Parse Inline Method\n     */\n    static parseInline(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parseInline(tokens);\n    }\n    /**\n     * Parse Loop\n     */\n    parse(tokens, top = true) {\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const anyToken = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) {\n                const genericToken = anyToken;\n                const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n                if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            const token = anyToken;\n            switch (token.type) {\n                case 'space': {\n                    out += this.renderer.space(token);\n                    continue;\n                }\n                case 'hr': {\n                    out += this.renderer.hr(token);\n                    continue;\n                }\n                case 'heading': {\n                    out += this.renderer.heading(token);\n                    continue;\n                }\n                case 'code': {\n                    out += this.renderer.code(token);\n                    continue;\n                }\n                case 'table': {\n                    out += this.renderer.table(token);\n                    continue;\n                }\n                case 'blockquote': {\n                    out += this.renderer.blockquote(token);\n                    continue;\n                }\n                case 'list': {\n                    out += this.renderer.list(token);\n                    continue;\n                }\n                case 'html': {\n                    out += this.renderer.html(token);\n                    continue;\n                }\n                case 'paragraph': {\n                    out += this.renderer.paragraph(token);\n                    continue;\n                }\n                case 'text': {\n                    let textToken = token;\n                    let body = this.renderer.text(textToken);\n                    while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n                        textToken = tokens[++i];\n                        body += '\\n' + this.renderer.text(textToken);\n                    }\n                    if (top) {\n                        out += this.renderer.paragraph({\n                            type: 'paragraph',\n                            raw: body,\n                            text: body,\n                            tokens: [{ type: 'text', raw: body, text: body }],\n                        });\n                    }\n                    else {\n                        out += body;\n                    }\n                    continue;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n    /**\n     * Parse Inline Tokens\n     */\n    parseInline(tokens, renderer) {\n        renderer = renderer || this.renderer;\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const anyToken = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) {\n                const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n                if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            const token = anyToken;\n            switch (token.type) {\n                case 'escape': {\n                    out += renderer.text(token);\n                    break;\n                }\n                case 'html': {\n                    out += renderer.html(token);\n                    break;\n                }\n                case 'link': {\n                    out += renderer.link(token);\n                    break;\n                }\n                case 'image': {\n                    out += renderer.image(token);\n                    break;\n                }\n                case 'strong': {\n                    out += renderer.strong(token);\n                    break;\n                }\n                case 'em': {\n                    out += renderer.em(token);\n                    break;\n                }\n                case 'codespan': {\n                    out += renderer.codespan(token);\n                    break;\n                }\n                case 'br': {\n                    out += renderer.br(token);\n                    break;\n                }\n                case 'del': {\n                    out += renderer.del(token);\n                    break;\n                }\n                case 'text': {\n                    out += renderer.text(token);\n                    break;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n}\n\nclass _Hooks {\n    options;\n    block;\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    static passThroughHooks = new Set([\n        'preprocess',\n        'postprocess',\n        'processAllTokens',\n    ]);\n    /**\n     * Process markdown before marked\n     */\n    preprocess(markdown) {\n        return markdown;\n    }\n    /**\n     * Process HTML after marked is finished\n     */\n    postprocess(html) {\n        return html;\n    }\n    /**\n     * Process all tokens before walk tokens\n     */\n    processAllTokens(tokens) {\n        return tokens;\n    }\n    /**\n     * Provide function to tokenize markdown\n     */\n    provideLexer() {\n        return this.block ? _Lexer.lex : _Lexer.lexInline;\n    }\n    /**\n     * Provide function to parse tokens\n     */\n    provideParser() {\n        return this.block ? _Parser.parse : _Parser.parseInline;\n    }\n}\n\nclass Marked {\n    defaults = _getDefaults();\n    options = this.setOptions;\n    parse = this.parseMarkdown(true);\n    parseInline = this.parseMarkdown(false);\n    Parser = _Parser;\n    Renderer = _Renderer;\n    TextRenderer = _TextRenderer;\n    Lexer = _Lexer;\n    Tokenizer = _Tokenizer;\n    Hooks = _Hooks;\n    constructor(...args) {\n        this.use(...args);\n    }\n    /**\n     * Run callback for every token\n     */\n    walkTokens(tokens, callback) {\n        let values = [];\n        for (const token of tokens) {\n            values = values.concat(callback.call(this, token));\n            switch (token.type) {\n                case 'table': {\n                    const tableToken = token;\n                    for (const cell of tableToken.header) {\n                        values = values.concat(this.walkTokens(cell.tokens, callback));\n                    }\n                    for (const row of tableToken.rows) {\n                        for (const cell of row) {\n                            values = values.concat(this.walkTokens(cell.tokens, callback));\n                        }\n                    }\n                    break;\n                }\n                case 'list': {\n                    const listToken = token;\n                    values = values.concat(this.walkTokens(listToken.items, callback));\n                    break;\n                }\n                default: {\n                    const genericToken = token;\n                    if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n                        this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n                            const tokens = genericToken[childTokens].flat(Infinity);\n                            values = values.concat(this.walkTokens(tokens, callback));\n                        });\n                    }\n                    else if (genericToken.tokens) {\n                        values = values.concat(this.walkTokens(genericToken.tokens, callback));\n                    }\n                }\n            }\n        }\n        return values;\n    }\n    use(...args) {\n        const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n        args.forEach((pack) => {\n            // copy options to new object\n            const opts = { ...pack };\n            // set async to true if it was set to true before\n            opts.async = this.defaults.async || opts.async || false;\n            // ==-- Parse \"addon\" extensions --== //\n            if (pack.extensions) {\n                pack.extensions.forEach((ext) => {\n                    if (!ext.name) {\n                        throw new Error('extension name required');\n                    }\n                    if ('renderer' in ext) { // Renderer extensions\n                        const prevRenderer = extensions.renderers[ext.name];\n                        if (prevRenderer) {\n                            // Replace extension with func to run new extension but fall back if false\n                            extensions.renderers[ext.name] = function (...args) {\n                                let ret = ext.renderer.apply(this, args);\n                                if (ret === false) {\n                                    ret = prevRenderer.apply(this, args);\n                                }\n                                return ret;\n                            };\n                        }\n                        else {\n                            extensions.renderers[ext.name] = ext.renderer;\n                        }\n                    }\n                    if ('tokenizer' in ext) { // Tokenizer Extensions\n                        if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n                            throw new Error(\"extension level must be 'block' or 'inline'\");\n                        }\n                        const extLevel = extensions[ext.level];\n                        if (extLevel) {\n                            extLevel.unshift(ext.tokenizer);\n                        }\n                        else {\n                            extensions[ext.level] = [ext.tokenizer];\n                        }\n                        if (ext.start) { // Function to check for start of token\n                            if (ext.level === 'block') {\n                                if (extensions.startBlock) {\n                                    extensions.startBlock.push(ext.start);\n                                }\n                                else {\n                                    extensions.startBlock = [ext.start];\n                                }\n                            }\n                            else if (ext.level === 'inline') {\n                                if (extensions.startInline) {\n                                    extensions.startInline.push(ext.start);\n                                }\n                                else {\n                                    extensions.startInline = [ext.start];\n                                }\n                            }\n                        }\n                    }\n                    if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n                        extensions.childTokens[ext.name] = ext.childTokens;\n                    }\n                });\n                opts.extensions = extensions;\n            }\n            // ==-- Parse \"overwrite\" extensions --== //\n            if (pack.renderer) {\n                const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n                for (const prop in pack.renderer) {\n                    if (!(prop in renderer)) {\n                        throw new Error(`renderer '${prop}' does not exist`);\n                    }\n                    if (['options', 'parser'].includes(prop)) {\n                        // ignore options property\n                        continue;\n                    }\n                    const rendererProp = prop;\n                    const rendererFunc = pack.renderer[rendererProp];\n                    const prevRenderer = renderer[rendererProp];\n                    // Replace renderer with func to run extension, but fall back if false\n                    renderer[rendererProp] = (...args) => {\n                        let ret = rendererFunc.apply(renderer, args);\n                        if (ret === false) {\n                            ret = prevRenderer.apply(renderer, args);\n                        }\n                        return ret || '';\n                    };\n                }\n                opts.renderer = renderer;\n            }\n            if (pack.tokenizer) {\n                const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n                for (const prop in pack.tokenizer) {\n                    if (!(prop in tokenizer)) {\n                        throw new Error(`tokenizer '${prop}' does not exist`);\n                    }\n                    if (['options', 'rules', 'lexer'].includes(prop)) {\n                        // ignore options, rules, and lexer properties\n                        continue;\n                    }\n                    const tokenizerProp = prop;\n                    const tokenizerFunc = pack.tokenizer[tokenizerProp];\n                    const prevTokenizer = tokenizer[tokenizerProp];\n                    // Replace tokenizer with func to run extension, but fall back if false\n                    // @ts-expect-error cannot type tokenizer function dynamically\n                    tokenizer[tokenizerProp] = (...args) => {\n                        let ret = tokenizerFunc.apply(tokenizer, args);\n                        if (ret === false) {\n                            ret = prevTokenizer.apply(tokenizer, args);\n                        }\n                        return ret;\n                    };\n                }\n                opts.tokenizer = tokenizer;\n            }\n            // ==-- Parse Hooks extensions --== //\n            if (pack.hooks) {\n                const hooks = this.defaults.hooks || new _Hooks();\n                for (const prop in pack.hooks) {\n                    if (!(prop in hooks)) {\n                        throw new Error(`hook '${prop}' does not exist`);\n                    }\n                    if (['options', 'block'].includes(prop)) {\n                        // ignore options and block properties\n                        continue;\n                    }\n                    const hooksProp = prop;\n                    const hooksFunc = pack.hooks[hooksProp];\n                    const prevHook = hooks[hooksProp];\n                    if (_Hooks.passThroughHooks.has(prop)) {\n                        // @ts-expect-error cannot type hook function dynamically\n                        hooks[hooksProp] = (arg) => {\n                            if (this.defaults.async) {\n                                return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n                                    return prevHook.call(hooks, ret);\n                                });\n                            }\n                            const ret = hooksFunc.call(hooks, arg);\n                            return prevHook.call(hooks, ret);\n                        };\n                    }\n                    else {\n                        // @ts-expect-error cannot type hook function dynamically\n                        hooks[hooksProp] = (...args) => {\n                            let ret = hooksFunc.apply(hooks, args);\n                            if (ret === false) {\n                                ret = prevHook.apply(hooks, args);\n                            }\n                            return ret;\n                        };\n                    }\n                }\n                opts.hooks = hooks;\n            }\n            // ==-- Parse WalkTokens extensions --== //\n            if (pack.walkTokens) {\n                const walkTokens = this.defaults.walkTokens;\n                const packWalktokens = pack.walkTokens;\n                opts.walkTokens = function (token) {\n                    let values = [];\n                    values.push(packWalktokens.call(this, token));\n                    if (walkTokens) {\n                        values = values.concat(walkTokens.call(this, token));\n                    }\n                    return values;\n                };\n            }\n            this.defaults = { ...this.defaults, ...opts };\n        });\n        return this;\n    }\n    setOptions(opt) {\n        this.defaults = { ...this.defaults, ...opt };\n        return this;\n    }\n    lexer(src, options) {\n        return _Lexer.lex(src, options ?? this.defaults);\n    }\n    parser(tokens, options) {\n        return _Parser.parse(tokens, options ?? this.defaults);\n    }\n    parseMarkdown(blockType) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const parse = (src, options) => {\n            const origOpt = { ...options };\n            const opt = { ...this.defaults, ...origOpt };\n            const throwError = this.onError(!!opt.silent, !!opt.async);\n            // throw error if an extension set async to true but parse was called with async: false\n            if (this.defaults.async === true && origOpt.async === false) {\n                return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n            }\n            // throw error in case of non string input\n            if (typeof src === 'undefined' || src === null) {\n                return throwError(new Error('marked(): input parameter is undefined or null'));\n            }\n            if (typeof src !== 'string') {\n                return throwError(new Error('marked(): input parameter is of type '\n                    + Object.prototype.toString.call(src) + ', string expected'));\n            }\n            if (opt.hooks) {\n                opt.hooks.options = opt;\n                opt.hooks.block = blockType;\n            }\n            const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n            const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n            if (opt.async) {\n                return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n                    .then(src => lexer(src, opt))\n                    .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n                    .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n                    .then(tokens => parser(tokens, opt))\n                    .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n                    .catch(throwError);\n            }\n            try {\n                if (opt.hooks) {\n                    src = opt.hooks.preprocess(src);\n                }\n                let tokens = lexer(src, opt);\n                if (opt.hooks) {\n                    tokens = opt.hooks.processAllTokens(tokens);\n                }\n                if (opt.walkTokens) {\n                    this.walkTokens(tokens, opt.walkTokens);\n                }\n                let html = parser(tokens, opt);\n                if (opt.hooks) {\n                    html = opt.hooks.postprocess(html);\n                }\n                return html;\n            }\n            catch (e) {\n                return throwError(e);\n            }\n        };\n        return parse;\n    }\n    onError(silent, async) {\n        return (e) => {\n            e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n            if (silent) {\n                const msg = '<p>An error occurred:</p><pre>'\n                    + escape$1(e.message + '', true)\n                    + '</pre>';\n                if (async) {\n                    return Promise.resolve(msg);\n                }\n                return msg;\n            }\n            if (async) {\n                return Promise.reject(e);\n            }\n            throw e;\n        };\n    }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n    return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n    marked.setOptions = function (options) {\n        markedInstance.setOptions(options);\n        marked.defaults = markedInstance.defaults;\n        changeDefaults(marked.defaults);\n        return marked;\n    };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n    markedInstance.use(...args);\n    marked.defaults = markedInstance.defaults;\n    changeDefaults(marked.defaults);\n    return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n    return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n","'use strict';\n\nvar escapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;'\n};\nvar unescapes = {\n  '&amp;': '&',\n  '&lt;': '<',\n  '&gt;': '>',\n  '&quot;': '\"',\n  '&#39;': \"'\"\n};\nvar rescaped = /(&amp;|&lt;|&gt;|&quot;|&#39;)/g;\nvar runescaped = /[&<>\"']/g;\n\nfunction escapeHtmlChar (match) {\n  return escapes[match];\n}\nfunction unescapeHtmlChar (match) {\n  return unescapes[match];\n}\n\nfunction escapeHtml (text) {\n  return text == null ? '' : String(text).replace(runescaped, escapeHtmlChar);\n}\n\nfunction unescapeHtml (html) {\n  return html == null ? '' : String(html).replace(rescaped, unescapeHtmlChar);\n}\n\nescapeHtml.options = unescapeHtml.options = {};\n\nmodule.exports = {\n  encode: escapeHtml,\n  escape: escapeHtml,\n  decode: unescapeHtml,\n  unescape: unescapeHtml,\n  version: '1.0.0-browser'\n};\n","'use strict';\n\nfunction assignment (result) {\n  var stack = Array.prototype.slice.call(arguments, 1);\n  var item;\n  var key;\n  while (stack.length) {\n    item = stack.shift();\n    for (key in item) {\n      if (item.hasOwnProperty(key)) {\n        if (Object.prototype.toString.call(result[key]) === '[object Object]') {\n          result[key] = assignment(result[key], item[key]);\n        } else {\n          result[key] = item[key];\n        }\n      }\n    }\n  }\n  return result;\n}\n\nmodule.exports = assignment;\n","'use strict';\n\nmodule.exports = function lowercase (string) {\n  return typeof string === 'string' ? string.toLowerCase() : string;\n};\n","'use strict';\n\nfunction toMap (list) {\n  return list.reduce(asKey, {});\n}\n\nfunction asKey (accumulator, item) {\n  accumulator[item] = true;\n  return accumulator;\n}\n\nmodule.exports = toMap;\n","'use strict';\n\nvar toMap = require('./toMap');\nvar uris = ['background', 'base', 'cite', 'href', 'longdesc', 'src', 'usemap'];\n\nmodule.exports = {\n  uris: toMap(uris) // attributes that have an href and hence need to be sanitized\n};\n","'use strict';\n\nvar toMap = require('./toMap');\nvar voids = ['area', 'br', 'col', 'hr', 'img', 'wbr', 'input', 'base', 'basefont', 'link', 'meta'];\n\nmodule.exports = {\n  voids: toMap(voids)\n};\n","'use strict';\n\nvar he = require('he');\nvar lowercase = require('./lowercase');\nvar attributes = require('./attributes');\nvar elements = require('./elements');\nvar rstart = /^<\\s*([\\w:-]+)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*>/;\nvar rend = /^<\\s*\\/\\s*([\\w:-]+)[^>]*>/;\nvar rattrs = /([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g;\nvar rtag = /^</;\nvar rtagend = /^<\\s*\\//;\n\nfunction createStack () {\n  var stack = [];\n  stack.lastItem = function lastItem () {\n    return stack[stack.length - 1];\n  };\n  return stack;\n}\n\nfunction parser (html, handler) {\n  var stack = createStack();\n  var last = html;\n  var chars;\n\n  while (html) {\n    parsePart();\n  }\n  parseEndTag(); // clean up any remaining tags\n\n  function parsePart () {\n    chars = true;\n    parseTag();\n\n    var same = html === last;\n    last = html;\n\n    if (same) { // discard, because it's invalid\n      html = '';\n    }\n  }\n\n  function parseTag () {\n    if (html.substr(0, 4) === '<!--') { // comments\n      parseComment();\n    } else if (rtagend.test(html)) {\n      parseEdge(rend, parseEndTag);\n    } else if (rtag.test(html)) {\n      parseEdge(rstart, parseStartTag);\n    }\n    parseTagDecode();\n  }\n\n  function parseEdge (regex, parser) {\n    var match = html.match(regex);\n    if (match) {\n      html = html.substring(match[0].length);\n      match[0].replace(regex, parser);\n      chars = false;\n    }\n  }\n\n  function parseComment () {\n    var index = html.indexOf('-->');\n    if (index >= 0) {\n      if (handler.comment) {\n        handler.comment(html.substring(4, index));\n      }\n      html = html.substring(index + 3);\n      chars = false;\n    }\n  }\n\n  function parseTagDecode () {\n    if (!chars) {\n      return;\n    }\n    var text;\n    var index = html.indexOf('<');\n    if (index >= 0) {\n      text = html.substring(0, index);\n      html = html.substring(index);\n    } else {\n      text = html;\n      html = '';\n    }\n    if (handler.chars) {\n      handler.chars(text);\n    }\n  }\n\n  function parseStartTag (tag, tagName, rest, unary) {\n    var attrs = {};\n    var low = lowercase(tagName);\n    var u = elements.voids[low] || !!unary;\n\n    rest.replace(rattrs, attrReplacer);\n\n    if (!u) {\n      stack.push(low);\n    }\n    if (handler.start) {\n      handler.start(low, attrs, u);\n    }\n\n    function attrReplacer (match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) {\n      if (doubleQuotedValue === void 0 && singleQuotedValue === void 0 && unquotedValue === void 0) {\n        attrs[name] = void 0; // attribute is like <button disabled></button>\n      } else {\n        attrs[name] = he.decode(doubleQuotedValue || singleQuotedValue || unquotedValue || '');\n      }\n    }\n  }\n\n  function parseEndTag (tag, tagName) {\n    var i;\n    var pos = 0;\n    var low = lowercase(tagName);\n    if (low) {\n      for (pos = stack.length - 1; pos >= 0; pos--) {\n        if (stack[pos] === low) {\n          break; // find the closest opened tag of the same type\n        }\n      }\n    }\n    if (pos >= 0) {\n      for (i = stack.length - 1; i >= pos; i--) {\n        if (handler.end) { // close all the open elements, up the stack\n          handler.end(stack[i]);\n        }\n      }\n      stack.length = pos;\n    }\n  }\n}\n\nmodule.exports = parser;\n","'use strict';\n\nvar he = require('he');\nvar lowercase = require('./lowercase');\nvar attributes = require('./attributes');\nvar elements = require('./elements');\n\nfunction sanitizer (buffer, options) {\n  var last;\n  var context;\n  var o = options || {};\n\n  reset();\n\n  return {\n    start: start,\n    end: end,\n    chars: chars\n  };\n\n  function out (value) {\n    buffer.push(value);\n  }\n\n  function start (tag, attrs, unary) {\n    var low = lowercase(tag);\n\n    if (context.ignoring) {\n      ignore(low); return;\n    }\n    if ((o.allowedTags || []).indexOf(low) === -1) {\n      ignore(low); return;\n    }\n    if (o.filter && !o.filter({ tag: low, attrs: attrs })) {\n      ignore(low); return;\n    }\n\n    out('<');\n    out(low);\n    Object.keys(attrs).forEach(parse);\n    out(unary ? '/>' : '>');\n\n    function parse (key) {\n      var value = attrs[key];\n      var classesOk = (o.allowedClasses || {})[low] || [];\n      var attrsOk = (o.allowedAttributes || {})[low] || [];\n      var valid;\n      var lkey = lowercase(key);\n      if (lkey === 'class' && attrsOk.indexOf(lkey) === -1) {\n        value = value.split(' ').filter(isValidClass).join(' ').trim();\n        valid = value.length;\n      } else {\n        valid = attrsOk.indexOf(lkey) !== -1 && (attributes.uris[lkey] !== true || testUrl(value));\n      }\n      if (valid) {\n        out(' ');\n        out(key);\n        if (typeof value === 'string') {\n          out('=\"');\n          out(he.encode(value));\n          out('\"');\n        }\n      }\n      function isValidClass (className) {\n        return classesOk && classesOk.indexOf(className) !== -1;\n      }\n    }\n  }\n\n  function end (tag) {\n    var low = lowercase(tag);\n    var allowed = (o.allowedTags || []).indexOf(low) !== -1;\n    if (allowed) {\n      if (context.ignoring === false) {\n        out('</');\n        out(low);\n        out('>');\n      } else {\n        unignore(low);\n      }\n    } else {\n      unignore(low);\n    }\n  }\n\n  function testUrl (text) {\n    var start = text[0];\n    if (start === '#' || start === '/') {\n      return true;\n    }\n    var colon = text.indexOf(':');\n    if (colon === -1) {\n      return true;\n    }\n    var questionmark = text.indexOf('?');\n    if (questionmark !== -1 && colon > questionmark) {\n      return true;\n    }\n    var hash = text.indexOf('#');\n    if (hash !== -1 && colon > hash) {\n      return true;\n    }\n    return o.allowedSchemes.some(matches);\n\n    function matches (scheme) {\n      return text.indexOf(scheme + ':') === 0;\n    }\n  }\n\n  function chars (text) {\n    if (context.ignoring === false) {\n      out(o.transformText ? o.transformText(text) : text);\n    }\n  }\n\n  function ignore (tag) {\n    if (elements.voids[tag]) {\n      return;\n    }\n    if (context.ignoring === false) {\n      context = { ignoring: tag, depth: 1 };\n    } else if (context.ignoring === tag) {\n      context.depth++;\n    }\n  }\n\n  function unignore (tag) {\n    if (context.ignoring === tag) {\n      if (--context.depth <= 0) {\n        reset();\n      }\n    }\n  }\n\n  function reset () {\n    context = { ignoring: false, depth: 0 };\n  }\n}\n\nmodule.exports = sanitizer;\n","'use strict';\n\nvar defaults = {\n  allowedAttributes: {\n    a: ['href', 'name', 'target', 'title', 'aria-label'],\n    iframe: ['allowfullscreen', 'frameborder', 'src'],\n    img: ['src', 'alt', 'title', 'aria-label']\n  },\n  allowedClasses: {},\n  allowedSchemes: ['http', 'https', 'mailto'],\n  allowedTags: [\n    'a', 'abbr', 'article', 'b', 'blockquote', 'br', 'caption', 'code', 'del', 'details', 'div', 'em',\n    'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'ins', 'kbd', 'li', 'main', 'mark',\n    'ol', 'p', 'pre', 'section', 'span', 'strike', 'strong', 'sub', 'summary', 'sup', 'table',\n    'tbody', 'td', 'th', 'thead', 'tr', 'u', 'ul'\n  ],\n  filter: null\n};\n\nmodule.exports = defaults;\n","'use strict';\n\nvar he = require('he');\nvar assign = require('assignment');\nvar parser = require('./parser');\nvar sanitizer = require('./sanitizer');\nvar defaults = require('./defaults');\n\nfunction insane (html, options, strict) {\n  var buffer = [];\n  var configuration = strict === true ? options : assign({}, defaults, options);\n  var handler = sanitizer(buffer, configuration);\n\n  parser(html, handler);\n\n  return buffer.join('');\n}\n\ninsane.defaults = defaults;\nmodule.exports = insane;\n","import insane from 'insane'\n\nconst insaneOptions = {\n  allowedClasses: {},\n  // @refer CVE-2018-8495\n  // @link https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-8495\n  // @link https://leucosite.com/Microsoft-Edge-RCE/\n  // @link https://medium.com/@knownsec404team/analysis-of-the-security-issues-of-url-scheme-in-pc-from-cve-2018-8495-934478a36756\n  allowedSchemes: [\n    'http',\n    'https',\n    'mailto',\n    'data', // for support base64 encoded image (安全性有待考虑)\n  ],\n  allowedTags: [\n    'a',\n    'abbr',\n    'article',\n    'b',\n    'blockquote',\n    'br',\n    'caption',\n    'code',\n    'del',\n    'details',\n    'div',\n    'em',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'hr',\n    'i',\n    'img',\n    'ins',\n    'kbd',\n    'li',\n    'main',\n    'mark',\n    'ol',\n    'p',\n    'pre',\n    'section',\n    'span',\n    'strike',\n    'strong',\n    'sub',\n    'summary',\n    'sup',\n    'table',\n    'tbody',\n    'td',\n    'th',\n    'thead',\n    'tr',\n    'u',\n    'ul',\n  ],\n  allowedAttributes: {\n    '*': ['title', 'accesskey'],\n    a: ['href', 'name', 'target', 'aria-label', 'rel'],\n    img: ['src', 'alt', 'title', 'atk-emoticon', 'aria-label', 'data-src', 'class', 'loading'],\n    // for code highlight\n    code: ['class'],\n    span: ['class', 'style'],\n  },\n  filter: (node) => {\n    // class whitelist\n    const allowed = [\n      ['code', /^hljs\\W+language-(.*)$/],\n      ['span', /^(hljs-.*)$/],\n      ['img', /^lazyload$/],\n    ]\n    allowed.forEach(([tag, reg]) => {\n      if (node.tag === tag && !!node.attrs.class && !(reg as RegExp).test(node.attrs.class)) {\n        delete node.attrs.class\n      }\n    })\n\n    // allow <span> set color sty\n    if (\n      node.tag === 'span' &&\n      !!node.attrs.style &&\n      !/^color:(\\W+)?#[0-9a-f]{3,6};?$/i.test(node.attrs.style)\n    ) {\n      delete node.attrs.style\n    }\n\n    return true\n  },\n}\n\nexport function sanitize(content: string): string {\n  // @link https://github.com/markedjs/marked/discussions/1232\n  // @link https://gist.github.com/lionel-rowe/bb384465ba4e4c81a9c8dada84167225\n  return insane(content, insaneOptions)\n}\n","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global.hanabi = factory());\n}(this, (function () { 'use strict';\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar index$1 = createCommonjsModule(function (module) {\n'use strict';\n\nvar comment = module.exports = function () {\n\treturn new RegExp('(?:' + comment.line().source + ')|(?:' + comment.block().source + ')', 'gm');\n};\n\ncomment.line = function () {\n\treturn /(?:^|\\s)\\/\\/(.+?)$/gm;\n};\n\ncomment.block = function () {\n\treturn /\\/\\*([\\S\\s]*?)\\*\\//gm;\n};\n});\n\nvar defaultColors = ['23AC69', '91C132', 'F19726', 'E8552D', '1AAB8E', 'E1147F', '2980C1', '1BA1E6', '9FA0A0', 'F19726', 'E30B20', 'E30B20', 'A3338B'];\n\nvar index = function (input, ref) {\n  if ( ref === void 0 ) ref = {};\n  var colors = ref.colors; if ( colors === void 0 ) colors = defaultColors;\n\n  var index = 0;\n  var cache = {};\n  var wordRe = /[\\u4E00-\\u9FFF\\u3400-\\u4dbf\\uf900-\\ufaff\\u3040-\\u309f\\uac00-\\ud7af\\u0400-\\u04FF]+|\\w+/;\n  var leftAngleRe = /</;\n\n  var re = new RegExp((\"(\" + (wordRe.source) + \"|\" + (leftAngleRe.source) + \")|(\" + (index$1().source) + \")\"), 'gmi');\n  return input\n  .replace(re, function (m, word, cm) {\n    if (cm) {\n      return toComment(cm)\n    }\n\n    if (word === '<') {\n      return '&lt;'\n    }\n    var color;\n    if (cache[word]) {\n      color = cache[word];\n    } else {\n      color = colors[index];\n      cache[word] = color;\n    }\n\n    var out = \"<span style=\\\"color: #\" + color + \"\\\">\" + word + \"</span>\";\n    index = ++index % colors.length;\n    return out\n  })\n};\n\nfunction toComment(cm) {\n  return (\"<span style=\\\"color: slategray\\\">\" + cm + \"</span>\")\n}\n\nreturn index;\n\n})));\n","import hanabi from 'hanabi'\n\nexport function renderCode(code: string) {\n  return hanabi(code)\n}\n","import { marked, Tokens } from 'marked'\nimport { renderCode } from './highlight'\nimport type { ArtalkConfig } from '@/types'\n\nexport interface RendererOptions {\n  imgLazyLoad: ArtalkConfig['imgLazyLoad']\n}\n\nexport function getRenderer(options: RendererOptions) {\n  const renderer = new marked.Renderer()\n  renderer.link = markedLinkRenderer(renderer, renderer.link)\n  renderer.code = markedCodeRenderer()\n  renderer.image = markedImageRenderer(renderer, renderer.image, options)\n  return renderer\n}\n\nconst markedLinkRenderer =\n  (renderer: any, orgLinkRenderer: (args: Tokens.Link) => string) => (args: Tokens.Link) => {\n    const getLinkOrigin = (link: string) => {\n      try {\n        return new URL(link).origin\n      } catch {\n        return ''\n      }\n    }\n    const isSameOriginLink = getLinkOrigin(args.href) === window.location.origin\n    const html = orgLinkRenderer.call(renderer, args)\n    return html.replace(\n      /^<a /,\n      `<a target=\"_blank\" ${!isSameOriginLink ? `rel=\"noreferrer noopener nofollow\"` : ''} `,\n    )\n  }\n\nconst markedCodeRenderer =\n  () =>\n  ({ lang, text }: Tokens.Code): string => {\n    // Colorize the block only if the language is known to highlight.js\n    const realLang = !lang ? 'plaintext' : lang\n    let colorized = text\n    if ((window as any).hljs) {\n      if (realLang && (window as any).hljs.getLanguage(realLang)) {\n        colorized = (window as any).hljs.highlight(realLang, text).value\n      }\n    } else {\n      colorized = renderCode(text)\n    }\n\n    return (\n      `<pre rel=\"${realLang}\">\\n` +\n      `<code class=\"hljs language-${realLang}\">${colorized.replace(/&amp;/g, '&')}</code>\\n` +\n      `</pre>`\n    )\n  }\n\nconst markedImageRenderer =\n  (\n    renderer: any,\n    orgImageRenderer: (args: Tokens.Image) => string,\n    { imgLazyLoad }: RendererOptions,\n  ) =>\n  (args: Tokens.Image): string => {\n    const html = orgImageRenderer.call(renderer, args)\n    if (!imgLazyLoad) return html\n    if (imgLazyLoad === 'native' || (imgLazyLoad as any) === true)\n      return html.replace(/^<img /, '<img class=\"lazyload\" loading=\"lazy\" ')\n    if (imgLazyLoad === 'data-src')\n      return html.replace(/^<img /, '<img class=\"lazyload\" ').replace('src=', 'data-src=')\n    return html\n  }\n","import { Marked } from 'marked'\nimport type { MarkedOptions } from 'marked'\n\nimport { sanitize } from './sanitizer'\nimport { renderCode } from './highlight'\nimport { getRenderer } from './marked-renderer'\nimport type { ArtalkConfig } from '@/types'\n\ntype Replacer = (raw: string) => string\n\nlet instance: Marked | undefined\nlet replacers: Replacer[] = []\n\nconst markedOptions: MarkedOptions = {\n  gfm: true,\n  breaks: true,\n  async: false,\n}\n\n/** Get Marked instance */\nexport function getInstance() {\n  return instance\n}\n\nexport function setReplacers(arr: Replacer[]) {\n  replacers = arr\n}\n\nexport interface MarkedInitOptions {\n  markedOptions: ArtalkConfig['markedOptions']\n  imgLazyLoad: ArtalkConfig['imgLazyLoad']\n}\n\n/** 初始化 marked */\nexport function initMarked(options: MarkedInitOptions) {\n  try {\n    if (!Marked.name) return\n  } catch {\n    return\n  }\n\n  // @see https://github.com/markedjs/marked/blob/4afb228d956a415624c4e5554bb8f25d047676fe/src/Tokenizer.js#L329\n  const marked = new Marked()\n  marked.setOptions({\n    renderer: getRenderer({\n      imgLazyLoad: options.imgLazyLoad,\n    }),\n    ...markedOptions,\n    ...options.markedOptions,\n  })\n\n  instance = marked\n}\n\n/** 解析 markdown */\nexport default function marked(src: string): string {\n  let markedContent = getInstance()?.parse(src) as string\n  if (!markedContent) {\n    // 无 Markdown 模式简单处理\n    markedContent = simpleMarked(src)\n  }\n\n  let dest = sanitize(markedContent)\n\n  // 内容替换器\n  replacers.forEach((replacer) => {\n    if (typeof replacer === 'function') dest = replacer(dest)\n  })\n\n  return dest\n}\n\nfunction simpleMarked(src: string) {\n  return (\n    src\n      // .replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>')\n      .replace(\n        /```\\s*([^]+?.*?[^]+?[^]+?)```/g,\n        (_, code) => `<pre><code>${renderCode(code)}</code></pre>`,\n      )\n      // .replace(/`([^`]+?)`/g, '<code>$1</code>')\n      .replace(/!\\[(.*?)\\]\\((.*?)\\)/g, (_, alt, imgSrc) => `<img src=\"${imgSrc}\" alt=\"${alt}\" />`)\n      .replace(\n        /\\[(.*?)\\]\\((.*?)\\)/g,\n        (_, text, link) => `<a href=\"${link}\" target=\"_blank\">${text}</a>`,\n      )\n      .replace(/\\n/g, '<br>')\n  )\n}\n","/**\n * Performs a deep merge of objects and returns new object.\n * Does not modify objects (immutable) and merges arrays via concatenation.\n *\n * @param objects - Objects to merge\n * @returns New object with merged key/values\n */\nexport function mergeDeep<T>(...objects: any[]): T {\n  const isObject = (obj: any) => obj && typeof obj === 'object' && obj.constructor === Object\n\n  return objects.reduce((prev, obj) => {\n    Object.keys(obj ?? {}).forEach((key) => {\n      // Avoid prototype pollution\n      if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n        return\n      }\n\n      const pVal = prev[key]\n      const oVal = obj[key]\n\n      if (Array.isArray(pVal) && Array.isArray(oVal)) {\n        prev[key] = pVal.concat(...oVal)\n      } else if (isObject(pVal) && isObject(oVal)) {\n        prev[key] = mergeDeep(pVal, oVal)\n      } else {\n        prev[key] = oVal\n      }\n    })\n\n    return prev\n  }, {})\n}\n","import EventManager from './lib/event-manager'\nimport type {\n  NotifyData,\n  PageData,\n  CommentData,\n  DataManagerApi,\n  ListFetchParams,\n  ListLastFetchData,\n  EventPayloadMap,\n} from '@/types'\n\nexport class DataManager implements DataManagerApi {\n  private loading: boolean = false\n  private listLastFetch?: ListLastFetchData\n  private comments: CommentData[] = [] // Note: 无层级结构 + 无须排列\n  private notifies: NotifyData[] = []\n  private page?: PageData\n\n  constructor(protected events: EventManager<EventPayloadMap>) {}\n\n  getLoading() {\n    return this.loading\n  }\n\n  setLoading(val: boolean) {\n    this.loading = val\n  }\n\n  getListLastFetch() {\n    return this.listLastFetch\n  }\n\n  setListLastFetch(val: ListLastFetchData) {\n    this.listLastFetch = val\n  }\n\n  // -------------------------------------------------------------------\n  //  Comments\n  // -------------------------------------------------------------------\n  getComments() {\n    return this.comments\n  }\n\n  fetchComments(params: Partial<ListFetchParams>) {\n    this.events.trigger('list-fetch', params)\n  }\n\n  findComment(id: number) {\n    return this.comments.find((c) => c.id === id)\n  }\n\n  clearComments() {\n    this.comments = []\n    this.events.trigger('list-loaded', this.comments)\n  }\n\n  loadComments(partialComments: CommentData[]) {\n    this.events.trigger('list-load', partialComments)\n\n    this.comments.push(...partialComments)\n\n    this.events.trigger('list-loaded', this.comments)\n  }\n\n  insertComment(comment: CommentData) {\n    this.comments.push(comment)\n\n    this.events.trigger('comment-inserted', comment)\n    this.events.trigger('list-loaded', this.comments) // list-loaded should always keep the last\n  }\n\n  updateComment(comment: CommentData) {\n    this.comments = this.comments.map((c) => {\n      if (c.id === comment.id) return comment\n      return c\n    })\n\n    this.events.trigger('comment-updated', comment)\n    this.events.trigger('list-loaded', this.comments)\n  }\n\n  deleteComment(id: number) {\n    const comment = this.comments.find((c) => c.id === id)\n    if (!comment) throw new Error(`Comment ${id} not found`)\n    this.comments = this.comments.filter((c) => c.id !== id)\n\n    this.events.trigger('comment-deleted', comment)\n    this.events.trigger('list-loaded', this.comments)\n  }\n\n  // -------------------------------------------------------------------\n  //  Notifies\n  // -------------------------------------------------------------------\n  getNotifies() {\n    return this.notifies\n  }\n\n  updateNotifies(notifies: NotifyData[]) {\n    this.notifies = notifies\n\n    this.events.trigger('notifies-updated', this.notifies)\n  }\n\n  // -------------------------------------------------------------------\n  // Page\n  // -------------------------------------------------------------------\n  getPage() {\n    return this.page\n  }\n\n  updatePage(pageData: PageData) {\n    this.page = pageData\n\n    this.events.trigger('page-loaded', pageData)\n  }\n}\n","export function createElement<E extends HTMLElement = HTMLElement>(htmlStr: string = ''): E {\n  const div = document.createElement('div')\n  div.innerHTML = htmlStr.trim()\n  return (div.firstElementChild || div) as E\n}\n\nexport function getHeight(el: HTMLElement): number {\n  const num = parseFloat(getComputedStyle(el, null).height.replace('px', ''))\n  return num || 0 // NaN -> 0\n}\n\nexport function htmlEncode(str: string) {\n  const temp = document.createElement('div')\n  temp.innerText = str\n  const output = temp.innerHTML\n  return output\n}\n\nexport function htmlDecode(str: string) {\n  const temp = document.createElement('div')\n  temp.innerHTML = str\n  const output = temp.innerText\n  return output\n}\n\nexport function getQueryParam(name: string) {\n  const match = RegExp(`[?&]${name}=([^&]*)`).exec(window.location.search)\n  return match && decodeURIComponent(match[1].replace(/\\+/g, ' '))\n}\n\nexport function getOffset(el: HTMLElement, relativeTo?: HTMLElement) {\n  const getOffsetRecursive = (element: HTMLElement): { top: number; left: number } => {\n    const rect = element.getBoundingClientRect()\n    const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft\n    const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n    return {\n      top: rect.top + scrollTop,\n      left: rect.left + scrollLeft,\n    }\n  }\n\n  const elOffset = getOffsetRecursive(el)\n  if (!relativeTo) return elOffset\n\n  const relativeToOffset = getOffsetRecursive(relativeTo)\n\n  return {\n    top: elOffset.top - relativeToOffset.top,\n    left: elOffset.left - relativeToOffset.left,\n  }\n}\n\nexport function padWithZeros(vNumber: number, width: number) {\n  let numAsString = vNumber.toString()\n  while (numAsString.length < width) {\n    numAsString = `0${numAsString}`\n  }\n  return numAsString\n}\n\nexport function dateFormat(date: Date) {\n  const vDay = padWithZeros(date.getDate(), 2)\n  const vMonth = padWithZeros(date.getMonth() + 1, 2)\n  const vYear = padWithZeros(date.getFullYear(), 2)\n  // var vHour = padWithZeros(date.getHours(), 2);\n  // var vMinute = padWithZeros(date.getMinutes(), 2);\n  // var vSecond = padWithZeros(date.getSeconds(), 2);\n  return `${vYear}-${vMonth}-${vDay}`\n}\n\nexport function timeAgo(date: Date, $t = (n: any) => n) {\n  try {\n    const oldTime = date.getTime()\n    const currTime = new Date().getTime()\n    const diffValue = currTime - oldTime\n\n    const days = Math.floor(diffValue / (24 * 3600 * 1000))\n    if (days === 0) {\n      // 计算相差小时数\n      const leave1 = diffValue % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数\n      const hours = Math.floor(leave1 / (3600 * 1000))\n      if (hours === 0) {\n        // 计算相差分钟数\n        const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数\n        const minutes = Math.floor(leave2 / (60 * 1000))\n        if (minutes === 0) {\n          // 计算相差秒数\n          const leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数\n          const seconds = Math.round(leave3 / 1000)\n          if (seconds < 10) return $t('now')\n          return `${seconds} ${$t('seconds')}`\n        }\n        return `${minutes} ${$t('minutes')}`\n      }\n      return `${hours} ${$t('hours')}`\n    }\n    if (days < 0) return $t('now')\n\n    if (days < 8) {\n      return `${days} ${$t('days')}`\n    }\n\n    return dateFormat(date)\n  } catch (error) {\n    console.error(error)\n    return ' - '\n  }\n}\n\nexport function getGravatarURL(opts: { params: string; mirror: string; emailHash: string }) {\n  return `${opts.mirror.replace(/\\/$/, '')}/${opts.emailHash}?${opts.params.replace(/^\\?/, '')}`\n}\n\nexport function sleep(ms: number) {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms)\n  })\n}\n\n/** 版本号比较（a < b :-1 | 0 | b < a :1） */\nexport function versionCompare(a: string, b: string) {\n  const pa = a.split('.')\n  const pb = b.split('.')\n  for (let i = 0; i < 3; i++) {\n    const na = Number(pa[i])\n    const nb = Number(pb[i])\n    if (na > nb) return 1\n    if (nb > na) return -1\n    if (!Number.isNaN(na) && Number.isNaN(nb)) return 1\n    if (Number.isNaN(na) && !Number.isNaN(nb)) return -1\n  }\n  return 0\n}\n\n/** 获取修正后的 UserAgent */\nexport async function getCorrectUserAgent() {\n  const uaRaw = navigator.userAgent\n  if (!(navigator as any).userAgentData || !(navigator as any).userAgentData.getHighEntropyValues) {\n    return uaRaw\n  }\n\n  // @link https://web.dev/migrate-to-ua-ch/\n  // @link https://web.dev/user-agent-client-hints/\n  const uaData = (navigator as any).userAgentData\n  let uaGot: any = null\n  try {\n    uaGot = await uaData.getHighEntropyValues(['platformVersion'])\n  } catch (err) {\n    console.error(err)\n    return uaRaw\n  }\n  const majorPlatformVersion = Number(uaGot.platformVersion.split('.')[0])\n\n  if (uaData.platform === 'Windows') {\n    if (majorPlatformVersion >= 13) {\n      // @link https://docs.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11\n      // @date 2022-4-29\n      // Win 11 样本：\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36\"\n      return uaRaw.replace(/Windows NT 10.0/, 'Windows NT 11.0')\n    }\n  }\n  if (uaData.platform === 'macOS') {\n    if (majorPlatformVersion >= 11) {\n      // 11 => BigSur\n      // @date 2022-4-29\n      // (Intel Chip) macOS 12.3 样本：\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"\n      // (Arm Chip) macOS 样本：\"Mozilla/5.0 (Macintosh; ARM Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15\"\n      return uaRaw.replace(\n        /(Mac OS X \\d+_\\d+_\\d+|Mac OS X)/,\n        `Mac OS X ${uaGot.platformVersion.replace(/\\./g, '_')}`,\n      )\n    }\n  }\n\n  return uaRaw\n}\n\n/** 是否为完整的 URL */\nexport function isValidURL(urlRaw: string) {\n  // @link https://www.rfc-editor.org/rfc/rfc3986\n  let url: URL\n  try {\n    url = new URL(urlRaw)\n  } catch (_) {\n    return false\n  }\n  return url.protocol === 'http:' || url.protocol === 'https:'\n}\n\n/** 获取基于 conf.server 的 URL */\nexport function getURLBasedOnApi(opts: { base: string; path: string }) {\n  return getURLBasedOn(opts.base, opts.path)\n}\n\n/** 获取基于某个 baseURL 的 URL */\nexport function getURLBasedOn(baseURL: string, path: string) {\n  return `${baseURL.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`\n}\n","const en = {\n  /* Editor */\n  placeholder: 'Leave a comment',\n  noComment: 'No Comment',\n  send: 'Send',\n  signIn: 'Sign in',\n  signUp: 'Sign up',\n  save: 'Save',\n  nick: 'Nickname',\n  email: 'Email',\n  link: 'Website',\n  emoticon: 'Emoji',\n  preview: 'Preview',\n  uploadImage: 'Upload Image',\n  uploadFail: 'Upload Failed',\n  commentFail: 'Failed to comment',\n  restoredMsg: 'Content has been restored',\n  onlyAdminCanReply: 'Only admin can reply',\n  uploadLoginMsg: 'Please fill in your name and email to upload',\n\n  /* List */\n  counter: '{count} Comments',\n  sortLatest: 'Latest',\n  sortOldest: 'Oldest',\n  sortBest: 'Best',\n  sortAuthor: 'Author',\n  openComment: 'Open Comment',\n  closeComment: 'Close Comment',\n  listLoadFailMsg: 'Failed to load comments',\n  listRetry: 'Retry',\n  loadMore: 'Load More',\n\n  /* Comment */\n  admin: 'Admin',\n  reply: 'Reply',\n  voteUp: 'Up',\n  voteDown: 'Down',\n  voteFail: 'Vote Failed',\n  readMore: 'Read More',\n  actionConfirm: 'Confirm',\n  collapse: 'Collapse',\n  collapsed: 'Collapsed',\n  collapsedMsg: 'This comment has been collapsed',\n  expand: 'Expand',\n  approved: 'Approved',\n  pending: 'Pending',\n  pendingMsg: 'Pending, visible only to commenter.',\n  edit: 'Edit',\n  editCancel: 'Cancel Edit',\n  delete: 'Delete',\n  deleteConfirm: 'Confirm',\n  pin: 'Pin',\n  unpin: 'Unpin',\n\n  /* Time */\n  seconds: 'seconds ago',\n  minutes: 'minutes ago',\n  hours: 'hours ago',\n  days: 'days ago',\n  now: 'just now',\n\n  /* Checker */\n  adminCheck: 'Enter admin password:',\n  captchaCheck: 'Enter the CAPTCHA to continue:',\n  confirm: 'Confirm',\n  cancel: 'Cancel',\n\n  /* Sidebar */\n  msgCenter: 'Messages',\n  ctrlCenter: 'Dashboard',\n\n  /* Auth */\n  userProfile: 'Profile',\n  noAccountPrompt: \"Don't have an account?\",\n  haveAccountPrompt: 'Already have an account?',\n  forgetPassword: 'Forget Password',\n  resetPassword: 'Reset Password',\n  changePassword: 'Change Password',\n  confirmPassword: 'Confirm Password',\n  passwordMismatch: 'Passwords do not match',\n  verificationCode: 'Verification Code',\n  verifySend: 'Send Code',\n  verifyResend: 'Resend',\n  waitSeconds: 'Wait {seconds}s',\n  emailVerified: 'Email has been verified',\n  password: 'Password',\n  username: 'Username',\n  nextStep: 'Next Step',\n  skipVerify: 'Skip verification',\n  logoutConfirm: 'Are you sure to logout?',\n  accountMergeNotice: 'Your email has multiple accounts with different id.',\n  accountMergeSelectOne: 'Please select one you want to merge all the data into it.',\n  accountMergeConfirm: 'All data will be merged into one account, the id is {id}.',\n  dismiss: 'Dismiss',\n  merge: 'Merge',\n\n  /* General */\n  frontend: 'Frontend',\n  backend: 'Backend',\n  loading: 'Loading',\n  loadFail: 'Load Failed',\n  editing: 'Editing',\n  editFail: 'Edit Failed',\n  deleting: 'Deleting',\n  deleteFail: 'Delete Failed',\n  reqGot: 'Request got',\n  reqAborted: 'Request timed out or terminated unexpectedly',\n  updateMsg: 'Please update Artalk {name} to get the best experience!',\n  currentVersion: 'Current Version',\n  ignore: 'Ignore',\n  open: 'Open',\n  openName: 'Open {name}',\n}\n\nexport type I18n = typeof en\nexport type I18nKeys = keyof I18n\n\nexport default en\n","import type { I18n } from '.'\n\nconst zhCN: I18n = {\n  /* Editor */\n  placeholder: '键入内容...',\n  noComment: '「此时无声胜有声」',\n  send: '发送',\n  signIn: '登录',\n  signUp: '注册',\n  save: '保存',\n  nick: '昵称',\n  email: '邮箱',\n  link: '网址',\n  emoticon: '表情',\n  preview: '预览',\n  uploadImage: '上传图片',\n  uploadFail: '上传失败',\n  commentFail: '评论失败',\n  restoredMsg: '内容已自动恢复',\n  onlyAdminCanReply: '仅管理员可评论',\n  uploadLoginMsg: '填入你的名字邮箱才能上传哦',\n\n  /* List */\n  counter: '{count} 条评论',\n  sortLatest: '最新',\n  sortOldest: '最早',\n  sortBest: '最热',\n  sortAuthor: '作者',\n  openComment: '打开评论',\n  closeComment: '关闭评论',\n  listLoadFailMsg: '无法获取评论列表数据',\n  listRetry: '点击重新获取',\n  loadMore: '加载更多',\n\n  /* Comment */\n  admin: '管理员',\n  reply: '回复',\n  voteUp: '赞同',\n  voteDown: '反对',\n  voteFail: '投票失败',\n  readMore: '阅读更多',\n  actionConfirm: '确认操作',\n  collapse: '折叠',\n  collapsed: '已折叠',\n  collapsedMsg: '该评论已被系统或管理员折叠',\n  expand: '展开',\n  approved: '已审',\n  pending: '待审',\n  pendingMsg: '审核中，仅本人可见。',\n  edit: '编辑',\n  editCancel: '取消编辑',\n  delete: '删除',\n  deleteConfirm: '确认删除',\n  pin: '置顶',\n  unpin: '取消置顶',\n\n  /* Time */\n  seconds: '秒前',\n  minutes: '分钟前',\n  hours: '小时前',\n  days: '天前',\n  now: '刚刚',\n\n  /* Checker */\n  adminCheck: '键入密码来验证管理员身份：',\n  captchaCheck: '键入验证码继续：',\n  confirm: '确认',\n  cancel: '取消',\n\n  /* Sidebar */\n  msgCenter: '通知中心',\n  ctrlCenter: '控制中心',\n\n  /* Auth */\n  userProfile: '个人资料',\n  noAccountPrompt: '没有账号？',\n  haveAccountPrompt: '已有账号？',\n  forgetPassword: '忘记密码',\n  resetPassword: '重置密码',\n  changePassword: '修改密码',\n  confirmPassword: '确认密码',\n  passwordMismatch: '两次输入的密码不一致',\n  verificationCode: '验证码',\n  verifySend: '发送验证码',\n  verifyResend: '重新发送',\n  waitSeconds: '等待 {seconds}秒',\n  emailVerified: '邮箱已验证',\n  password: '密码',\n  username: '用户名',\n  nextStep: '下一步',\n  skipVerify: '跳过验证',\n  logoutConfirm: '确定要退出登录吗？',\n  accountMergeNotice: '您的电子邮件下有多个不同 ID 的账户。',\n  accountMergeSelectOne: '请选择将所有数据合并到其中的一个。',\n  accountMergeConfirm: '所有数据将合并到 ID 为 {id} 的账户中。',\n  dismiss: '忽略',\n  merge: '合并',\n\n  /* General */\n  frontend: '前端',\n  backend: '后端',\n  loading: '加载中',\n  loadFail: '加载失败',\n  editing: '修改中',\n  editFail: '修改失败',\n  deleting: '删除中',\n  deleteFail: '删除失败',\n  reqGot: '请求响应',\n  reqAborted: '请求超时或意外终止',\n  updateMsg: '请更新 Artalk {name} 以获得更好的体验！',\n  currentVersion: '当前版本',\n  ignore: '忽略',\n  open: '打开',\n  openName: '打开{name}',\n}\n\nexport default zhCN\n","import type { I18n } from '.'\n\nexport const GLOBAL_LOCALES_KEY = 'ArtalkI18n'\n\nexport function defineLocaleExternal(lang: string, locale: I18n, aliases?: string[]) {\n  if (!window[GLOBAL_LOCALES_KEY]) window[GLOBAL_LOCALES_KEY] = {}\n  window[GLOBAL_LOCALES_KEY][lang] = locale\n  if (aliases)\n    aliases.forEach((l) => {\n      window[GLOBAL_LOCALES_KEY][l] = locale\n    })\n  return locale\n}\n","import * as Utils from '../lib/utils'\nimport en, { I18n, I18nKeys } from './en'\nimport zhCN from './zh-CN'\nimport { GLOBAL_LOCALES_KEY } from './external'\n\nexport type * from './en'\n\n// @note the key of language is followed by `ISO 639`\n// https://en.wikipedia.org/wiki/ISO_639\n// https://datatracker.ietf.org/doc/html/rfc5646#section-2.1\nexport const internal = {\n  en,\n  'en-US': en,\n  'zh-CN': zhCN,\n}\n\n/**\n * find a locale object by language name\n */\nexport function findLocaleSet(lang: string): I18n {\n  // normalize a key of language to `ISO 639`\n  lang = lang.replace(\n    /^([a-zA-Z]+)(-[a-zA-Z]+)?$/,\n    (_, p1: string, p2: string) => p1.toLowerCase() + (p2 || '').toUpperCase(),\n  )\n\n  // internal finding\n  if (internal[lang]) {\n    return internal[lang]\n  }\n\n  // external finding\n  if (window[GLOBAL_LOCALES_KEY] && window[GLOBAL_LOCALES_KEY][lang]) {\n    return window[GLOBAL_LOCALES_KEY][lang]\n  }\n\n  // case when not found:\n  // use `en` by default\n  return internal.en\n}\n\n/**\n * System locale setting\n */\nlet LocaleConf: I18n | string = 'en'\nlet LocaleDict: I18n = findLocaleSet(LocaleConf) // en by default\n\n/**\n * Set system locale\n */\nexport function setLocale(locale: I18n | string) {\n  if (locale === LocaleConf) return\n  LocaleConf = locale\n  LocaleDict = typeof locale === 'string' ? findLocaleSet(locale) : locale\n}\n\n/**\n * Get an i18n message by key\n */\nexport function t(key: I18nKeys, args: { [key: string]: string } = {}) {\n  let str = LocaleDict?.[key] || key\n  str = str.replace(/\\{\\s*(\\w+?)\\s*\\}/g, (_, token) => args[token] || '')\n\n  return Utils.htmlEncode(str)\n}\n\nexport default t\n","export type EventHandler<T> = (payload: T) => void\nexport interface Event<PayloadMap, K extends keyof PayloadMap = keyof PayloadMap>\n  extends EventOptions {\n  name: K\n  handler: EventHandler<PayloadMap[K]>\n}\nexport interface EventOptions {\n  once?: boolean\n}\n\nexport interface EventManagerFuncs<PayloadMap> {\n  on<K extends keyof PayloadMap>(\n    name: K,\n    handler: EventHandler<PayloadMap[K]>,\n    opts?: EventOptions,\n  ): void\n  off<K extends keyof PayloadMap>(name: K, handler: EventHandler<PayloadMap[K]>): void\n  trigger<K extends keyof PayloadMap>(name: K, payload?: PayloadMap[K]): void\n}\n\nexport default class EventManager<PayloadMap> implements EventManagerFuncs<PayloadMap> {\n  private events: Event<PayloadMap>[] = []\n\n  /**\n   * Add an event listener for a specific event name\n   */\n  public on<K extends keyof PayloadMap>(\n    name: K,\n    handler: EventHandler<PayloadMap[K]>,\n    opts: EventOptions = {},\n  ) {\n    this.events.push({\n      name,\n      handler: handler as EventHandler<PayloadMap[keyof PayloadMap]>,\n      ...opts,\n    })\n  }\n\n  /**\n   * Remove an event listener for a specific event name and handler\n   */\n  public off<K extends keyof PayloadMap>(name: K, handler: EventHandler<PayloadMap[K]>) {\n    if (!handler) return // not allow remove all events with same name\n    this.events = this.events.filter((evt) => !(evt.name === name && evt.handler === handler))\n  }\n\n  /**\n   * Trigger an event with an optional payload\n   */\n  public trigger<K extends keyof PayloadMap>(name: K, payload?: PayloadMap[K]) {\n    this.events\n      .slice(0) // make a copy, in case listeners are removed while iterating\n      .filter((evt) => evt.name === name && typeof evt.handler === 'function')\n      .forEach((evt) => {\n        if (evt.once) this.off(name, evt.handler)\n        evt.handler(payload!)\n      })\n  }\n}\n","import type { ArtalkConfig } from '@/types'\n\nconst defaults: ArtalkConfig = {\n  el: '',\n  pageKey: '',\n  pageTitle: '',\n  server: '',\n  site: '',\n\n  placeholder: '',\n  noComment: '',\n  sendBtn: '',\n  darkMode: false,\n  editorTravel: true,\n\n  flatMode: 'auto',\n  nestMax: 2,\n  nestSort: 'DATE_ASC',\n\n  emoticons: 'https://cdn.jsdelivr.net/gh/ArtalkJS/Emoticons/grps/default.json',\n\n  vote: true,\n  voteDown: false,\n  uaBadge: true,\n  listSort: true,\n  preview: true,\n  countEl: '.artalk-comment-count',\n  pvEl: '.artalk-pv-count',\n  statPageKeyAttr: 'data-page-key',\n\n  gravatar: {\n    mirror: 'https://www.gravatar.com/avatar/',\n    params: 'sha256=1&d=mp&s=240',\n  },\n\n  pagination: {\n    pageSize: 20,\n    readMore: true,\n    autoLoad: true,\n  },\n\n  heightLimit: {\n    content: 300,\n    children: 400,\n    scrollable: false,\n  },\n\n  imgUpload: true,\n  reqTimeout: 15000,\n  versionCheck: true,\n  useBackendConf: true,\n\n  locale: 'en',\n}\n\nif (ARTALK_LITE) {\n  defaults.vote = false\n  defaults.uaBadge = false\n  defaults.emoticons = false\n  defaults.preview = false\n}\n\nexport default defaults\n","import type { ApiOptions } from './api/options'\nimport { mergeDeep } from './lib/merge-deep'\nimport { createApiHandlers } from './api'\nimport Defaults from './defaults'\nimport type { ArtalkConfig, ContextApi } from '@/types'\n\n/**\n * Handle the custom config which is provided by the user\n *\n * @param customConf - The custom config object which is provided by the user\n * @param full - If `full` is `true`, the return value will be the complete config for Artalk instance creation\n * @returns The config for Artalk instance creation\n */\nexport function handelCustomConf(customConf: Partial<ArtalkConfig>, full: true): ArtalkConfig\nexport function handelCustomConf(\n  customConf: Partial<ArtalkConfig>,\n  full?: false,\n): Partial<ArtalkConfig>\nexport function handelCustomConf(customConf: Partial<ArtalkConfig>, full = false) {\n  // 合并默认配置\n  const conf: Partial<ArtalkConfig> = full ? mergeDeep(Defaults, customConf) : customConf\n\n  // 绑定元素\n  if (conf.el && typeof conf.el === 'string') {\n    try {\n      const findEl = document.querySelector<HTMLElement>(conf.el)\n      if (!findEl) throw Error(`Target element \"${conf.el}\" was not found.`)\n      conf.el = findEl\n    } catch (e) {\n      console.error(e)\n      throw new Error('Please check your Artalk `el` config.')\n    }\n  }\n\n  // 默认 pageKey\n  if (conf.pageKey === '') conf.pageKey = `${window.location.pathname}` // @link http://bl.ocks.org/abernier/3070589\n\n  // 默认 pageTitle\n  if (conf.pageTitle === '') conf.pageTitle = `${document.title}`\n\n  // 服务器配置\n  if (conf.server) conf.server = conf.server.replace(/\\/$/, '').replace(/\\/api\\/?$/, '')\n\n  // 自适应语言\n  if (conf.locale === 'auto') conf.locale = navigator.language\n\n  // 自动判断启用平铺模式\n  if (conf.flatMode === 'auto') conf.flatMode = window.matchMedia('(max-width: 768px)').matches\n\n  // flatMode\n  if (typeof conf.nestMax === 'number' && Number(conf.nestMax) <= 1) conf.flatMode = true\n\n  return conf\n}\n\n/**\n * Handle the config which is provided by the server\n *\n * @param conf - The Server response config for control the frontend of Artalk remotely\n * @returns The config for Artalk instance creation\n */\nexport function handleConfFormServer(conf: Partial<ArtalkConfig>) {\n  const ExcludedKeys: (keyof ArtalkConfig)[] = [\n    'el',\n    'pageKey',\n    'pageTitle',\n    'server',\n    'site',\n    'pvEl',\n    'countEl',\n    'statPageKeyAttr',\n  ]\n  Object.keys(conf).forEach((k) => {\n    if (ExcludedKeys.includes(k as any)) delete conf[k]\n    if (k === 'darkMode' && conf[k] !== 'auto') delete conf[k]\n  })\n\n  // Patch: `emoticons` config string to json\n  if (conf.emoticons && typeof conf.emoticons === 'string') {\n    conf.emoticons = conf.emoticons.trim()\n    if (conf.emoticons.startsWith('[') || conf.emoticons.startsWith('{')) {\n      conf.emoticons = JSON.parse(conf.emoticons) // parse json\n    } else if (conf.emoticons === 'false') {\n      conf.emoticons = false\n    }\n  }\n\n  return conf\n}\n\n/**\n * Convert Artalk Config to ApiOptions for Api client\n *\n * @param conf - Artalk config\n * @param ctx - If `ctx` not provided, `checkAdmin` and `checkCaptcha` will be disabled\n * @returns ApiOptions for Api client instance creation\n */\nexport function convertApiOptions(conf: Partial<ArtalkConfig>, ctx?: ContextApi): ApiOptions {\n  return {\n    baseURL: `${conf.server}/api/v2`,\n    siteName: conf.site || '',\n    pageKey: conf.pageKey || '',\n    pageTitle: conf.pageTitle || '',\n    timeout: conf.reqTimeout,\n    getApiToken: () => ctx?.get('user').getData().token,\n    userInfo: ctx?.get('user').checkHasBasicUserInfo()\n      ? {\n          name: ctx?.get('user').getData().name,\n          email: ctx?.get('user').getData().email,\n        }\n      : undefined,\n    handlers: ctx?.getApiHandlers(),\n  }\n}\n\nexport function createNewApiHandlers(ctx: ContextApi) {\n  const h = createApiHandlers()\n  h.add('need_captcha', (res) => ctx.checkCaptcha(res))\n  h.add('need_login', () => ctx.checkAdmin({}))\n\n  return h\n}\n","import type { ArtalkConfig, ContextApi } from '@/types'\n\nexport function watchConf<T extends (keyof ArtalkConfig)[]>(\n  ctx: ContextApi,\n  keys: T,\n  effect: (conf: Pick<ArtalkConfig, T[number]>) => void,\n): void {\n  const deepEqual = (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b)\n  const val = () => {\n    const conf = ctx.getConf()\n    const res: any = {}\n    keys.forEach((key) => {\n      res[key] = conf[key]\n    })\n    return res\n  }\n  let lastVal: any = null\n  const handler = () => {\n    const newVal = val()\n    const isDiff = lastVal == null || !deepEqual(lastVal, newVal)\n    // only trigger when specific keys changed\n    if (isDiff) {\n      lastVal = newVal\n      effect(newVal)\n    }\n  }\n  ctx.on('mounted', handler)\n  ctx.on('updated', handler)\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport type { TInjectedServices } from './service'\nimport { Api, ApiHandlers } from './api'\n\nimport * as marked from './lib/marked'\nimport { mergeDeep } from './lib/merge-deep'\nimport { CheckerCaptchaPayload, CheckerPayload } from './components/checker'\n\nimport { DataManager } from './data'\nimport * as I18n from './i18n'\n\nimport EventManager from './lib/event-manager'\nimport { convertApiOptions, createNewApiHandlers, handelCustomConf } from './config'\nimport { watchConf } from './lib/watch-conf'\n\nimport type {\n  ArtalkConfig,\n  CommentData,\n  ListFetchParams,\n  ContextApi,\n  EventPayloadMap,\n  SidebarShowPayload,\n} from '@/types'\n\n// Auto dependency injection\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface Context extends TInjectedServices {}\n\n/**\n * Artalk Context\n */\nclass Context implements ContextApi {\n  /* 运行参数 */\n  conf: ArtalkConfig\n  data: DataManager\n  $root: HTMLElement\n\n  /* Event Manager */\n  private events = new EventManager<EventPayloadMap>()\n  private mounted = false\n\n  constructor(conf: ArtalkConfig) {\n    this.conf = conf\n\n    this.$root = conf.el as HTMLElement\n    this.$root.classList.add('artalk')\n    this.$root.innerHTML = ''\n    conf.darkMode && this.$root.classList.add('atk-dark-mode')\n\n    this.data = new DataManager(this.events)\n\n    this.on('mounted', () => {\n      this.mounted = true\n    })\n  }\n\n  inject(depName: string, obj: any) {\n    this[depName] = obj\n  }\n\n  get(depName: string) {\n    return this[depName]\n  }\n\n  getApi() {\n    return new Api(convertApiOptions(this.conf, this))\n  }\n\n  private apiHandlers = <ApiHandlers | null>null\n  getApiHandlers() {\n    if (!this.apiHandlers) this.apiHandlers = createNewApiHandlers(this)\n    return this.apiHandlers\n  }\n\n  getData() {\n    return this.data\n  }\n\n  replyComment(commentData: CommentData, $comment: HTMLElement): void {\n    this.editor.setReply(commentData, $comment)\n  }\n\n  editComment(commentData: CommentData, $comment: HTMLElement): void {\n    this.editor.setEditComment(commentData, $comment)\n  }\n\n  fetch(params: Partial<ListFetchParams>): void {\n    this.data.fetchComments(params)\n  }\n\n  reload(): void {\n    this.data.fetchComments({ offset: 0 })\n  }\n\n  /* List */\n  listGotoFirst(): void {\n    this.events.trigger('list-goto-first')\n  }\n\n  getCommentNodes() {\n    return this.list.getCommentNodes()\n  }\n\n  getComments() {\n    return this.data.getComments()\n  }\n\n  getCommentList = this.getCommentNodes\n  getCommentDataList = this.getComments\n\n  /* Editor */\n  editorShowLoading(): void {\n    this.editor.showLoading()\n  }\n\n  editorHideLoading(): void {\n    this.editor.hideLoading()\n  }\n\n  editorShowNotify(msg, type): void {\n    this.editor.showNotify(msg, type)\n  }\n\n  editorResetState(): void {\n    this.editor.resetState()\n  }\n\n  /* Sidebar */\n  showSidebar(payload?: SidebarShowPayload): void {\n    this.sidebarLayer.show(payload)\n  }\n\n  hideSidebar(): void {\n    this.sidebarLayer.hide()\n  }\n\n  /* Checker */\n  checkAdmin(payload: CheckerPayload): Promise<void> {\n    return this.checkerLauncher.checkAdmin(payload)\n  }\n\n  checkCaptcha(payload: CheckerCaptchaPayload): Promise<void> {\n    return this.checkerLauncher.checkCaptcha(payload)\n  }\n\n  /* Events */\n  on(name: any, handler: any) {\n    this.events.on(name, handler)\n  }\n\n  off(name: any, handler: any) {\n    this.events.off(name, handler)\n  }\n\n  trigger(name: any, payload?: any) {\n    this.events.trigger(name, payload)\n  }\n\n  /* i18n */\n  $t(key: I18n.I18nKeys, args: { [key: string]: string } = {}): string {\n    return I18n.t(key, args)\n  }\n\n  setDarkMode(darkMode: boolean | 'auto'): void {\n    this.updateConf({ darkMode })\n  }\n\n  updateConf(nConf: Partial<ArtalkConfig>): void {\n    this.conf = mergeDeep(this.conf, handelCustomConf(nConf, false))\n    this.mounted && this.events.trigger('updated', this.conf)\n  }\n\n  getConf(): ArtalkConfig {\n    return this.conf\n  }\n\n  getEl(): HTMLElement {\n    return this.$root\n  }\n\n  getMarked() {\n    return marked.getInstance()\n  }\n\n  watchConf<T extends (keyof ArtalkConfig)[]>(\n    keys: T,\n    effect: (conf: Pick<ArtalkConfig, T[number]>) => void,\n  ): void {\n    watchConf(this, keys, effect)\n  }\n}\n\nexport default Context\n","import * as Utils from './utils'\nimport type { NotifyLevel } from '@/types'\n\n/** 显示加载 */\nexport function showLoading(parentElem: HTMLElement, conf?: { transparentBg?: boolean }) {\n  // Use :scope https://developer.mozilla.org/en-US/docs/Web/CSS/:scope\n  let $loading = parentElem.querySelector<HTMLElement>(':scope > .atk-loading')\n  if (!$loading) {\n    $loading = Utils.createElement(\n      `<div class=\"atk-loading\" style=\"display: none;\">\n      <div class=\"atk-loading-spinner\">\n        <svg viewBox=\"25 25 50 50\"><circle cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"2\" stroke-miterlimit=\"10\"></circle></svg>\n      </div>\n    </div>`,\n    )\n    if (conf?.transparentBg) $loading.style.background = 'transparent'\n    parentElem.appendChild($loading)\n  }\n  $loading.style.display = ''\n\n  // spinner 延迟显示，若加载等待时间太短，没必要显示（闪一下即可）\n  const $spinner = $loading.querySelector<HTMLElement>('.atk-loading-spinner')\n  if ($spinner) {\n    $spinner.style.display = 'none'\n    window.setTimeout(() => {\n      if ($spinner.isConnected) $spinner.style.display = ''\n    }, 500)\n  }\n}\n\n/** 隐藏加载 */\nexport function hideLoading(parentElem: HTMLElement) {\n  const $loading = parentElem.querySelector<HTMLElement>(':scope > .atk-loading')\n  if ($loading) $loading.style.display = 'none'\n}\n\n/** 元素加载动画 */\nexport function setLoading(val: boolean, parentElem: HTMLElement) {\n  if (val) showLoading(parentElem)\n  else hideLoading(parentElem)\n}\n\n/** 元素是否用户可见 */\nexport function isVisible(el: HTMLElement, viewport: HTMLElement = document.documentElement) {\n  const viewportHeight = viewport.clientHeight\n\n  const docViewTop = viewport.scrollTop\n  const docViewBottom = docViewTop + viewportHeight\n\n  const rect = el.getBoundingClientRect()\n  const elemTop = rect.top + docViewTop\n  const elemBottom = elemTop + rect.height\n\n  return elemBottom <= docViewBottom //&& (elemTop >= docViewTop) 注释因为假如 el 比 viewport 还高就会失效\n}\n\n/** 滚动到元素中心 */\nexport function scrollIntoView(\n  elem: HTMLElement,\n  enableAnim: boolean = true,\n  relativeTo?: HTMLElement,\n) {\n  let top: number\n\n  if (relativeTo) {\n    const containerRect = relativeTo.getBoundingClientRect()\n    const elementRect = elem.getBoundingClientRect()\n    top =\n      elementRect.top -\n      containerRect.top +\n      relativeTo.scrollTop -\n      relativeTo.clientHeight / 2 +\n      elem.clientHeight / 2\n  } else {\n    const rect = elem.getBoundingClientRect()\n    const elemTop = rect.top + window.scrollY\n    top = elemTop - (window.innerHeight / 2 - rect.height / 2)\n  }\n\n  const scrollOptions: ScrollToOptions = {\n    top,\n    left: 0,\n    // behavior: enableAnim ? 'smooth' : 'instant',\n    behavior: 'instant',\n  }\n\n  if (relativeTo) relativeTo.scroll(scrollOptions)\n  else window.scroll(scrollOptions)\n}\n\n/** 显示消息 */\nexport function showNotify(wrapElem: HTMLElement, msg: string, type: NotifyLevel) {\n  const colors = { s: '#57d59f', e: '#ff6f6c', w: '#ffc721', i: '#2ebcfc' }\n  const timeout = 3000 // 持续显示时间 ms\n\n  const notifyElem = Utils.createElement(\n    `<div class=\"atk-notify atk-fade-in\" style=\"background-color: ${colors[type]}\"><span class=\"atk-notify-content\"></span></div>`,\n  )\n  const notifyContentEl = notifyElem.querySelector<HTMLElement>('.atk-notify-content')!\n  notifyContentEl.innerHTML = Utils.htmlEncode(msg).replace('\\n', '<br/>')\n\n  wrapElem.appendChild(notifyElem)\n\n  const notifyRemove = () => {\n    notifyElem.classList.add('atk-fade-out')\n    setTimeout(() => {\n      notifyElem.remove()\n    }, 200)\n  }\n\n  let timeoutFn: number\n  if (timeout > 0) {\n    timeoutFn = window.setTimeout(() => {\n      notifyRemove()\n    }, timeout)\n  }\n\n  notifyElem.addEventListener('click', () => {\n    notifyRemove()\n    window.clearTimeout(timeoutFn)\n  })\n}\n\n/** fade 动画 */\nexport function playFadeAnim(elem: HTMLElement, after?: () => void, type: 'in' | 'out' = 'in') {\n  elem.classList.add(`atk-fade-${type}`)\n  // 动画结束清除 class\n  const onAnimEnded = () => {\n    elem.classList.remove(`atk-fade-${type}`)\n    elem.removeEventListener('animationend', onAnimEnded)\n    if (after) after()\n  }\n  elem.addEventListener('animationend', onAnimEnded)\n}\n\n/** 渐入动画 */\nexport function playFadeInAnim(elem: HTMLElement, after?: () => void) {\n  playFadeAnim(elem, after, 'in')\n}\n\n/** 渐出动画 */\nexport function playFadeOutAnim(elem: HTMLElement, after?: () => void) {\n  playFadeAnim(elem, after, 'out')\n}\n\n/** 设置全局错误 */\nexport function setError(\n  parentElem: HTMLElement,\n  html: string | HTMLElement | null,\n  title: string = '<span class=\"atk-error-title\">Artalk Error</span>',\n) {\n  let elem = parentElem.querySelector<HTMLElement>('.atk-error-layer')\n  if (html === null) {\n    if (elem !== null) elem.remove()\n    return\n  }\n  if (!elem) {\n    elem = Utils.createElement(\n      `<div class=\"atk-error-layer\">${title}<span class=\"atk-error-text\"></span></div>`,\n    )\n    parentElem.appendChild(elem)\n  }\n\n  const errorTextEl = elem.querySelector<HTMLElement>('.atk-error-text')!\n  errorTextEl.innerHTML = ''\n  if (html === null) return\n\n  if (html instanceof HTMLElement) {\n    errorTextEl.appendChild(html)\n  } else {\n    errorTextEl.innerText = html\n  }\n}\n\nexport function getScrollBarWidth() {\n  const inner = document.createElement('p')\n  inner.style.width = '100%'\n  inner.style.height = '200px'\n\n  const outer = document.createElement('div')\n  outer.style.position = 'absolute'\n  outer.style.top = '0px'\n  outer.style.left = '0px'\n  outer.style.visibility = 'hidden'\n  outer.style.width = '200px'\n  outer.style.height = '150px'\n  outer.style.overflow = 'hidden'\n  outer.appendChild(inner)\n\n  document.body.appendChild(outer)\n  const w1 = inner.offsetWidth\n  outer.style.overflow = 'scroll'\n  let w2 = inner.offsetWidth\n  if (w1 === w2) w2 = outer.clientWidth\n\n  document.body.removeChild(outer)\n\n  return w1 - w2\n}\n","import type { CheckerCtx } from '.'\nimport $t from '@/i18n'\nimport * as Utils from '@/lib/utils'\nimport * as Ui from '@/lib/ui'\n\n/** 图片验证码 */\nexport function imgBody(checker: CheckerCtx) {\n  // 图片验证方式\n  const elem = Utils.createElement(\n    `<span><img class=\"atk-captcha-img\" src=\"${checker.get('img_data') || ''}\">${$t('captchaCheck')}</span>`,\n  )\n\n  // 刷新验证码\n  elem.querySelector<HTMLElement>('.atk-captcha-img')!.onclick = () => {\n    const imgEl = elem.querySelector('.atk-captcha-img')\n    checker\n      .getApi()\n      .captcha.getCaptcha()\n      .then((res) => {\n        imgEl!.setAttribute('src', res.data.img_data)\n      })\n      .catch((err) => {\n        console.error('Failed to get captcha image ', err)\n      })\n  }\n  return elem\n}\n\n/** iframe 形式的通用验证服务 */\nexport function iframeBody(checker: CheckerCtx) {\n  const $iframeWrap = Utils.createElement(`<div class=\"atk-checker-iframe-wrap\"></div>`)\n  const $iframe = Utils.createElement<HTMLIFrameElement>(\n    `<iframe class=\"atk-fade-in\" referrerpolicy=\"strict-origin-when-cross-origin\"></iframe>`,\n  )\n  $iframe.style.display = 'none'\n  Ui.showLoading($iframeWrap, { transparentBg: true })\n  $iframe.src = checker.getOpts().getCaptchaIframeURL()\n  $iframe.onload = () => {\n    $iframe.style.display = ''\n    Ui.hideLoading($iframeWrap)\n  }\n  $iframeWrap.append($iframe)\n\n  const $closeBtn = Utils.createElement(\n    `<div class=\"atk-close-btn\"><i class=\"atk-icon atk-icon-close\"></i></div>`,\n  )\n  $iframeWrap.append($closeBtn)\n\n  checker.hideInteractInput()\n\n  // 轮询状态\n  let stop = false // 打断\n  const sleep = (ms: number) =>\n    new Promise((resolve) => {\n      window.setTimeout(() => {\n        resolve(null)\n      }, ms)\n    })\n  ;(async function queryStatus() {\n    await sleep(1000)\n    if (stop) return\n    let isPass = false\n    try {\n      const resp = await checker.getApi().captcha.getCaptchaStatus()\n      isPass = resp.data.is_pass\n    } catch {\n      isPass = false\n    }\n    if (isPass) {\n      checker.triggerSuccess()\n    } else {\n      queryStatus()\n    }\n  })()\n\n  $closeBtn.onclick = () => {\n    stop = true\n    checker.cancel()\n  }\n\n  return $iframeWrap\n}\n","import * as render from './captcha-renders'\nimport type { Checker } from '.'\n\nconst CaptchaChecker: Checker = {\n  request(checker, inputVal) {\n    return checker.getApi().captcha.verifyCaptcha({\n      value: inputVal,\n    })\n  },\n\n  body(checker) {\n    if (checker.get('iframe')) return render.iframeBody(checker)\n    return render.imgBody(checker)\n  },\n\n  onSuccess(checker, data, inputVal, formEl) {\n    checker.set('val', inputVal)\n  },\n\n  onError(checker, err, inputVal, formEl) {\n    formEl.querySelector<HTMLElement>('.atk-captcha-img')!.click() // 刷新验证码\n    formEl.querySelector<HTMLInputElement>('input[type=\"text\"]')!.value = '' // 清空输入框输入\n  },\n}\n\nexport default CaptchaChecker\n","import type { Checker } from '.'\nimport $t from '@/i18n'\nimport * as Utils from '@/lib/utils'\n\nconst AdminChecker: Checker<{ token: string }> = {\n  inputType: 'password',\n\n  async request(checker, inputVal) {\n    return (\n      await checker.getApi().user.login({\n        name: checker.getUser().getData().name,\n        email: checker.getUser().getData().email,\n        password: inputVal,\n      })\n    ).data\n  },\n\n  body(checker) {\n    return Utils.createElement(`<span>${$t('adminCheck')}</span>`)\n  },\n\n  onSuccess(checker, res, inputVal, formEl) {\n    checker.getUser().update({\n      is_admin: true,\n      token: res.token,\n    })\n    checker.getOpts().onReload()\n  },\n\n  onError(checker, err, inputVal, formEl) {},\n}\n\nexport default AdminChecker\n","import * as Utils from '../lib/utils'\nimport $t from '@/i18n'\n\ntype BtnClickHandler = (btnEl: HTMLElement, dialog: Dialog) => boolean | void\n\n/**\n * 对话框\n */\nexport default class Dialog {\n  public $el: HTMLElement\n  public $content: HTMLElement\n  public $actions: HTMLElement\n\n  constructor(contentEl: HTMLElement) {\n    this.$el = Utils.createElement(\n      `<div class=\"atk-layer-dialog-wrap\">\n        <div class=\"atk-layer-dialog\">\n          <div class=\"atk-layer-dialog-content\"></div>\n          <div class=\"atk-layer-dialog-actions\"></div>\n        </div>\n      </div>`,\n    )\n\n    // 按钮\n    this.$actions = this.$el.querySelector<HTMLElement>('.atk-layer-dialog-actions')!\n\n    // 内容\n    this.$content = this.$el.querySelector('.atk-layer-dialog-content')!\n    this.$content.appendChild(contentEl)\n  }\n\n  /** 按钮 · 确定 */\n  public setYes(handler: BtnClickHandler) {\n    const btn = Utils.createElement<HTMLButtonElement>(\n      `<button data-action=\"confirm\">${$t('confirm')}</button>`,\n    )\n    btn.onclick = this.onBtnClick(handler)\n    this.$actions.appendChild(btn)\n\n    return this\n  }\n\n  /** 按钮 · 取消 */\n  public setNo(handler: BtnClickHandler) {\n    const btn = Utils.createElement<HTMLButtonElement>(\n      `<button data-action=\"cancel\">${$t('cancel')}</button>`,\n    )\n    btn.onclick = this.onBtnClick(handler)\n    this.$actions.appendChild(btn)\n\n    return this\n  }\n\n  private onBtnClick(handler: BtnClickHandler) {\n    return (evt: Event) => {\n      const re = handler(evt.currentTarget as HTMLElement, this)\n      if (re === undefined || re === true) {\n        this.$el.remove()\n      }\n    }\n  }\n}\n","import CaptchaChecker from './captcha'\nimport AdminChecker from './admin'\nimport type { Api } from '@/api'\nimport Dialog from '@/components/dialog'\nimport $t from '@/i18n'\nimport type { ContextApi } from '@/types'\nimport type User from '@/lib/user'\nimport * as Utils from '@/lib/utils'\n\nexport interface CheckerCaptchaPayload extends CheckerPayload {\n  img_data?: string\n  iframe?: string\n}\n\nexport interface CheckerPayload {\n  onSuccess?: () => void\n  onMount?: (dialogEl: HTMLElement) => void\n  onCancel?: () => void\n}\n\nexport interface CheckerLauncherOptions {\n  getCtx: () => ContextApi\n  getApi: () => Api\n  getCaptchaIframeURL: () => string\n  onReload: () => void\n}\n\nfunction wrapPromise<P extends CheckerPayload = CheckerPayload>(fn: (p: P) => void) {\n  return (payload: P) =>\n    new Promise<void>((resolve, reject) => {\n      const cancelFn = payload.onCancel\n      payload.onCancel = () => {\n        cancelFn && cancelFn()\n        reject(new Error('user canceled the checker'))\n      }\n      const successFn = payload.onSuccess\n      payload.onSuccess = () => {\n        successFn && successFn()\n        resolve()\n      }\n      fn(payload)\n    })\n}\n\n/**\n * Checker 发射台\n */\nexport default class CheckerLauncher {\n  constructor(private opts: CheckerLauncherOptions) {}\n\n  public checkCaptcha: (payload: CheckerCaptchaPayload) => Promise<void> = wrapPromise((p) => {\n    this.fire(CaptchaChecker, p, (ctx) => {\n      ctx.set('img_data', p.img_data)\n      ctx.set('iframe', p.iframe)\n    })\n  })\n\n  public checkAdmin: (payload: CheckerPayload) => Promise<void> = wrapPromise((p) => {\n    this.fire(AdminChecker, p)\n  })\n\n  public fire(checker: Checker, payload: CheckerPayload, postFire?: (c: CheckerCtx) => void) {\n    // 显示层\n    const layer = this.opts.getCtx().get('layerManager').create(`checker-${new Date().getTime()}`)\n    layer.show()\n\n    const close = () => {\n      layer.destroy()\n    }\n\n    // 构建 Checker 的上下文\n    const checkerStore: CheckerStore = {}\n    let hideInteractInput = false\n    const checkerCtx: CheckerCtx = {\n      set: (key, val) => {\n        checkerStore[key] = val\n      },\n      get: (key) => checkerStore[key],\n      getOpts: () => this.opts,\n      getUser: () => this.opts.getCtx().get('user'),\n      getApi: () => this.opts.getApi(),\n      hideInteractInput: () => {\n        hideInteractInput = true\n      },\n      triggerSuccess: () => {\n        close()\n        if (checker.onSuccess) checker.onSuccess(checkerCtx, '', '', formEl)\n        if (payload.onSuccess) payload.onSuccess()\n      },\n      cancel: () => {\n        close()\n        if (payload.onCancel) payload.onCancel()\n      },\n    }\n\n    if (postFire) postFire(checkerCtx)\n\n    // 创建表单\n    const formEl = Utils.createElement()\n    formEl.appendChild(checker.body(checkerCtx))\n\n    // 输入框\n    const $input = Utils.createElement<HTMLInputElement>(\n      `<input id=\"check\" type=\"${checker.inputType || 'text'}\" autocomplete=\"off\" required placeholder=\"\">`,\n    )\n    formEl.appendChild($input)\n    setTimeout(() => $input.focus(), 80) // 延迟 Focus\n\n    // 绑定键盘事件\n    $input.onkeyup = (evt) => {\n      if (evt.key === 'Enter' || evt.keyCode === 13) {\n        // 按下回车键\n        evt.preventDefault()\n        layer.getEl().querySelector<HTMLButtonElement>('button[data-action=\"confirm\"]')!.click()\n      }\n    }\n\n    let btnTextOrg: string | undefined\n    const dialog = new Dialog(formEl)\n\n    // 确认按钮\n    dialog.setYes((btnEl) => {\n      const inputVal = $input.value.trim()\n\n      // 按钮操作\n      if (!btnTextOrg) btnTextOrg = btnEl.innerText\n      const btnTextSet = (btnText: string) => {\n        btnEl.innerText = btnText\n        btnEl.classList.add('error')\n      }\n      const btnTextRestore = () => {\n        btnEl.innerText = btnTextOrg || ''\n        btnEl.classList.remove('error')\n      }\n\n      btnEl.innerText = `${$t('loading')}...`\n\n      // 发送请求\n      checker\n        .request(checkerCtx, inputVal)\n        .then((data) => {\n          // 请求成功\n          close()\n\n          if (checker.onSuccess) checker.onSuccess(checkerCtx, data, inputVal, formEl)\n          if (payload.onSuccess) payload.onSuccess()\n        })\n        .catch((err) => {\n          // 请求失败\n          btnTextSet(String(err.message || String(err)))\n\n          if (checker.onError) checker.onError(checkerCtx, err, inputVal, formEl)\n\n          // 错误显示 3s 后恢复按钮\n          const tf = setTimeout(() => btnTextRestore(), 3000)\n          $input.onfocus = () => {\n            btnTextRestore()\n            clearTimeout(tf)\n          }\n        })\n\n      return false\n    })\n\n    // 取消按钮\n    dialog.setNo(() => {\n      close()\n      if (payload.onCancel) payload.onCancel()\n      return false\n    })\n\n    if (hideInteractInput) {\n      $input.style.display = 'none'\n      dialog.$el.querySelector<HTMLElement>('.atk-layer-dialog-actions')!.style.display = 'none'\n    }\n\n    // 层装载 dialog 元素\n    layer.getEl().append(dialog.$el)\n\n    // onMount 回调\n    if (payload.onMount) payload.onMount(dialog.$el)\n  }\n}\n\nexport interface Checker<T = any> {\n  el?: HTMLElement\n  inputType?: 'password' | 'text'\n  body: (checker: CheckerCtx) => HTMLElement\n  request: (checker: CheckerCtx, inputVal: string) => Promise<T>\n  onSuccess?: (checker: CheckerCtx, respData: T, inputVal: string, formEl: HTMLElement) => void\n  onError?: (checker: CheckerCtx, errData: any, inputVal: string, formEl: HTMLElement) => void\n}\n\ninterface CheckerStore {\n  val?: string\n  img_data?: string\n  iframe?: string\n}\n\nexport interface CheckerCtx {\n  get<K extends keyof CheckerStore>(key: K): CheckerStore[K]\n  set<K extends keyof CheckerStore>(key: K, val: CheckerStore[K]): void\n  getOpts(): CheckerLauncherOptions\n  getApi(): Api\n  getUser(): User\n  hideInteractInput(): void\n  triggerSuccess(): void\n  cancel(): void\n}\n","import type { ContextApi } from '@/types'\n\nexport default abstract class Component {\n  public $el!: HTMLElement\n  public get conf() {\n    return this.ctx.conf\n  }\n\n  public constructor(public ctx: ContextApi) {}\n\n  getEl() {\n    return this.$el\n  }\n}\n","export default \"<div class=\\\"atk-main-editor\\\">\\n  <div class=\\\"atk-header\\\">\\n    <input name=\\\"name\\\" class=\\\"atk-name\\\" type=\\\"text\\\" required=\\\"required\\\" />\\n    <input name=\\\"email\\\" class=\\\"atk-email\\\" type=\\\"email\\\" required=\\\"required\\\" />\\n    <input name=\\\"link\\\" class=\\\"atk-link\\\" type=\\\"url\\\" />\\n  </div>\\n  <div class=\\\"atk-textarea-wrap\\\">\\n    <textarea class=\\\"atk-textarea\\\"></textarea>\\n  </div>\\n  <div class=\\\"atk-plug-panel-wrap\\\" style=\\\"display: none\\\"></div>\\n  <div class=\\\"atk-bottom\\\">\\n    <div class=\\\"atk-item atk-bottom-left\\\">\\n      <span class=\\\"atk-state-wrap\\\"></span>\\n      <span class=\\\"atk-plug-btn-wrap\\\"></span>\\n    </div>\\n    <div class=\\\"atk-item\\\">\\n      <button type=\\\"button\\\" class=\\\"atk-send-btn\\\"></button>\\n    </div>\\n  </div>\\n  <div class=\\\"atk-notify-wrap\\\"></div>\\n</div>\\n\"","import * as Utils from '../lib/utils'\nimport EditorHTML from './editor.html?raw'\n\nconst Sel = {\n  $header: '.atk-header',\n  $name: '.atk-header [name=\"name\"]',\n  $email: '.atk-header [name=\"email\"]',\n  $link: '.atk-header [name=\"link\"]',\n  $textareaWrap: '.atk-textarea-wrap',\n  $textarea: '.atk-textarea',\n  $bottom: '.atk-bottom',\n  $submitBtn: '.atk-send-btn',\n  $notifyWrap: '.atk-notify-wrap',\n  $bottomLeft: '.atk-bottom-left',\n  $stateWrap: '.atk-state-wrap',\n  $plugBtnWrap: '.atk-plug-btn-wrap',\n  $plugPanelWrap: '.atk-plug-panel-wrap',\n}\n\nexport interface EditorUI extends Record<keyof typeof Sel, HTMLElement> {\n  $el: HTMLElement\n  $name: HTMLInputElement\n  $email: HTMLInputElement\n  $link: HTMLInputElement\n  $textarea: HTMLTextAreaElement\n  $submitBtn: HTMLButtonElement\n  $sendReplyBtn?: HTMLElement\n  $editCancelBtn?: HTMLElement\n}\n\nexport function render() {\n  const $el = Utils.createElement(EditorHTML)\n  const ui = { $el }\n  Object.entries(Sel).forEach(([k, sel]) => {\n    ui[k] = $el.querySelector(sel)\n  })\n  return ui as EditorUI\n}\n","import type PlugKit from './_kit'\nimport type { CommentData, EditorState } from '@/types'\nimport * as Utils from '@/lib/utils'\n\n/**\n * Editor 插件\n */\nclass EditorPlug {\n  $btn?: HTMLElement\n  $panel?: HTMLElement\n  contentTransformer?(rawContent: string): string\n  editorStateEffectWhen?: EditorState\n  editorStateEffect?(comment: CommentData): () => void\n\n  constructor(protected kit: PlugKit) {}\n\n  /** Use plug btn will add a btn on the bottom of editor */\n  useBtn(html: string = '<div></div>') {\n    this.$btn = Utils.createElement(`<span class=\"atk-plug-btn\">${html}</span>`)\n    return this.$btn\n  }\n\n  /** Use plug panel will show the panel when btn is clicked */\n  usePanel(html: string = '<div></div>') {\n    this.$panel = Utils.createElement(html)\n    return this.$panel\n  }\n\n  /** Use the content transformer to handle the content of the last submit by the editor */\n  useContentTransformer(func: (raw: string) => string) {\n    this.contentTransformer = func\n  }\n\n  /** Listen the event of panel show */\n  usePanelShow(func: () => void) {\n    this.kit.useEvents().on('panel-show', (aPlug) => {\n      if (aPlug === this) func()\n    })\n  }\n\n  /** Listen the event of panel hide */\n  usePanelHide(func: () => void) {\n    this.kit.useEvents().on('panel-hide', (aPlug) => {\n      if (aPlug === this) func()\n    })\n  }\n\n  /** Use editor state modifier */\n  useEditorStateEffect(stateName: EditorState, effectFn: (comment: CommentData) => () => void) {\n    this.editorStateEffectWhen = stateName\n    this.editorStateEffect = effectFn\n  }\n}\n\nexport default EditorPlug\n","import EditorPlug from './_plug'\nimport * as Utils from '@/lib/utils'\n\nexport default class Mover extends EditorPlug {\n  private isMoved = false\n\n  move(afterEl: HTMLElement) {\n    if (this.isMoved) return\n    this.isMoved = true\n\n    const editorEl = this.kit.useUI().$el\n\n    editorEl.after(Utils.createElement('<div class=\"atk-editor-travel-placeholder\"></div>'))\n\n    const $travelPlace = Utils.createElement('<div></div>')\n    afterEl.after($travelPlace)\n    $travelPlace.replaceWith(editorEl)\n\n    editorEl.classList.add('atk-fade-in') // 添加渐入动画\n    editorEl.classList.add('editor-traveling')\n  }\n\n  back() {\n    if (!this.isMoved) return\n    this.isMoved = false\n    this.kit\n      .useGlobalCtx()\n      .$root.querySelector('.atk-editor-travel-placeholder')\n      ?.replaceWith(this.kit.useUI().$el)\n    this.kit.useUI().$el.classList.remove('editor-traveling')\n  }\n}\n","import Mover from '../plugins/editor/mover'\nimport type Editor from './editor'\nimport type { EditorState, CommentData } from '@/types'\nimport * as Ui from '@/lib/ui'\n\nexport default class EditorStateManager {\n  constructor(private editor: Editor) {}\n\n  private stateCurt: EditorState = 'normal'\n  private stateUnmountFn: (() => void) | null = null\n\n  /** Get current state */\n  get() {\n    return this.stateCurt\n  }\n\n  /**\n   * Switch editor state\n   *\n   * @param state The state to switch\n   * @param payload The cause of state switch\n   */\n  switch(state: EditorState, payload?: { $comment: HTMLElement; comment: CommentData }) {\n    // trigger unmount\n    if (this.stateUnmountFn) {\n      this.stateUnmountFn()\n      this.stateUnmountFn = null\n\n      // move editor back to the initial position\n      this.editor.getPlugs()?.get(Mover)?.back()\n    }\n\n    // invoke effect function and save unmount function\n    if (state !== 'normal' && payload) {\n      // move editor position\n      let moveAfterEl = payload.$comment\n      if (!this.editor.conf.flatMode)\n        moveAfterEl = moveAfterEl.querySelector<HTMLElement>('.atk-footer')!\n      this.editor.getPlugs()?.get(Mover)?.move(moveAfterEl)\n\n      const $relative =\n        this.editor.ctx.conf.scrollRelativeTo && this.editor.ctx.conf.scrollRelativeTo()\n      Ui.scrollIntoView(this.editor.getUI().$el, true, $relative)\n\n      const plugin = this.editor\n        .getPlugs()\n        ?.getPlugs()\n        .find((p) => p.editorStateEffectWhen === state)\n      if (plugin && plugin.editorStateEffect) {\n        this.stateUnmountFn = plugin.editorStateEffect(payload.comment)\n      }\n    }\n\n    // change current state\n    this.stateCurt = state\n  }\n}\n","import Component from '../lib/component'\nimport * as Ui from '../lib/ui'\nimport marked from '../lib/marked'\nimport { render, EditorUI } from './ui'\nimport EditorStateManager from './state'\nimport type { CommentData, ContextApi, EditorApi } from '@/types'\n\nclass Editor extends Component implements EditorApi {\n  private ui: EditorUI\n  private state: EditorStateManager\n\n  getUI() {\n    return this.ui\n  }\n  getPlugs() {\n    return this.ctx.get('editorPlugs')\n  }\n  getState() {\n    return this.state.get()\n  }\n\n  constructor(ctx: ContextApi) {\n    super(ctx)\n\n    // init editor ui\n    this.ui = render()\n    this.$el = this.ui.$el\n\n    // init state manager\n    this.state = new EditorStateManager(this)\n  }\n\n  getHeaderInputEls() {\n    return { name: this.ui.$name, email: this.ui.$email, link: this.ui.$link }\n  }\n\n  getContentFinal() {\n    let content = this.getContentRaw()\n\n    // plug hook: final content transformer\n    const plugs = this.getPlugs()\n    if (plugs) content = plugs.getTransformedContent(content)\n\n    return content\n  }\n\n  getContentRaw() {\n    return this.ui.$textarea.value || ''\n  }\n\n  getContentMarked() {\n    return marked(this.getContentFinal())\n  }\n\n  setContent(val: string) {\n    this.ui.$textarea.value = val\n\n    // plug hook: content updated\n    this.getPlugs()?.getEvents().trigger('content-updated', val)\n  }\n\n  insertContent(val: string) {\n    if ((document as any).selection) {\n      this.ui.$textarea.focus()\n      ;(document as any).selection.createRange().text = val\n      this.ui.$textarea.focus()\n    } else if (this.ui.$textarea.selectionStart || this.ui.$textarea.selectionStart === 0) {\n      const sStart = this.ui.$textarea.selectionStart\n      const sEnd = this.ui.$textarea.selectionEnd\n      const sT = this.ui.$textarea.scrollTop\n      this.setContent(\n        this.ui.$textarea.value.substring(0, sStart) +\n          val +\n          this.ui.$textarea.value.substring(sEnd, this.ui.$textarea.value.length),\n      )\n      this.ui.$textarea.focus()\n      this.ui.$textarea.selectionStart = sStart + val.length\n      this.ui.$textarea.selectionEnd = sStart + val.length\n      this.ui.$textarea.scrollTop = sT\n    } else {\n      this.ui.$textarea.focus()\n      this.ui.$textarea.value += val\n    }\n  }\n\n  focus() {\n    this.ui.$textarea.focus()\n  }\n\n  reset() {\n    this.setContent('')\n    this.resetState()\n  }\n\n  resetState() {\n    this.state.switch('normal')\n  }\n\n  setReply(comment: CommentData, $comment: HTMLElement) {\n    this.state.switch('reply', { comment, $comment })\n  }\n\n  setEditComment(comment: CommentData, $comment: HTMLElement) {\n    this.state.switch('edit', { comment, $comment })\n  }\n\n  showNotify(msg: string, type: any) {\n    Ui.showNotify(this.ui.$notifyWrap, msg, type)\n  }\n\n  showLoading() {\n    Ui.showLoading(this.ui.$el)\n  }\n\n  hideLoading() {\n    Ui.hideLoading(this.ui.$el)\n  }\n\n  submit() {\n    const next = () => this.ctx.trigger('editor-submit')\n    if (this.ctx.conf.beforeSubmit) {\n      this.ctx.conf.beforeSubmit(this, next)\n    } else {\n      next()\n    }\n  }\n}\n\nexport default Editor\n","export default \"<div class=\\\"atk-sidebar-layer\\\">\\n  <div class=\\\"atk-sidebar-inner\\\">\\n    <div class=\\\"atk-sidebar-header\\\">\\n      <div class=\\\"atk-sidebar-close\\\">\\n        <i class=\\\"atk-icon atk-icon-close-slim\\\"></i>\\n      </div>\\n    </div>\\n    <div class=\\\"atk-sidebar-iframe-wrap\\\"></div>\\n  </div>\\n</div>\\n\"","import SidebarHTML from './sidebar-layer.html?raw'\nimport type { Layer } from './layer'\nimport type { ContextApi, SidebarShowPayload } from '@/types'\nimport Component from '@/lib/component'\nimport * as Utils from '@/lib/utils'\nimport * as Ui from '@/lib/ui'\n\nexport default class SidebarLayer extends Component {\n  public layer?: Layer\n  public $header: HTMLElement\n  public $closeBtn: HTMLElement\n  public $iframeWrap: HTMLElement\n  public $iframe?: HTMLIFrameElement\n\n  constructor(ctx: ContextApi) {\n    super(ctx)\n\n    this.$el = Utils.createElement(SidebarHTML)\n    this.$header = this.$el.querySelector('.atk-sidebar-header')!\n    this.$closeBtn = this.$header.querySelector('.atk-sidebar-close')!\n    this.$iframeWrap = this.$el.querySelector('.atk-sidebar-iframe-wrap')!\n\n    this.$closeBtn.onclick = () => {\n      this.hide()\n    }\n\n    // event\n    this.ctx.on('user-changed', () => {\n      this.refreshWhenShow = true\n    })\n  }\n\n  /** Refresh iFrame when show */\n  private refreshWhenShow = true\n\n  /** Animation timer */\n  private animTimer?: any = undefined\n\n  /** 显示 */\n  public async show(conf: SidebarShowPayload = {}) {\n    this.$el.style.transform = '' // 动画清除，防止二次打开失效\n\n    // init layer\n    this.initLayer()\n    this.layer!.show()\n\n    // init iframe\n    if (this.refreshWhenShow) {\n      this.refreshWhenShow = false\n      this.$iframeWrap.innerHTML = ''\n      this.$iframe = this.createIframe(conf.view)\n      this.$iframeWrap.append(this.$iframe)\n    } else {\n      // Sync Dark Mode (reload iframe if not match)\n      const $iframe = this.$iframe!\n      const iFrameSrc = $iframe.src\n      if (this.getDarkMode() !== iFrameSrc.includes('&darkMode=1')) {\n        this.iframeLoad(\n          $iframe,\n          iFrameSrc.replace(/&darkMode=\\d/, `&darkMode=${Number(this.getDarkMode())}`),\n        )\n      }\n    }\n\n    // 管理员身份验证 (若身份失效，弹出验证窗口)\n    this.authCheck({\n      onSuccess: () => this.show(conf), // retry show after auth check\n    })\n\n    // 执行滑动显示动画\n    this.animTimer = setTimeout(() => {\n      this.animTimer = undefined\n      this.$el.style.transform = 'translate(0, 0)'\n\n      setTimeout(() => {\n        this.ctx.getData().updateNotifies([])\n      }, 0)\n\n      this.ctx.trigger('sidebar-show')\n    }, 100)\n  }\n\n  /** 隐藏 */\n  public hide() {\n    this.layer?.hide()\n  }\n\n  // --------------------------------------------------\n\n  private async authCheck(opts: { onSuccess: () => void }) {\n    const data = (\n      await this.ctx.getApi().user.getUserStatus({\n        ...this.ctx.getApi().getUserFields(),\n      })\n    ).data\n    if (data.is_admin && !data.is_login) {\n      this.refreshWhenShow = true\n\n      // show checker layer\n      this.ctx.checkAdmin({\n        onSuccess: () => {\n          setTimeout(() => {\n            opts.onSuccess()\n          }, 500)\n        },\n        onCancel: () => {\n          this.hide()\n        },\n      })\n\n      // hide sidebar layer\n      this.hide()\n    }\n  }\n\n  private initLayer() {\n    if (this.layer) return\n\n    this.layer = this.ctx.get('layerManager').create('sidebar', this.$el)\n    this.layer.setOnAfterHide(() => {\n      // 防止评论框被吞\n      this.ctx.editorResetState()\n\n      // interrupt animation\n      this.animTimer && clearTimeout(this.animTimer)\n\n      // perform transform\n      this.$el.style.transform = ''\n\n      // trigger event\n      this.ctx.trigger('sidebar-hide')\n    })\n  }\n\n  private createIframe(view?: string) {\n    const $iframe = Utils.createElement<HTMLIFrameElement>(\n      '<iframe referrerpolicy=\"strict-origin-when-cross-origin\"></iframe>',\n    )\n\n    // 准备 Iframe 参数\n    const baseURL = import.meta.env.DEV\n      ? 'http://localhost:23367/'\n      : Utils.getURLBasedOnApi({\n          base: this.ctx.conf.server,\n          path: '/sidebar/',\n        })\n\n    const query: any = {\n      pageKey: this.conf.pageKey,\n      site: this.conf.site || '',\n      user: JSON.stringify(this.ctx.get('user').getData()),\n      time: +new Date(),\n    }\n\n    if (view) query.view = view\n    query.darkMode = this.getDarkMode() ? '1' : '0'\n\n    const urlParams = new URLSearchParams(query)\n    this.iframeLoad($iframe, `${baseURL}?${urlParams.toString()}`)\n\n    return $iframe\n  }\n\n  private getDarkMode() {\n    return this.conf.darkMode === 'auto'\n      ? window.matchMedia('(prefers-color-scheme: dark)').matches\n      : this.conf.darkMode\n  }\n\n  private iframeLoad($iframe: HTMLIFrameElement, src: string) {\n    $iframe.src = src\n\n    // 加载动画\n    Ui.showLoading(this.$iframeWrap)\n    $iframe.onload = () => {\n      Ui.hideLoading(this.$iframeWrap)\n    }\n  }\n}\n","export default \"<div class=\\\"atk-list\\\">\\n  <div class=\\\"atk-list-header\\\">\\n    <div class=\\\"atk-comment-count\\\">\\n      <div class=\\\"atk-text\\\"></div>\\n    </div>\\n    <div class=\\\"atk-right-action\\\">\\n      <span data-action=\\\"admin-close-comment\\\" class=\\\"atk-hide\\\" atk-only-admin-show></span>\\n      <span data-action=\\\"open-sidebar\\\" class=\\\"atk-hide atk-on\\\">\\n        <span class=\\\"atk-unread-badge\\\" style=\\\"display: none\\\"></span>\\n        <div class=\\\"atk-text\\\"></div>\\n      </span>\\n    </div>\\n  </div>\\n  <div class=\\\"atk-list-body\\\">\\n    <div class=\\\"atk-list-comments-wrap\\\"></div>\\n  </div>\\n  <div class=\\\"atk-list-footer\\\">\\n    <div class=\\\"atk-copyright\\\"></div>\\n  </div>\\n</div>\\n\"","import type { CommentData } from '@/types'\n\nexport type CommentNode = {\n  id: number\n  comment: CommentData\n  children: CommentNode[]\n  parent?: CommentNode\n  level: number\n}\n\nexport type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC'\n\n// 构建树状结构列表\nexport function makeNestCommentNodeList(\n  srcData: CommentData[],\n  sortBy: SortByType = 'DATE_DESC',\n  nestMax = 2,\n) {\n  const nodeList: CommentNode[] = []\n\n  const roots = srcData.filter((o) => o.rid === 0)\n  roots.forEach((root: CommentData) => {\n    const rootNode: CommentNode = {\n      id: root.id,\n      comment: root,\n      children: [],\n      level: 1,\n    }\n\n    rootNode.parent = rootNode\n    nodeList.push(rootNode)\n    ;(function loadChildren(parentNode: CommentNode) {\n      const children = srcData.filter((o) => o.rid === parentNode.id)\n      if (children.length === 0) return\n      if (parentNode.level >= nestMax) parentNode = parentNode.parent!\n      children.forEach((child: CommentData) => {\n        const childNode: CommentNode = {\n          id: child.id,\n          comment: child,\n          children: [],\n          parent: parentNode,\n          level: parentNode.level + 1,\n        }\n\n        parentNode.children.push(childNode)\n        loadChildren(childNode)\n      })\n    })(rootNode)\n  })\n\n  // 排序\n  const sortFunc = (a: CommentNode, b: CommentNode): number => {\n    let v = a.id - b.id\n    if (sortBy === 'DATE_ASC') v = +new Date(a.comment.date) - +new Date(b.comment.date)\n    else if (sortBy === 'DATE_DESC') v = +new Date(b.comment.date) - +new Date(a.comment.date)\n    else if (sortBy === 'SRC_INDEX') v = srcData.indexOf(a.comment) - srcData.indexOf(b.comment)\n    else if (sortBy === 'VOTE_UP_DESC') v = b.comment.vote_up - a.comment.vote_up\n    return v\n  }\n\n  ;(function sortLevels(nodes: CommentNode[]) {\n    nodes.forEach((node) => {\n      node.children = node.children.sort(sortFunc)\n      sortLevels(node.children)\n    })\n  })(nodeList)\n\n  return nodeList\n}\n","import type { LayoutStrategyCreator } from '.'\nimport type { CommentNode } from '@/comment'\nimport * as Ui from '@/lib/ui'\nimport * as ListNest from '@/list/nest'\n\nexport const createNestStrategy: LayoutStrategyCreator = (opts) => ({\n  import: (comments) => {\n    // 遍历 root 评论\n    const rootNodes = ListNest.makeNestCommentNodeList(comments, opts.nestSortBy, opts.nestMax)\n    rootNodes.forEach((rootNode: ListNest.CommentNode) => {\n      const rootC = opts.createCommentNode(rootNode.comment)\n\n      // 显示并播放渐入动画\n      opts.$commentsWrap?.appendChild(rootC.getEl())\n      rootC.getRender().playFadeAnim()\n\n      // 加载子评论\n      const loadChildren = (parentC: CommentNode, parentNode: ListNest.CommentNode) => {\n        parentNode.children.forEach((node: ListNest.CommentNode) => {\n          const replyD = comments.find((c) => c.id === node.comment.rid)\n          const childD = node.comment\n          const childC = opts.createCommentNode(childD, replyD)\n\n          // 插入到父评论中\n          parentC.putChild(childC)\n\n          // 递归加载子评论\n          loadChildren(childC, node)\n        })\n      }\n      loadChildren(rootC, rootNode)\n\n      // 限高检测\n      rootC.getRender().checkHeightLimit()\n    })\n  },\n  insert: (comment, replyComment) => {\n    // 嵌套模式\n    const node = opts.createCommentNode(comment, replyComment)\n\n    if (comment.rid === 0) {\n      // root评论 新增\n      opts.$commentsWrap?.prepend(node.getEl())\n    } else {\n      // 子评论 新增\n      const parent = opts.findCommentNode(comment.rid)\n      if (parent) {\n        parent.putChild(node, opts.nestSortBy === 'DATE_ASC' ? 'append' : 'prepend')\n\n        // 若父评论存在 “子评论部分” 限高，取消限高\n        node.getParents().forEach((p) => {\n          p.getRender().heightLimitRemoveForChildren()\n        })\n      }\n    }\n\n    node.getRender().checkHeightLimit()\n\n    node.scrollIntoView() // 滚动到可以见\n    node.getRender().playFadeAnim() // 播放评论渐出动画\n  },\n})\n","import type { LayoutStrategyCreator, LayoutOptions } from '.'\nimport type { CommentData } from '@/types'\nimport * as Ui from '@/lib/ui'\n\nexport const createFlatStrategy: LayoutStrategyCreator = (opts) => ({\n  import: (comments) => {\n    comments.forEach((comment: CommentData) => {\n      const replyComment =\n        comment.rid === 0 ? undefined : comments.find((c) => c.id === comment.rid)\n      insertComment(opts, 'append', comment, replyComment)\n    })\n  },\n  insert: (comment, replyComment) => {\n    const node = insertComment(opts, 'prepend', comment, replyComment)\n    node.scrollIntoView()\n  },\n})\n\n/** 导入评论 · 平铺模式 */\nfunction insertComment(\n  opts: LayoutOptions,\n  insertMode: 'append' | 'prepend',\n  comment: CommentData,\n  replyComment?: CommentData | undefined,\n) {\n  if (comment.is_collapsed) comment.is_allow_reply = false\n  const node = opts.createCommentNode(comment, replyComment)\n\n  // 可见评论添加到界面\n  // 注：不可见评论用于显示 “引用内容”\n  if (comment.visible) {\n    const $comment = node.getEl()\n    const $listCommentsWrap = opts.$commentsWrap\n    if (insertMode === 'append') $listCommentsWrap?.append($comment)\n    if (insertMode === 'prepend') $listCommentsWrap?.prepend($comment)\n    node.getRender().playFadeAnim()\n  }\n\n  // 平铺评论插入后 · 内容限高检测\n  // 插入列表的评论 (visible=true) 和关联的评论 (visible=false) 都需要检测\n  node.getRender().checkHeightLimit()\n\n  return node\n}\n","import * as ListNest from '../nest'\nimport { createNestStrategy } from './nest'\nimport { createFlatStrategy } from './flat'\nimport type { CommentNode } from '@/comment'\nimport type { CommentData } from '@/types'\n\nexport interface LayoutOptions {\n  /** The comments wrap of list */\n  $commentsWrap: HTMLElement\n  nestSortBy: ListNest.SortByType\n  nestMax: number\n  flatMode: boolean\n\n  createCommentNode(comment: CommentData, replyComment?: CommentData): CommentNode\n  findCommentNode(id: number): CommentNode | undefined\n}\n\nexport interface LayoutStrategy {\n  import(comments: CommentData[]): void\n  insert(comment: CommentData, replyComment?: CommentData): void\n}\n\nexport type LayoutStrategyCreator = (opts: LayoutOptions) => LayoutStrategy\n\nexport class ListLayout {\n  constructor(private options: LayoutOptions) {}\n\n  private getStrategy() {\n    return this.options.flatMode\n      ? createFlatStrategy(this.options)\n      : createNestStrategy(this.options)\n  }\n\n  import(comments: CommentData[]) {\n    this.getStrategy().import(comments)\n  }\n\n  insert(comment: CommentData, replyComment?: CommentData) {\n    this.getStrategy().insert(comment, replyComment)\n  }\n}\n","function Detect(userAgent?: string) {\n  const win = (window as any) || {}\n  const nav = navigator || {}\n\n  const u = String(userAgent || nav.userAgent)\n  const dest = {\n    os: '',\n    osVersion: '',\n    engine: '',\n    browser: '',\n    device: '',\n    language: '',\n    version: ''\n  }\n\n  // 内核\n  const engineMatch = {\n    Trident: u.includes('Trident') || u.includes('NET CLR'),\n    Presto: u.includes('Presto'),\n    WebKit: u.includes('AppleWebKit'),\n    Gecko: u.includes('Gecko/')\n  }\n\n  // 浏览器\n  const browserMatch = {\n    Safari: u.includes('Safari'),\n    Chrome: u.includes('Chrome') || u.includes('CriOS'),\n    IE: u.includes('MSIE') || u.includes('Trident'),\n    Edge: u.includes('Edge') || u.includes('Edg'),\n    Firefox: u.includes('Firefox') || u.includes('FxiOS'),\n    'Firefox Focus': u.includes('Focus'),\n    Chromium: u.includes('Chromium'),\n    Opera: u.includes('Opera') || u.includes('OPR'),\n    Vivaldi: u.includes('Vivaldi'),\n    Yandex: u.includes('YaBrowser'),\n    Kindle: u.includes('Kindle') || u.includes('Silk/'),\n    360: u.includes('360EE') || u.includes('360SE'),\n    UC: u.includes('UC') || u.includes(' UBrowser'),\n    QQBrowser: u.includes('QQBrowser'),\n    QQ: u.includes('QQ/'),\n    Baidu: u.includes('Baidu') || u.includes('BIDUBrowser'),\n    Maxthon: u.includes('Maxthon'),\n    Sogou: u.includes('MetaSr') || u.includes('Sogou'),\n    LBBROWSER: u.includes('LBBROWSER'),\n    '2345Explorer': u.includes('2345Explorer'),\n    TheWorld: u.includes('TheWorld'),\n    MIUI: u.includes('MiuiBrowser'),\n    Quark: u.includes('Quark'),\n    Qiyu: u.includes('Qiyu'),\n    Wechat: u.includes('MicroMessenger'),\n    Taobao: u.includes('AliApp(TB'),\n    Alipay: u.includes('AliApp(AP'),\n    Weibo: u.includes('Weibo'),\n    Douban: u.includes('com.douban.frodo'),\n    Suning: u.includes('SNEBUY-APP'),\n    iQiYi: u.includes('IqiyiApp'),\n  }\n\n  // 系统或平台\n  const osMatch = {\n    Windows: u.includes('Windows'),\n    Linux: u.includes('Linux') || u.includes('X11'),\n    'macOS': u.includes('Macintosh'),\n    Android: u.includes('Android') || u.includes('Adr'),\n    Ubuntu: u.includes('Ubuntu'),\n    FreeBSD: u.includes('FreeBSD'),\n    Debian: u.includes('Debian'),\n    'Windows Phone': u.includes('IEMobile') || u.includes('Windows Phone'),\n    BlackBerry: u.includes('BlackBerry') || u.includes('RIM'),\n    MeeGo: u.includes('MeeGo'),\n    Symbian: u.includes('Symbian'),\n    iOS: u.includes('like Mac OS X'),\n    'Chrome OS': u.includes('CrOS'),\n    WebOS: u.includes('hpwOS'),\n  }\n\n  // 设备\n  const deviceMatch = {\n    Mobile: u.includes('Mobi') || u.includes('iPh') || u.includes('480'),\n    Tablet: u.includes('Tablet') || u.includes('Pad') || u.includes('Nexus 7')\n  }\n\n  // 修正\n  if (deviceMatch.Mobile) {\n    deviceMatch.Mobile = !(u.includes('iPad'))\n  } else if (browserMatch.Chrome && u.includes('Edg')) {\n    // Chrome 内核的 Edge\n    browserMatch.Chrome = false\n    browserMatch.Edge = true\n  } else if (win.showModalDialog && win.chrome) {\n    browserMatch.Chrome = false\n    browserMatch['360'] = true\n  }\n\n  // 默认设备\n  dest.device = 'PC'\n\n  // 语言\n  dest.language = (() => {\n    const g = ((nav as any).browserLanguage || nav.language)\n    const arr = g.split('-')\n    if (arr[1]) arr[1] = arr[1].toUpperCase()\n    return arr.join('_')\n  })()\n\n  // 应用判断数据\n  const hash = {\n    engine: engineMatch,\n    browser: browserMatch,\n    os: osMatch,\n    device: deviceMatch,\n  }\n  Object.entries(hash).forEach(([type, match]) => {\n    Object.entries(match).forEach(([name, result]) => {\n      if (result === true) dest[type] = name\n    })\n  })\n\n  // 系统版本信息\n  const osVersion = {\n    Windows: () => {\n      const v = u.replace(/^.*Windows NT ([\\d.]+);.*$/, '$1')\n      const wvHash = {\n        '6.4': '10',\n        '6.3': '8.1',\n        '6.2': '8',\n        '6.1': '7',\n        '6.0': 'Vista',\n        '5.2': 'XP',\n        '5.1': 'XP',\n        '5.0': '2000',\n        '10.0': '10',\n        '11.0': '11' // 自定的，不是微软官方的判断方法\n      }\n      return wvHash[v] || v\n    },\n    Android: () => u.replace(/^.*Android ([\\d.]+);.*$/, '$1'),\n    iOS: () => u.replace(/^.*OS ([\\d_]+) like.*$/, '$1').replace(/_/g, '.'),\n    Debian: () => u.replace(/^.*Debian\\/([\\d.]+).*$/, '$1'),\n    'Windows Phone': () => u.replace(/^.*Windows Phone( OS)? ([\\d.]+);.*$/, '$2'),\n    'macOS': () => u.replace(/^.*Mac OS X ([\\d_]+).*$/, '$1').replace(/_/g, '.'),\n    WebOS: () => u.replace(/^.*hpwOS\\/([\\d.]+);.*$/, '$1')\n  }\n\n  dest.osVersion = ''\n  if (osVersion[dest.os]) {\n    dest.osVersion = osVersion[dest.os]()\n    if (dest.osVersion === u) {\n      dest.osVersion = ''\n    }\n  }\n\n  // 浏览器版本信息\n  const version = {\n    Safari: () => u.replace(/^.*Version\\/([\\d.]+).*$/, '$1'),\n    Chrome: () => u.replace(/^.*Chrome\\/([\\d.]+).*$/, '$1').replace(/^.*CriOS\\/([\\d.]+).*$/, '$1'),\n    IE: () => u.replace(/^.*MSIE ([\\d.]+).*$/, '$1').replace(/^.*rv:([\\d.]+).*$/, '$1'),\n    Edge: () => u.replace(/^.*(Edge|Edg|Edg[A-Z]{1})\\/([\\d.]+).*$/, '$2'),\n    Firefox: () => u.replace(/^.*Firefox\\/([\\d.]+).*$/, '$1').replace(/^.*FxiOS\\/([\\d.]+).*$/, '$1'),\n    'Firefox Focus': () => u.replace(/^.*Focus\\/([\\d.]+).*$/, '$1'),\n    Chromium: () => u.replace(/^.*Chromium\\/([\\d.]+).*$/, '$1'),\n    Opera: () => u.replace(/^.*Opera\\/([\\d.]+).*$/, '$1').replace(/^.*OPR\\/([\\d.]+).*$/, '$1'),\n    Vivaldi: () => u.replace(/^.*Vivaldi\\/([\\d.]+).*$/, '$1'),\n    Yandex: () => u.replace(/^.*YaBrowser\\/([\\d.]+).*$/, '$1'),\n    Kindle: () => u.replace(/^.*Version\\/([\\d.]+).*$/, '$1'),\n    Maxthon: () => u.replace(/^.*Maxthon\\/([\\d.]+).*$/, '$1'),\n    QQBrowser: () => u.replace(/^.*QQBrowser\\/([\\d.]+).*$/, '$1'),\n    QQ: () => u.replace(/^.*QQ\\/([\\d.]+).*$/, '$1'),\n    Baidu: () => u.replace(/^.*BIDUBrowser[\\s/]([\\d.]+).*$/, '$1'),\n    UC: () => u.replace(/^.*UC?Browser\\/([\\d.]+).*$/, '$1'),\n    Sogou: () => u.replace(/^.*SE ([\\d.X]+).*$/, '$1').replace(/^.*SogouMobileBrowser\\/([\\d.]+).*$/, '$1'),\n    '2345Explorer': () => u.replace(/^.*2345Explorer\\/([\\d.]+).*$/, '$1'),\n    TheWorld: () => u.replace(/^.*TheWorld ([\\d.]+).*$/, '$1'),\n    MIUI: () => u.replace(/^.*MiuiBrowser\\/([\\d.]+).*$/, '$1'),\n    Quark: () => u.replace(/^.*Quark\\/([\\d.]+).*$/, '$1'),\n    Qiyu: () => u.replace(/^.*Qiyu\\/([\\d.]+).*$/, '$1'),\n    Wechat: () => u.replace(/^.*MicroMessenger\\/([\\d.]+).*$/, '$1'),\n    Taobao: () => u.replace(/^.*AliApp\\(TB\\/([\\d.]+).*$/, '$1'),\n    Alipay: () => u.replace(/^.*AliApp\\(AP\\/([\\d.]+).*$/, '$1'),\n    Weibo: () => u.replace(/^.*weibo__([\\d.]+).*$/, '$1'),\n    Douban: () => u.replace(/^.*com.douban.frodo\\/([\\d.]+).*$/, '$1'),\n    Suning: () => u.replace(/^.*SNEBUY-APP([\\d.]+).*$/, '$1'),\n    iQiYi: () => u.replace(/^.*IqiyiVersion\\/([\\d.]+).*$/, '$1'),\n  }\n\n  dest.version = ''\n  if (version[dest.browser]) {\n    dest.version = version[dest.browser]()\n    if (dest.version === u) {\n      dest.version = ''\n    }\n  }\n\n  // 简化版本号\n  /* if (_this.osVersion.indexOf('.')) {\n    _this.osVersion = _this.osVersion.substring(0, _this.osVersion.indexOf('.'))\n  } */\n  if (dest.version.indexOf('.')) {\n    dest.version = dest.version.substring(0, dest.version.indexOf('.'))\n  }\n\n  // 修正\n  if (dest.os === 'iOS' && u.includes('iPad')) {\n    dest.os = 'iPadOS'\n  } else if (dest.browser === 'Edge' && !u.includes('Edg')) {\n    dest.engine = 'EdgeHTML'\n  } else if (dest.browser === 'MIUI') {\n    dest.os = 'Android'\n  } else if (dest.browser === 'Chrome' && Number(dest.version) > 27) {\n    dest.engine = 'Blink'\n  } else if (dest.browser === 'Opera' && Number(dest.version) > 12) {\n    dest.engine = 'Blink'\n  } else if (dest.browser === 'Yandex') {\n    dest.engine = 'Blink'\n  } else if (dest.browser === undefined) {\n    dest.browser = 'Unknow App'\n  }\n\n  return dest\n}\n\nexport default Detect\n","import * as Utils from '../lib/utils'\nimport $t from '../i18n'\n\nexport interface IHeightLimitConf {\n  /** After expand btn click */\n  afterExpandBtnClick?: () => void\n  /** Allow Scroll */\n  scrollable?: boolean\n}\n\nexport interface IHeightLimitRule {\n  /** Target element need to check */\n  el: HTMLElement | null | undefined\n\n  /** Max height (unit: px) */\n  max: number\n\n  /** Whether or not the element contains `<img />` */\n  imgCheck?: boolean\n}\n\nexport type THeightLimitRuleSet = IHeightLimitRule[]\n\n/** Check all elements below the max height limit */\nexport function check(conf: IHeightLimitConf, rules: THeightLimitRuleSet) {\n  rules.forEach(({ el, max, imgCheck }) => {\n    if (!el) return\n\n    // set max height for avoiding img exceed the limit while loading\n    if (imgCheck) el.style.maxHeight = `${max + 1}px` // allow 1px more for next detecting\n\n    let lock = false\n    const _check = () => {\n      if (lock) return\n      if (Utils.getHeight(el) <= max) return // if not exceed the limit, do nothing\n\n      const afterExpandBtnClick = () => {\n        lock = true // add lock to prevent collapse again after expand when image lazy loaded\n        conf.afterExpandBtnClick?.()\n      }\n\n      !conf.scrollable\n        ? applyHeightLimit({ el, max, afterExpandBtnClick })\n        : applyScrollableHeightLimit({ el, max })\n    }\n\n    // check immediately\n    _check()\n\n    // check images after loaded\n    if (imgCheck) {\n      // check again when image loaded\n      const imgs = el.querySelectorAll<HTMLImageElement>('.atk-content img')\n      if (imgs.length === 0) el.style.maxHeight = ''\n      imgs.forEach((img) => {\n        img.onload = () => _check()\n      })\n    }\n  })\n}\n\n/** Height limit CSS class name */\nconst HEIGHT_LIMIT_CSS = 'atk-height-limit'\n\n/** Apply height limit on an element and add expand btn */\nexport function applyHeightLimit(obj: {\n  el: HTMLElement\n  max: number\n  afterExpandBtnClick?: (e: MouseEvent) => void\n}) {\n  if (!obj.el) return\n  if (!obj.max) return\n  if (obj.el.classList.contains(HEIGHT_LIMIT_CSS)) return\n\n  obj.el.classList.add(HEIGHT_LIMIT_CSS)\n  obj.el.style.height = `${obj.max}px`\n  obj.el.style.overflow = 'hidden'\n\n  /* Expand button */\n  const $expandBtn = Utils.createElement(\n    `<div class=\"atk-height-limit-btn\">${$t('readMore')}</span>`,\n  )\n  $expandBtn.onclick = (e) => {\n    e.stopPropagation()\n    disposeHeightLimit(obj.el)\n\n    if (obj.afterExpandBtnClick) obj.afterExpandBtnClick(e)\n  }\n  obj.el.append($expandBtn)\n}\n\n/** Dispose height limit on an element and remove expand btn */\nexport function disposeHeightLimit($el: HTMLElement) {\n  if (!$el) return\n  if (!$el.classList.contains(HEIGHT_LIMIT_CSS)) return\n\n  $el.classList.remove(HEIGHT_LIMIT_CSS)\n  Array.from($el.children).forEach((e) => {\n    if (e.classList.contains('atk-height-limit-btn')) e.remove()\n  })\n  $el.style.height = ''\n  $el.style.maxHeight = ''\n  $el.style.overflow = ''\n}\n\n/** Height limit scrollable CSS class name */\nconst HEIGHT_LIMIT_SCROLL_CSS = 'atk-height-limit-scroll'\n\n/** Apply scrollable height limit */\nexport function applyScrollableHeightLimit(opt: { el: HTMLElement; max: number }) {\n  if (!opt.el) return\n  if (opt.el.classList.contains(HEIGHT_LIMIT_SCROLL_CSS)) return\n  opt.el.classList.add(HEIGHT_LIMIT_SCROLL_CSS)\n  opt.el.style.height = `${opt.max}px`\n}\n","export default \"<div class=\\\"atk-comment-wrap\\\">\\n  <div class=\\\"atk-comment\\\">\\n    <div class=\\\"atk-avatar\\\"></div>\\n    <div class=\\\"atk-main\\\">\\n      <div class=\\\"atk-header\\\">\\n        <span class=\\\"atk-item atk-nick\\\"></span>\\n        <span class=\\\"atk-badge-wrap\\\"></span>\\n        <span class=\\\"atk-item atk-date\\\"></span>\\n      </div>\\n      <div class=\\\"atk-body\\\">\\n        <div class=\\\"atk-content\\\"></div>\\n      </div>\\n      <div class=\\\"atk-footer\\\">\\n        <div class=\\\"atk-actions\\\"></div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\"","import * as Utils from '../../lib/utils'\nimport type Render from '../render'\n\n/**\n * 评论头像界面\n */\nexport default function renderAvatar(r: Render) {\n  const $avatar = r.$el.querySelector<HTMLElement>('.atk-avatar')!\n  const $avatarImg = Utils.createElement<HTMLImageElement>('<img />')\n\n  const avatarURLBuilder = r.opts.avatarURLBuilder\n  $avatarImg.src = avatarURLBuilder ? avatarURLBuilder(r.data) : r.comment.getGravatarURL()\n\n  if (r.data.link) {\n    const $avatarA = Utils.createElement<HTMLLinkElement>(\n      '<a target=\"_blank\" rel=\"noreferrer noopener nofollow\"></a>',\n    )\n    $avatarA.href = Utils.isValidURL(r.data.link) ? r.data.link : `https://${r.data.link}`\n    $avatarA.append($avatarImg)\n    $avatar.append($avatarA)\n  } else {\n    $avatar.append($avatarImg)\n  }\n}\n","import * as Utils from '../../lib/utils'\nimport type Render from '../render'\nimport $t from '@/i18n'\n\n/**\n * 评论头部界面\n */\nexport default function renderHeader(r: Render) {\n  Object.entries({\n    renderNick,\n    renderVerifyBadge,\n    renderDate,\n    renderUABadge,\n  }).forEach(([name, render]) => {\n    render(r)\n  })\n}\n\nfunction renderNick(r: Render) {\n  r.$headerNick = r.$el.querySelector<HTMLElement>('.atk-nick')!\n\n  if (r.data.link) {\n    const $nickA = Utils.createElement<HTMLLinkElement>(\n      '<a target=\"_blank\" rel=\"noreferrer noopener nofollow\"></a>',\n    )\n    $nickA.innerText = r.data.nick\n    $nickA.href = Utils.isValidURL(r.data.link) ? r.data.link : `https://${r.data.link}`\n    r.$headerNick.append($nickA)\n  } else {\n    r.$headerNick.innerText = r.data.nick\n  }\n}\n\nfunction renderVerifyBadge(ctx: Render) {\n  ctx.$headerBadgeWrap = ctx.$el.querySelector<HTMLElement>('.atk-badge-wrap')!\n  ctx.$headerBadgeWrap.innerHTML = ''\n\n  const badgeText = ctx.data.badge_name\n  const badgeColor = ctx.data.badge_color\n  if (badgeText) {\n    const $badge = Utils.createElement(`<span class=\"atk-badge\"></span>`)\n    $badge.innerText = badgeText.replace('管理员', $t('admin')) // i18n patch\n    $badge.style.backgroundColor = badgeColor || ''\n    ctx.$headerBadgeWrap.append($badge)\n  } else if (ctx.data.is_verified) {\n    const $verifiedBadge = Utils.createElement(\n      `<span class=\"atk-verified-icon\" title=\"${$t('emailVerified')}\"></span>`,\n    ) // 邮箱验证徽章\n    ctx.$headerBadgeWrap.append($verifiedBadge)\n  }\n\n  if (ctx.data.is_pinned) {\n    const $pinnedBadge = Utils.createElement(`<span class=\"atk-pinned-badge\">${$t('pin')}</span>`) // 置顶徽章\n    ctx.$headerBadgeWrap.append($pinnedBadge)\n  }\n}\n\nfunction renderDate(ctx: Render) {\n  const $date = ctx.$el.querySelector<HTMLElement>('.atk-date')!\n  $date.innerText = ctx.comment.getDateFormatted()\n  $date.setAttribute('data-atk-comment-date', String(+new Date(ctx.data.date)))\n}\n\nfunction renderUABadge(ctx: Render) {\n  if (!ctx.opts.uaBadge && !ctx.data.ip_region) return\n\n  let $uaWrap = ctx.$header.querySelector('atk-ua-wrap')\n  if (!$uaWrap) {\n    $uaWrap = Utils.createElement(`<span class=\"atk-ua-wrap\"></span>`)\n    ctx.$header.append($uaWrap)\n  }\n\n  $uaWrap.innerHTML = ''\n\n  if (ctx.data.ip_region) {\n    const $regionBadge = Utils.createElement(`<span class=\"atk-region-badge\"></span>`)\n    $regionBadge.innerText = ctx.data.ip_region\n    $uaWrap.append($regionBadge)\n  }\n\n  if (ctx.opts.uaBadge) {\n    const { browser, os } = ctx.comment.getUserUA()\n    if (String(browser).trim()) {\n      const $uaBrowser = Utils.createElement(`<span class=\"atk-ua ua-browser\"></span>`)\n      $uaBrowser.innerText = browser\n      $uaWrap.append($uaBrowser)\n    }\n\n    if (String(os).trim()) {\n      const $usOS = Utils.createElement(`<span class=\"atk-ua ua-os\"></span>`)\n      $usOS.innerText = os\n      $uaWrap.append($usOS)\n    }\n  }\n}\n","import * as Utils from '../../lib/utils'\nimport * as Ui from '../../lib/ui'\nimport type Render from '../render'\nimport $t from '@/i18n'\n\n/**\n * 评论内容界面\n */\nexport default function renderContent(r: Render) {\n  if (!r.data.is_collapsed) {\n    r.$content.innerHTML = r.comment.getContentMarked()\n    r.$content.classList.remove('atk-hide', 'atk-collapsed')\n    return\n  }\n\n  // 内容 & 折叠\n  r.$content.classList.add('atk-hide', 'atk-type-collapsed')\n  const collapsedInfoEl = Utils.createElement(`\n    <div class=\"atk-collapsed\">\n      <span class=\"atk-text\">${$t('collapsedMsg')}</span>\n      <span class=\"atk-show-btn\">${$t('expand')}</span>\n    </div>`)\n  r.$body.insertAdjacentElement('beforeend', collapsedInfoEl)\n\n  const contentShowBtn = collapsedInfoEl.querySelector<HTMLElement>('.atk-show-btn')!\n  contentShowBtn.addEventListener('click', (e) => {\n    e.stopPropagation() // 防止穿透\n\n    if (r.$content.classList.contains('atk-hide')) {\n      r.$content.innerHTML = r.comment.getContentMarked()\n      r.$content.classList.remove('atk-hide')\n      Ui.playFadeInAnim(r.$content)\n      contentShowBtn.innerText = $t('collapse')\n    } else {\n      r.$content.innerHTML = ''\n      r.$content.classList.add('atk-hide')\n      contentShowBtn.innerText = $t('expand')\n    }\n  })\n}\n","import * as Utils from '../../lib/utils'\nimport type Render from '../render'\n\n/**\n * Reply user indicator (with arrow icon) in the comment meta header\n */\nexport default function renderReplyAt(r: Render) {\n  if (r.opts.flatMode || r.data.rid === 0) return // if not nested mode or root comment\n  if (!r.opts.replyTo) return // if no replyTo data\n\n  r.$replyAt = Utils.createElement(\n    `<span class=\"atk-item atk-reply-at\"><span class=\"atk-arrow\"></span><span class=\"atk-nick\"></span></span>`,\n  )\n  r.$replyAt.querySelector<HTMLElement>('.atk-nick')!.innerText = `${r.opts.replyTo.nick}`\n  r.$replyAt.onclick = () => {\n    r.comment.getActions().goToReplyComment()\n  }\n\n  r.$headerBadgeWrap.insertAdjacentElement('afterend', r.$replyAt)\n}\n","import type Render from '../render'\nimport * as Utils from '@/lib/utils'\nimport marked from '@/lib/marked'\nimport $t from '@/i18n'\n\n/**\n * 关联评论显示 (被回复的评论)\n */\nexport default function renderReplyTo(r: Render) {\n  if (!r.opts.flatMode) return // 仅平铺模式显示\n  if (!r.opts.replyTo) return\n\n  r.$replyTo = Utils.createElement(`\n    <div class=\"atk-reply-to\">\n      <div class=\"atk-meta\">${$t('reply')} <span class=\"atk-nick\"></span>:</div>\n      <div class=\"atk-content\"></div>\n    </div>`)\n\n  // Comment author name\n  const $nick = r.$replyTo.querySelector<HTMLElement>('.atk-nick')!\n  $nick.innerText = `@${r.opts.replyTo.nick}`\n  $nick.onclick = () => {\n    r.comment.getActions().goToReplyComment()\n  }\n\n  // Comment content\n  let replyContent = marked(r.opts.replyTo.content)\n  if (r.opts.replyTo.is_collapsed) replyContent = `[${$t('collapsed')}]`\n  r.$replyTo.querySelector<HTMLElement>('.atk-content')!.innerHTML = replyContent\n\n  // Mount the replyTo element\n  r.$body.prepend(r.$replyTo)\n}\n","import * as Utils from '../../lib/utils'\nimport type Render from '../render'\nimport $t from '@/i18n'\n\n/**\n * 待审核状态界面\n */\nexport default function renderPending(r: Render) {\n  if (!r.data.is_pending) return\n\n  const pendingEl = Utils.createElement(`<div class=\"atk-pending\">${$t('pendingMsg')}</div>`)\n  r.$body.prepend(pendingEl)\n}\n","import * as Utils from '../lib/utils'\nimport $t from '@/i18n'\n\ninterface ActionBtnOptions {\n  /** 按钮文字 (动态/静态) */\n  text: (() => string) | string\n\n  /** 仅管理员可用 */\n  adminOnly?: boolean\n\n  /** 确认操作 */\n  confirm?: boolean\n\n  /** 确认时提示文字 */\n  confirmText?: string\n}\n\n/**\n * 通用操作按钮\n */\nexport default class ActionBtn {\n  private opts: ActionBtnOptions\n  public $el: HTMLElement\n\n  public isLoading = false // 正在加载\n\n  public msgRecTimer?: number // 消息显示复原定时器\n  public msgRecTimerFunc?: () => void // 消息显示复原操作\n  public get isMessaging() {\n    return !!this.msgRecTimer\n  } // 消息正在显示\n\n  public isConfirming = false // 正在确认\n  public confirmRecTimer?: number // 确认消息复原定时器\n\n  /** 构造函数 */\n  constructor(opts: ActionBtnOptions | string | (() => string)) {\n    this.$el = Utils.createElement(`<span class=\"atk-common-action-btn\"></span>`)\n\n    this.opts = typeof opts !== 'object' ? { text: opts } : opts\n    this.$el.innerText = this.getText()\n\n    // 仅管理员可操作\n    if (this.opts.adminOnly) this.$el.setAttribute('atk-only-admin-show', '')\n  }\n\n  /** 将按钮装载到指定元素 */\n  public appendTo(dom: HTMLElement) {\n    dom.append(this.$el)\n    return this\n  }\n\n  /** 获取按钮文字（动态/静态） */\n  private getText() {\n    return typeof this.opts.text === 'string' ? this.opts.text : this.opts.text()\n  }\n\n  /** 设置点击事件 */\n  public setClick(func: () => void) {\n    this.$el.onclick = (e) => {\n      e.stopPropagation() // 防止穿透\n\n      // 按钮处于加载状态，禁止点击\n      if (this.isLoading) {\n        return\n      }\n\n      // 操作确认\n      if (this.opts.confirm && !this.isMessaging) {\n        const confirmRestore = () => {\n          this.isConfirming = false\n          this.$el.classList.remove('atk-btn-confirm')\n          this.$el.innerText = this.getText()\n        }\n\n        if (!this.isConfirming) {\n          this.isConfirming = true\n          this.$el.classList.add('atk-btn-confirm')\n          this.$el.innerText = this.opts.confirmText || $t('actionConfirm')\n          this.confirmRecTimer = window.setTimeout(() => confirmRestore(), 5000)\n          return\n        }\n\n        if (this.confirmRecTimer) window.clearTimeout(this.confirmRecTimer)\n        confirmRestore()\n      }\n\n      // 立刻释放掉原有的定时器（当显示消息后，用户立刻点击时）\n      if (this.msgRecTimer) {\n        this.fireMsgRecTimer()\n        this.clearMsgRecTimer()\n        return\n      }\n\n      // 触发设定的点击事件\n      func()\n    }\n  }\n\n  /** 文字刷新（动态/静态） */\n  public updateText(text?: (() => string) | string) {\n    if (text) this.opts.text = text\n    this.setLoading(false)\n    this.$el.innerText = this.getText()\n  }\n\n  /** 设置加载状态 */\n  public setLoading(value: boolean, loadingText?: string) {\n    if (this.isLoading === value) return\n    this.isLoading = value\n    if (value) {\n      this.$el.classList.add('atk-btn-loading')\n      this.$el.innerText = loadingText || `${$t('loading')}...`\n    } else {\n      this.$el.classList.remove('atk-btn-loading')\n      this.$el.innerText = this.getText()\n    }\n  }\n\n  /** 错误消息 */\n  public setError(text: string) {\n    this.setMsg(text, 'atk-btn-error')\n  }\n\n  /** 警告消息 */\n  public setWarn(text: string) {\n    this.setMsg(text, 'atk-btn-warn')\n  }\n\n  /** 成功消息 */\n  public setSuccess(text: string) {\n    this.setMsg(text, 'atk-btn-success')\n  }\n\n  /** 设置消息 */\n  public setMsg(text: string, className?: string, duringTime?: number, after?: () => void) {\n    this.setLoading(false)\n    if (className) this.$el.classList.add(className)\n    this.$el.innerText = text\n\n    // 设定复原 timer\n    this.setMsgRecTimer(() => {\n      this.$el.innerText = this.getText()\n      if (className) this.$el.classList.remove(className)\n      if (after) after()\n    }, duringTime || 2500) // 消息默认显示持续 2500s\n  }\n\n  /** 设置消息复原操作定时器 */\n  private setMsgRecTimer(func: () => void, duringTime: number) {\n    this.fireMsgRecTimer()\n    this.clearMsgRecTimer()\n\n    this.msgRecTimerFunc = func\n    this.msgRecTimer = window.setTimeout(() => {\n      func()\n      this.clearMsgRecTimer()\n    }, duringTime)\n  }\n\n  /** 立刻触发器复原定时器 */\n  private fireMsgRecTimer() {\n    if (this.msgRecTimerFunc) this.msgRecTimerFunc()\n  }\n\n  /** 仅清除 timer */\n  private clearMsgRecTimer() {\n    if (this.msgRecTimer) window.clearTimeout(this.msgRecTimer)\n    this.msgRecTimer = undefined\n    this.msgRecTimerFunc = undefined\n  }\n}\n","import * as Utils from '../../lib/utils'\nimport ActionBtn from '../../components/action-btn'\nimport type Render from '../render'\nimport $t from '@/i18n'\n\n/**\n * 评论操作按钮界面\n */\nexport default function renderActions(r: Render) {\n  Object.entries({\n    renderVote,\n    renderReply,\n    // 管理员操作\n    renderCollapse,\n    renderModerator,\n    renderPin,\n    renderEdit,\n    renderDel,\n  }).forEach(([name, render]) => {\n    render(r)\n  })\n}\n\n// 操作按钮 - 投票\nfunction renderVote(r: Render) {\n  if (!r.opts.vote) return // 关闭投票功能\n\n  // 赞同按钮\n  r.voteBtnUp = new ActionBtn(() => `${$t('voteUp')} (${r.data.vote_up || 0})`).appendTo(r.$actions)\n  r.voteBtnUp.setClick(() => {\n    r.comment.getActions().vote('up')\n  })\n\n  // 反对按钮\n  if (r.opts.voteDown) {\n    r.voteBtnDown = new ActionBtn(() => `${$t('voteDown')} (${r.data.vote_down || 0})`).appendTo(\n      r.$actions,\n    )\n    r.voteBtnDown.setClick(() => {\n      r.comment.getActions().vote('down')\n    })\n  }\n}\n\n// 操作按钮 - 回复\nfunction renderReply(r: Render) {\n  if (!r.data.is_allow_reply) return // 不允许回复\n\n  const replyBtn = Utils.createElement(`<span>${$t('reply')}</span>`)\n  r.$actions.append(replyBtn)\n  replyBtn.addEventListener('click', (e) => {\n    e.stopPropagation() // 防止穿透\n    r.opts.replyComment(r.data, r.$el)\n  })\n}\n\n// 操作按钮 - 折叠\nfunction renderCollapse(r: Render) {\n  const collapseBtn = new ActionBtn({\n    text: () => (r.data.is_collapsed ? $t('expand') : $t('collapse')),\n    adminOnly: true,\n  })\n  collapseBtn.appendTo(r.$actions)\n  collapseBtn.setClick(() => {\n    r.comment.getActions().adminEdit('collapsed', collapseBtn)\n  })\n}\n\n// 操作按钮 - 审核\nfunction renderModerator(r: Render) {\n  const pendingBtn = new ActionBtn({\n    text: () => (r.data.is_pending ? $t('pending') : $t('approved')),\n    adminOnly: true,\n  })\n  pendingBtn.appendTo(r.$actions)\n  pendingBtn.setClick(() => {\n    r.comment.getActions().adminEdit('pending', pendingBtn)\n  })\n}\n\n// 操作按钮 - 置顶\nfunction renderPin(r: Render) {\n  const pinnedBtn = new ActionBtn({\n    text: () => (r.data.is_pinned ? $t('unpin') : $t('pin')),\n    adminOnly: true,\n  })\n  pinnedBtn.appendTo(r.$actions)\n  pinnedBtn.setClick(() => {\n    r.comment.getActions().adminEdit('pinned', pinnedBtn)\n  })\n}\n\n// 操作按钮 - 编辑\nfunction renderEdit(r: Render) {\n  const editBtn = new ActionBtn({\n    text: $t('edit'),\n    adminOnly: true,\n  })\n  editBtn.appendTo(r.$actions)\n  editBtn.setClick(() => {\n    r.opts.editComment(r.data, r.$el)\n  })\n}\n\n// 操作按钮 - 删除\nfunction renderDel(r: Render) {\n  const delBtn = new ActionBtn({\n    text: $t('delete'),\n    confirm: true,\n    confirmText: $t('deleteConfirm'),\n    adminOnly: true,\n  })\n  delBtn.appendTo(r.$actions)\n  delBtn.setClick(() => {\n    r.comment.getActions().adminDelete(delBtn)\n  })\n}\n","import type Render from '../render'\nimport Avatar from './avatar'\nimport Header from './header'\nimport Content from './content'\nimport ReplyAt from './reply-at'\nimport ReplyTo from './reply-to'\nimport Pending from './pending'\nimport Actions from './actions'\n\nconst Renders = {\n  Avatar,\n  Header,\n  Content,\n  ReplyAt,\n  ReplyTo,\n  Pending,\n  Actions,\n}\n\nexport default function loadRenders(r: Render) {\n  Object.entries(Renders).forEach(([name, render]) => {\n    render(r)\n  })\n}\n","import ActionBtn from '../components/action-btn'\nimport * as Utils from '../lib/utils'\nimport * as Ui from '../lib/ui'\n\nimport * as HeightLimit from './height-limit'\nimport CommentHTML from './comment.html?raw'\nimport loadRenders from './renders'\nimport type { CommentNode } from '.'\n\nexport default class Render {\n  public comment: CommentNode\n\n  public get data() {\n    return this.comment.getData()\n  }\n  public get opts() {\n    return this.comment.getOpts()\n  }\n\n  public $el!: HTMLElement\n  public $main!: HTMLElement\n  public $header!: HTMLElement\n  public $headerNick!: HTMLElement\n  public $headerBadgeWrap!: HTMLElement\n  public $body!: HTMLElement\n  public $content!: HTMLElement\n  public $childrenWrap!: HTMLElement | null\n  public $actions!: HTMLElement\n  public voteBtnUp?: ActionBtn\n  public voteBtnDown?: ActionBtn\n\n  public $replyTo?: HTMLElement // 回复评论内容 (平铺下显示)\n  public $replyAt?: HTMLElement // 回复 AT（层级嵌套下显示）\n\n  public constructor(comment: CommentNode) {\n    this.comment = comment\n  }\n\n  /**\n   * Render the comment ui\n   *\n   * If comment data is updated, call this method to re-render the comment ui.\n   * The method will be called multiple times, so it should be idempotent.\n   *\n   * Renders may add event listeners to the comment ui, so it should be called only once or override the original.\n   * Please be aware of the memory leak caused by the event listener.\n   */\n  public render() {\n    // init ui elements\n    this.$el = Utils.createElement(CommentHTML)\n\n    this.$main = this.$el.querySelector('.atk-main')!\n    this.$header = this.$el.querySelector('.atk-header')!\n    this.$body = this.$el.querySelector('.atk-body')!\n    this.$content = this.$body.querySelector('.atk-content')!\n    this.$actions = this.$el.querySelector('.atk-actions')!\n\n    this.$el.setAttribute('id', `atk-comment-${this.data.id}`)\n\n    // call all renders\n    loadRenders(this)\n\n    // append children wrap if exists\n    if (this.$childrenWrap) {\n      this.$main.append(this.$childrenWrap)\n    }\n\n    return this.$el\n  }\n\n  /** 内容限高检测 */\n  public checkHeightLimit() {\n    const conf = this.opts.heightLimit\n    if (!conf || !conf.content || !conf.children) return // 关闭限高\n\n    const contentMaxH = conf.content\n    const childrenMaxH = conf.children\n\n    HeightLimit.check(\n      {\n        afterExpandBtnClick: () => {\n          // 子评论数仅有 1，直接取消限高\n          const children = this.comment.getChildren()\n          if (children.length === 1)\n            HeightLimit.disposeHeightLimit(children[0].getRender().$content)\n        },\n        scrollable: conf.scrollable,\n      },\n      [\n        // 评论内容限高\n        { el: this.$content, max: contentMaxH, imgCheck: true },\n        { el: this.$replyTo, max: contentMaxH, imgCheck: true },\n        // 子评论区域限高（仅嵌套模式）\n        { el: this.$childrenWrap, max: childrenMaxH, imgCheck: false },\n      ],\n    )\n  }\n\n  /** 子评论区域移除限高 */\n  public heightLimitRemoveForChildren() {\n    if (!this.$childrenWrap) return\n    HeightLimit.disposeHeightLimit(this.$childrenWrap)\n  }\n\n  /** 渐出动画 */\n  playFadeAnim() {\n    Ui.playFadeInAnim(this.comment.getRender().$el)\n  }\n\n  /** 渐出动画 · 评论内容区域 */\n  playFadeAnimForBody() {\n    Ui.playFadeInAnim(this.comment.getRender().$body)\n  }\n\n  /** Perform the flash animation */\n  playFlashAnim() {\n    // Make sure the class is removed\n    this.$el.classList.remove('atk-flash-once')\n    window.setTimeout(() => {\n      // Add the class to perform the animation\n      this.$el.classList.add('atk-flash-once')\n    }, 150)\n  }\n\n  /** 获取子评论 Wrap */\n  public getChildrenWrap() {\n    if (!this.$childrenWrap) {\n      // if not exists, create a new one\n      this.$childrenWrap = Utils.createElement('<div class=\"atk-comment-children\"></div>')\n      this.$main.append(this.$childrenWrap)\n    }\n    return this.$childrenWrap\n  }\n\n  /** 设置已读 */\n  public setUnread(val: boolean) {\n    if (val) this.$el.classList.add('atk-unread')\n    else this.$el.classList.remove('atk-unread')\n  }\n\n  /** 设置为可点击的评论 */\n  public setOpenable(val: boolean) {\n    if (val) this.$el.classList.add('atk-openable')\n    else this.$el.classList.remove('atk-openable')\n  }\n\n  /** 设置点击评论打开置顶 URL */\n  public setOpenURL(url: string) {\n    this.setOpenable(true)\n    this.$el.onclick = (evt) => {\n      evt.stopPropagation()\n      window.open(url)\n    }\n  }\n\n  /** 设置点击评论时的操作 */\n  public setOpenAction(action: () => void) {\n    this.setOpenable(true)\n    this.$el.onclick = (evt) => {\n      evt.stopPropagation()\n      action()\n    }\n  }\n}\n","import type { CommentNode } from '.'\nimport ActionBtn from '@/components/action-btn'\nimport $t from '@/i18n'\n\nexport default class CommentActions {\n  private comment: CommentNode\n\n  private get data() {\n    return this.comment.getData()\n  }\n  private get opts() {\n    return this.comment.getOpts()\n  }\n  private getApi() {\n    return this.comment.getOpts().getApi()\n  }\n\n  public constructor(comment: CommentNode) {\n    this.comment = comment\n  }\n\n  /** 投票操作 */\n  public vote(type: 'up' | 'down') {\n    const actionBtn =\n      type === 'up' ? this.comment.getRender().voteBtnUp : this.comment.getRender().voteBtnDown\n\n    this.getApi()\n      .votes.vote(`comment_${type}`, this.data.id, {\n        ...this.getApi().getUserFields(),\n      })\n      .then((res) => {\n        this.data.vote_up = res.data.up\n        this.data.vote_down = res.data.down\n        this.comment.getRender().voteBtnUp?.updateText()\n        this.comment.getRender().voteBtnDown?.updateText()\n      })\n      .catch((err) => {\n        actionBtn?.setError($t('voteFail'))\n        console.error(err)\n      })\n  }\n\n  /** 管理员 - 评论状态修改 */\n  public adminEdit(type: 'collapsed' | 'pending' | 'pinned', btnElem: ActionBtn) {\n    if (btnElem.isLoading) return // 若正在修改中\n\n    btnElem.setLoading(true, `${$t('editing')}...`)\n\n    // 克隆并修改当前数据\n    const modify = { ...this.data }\n    if (type === 'collapsed') {\n      modify.is_collapsed = !modify.is_collapsed\n    } else if (type === 'pending') {\n      modify.is_pending = !modify.is_pending\n    } else if (type === 'pinned') {\n      modify.is_pinned = !modify.is_pinned\n    }\n\n    this.getApi()\n      .comments.updateComment(this.data.id, {\n        ...modify,\n      })\n      .then((res) => {\n        btnElem.setLoading(false)\n\n        // 刷新当前 Comment UI\n        this.comment.setData(res.data)\n      })\n      .catch((err) => {\n        console.error(err)\n        btnElem.setError($t('editFail'))\n      })\n  }\n\n  /** 管理员 - 评论删除 */\n  public adminDelete(btnElem: ActionBtn) {\n    if (btnElem.isLoading) return // 若正在删除中\n\n    btnElem.setLoading(true, `${$t('deleting')}...`)\n    this.getApi()\n      .comments.deleteComment(this.data.id)\n      .then(() => {\n        btnElem.setLoading(false)\n        if (this.opts.onDelete) this.opts.onDelete(this.comment)\n      })\n      .catch((e) => {\n        console.error(e)\n        btnElem.setError($t('deleteFail'))\n      })\n  }\n\n  /** 快速跳转到该评论 */\n  public goToReplyComment() {\n    const origHash = window.location.hash\n    const modifyHash = `#atk-comment-${this.data.rid}`\n\n    window.location.hash = modifyHash\n    if (modifyHash === origHash) window.dispatchEvent(new Event('hashchange')) // 强制触发事件\n  }\n}\n","import type { Api } from '../api'\nimport * as Ui from '../lib/ui'\nimport * as Utils from '../lib/utils'\nimport marked from '../lib/marked'\nimport UADetect from '../lib/detect'\nimport CommentUI from './render'\nimport CommentActions from './actions'\nimport $t from '@/i18n'\nimport type { CommentData, ArtalkConfig, ContextApi } from '@/types'\n\nexport interface CommentOptions {\n  // Hooks\n  onAfterRender?: () => void\n  onDelete?: (c: CommentNode) => void\n\n  /** The comment being replied to (linked comment) */\n  replyTo?: CommentData\n\n  // Referenced from ArtalkConfig\n  flatMode: boolean\n  vote: boolean\n  voteDown: boolean\n  uaBadge: boolean\n  nestMax: number\n  gravatar: ArtalkConfig['gravatar']\n  heightLimit: ArtalkConfig['heightLimit']\n  avatarURLBuilder: ArtalkConfig['avatarURLBuilder']\n  scrollRelativeTo: ArtalkConfig['scrollRelativeTo']\n  dateFormatter: ArtalkConfig['dateFormatter']\n\n  // TODO: Move to plugin folder and remove from core\n  getApi: () => Api\n  replyComment: ContextApi['replyComment']\n  editComment: ContextApi['editComment']\n}\n\nexport default class CommentNode {\n  $el?: HTMLElement\n\n  private renderInstance: CommentUI\n  private actionInstance: CommentActions\n\n  private data: CommentData\n  private opts: CommentOptions\n\n  private parent: CommentNode | null\n  private children: CommentNode[] = []\n\n  private nestCurt: number // 当前嵌套层数\n\n  constructor(data: CommentData, opts: CommentOptions) {\n    this.opts = opts\n    this.data = { ...data }\n    this.data.date = this.data.date.replace(/-/g, '/') // 解决 Safari 日期解析 NaN 问题\n\n    this.parent = null\n    this.nestCurt = 1 // 现在已嵌套 n 层\n\n    this.actionInstance = new CommentActions(this)\n    this.renderInstance = new CommentUI(this)\n  }\n\n  /** 渲染 UI */\n  public render() {\n    const newEl = this.renderInstance.render()\n\n    if (this.$el) this.$el.replaceWith(newEl)\n    this.$el = newEl\n    // Please be aware of the memory leak, the $el may be replaced multiple times.\n    // If somewhere else has a reference to the old $el, it will cause a memory leak.\n    // So it's limited to use the $el reference by `getEl()`.\n    // The `getEl()` will always return the latest $el.\n\n    if (this.opts.onAfterRender) this.opts.onAfterRender()\n  }\n\n  /** 获取评论操作实例对象 */\n  public getActions() {\n    return this.actionInstance\n  }\n\n  /** 获取评论渲染器实例对象 */\n  public getRender() {\n    return this.renderInstance\n  }\n\n  /** 获取评论数据 */\n  public getData() {\n    return this.data\n  }\n\n  /** 设置数据 */\n  public setData(data: CommentData) {\n    this.data = data\n\n    this.render()\n    this.getRender().playFadeAnimForBody()\n  }\n\n  /** 获取父评论 */\n  public getParent() {\n    return this.parent\n  }\n\n  /** 获取所有子评论 */\n  public getChildren() {\n    return this.children\n  }\n\n  /** 获取当前嵌套层数 */\n  public getNestCurt() {\n    return this.nestCurt\n  }\n\n  /** 判断是否为根评论 */\n  public getIsRoot() {\n    return this.data.rid === 0\n  }\n\n  /** 获取评论 ID */\n  public getID() {\n    return this.data.id\n  }\n\n  /** 置入子评论 */\n  public putChild(childNode: CommentNode, insertMode: 'append' | 'prepend' = 'append') {\n    childNode.parent = this\n    childNode.nestCurt = this.nestCurt + 1 // 嵌套层数 +1\n    this.children.push(childNode)\n\n    const $childrenWrap = this.getChildrenWrapEl()\n    const $childComment = childNode.getEl()\n    if (insertMode === 'append') $childrenWrap.append($childComment)\n    else if (insertMode === 'prepend') $childrenWrap.prepend($childComment)\n\n    childNode.getRender().playFadeAnim()\n    childNode.getRender().checkHeightLimit() // 内容限高\n  }\n\n  /** 获取存放子评论的元素对象 */\n  public getChildrenWrapEl(): HTMLElement {\n    // console.log(this.nestCurt)\n    if (this.nestCurt >= this.opts.nestMax) {\n      return this.parent!.getChildrenWrapEl()\n    }\n    return this.getRender().getChildrenWrap()\n  }\n\n  /** 获取所有父评论 */\n  public getParents() {\n    const flattenParents: CommentNode[] = []\n    let parent = this.parent\n    while (parent) {\n      flattenParents.push(parent)\n      parent = parent.getParent()\n    }\n    return flattenParents\n  }\n\n  /**\n   * Get the element of the comment\n   *\n   * The `getEl()` will always return the latest $el after calling `render()`.\n   * Please be aware of the memory leak if you use the $el reference directly.\n   */\n  public getEl() {\n    if (!this.$el) throw new Error('comment element not initialized before `getEl()`')\n    return this.$el\n  }\n\n  /**\n   * Focus on the comment\n   *\n   * Scroll to the comment and perform flash animation\n   */\n  focus() {\n    if (!this.$el) throw new Error('comment element not initialized before `focus()`')\n\n    // 若父评论存在 “子评论部分” 限高，取消限高\n    this.getParents().forEach((p) => {\n      p.getRender().heightLimitRemoveForChildren()\n    })\n\n    // Scroll to comment\n    this.scrollIntoView()\n\n    // Perform flash animation\n    this.getRender().playFlashAnim()\n  }\n\n  scrollIntoView() {\n    this.$el &&\n      Ui.scrollIntoView(this.$el, false, this.opts.scrollRelativeTo && this.opts.scrollRelativeTo())\n  }\n\n  /**\n   * Remove the comment node\n   */\n  remove() {\n    this.$el?.remove()\n  }\n\n  /** 获取 Gravatar 头像 URL */\n  public getGravatarURL() {\n    return Utils.getGravatarURL({\n      mirror: this.opts.gravatar.mirror,\n      params: this.opts.gravatar.params,\n      emailHash: this.data.email_encrypted,\n    })\n  }\n\n  /** 获取评论 markdown 解析后的内容 */\n  public getContentMarked() {\n    return marked(this.data.content)\n  }\n\n  /** 获取格式化后的日期 */\n  public getDateFormatted() {\n    const date = new Date(this.data.date)\n    return this.opts.dateFormatter?.(date) || Utils.timeAgo(date, $t)\n  }\n\n  /** 获取用户 UserAgent 信息 */\n  public getUserUA() {\n    const info = UADetect(this.data.ua)\n    return {\n      browser: `${info.browser} ${info.version}`,\n      os: `${info.os} ${info.osVersion}`,\n    }\n  }\n\n  /** 获取配置 */\n  public getOpts() {\n    return this.opts\n  }\n}\n","import type { ContextApi, CommentData } from '@/types'\nimport { CommentNode } from '@/comment'\n\ninterface CreateCommentNodeOptions {\n  forceFlatMode?: boolean\n}\n\nexport function createCommentNode(\n  ctx: ContextApi,\n  comment: CommentData,\n  replyComment?: CommentData,\n  opts?: CreateCommentNodeOptions,\n): CommentNode {\n  const instance = new CommentNode(comment, {\n    onAfterRender: () => {\n      ctx.trigger('comment-rendered', instance)\n    },\n    onDelete: (c: CommentNode) => {\n      ctx.getData().deleteComment(c.getID())\n    },\n\n    replyTo: replyComment,\n\n    // TODO simplify reference\n    flatMode:\n      typeof opts?.forceFlatMode === 'boolean'\n        ? opts?.forceFlatMode\n        : (ctx.conf.flatMode as boolean),\n    gravatar: ctx.conf.gravatar,\n    nestMax: ctx.conf.nestMax,\n    heightLimit: ctx.conf.heightLimit,\n    avatarURLBuilder: ctx.conf.avatarURLBuilder,\n    scrollRelativeTo: ctx.conf.scrollRelativeTo,\n    vote: ctx.conf.vote,\n    voteDown: ctx.conf.voteDown,\n    uaBadge: ctx.conf.uaBadge,\n    dateFormatter: ctx.conf.dateFormatter,\n\n    // TODO: move to plugin folder and remove from core\n    getApi: () => ctx.getApi(),\n    replyComment: (c, $el) => ctx.replyComment(c, $el),\n    editComment: (c, $el) => ctx.editComment(c, $el),\n  })\n\n  // 渲染元素\n  instance.render()\n\n  return instance\n}\n","import * as Utils from '../lib/utils'\n\nexport interface ReadMoreBtnOptions {\n  /** 回调函数 */\n  onClick: (offset: number) => void\n\n  pageSize: number\n\n  text?: string\n}\n\n/**\n * 阅读更多按钮\n */\nexport default class ReadMoreBtn {\n  public opts: ReadMoreBtnOptions\n  public $el: HTMLElement\n  private $loading: HTMLElement\n  private $text: HTMLElement\n  private offset: number = 0\n  private total: number = 0\n  private origText: string = 'Load More'\n\n  /** 是否有更多内容 */\n  get hasMore() {\n    return this.total > this.offset + this.opts.pageSize\n  }\n\n  public constructor(opts: ReadMoreBtnOptions) {\n    this.opts = opts\n    this.origText = this.opts.text || this.origText\n\n    this.$el = Utils.createElement(\n      `<div class=\"atk-list-read-more\" style=\"display: none;\">\n      <div class=\"atk-list-read-more-inner\">\n        <div class=\"atk-loading-icon\" style=\"display: none;\"></div>\n        <span class=\"atk-text\">${this.origText}</span>\n      </div>\n    </div>`,\n    )\n\n    this.$loading = this.$el.querySelector<HTMLElement>('.atk-loading-icon')!\n    this.$text = this.$el.querySelector<HTMLElement>('.atk-text')!\n\n    this.$el.onclick = () => {\n      this.click()\n    }\n  }\n\n  click() {\n    if (this.hasMore) this.opts.onClick(this.offset + this.opts.pageSize)\n    this.checkDisabled()\n  }\n\n  /** 显示 */\n  show() {\n    this.$el.style.display = ''\n  }\n\n  /** 隐藏 */\n  hide() {\n    this.$el.style.display = 'none'\n  }\n\n  /** 加载 */\n  setLoading(isLoading: boolean) {\n    this.$loading.style.display = isLoading ? '' : 'none'\n    this.$text.style.display = isLoading ? 'none' : ''\n  }\n\n  /** 错误提示 */\n  showErr(errMsg: string) {\n    this.setLoading(false)\n\n    this.$text.innerText = errMsg\n    this.$el.classList.add('atk-err')\n    window.setTimeout(() => {\n      this.$text.innerText = this.origText\n      this.$el.classList.remove('atk-err')\n    }, 2000) // 2s后错误提示复原\n  }\n\n  /** 更新数据 */\n  public update(offset: number, total: number) {\n    this.offset = offset\n    this.total = total\n\n    this.checkDisabled()\n  }\n\n  public checkDisabled() {\n    if (this.hasMore) this.show()\n    else this.hide()\n  }\n}\n","import type { Paginator, IPgHolderOpt } from '.'\nimport type { ListFetchParams } from '@/types'\nimport ReadMoreBtn from '@/components/read-more-btn'\nimport $t from '@/i18n'\n\n/**\n * 阅读更多形式的分页\n */\nexport default class ReadMorePaginator implements Paginator {\n  private instance!: ReadMoreBtn\n  private onReachedBottom: (() => void) | null = null\n  private opt!: IPgHolderOpt\n\n  create(opt: IPgHolderOpt) {\n    this.opt = opt\n\n    this.instance = new ReadMoreBtn({\n      pageSize: opt.pageSize,\n      onClick: async (o) => {\n        opt.ctx.fetch({\n          offset: o,\n        })\n      },\n      text: $t('loadMore'),\n    })\n\n    // 滚动到底部自动加载\n    if (opt.readMoreAutoLoad) {\n      this.onReachedBottom = () => {\n        if (!this.instance.hasMore || this.opt.ctx.getData().getLoading()) return\n        this.instance.click()\n      }\n      this.opt.ctx.on('list-reach-bottom', this.onReachedBottom)\n    }\n\n    return this.instance.$el\n  }\n\n  setLoading(val: boolean) {\n    this.instance.setLoading(val)\n  }\n\n  update(offset: number, total: number) {\n    this.instance.update(offset, total)\n  }\n\n  showErr(msg: string) {\n    this.instance.showErr(msg)\n  }\n\n  next() {\n    this.instance.click()\n  }\n\n  getHasMore(): boolean {\n    return this.instance.hasMore\n  }\n\n  getIsClearComments(params: { offset?: number }): boolean {\n    return params.offset === 0\n  }\n\n  dispose(): void {\n    this.onReachedBottom && this.opt.ctx.off('list-reach-bottom', this.onReachedBottom)\n    this.instance.$el.remove()\n  }\n}\n","import * as Utils from '../lib/utils'\nimport * as Ui from '../lib/ui'\n\nexport interface PaginationOptions {\n  /** 每页条数 */\n  pageSize: number\n\n  /** 回调函数 */\n  onChange: (offset: number) => void\n}\n\nexport default class Pagination {\n  private opts: PaginationOptions\n  public total: number\n  public $el: HTMLElement\n  public $input: HTMLInputElement\n  public inputTimer?: number\n  public $prevBtn: HTMLElement\n  public $nextBtn: HTMLElement\n\n  public page: number = 1\n  get pageSize(): number {\n    return this.opts.pageSize\n  }\n  get offset(): number {\n    return this.pageSize * (this.page - 1)\n  }\n  get maxPage(): number {\n    return Math.ceil(this.total / this.pageSize)\n  }\n\n  public constructor(total: number, opts: PaginationOptions) {\n    this.total = total\n    this.opts = opts\n\n    this.$el = Utils.createElement(\n      `<div class=\"atk-pagination-wrap\">\n        <div class=\"atk-pagination\">\n          <div class=\"atk-btn atk-btn-prev\" aria-label=\"Previous page\">\n            <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\" height=\"14px\" width=\"14px\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M217.9 256L345 129c9.4-9.4 9.4-24.6 0-33.9-9.4-9.4-24.6-9.3-34 0L167 239c-9.1 9.1-9.3 23.7-.7 33.1L310.9 417c4.7 4.7 10.9 7 17 7s12.3-2.3 17-7c9.4-9.4 9.4-24.6 0-33.9L217.9 256z\"></path></svg>\n          </div>\n          <input type=\"text\" class=\"atk-input\" aria-label=\"Enter the number of page\" />\n          <div class=\"atk-btn atk-btn-next\" aria-label=\"Next page\">\n            <svg stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" viewBox=\"0 0 512 512\" height=\"14px\" width=\"14px\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M294.1 256L167 129c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.3 34 0L345 239c9.1 9.1 9.3 23.7.7 33.1L201.1 417c-4.7 4.7-10.9 7-17 7s-12.3-2.3-17-7c-9.4-9.4-9.4-24.6 0-33.9l127-127.1z\"></path></svg>\n          </div>\n        </div>\n      </div>`,\n    )\n    this.$input = this.$el.querySelector('.atk-input')!\n    this.$input.value = `${this.page}`\n\n    this.$input.oninput = () => this.input()\n    this.$input.onkeydown = (e) => this.keydown(e)\n\n    this.$prevBtn = this.$el.querySelector('.atk-btn-prev')!\n    this.$nextBtn = this.$el.querySelector('.atk-btn-next')!\n\n    this.$prevBtn.onclick = () => this.prev()\n    this.$nextBtn.onclick = () => this.next()\n\n    this.checkDisabled()\n  }\n\n  public update(offset: number, total: number) {\n    this.page = Math.ceil(offset / this.pageSize) + 1\n    this.total = total\n\n    this.setInput(this.page)\n    this.checkDisabled()\n  }\n\n  public setInput(page: number) {\n    this.$input.value = `${page}`\n  }\n\n  public input(now: boolean = false) {\n    window.clearTimeout(this.inputTimer)\n\n    const value = this.$input.value.trim()\n\n    const modify = () => {\n      if (value === '') {\n        this.setInput(this.page)\n        return\n      }\n      let page = Number(value)\n      if (Number.isNaN(page)) {\n        this.setInput(this.page)\n        return\n      }\n      if (page < 1) {\n        this.setInput(this.page)\n        return\n      }\n      if (page > this.maxPage) {\n        this.setInput(this.maxPage)\n        page = this.maxPage\n      }\n      this.change(page)\n    }\n\n    // 延迟 800ms 执行\n    if (!now) this.inputTimer = window.setTimeout(() => modify(), 800)\n    else modify()\n  }\n\n  public prev() {\n    const page = this.page - 1\n    if (page < 1) {\n      return\n    }\n    this.change(page)\n  }\n\n  public next() {\n    const page = this.page + 1\n    if (page > this.maxPage) {\n      return\n    }\n    this.change(page)\n  }\n\n  public getHasMore() {\n    return this.page + 1 <= this.maxPage\n  }\n\n  public change(page: number) {\n    this.page = page\n    this.opts.onChange(this.offset)\n    this.setInput(page)\n    this.checkDisabled()\n  }\n\n  public checkDisabled() {\n    if (this.page + 1 > this.maxPage) {\n      this.$nextBtn.classList.add('atk-disabled')\n    } else {\n      this.$nextBtn.classList.remove('atk-disabled')\n    }\n\n    if (this.page - 1 < 1) {\n      this.$prevBtn.classList.add('atk-disabled')\n    } else {\n      this.$prevBtn.classList.remove('atk-disabled')\n    }\n  }\n\n  public keydown(e: KeyboardEvent) {\n    const keyCode = e.keyCode || e.which\n\n    if (keyCode === 38) {\n      // 上键\n      const page = Number(this.$input.value) + 1\n      if (page > this.maxPage) {\n        return\n      }\n      this.setInput(page)\n      this.input()\n    } else if (keyCode === 40) {\n      // 下键\n      const page = Number(this.$input.value) - 1\n      if (page < 1) {\n        return\n      }\n      this.setInput(page)\n      this.input()\n    } else if (keyCode === 13) {\n      // 回车\n      this.input(true)\n    }\n  }\n\n  /** 加载 */\n  setLoading(isLoading: boolean) {\n    if (isLoading) Ui.showLoading(this.$el)\n    else Ui.hideLoading(this.$el)\n  }\n}\n","import type { Paginator, IPgHolderOpt } from '.'\nimport PaginationComponent from '@/components/pagination'\n\n/**\n * 翻页形式的分页\n */\nexport default class UpDownPaginator implements Paginator {\n  private instance!: PaginationComponent\n\n  create(opt: IPgHolderOpt) {\n    this.instance = new PaginationComponent(opt.total, {\n      pageSize: opt.pageSize,\n      onChange: async (o) => {\n        opt.ctx.editorResetState() // 防止评论框被吞\n\n        opt.ctx.fetch({\n          offset: o,\n          onSuccess: () => {\n            opt.ctx.listGotoFirst()\n          },\n        })\n      },\n    })\n\n    return this.instance.$el\n  }\n\n  setLoading(val: boolean) {\n    this.instance.setLoading(val)\n  }\n\n  update(offset: number, total: number) {\n    this.instance.update(offset, total)\n  }\n\n  next() {\n    this.instance.next()\n  }\n\n  getHasMore(): boolean {\n    return this.instance.getHasMore()\n  }\n\n  getIsClearComments(): boolean {\n    return true\n  }\n\n  dispose(): void {\n    this.instance.$el.remove()\n  }\n}\n","import { Paginator } from './paginator'\nimport ReadMorePaginator from './paginator/read-more'\nimport UpDownPaginator from './paginator/up-down'\nimport $t from '@/i18n'\nimport type { ArtalkConfig, ContextApi } from '@/types'\n\nfunction createPaginatorByConf(conf: Pick<ArtalkConfig, 'pagination'>): Paginator {\n  if (conf.pagination.readMore) return new ReadMorePaginator()\n  return new UpDownPaginator()\n}\n\nfunction getPageDataByLastData(ctx: ContextApi): {\n  offset: number\n  total: number\n} {\n  const last = ctx.getData().getListLastFetch()\n  const r = { offset: 0, total: 0 }\n  if (!last) return r\n\n  r.offset = last.params.offset\n  if (last.data) r.total = last.params.flatMode ? last.data.count : last.data.roots_count\n\n  return r\n}\n\nexport const initListPaginatorFunc = (ctx: ContextApi) => {\n  let paginator: Paginator | null = null\n\n  // Init paginator when conf loaded\n  ctx.watchConf(['pagination', 'locale'], (conf) => {\n    const list = ctx.get('list')\n\n    if (paginator) paginator.dispose() // if had been init, dispose it\n\n    // create paginator instance\n    paginator = createPaginatorByConf(conf)\n\n    // create paginator dom\n    const { offset, total } = getPageDataByLastData(ctx)\n    const $paginator = paginator.create({\n      ctx,\n      pageSize: conf.pagination.pageSize,\n      total,\n\n      readMoreAutoLoad: conf.pagination.autoLoad,\n    })\n\n    // mount paginator dom\n    list.$commentsWrap.after($paginator)\n\n    // update paginator info\n    paginator?.update(offset, total)\n  })\n\n  // When list loaded\n  ctx.on('list-loaded', (comments) => {\n    // update paginator info\n    const { offset, total } = getPageDataByLastData(ctx)\n    paginator?.update(offset, total)\n  })\n\n  // When list fetch\n  ctx.on('list-fetch', (params) => {\n    // if clear comments when fetch new page data\n    if (ctx.getData().getComments().length > 0 && paginator?.getIsClearComments(params)) {\n      ctx.getData().clearComments()\n    }\n  })\n\n  // When list error\n  ctx.on('list-failed', () => {\n    paginator?.showErr?.($t('loadFail'))\n  })\n\n  // loading\n  ctx.on('list-fetch', (params) => {\n    paginator?.setLoading(true)\n  })\n  ctx.on('list-fetched', ({ params }) => {\n    paginator?.setLoading(false)\n  })\n}\n","import ListHTML from './list.html?raw'\nimport { ListLayout } from './layout'\nimport { createCommentNode } from './comment'\nimport { initListPaginatorFunc } from './page'\nimport type { ContextApi } from '@/types'\nimport Component from '@/lib/component'\nimport * as Utils from '@/lib/utils'\nimport { CommentNode } from '@/comment'\n\nexport default class List extends Component {\n  /** 列表评论集区域元素 */\n  $commentsWrap!: HTMLElement\n  public getCommentsWrapEl() {\n    return this.$commentsWrap\n  }\n\n  protected commentNodes: CommentNode[] = []\n  getCommentNodes() {\n    return this.commentNodes\n  }\n\n  constructor(ctx: ContextApi) {\n    super(ctx)\n\n    // Init base element\n    this.$el = Utils.createElement(ListHTML)\n    this.$commentsWrap = this.$el.querySelector('.atk-list-comments-wrap')!\n\n    // Init paginator\n    initListPaginatorFunc(ctx)\n\n    // Bind events\n    this.initCrudEvents()\n  }\n\n  getListLayout({ forceFlatMode }: { forceFlatMode?: boolean } = {}) {\n    return new ListLayout({\n      $commentsWrap: this.$commentsWrap,\n      nestSortBy: this.ctx.conf.nestSort,\n      nestMax: this.ctx.conf.nestMax,\n      flatMode:\n        typeof forceFlatMode === 'boolean' ? forceFlatMode : (this.ctx.conf.flatMode as boolean),\n      // flatMode must be boolean because it had been handled when Artalk.init\n      createCommentNode: (d, r) => {\n        const node = createCommentNode(this.ctx, d, r, { forceFlatMode })\n        this.commentNodes.push(node) // store node instance\n        return node\n      },\n      findCommentNode: (id) => this.commentNodes.find((c) => c.getID() === id),\n    })\n  }\n\n  private initCrudEvents() {\n    this.ctx.on('list-load', (comments) => {\n      // 导入数据\n      this.getListLayout().import(comments)\n    })\n\n    this.ctx.on('list-loaded', (comments) => {\n      if (comments.length === 0) {\n        this.commentNodes = []\n        this.$commentsWrap.innerHTML = ''\n      }\n    })\n\n    // When comment insert\n    this.ctx.on('comment-inserted', (comment) => {\n      const replyComment = comment.rid\n        ? this.commentNodes.find((c) => c.getID() === comment.rid)?.getData()\n        : undefined\n      this.getListLayout().insert(comment, replyComment)\n    })\n\n    // When comment delete\n    this.ctx.on('comment-deleted', (comment) => {\n      const node = this.commentNodes.find((c) => c.getID() === comment.id)\n      if (!node) {\n        console.error(`comment node id=${comment.id} not found`)\n        return\n      }\n      node.remove()\n      this.commentNodes = this.commentNodes.filter((c) => c.getID() !== comment.id)\n      // TODO: remove child nodes\n    })\n\n    // When comment update\n    this.ctx.on('comment-updated', (comment) => {\n      const node = this.commentNodes.find((c) => c.getID() === comment.id)\n      node && node.setData(comment)\n    })\n  }\n}\n","import * as Ui from '@/lib/ui'\n\nlet bodyOrgOverflow: string\nlet bodyOrgPaddingRight: string\n\nexport function getScrollbarHelper() {\n  return {\n    init() {\n      bodyOrgOverflow = document.body.style.overflow\n      bodyOrgPaddingRight = document.body.style.paddingRight\n    },\n\n    unlock() {\n      document.body.style.overflow = bodyOrgOverflow\n      document.body.style.paddingRight = bodyOrgPaddingRight\n    },\n\n    lock() {\n      document.body.style.overflow = 'hidden'\n      const barPaddingRight = parseInt(\n        window.getComputedStyle(document.body, null).getPropertyValue('padding-right'),\n        10,\n      )\n      document.body.style.paddingRight = `${Ui.getScrollBarWidth() + barPaddingRight || 0}px`\n    },\n  }\n}\n","import type { Layer as LayerApi } from '@/types/layer'\n\nexport interface LayerOptions {\n  onShow: () => void\n  onHide: () => void\n}\n\nexport class Layer implements LayerApi {\n  private allowMaskClose = true\n  private onAfterHide?: () => void\n\n  constructor(\n    private $el: HTMLElement,\n    private opts: LayerOptions,\n  ) {}\n\n  setOnAfterHide(func: () => void) {\n    this.onAfterHide = func\n  }\n\n  setAllowMaskClose(allow: boolean) {\n    this.allowMaskClose = allow\n  }\n\n  getAllowMaskClose() {\n    return this.allowMaskClose\n  }\n\n  getEl() {\n    return this.$el\n  }\n\n  show() {\n    this.opts.onShow()\n    this.$el.style.display = ''\n  }\n\n  hide() {\n    this.opts.onHide()\n    this.$el.style.display = 'none'\n    this.onAfterHide && this.onAfterHide()\n  }\n\n  destroy() {\n    this.opts.onHide()\n    this.$el.remove()\n    this.onAfterHide && this.onAfterHide()\n  }\n}\n","import { getScrollbarHelper } from './scrollbar-helper'\nimport { Layer } from './layer'\nimport * as Utils from '@/lib/utils'\n\nexport class LayerWrap {\n  private $wrap: HTMLElement\n  private $mask: HTMLElement\n  private items: Layer[] = []\n\n  constructor() {\n    this.$wrap = Utils.createElement(\n      `<div class=\"atk-layer-wrap\" style=\"display: none;\"><div class=\"atk-layer-mask\"></div></div>`,\n    )\n    this.$mask = this.$wrap.querySelector<HTMLElement>('.atk-layer-mask')!\n  }\n\n  createItem(name: string, el?: HTMLElement) {\n    // init element\n    el = el || this.createItemElement(name)\n    el.setAttribute('data-layer-name', name)\n    this.$wrap.appendChild(el)\n\n    // create layer instance\n    const layer = new Layer(el, {\n      onHide: () => this.hideWrap(el!),\n      onShow: () => this.showWrap(),\n    })\n\n    // register mask click event\n    this.getMask().addEventListener('click', () => {\n      layer.getAllowMaskClose() && layer.hide()\n    })\n\n    // add to items\n    this.items.push(layer)\n\n    return layer\n  }\n\n  private createItemElement(name: string) {\n    const el = document.createElement('div')\n    el.classList.add('atk-layer-item')\n    el.style.display = 'none'\n    this.$wrap.appendChild(el)\n    return el\n  }\n\n  getWrap() {\n    return this.$wrap\n  }\n\n  getMask() {\n    return this.$mask\n  }\n\n  showWrap() {\n    this.$wrap.style.display = 'block'\n    this.$mask.style.display = 'block'\n    this.$mask.classList.add('atk-fade-in')\n    getScrollbarHelper().lock()\n  }\n\n  hideWrap($el: HTMLElement) {\n    // if wrap contains more than one item, do not hide entire wrap\n    if (\n      this.items\n        .map((l) => l.getEl())\n        .filter((e) => e !== $el && e.isConnected && e.style.display !== 'none').length > 0\n    ) {\n      return\n    }\n\n    this.$wrap.style.display = 'none'\n    getScrollbarHelper().unlock()\n  }\n}\n","import { getScrollbarHelper } from './scrollbar-helper'\nimport { LayerWrap } from './wrap'\nimport type { ContextApi } from '@/types'\n\nexport class LayerManager {\n  private wrap: LayerWrap\n\n  constructor(ctx: ContextApi) {\n    this.wrap = new LayerWrap()\n    document.body.appendChild(this.wrap.getWrap())\n\n    ctx.on('unmounted', () => {\n      this.wrap.getWrap().remove()\n    })\n\n    // 记录页面原始 CSS 属性\n    getScrollbarHelper().init()\n  }\n\n  getEl() {\n    return this.wrap.getWrap()\n  }\n\n  create(name: string, el?: HTMLElement) {\n    return this.wrap.createItem(name, el)\n  }\n}\n","import type { LocalUser } from '@/types'\n\nconst LOCAL_USER_KEY = 'ArtalkUser'\n\ninterface UserOpts {\n  onUserChanged?: (user: LocalUser) => void\n}\n\nclass User {\n  private data: LocalUser\n\n  constructor(private opts: UserOpts) {\n    // Import from localStorage\n    const localUser = JSON.parse(window.localStorage.getItem(LOCAL_USER_KEY) || '{}')\n\n    // Initialize\n    this.data = {\n      name: localUser.name || localUser.nick || '', // nick is deprecated (for historical compatibility)\n      email: localUser.email || '',\n      link: localUser.link || '',\n      token: localUser.token || '',\n      is_admin: localUser.is_admin || localUser.isAdmin || false,\n    }\n  }\n\n  getData() {\n    return this.data\n  }\n\n  /** Update user data and save to localStorage */\n  update(obj: Partial<LocalUser> = {}) {\n    Object.entries(obj).forEach(([key, value]) => {\n      this.data[key] = value\n    })\n\n    window.localStorage.setItem(LOCAL_USER_KEY, JSON.stringify(this.data))\n    this.opts.onUserChanged && this.opts.onUserChanged(this.data)\n  }\n\n  /**\n   * Logout\n   *\n   * @description Logout will clear login status, but not clear user data (name, email, link)\n   */\n  logout() {\n    this.update({\n      token: '',\n      is_admin: false,\n    })\n  }\n\n  /** Check if user has filled basic data */\n  checkHasBasicUserInfo() {\n    return !!this.data.name && !!this.data.email\n  }\n}\n\nexport default User\n","import CheckerLauncher from './components/checker'\nimport Editor from './editor/editor'\nimport SidebarLayer from './layer/sidebar-layer'\n\nimport List from './list/list'\n\nimport * as I18n from './i18n'\nimport { PlugManager } from './plugins/editor-kit'\nimport { LayerManager } from './layer/layer-manager'\nimport User from './lib/user'\nimport type { ContextApi } from '@/types'\n\n/**\n * Services\n *\n * @description Call these services by `ctx.get('serviceName')` or `ctx.serviceName`\n */\nconst services = {\n  // I18n\n  i18n(ctx: ContextApi) {\n    I18n.setLocale(ctx.conf.locale)\n\n    ctx.watchConf(['locale'], (conf) => {\n      I18n.setLocale(conf.locale)\n    })\n  },\n\n  // User Store\n  user(ctx: ContextApi) {\n    const user = new User({\n      onUserChanged: (data) => {\n        ctx.trigger('user-changed', data)\n      },\n    })\n    return user\n  },\n\n  // 弹出层\n  layerManager(ctx: ContextApi) {\n    return new LayerManager(ctx)\n  },\n\n  // CheckerLauncher\n  checkerLauncher(ctx: ContextApi) {\n    const checkerLauncher = new CheckerLauncher({\n      getCtx: () => ctx,\n      getApi: () => ctx.getApi(),\n      onReload: () => ctx.reload(),\n\n      // make sure suffix with a slash, because it will be used as a base url when call `fetch`\n      getCaptchaIframeURL: () => `${ctx.conf.server}/api/v2/captcha/?t=${+new Date()}`,\n    })\n    return checkerLauncher\n  },\n\n  // 编辑器\n  editor(ctx: ContextApi) {\n    const editor = new Editor(ctx)\n    ctx.$root.appendChild(editor.$el)\n    return editor\n  },\n\n  // 评论列表\n  list(ctx: ContextApi): List {\n    const list = new List(ctx)\n    ctx.$root.appendChild(list.$el)\n    return list\n  },\n\n  // 侧边栏 Layer\n  sidebarLayer(ctx: ContextApi) {\n    const sidebarLayer = new SidebarLayer(ctx)\n    return sidebarLayer\n  },\n\n  // Extra Service\n  // -----------------------------------------\n  // Only for type check\n  // Not inject to ctx immediately,\n  // but can be injected by other occasions\n\n  editorPlugs(): PlugManager | undefined {\n    return undefined\n  },\n}\n\nexport default services\n\n// type tricks for dependency injection\ntype TServiceImps = typeof services\ntype TObjectWithFuncs = { [k: string]: (...args: any) => any }\ntype TKeysOnlyReturn<T extends TObjectWithFuncs, V> = {\n  [K in keyof T]: ReturnType<T[K]> extends V ? K : never\n}[keyof T]\ntype TOmitConditions = TKeysOnlyReturn<TServiceImps, void>\ntype TServiceInjectors = Omit<TServiceImps, TOmitConditions>\nexport type TInjectedServices = {\n  [K in keyof TServiceInjectors]: ReturnType<TServiceInjectors[K]>\n}\n","import type { ContextApi, ArtalkPlugin, ArtalkConfig } from '@/types'\nimport { Api } from '@/api'\n\ntype CountCache = { [pageKey: string]: number }\n\nexport interface CountOptions {\n  getApi(): Api\n\n  siteName: string\n  pageKey?: string\n  pageTitle?: string\n  countEl: string\n  pvEl: string\n  pageKeyAttr: string\n\n  /** Whether to add PV count when initializing */\n  pvAdd?: boolean\n}\n\nexport const PvCountWidget: ArtalkPlugin = (ctx: ContextApi) => {\n  ctx.watchConf(['site', 'pageKey', 'pageTitle', 'countEl', 'pvEl', 'statPageKeyAttr'], (conf) => {\n    initCountWidget({\n      getApi: () => ctx.getApi(),\n      siteName: conf.site,\n      pageKey: conf.pageKey,\n      pageTitle: conf.pageTitle,\n      countEl: conf.countEl,\n      pvEl: conf.pvEl,\n      pageKeyAttr: conf.statPageKeyAttr,\n      pvAdd: typeof ctx.conf.pvAdd === 'boolean' ? ctx.conf.pvAdd : true,\n    })\n  })\n}\n\n/** Initialize count widgets */\nexport async function initCountWidget(opt: CountOptions) {\n  // Load comment count\n  await loadCommentCount(opt)\n\n  // Increment PV count\n  const cacheData = await incrementPvCount(opt)\n\n  // Load PV count\n  await loadPvCount(opt, cacheData)\n}\n\n/** Increment PV count and get cache data that contains PV count */\nasync function incrementPvCount(opt: CountOptions) {\n  if (!opt.pvAdd || !opt.pageKey) return undefined\n\n  const pvCount = (\n    await opt.getApi().pages.logPv({\n      page_key: opt.pageKey,\n      page_title: opt.pageTitle,\n      site_name: opt.siteName,\n    })\n  ).data.pv // pv+1 and get pv count\n\n  return {\n    [opt.pageKey]: pvCount,\n  }\n}\n\n/** Load comment count */\nasync function loadCommentCount(opt: CountOptions) {\n  await loadStatCount({ opt, query: 'page_comment', containers: [opt.countEl, '#ArtalkCount'] })\n}\n\n/** Load PV count */\nasync function loadPvCount(opt: CountOptions, cache?: CountCache) {\n  await loadStatCount({ opt, query: 'page_pv', containers: [opt.pvEl, '#ArtalkPV'], cache })\n}\n\nasync function loadStatCount(args: {\n  opt: CountOptions\n  query: 'page_pv' | 'page_comment'\n  containers: string[]\n  cache?: CountCache\n}) {\n  const { opt } = args\n  let cache: CountCache = args.cache || {}\n\n  // Retrieve elements\n  const els = retrieveElements(args.containers)\n\n  // Get page keys which will be queried\n  const pageKeys = getPageKeys(els, opt.pageKeyAttr, opt.pageKey, cache)\n\n  // Fetch count data from server\n  if (pageKeys.length > 0) {\n    const res = (\n      await opt.getApi().stats.getStats(args.query, {\n        page_keys: pageKeys.join(','),\n        site_name: opt.siteName,\n      })\n    ).data.data as CountCache\n    cache = { ...cache, ...res }\n  }\n\n  updateElementsText(els, cache, opt.pageKey)\n}\n\n/** Retrieve elements based on selectors */\nfunction retrieveElements(containers: string[]): Set<HTMLElement> {\n  const els = new Set<HTMLElement>()\n  new Set(containers).forEach((selector) => {\n    document.querySelectorAll<HTMLElement>(selector).forEach((el) => els.add(el))\n  })\n  return els\n}\n\n/** Get page keys to be queried */\nfunction getPageKeys(\n  els: Set<HTMLElement>,\n  pageKeyAttr: string,\n  pageKey: string | undefined,\n  cache: CountCache,\n): string[] {\n  const pageKeys = Array.from(els)\n    .map((el) => el.getAttribute(pageKeyAttr) || pageKey)\n    .filter((key) => key && typeof cache[key] !== 'number') // filter out keys that already have data\n\n  return [...new Set(pageKeys as string[])] // deduplicate\n}\n\n/** Update elements text content with the count data */\nfunction updateElementsText(els: Set<HTMLElement>, data: CountCache, defaultPageKey?: string) {\n  els.forEach((el) => {\n    const pageKey = el.getAttribute('data-page-key')\n    const count = (pageKey && data[pageKey]) || (defaultPageKey && data[defaultPageKey]) || 0 // if pageKey is not set, use defaultCount\n    el.innerText = `${Number(count)}`\n  })\n}\n\nexport const exportedForTesting = {\n  incrementPvCount,\n  loadCommentCount,\n  loadPvCount,\n  retrieveElements,\n  getPageKeys,\n  updateElementsText,\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as marked from '@/lib/marked'\n\nexport const Markdown: ArtalkPlugin = (ctx) => {\n  ctx.watchConf(['imgLazyLoad', 'markedOptions'], (conf) => {\n    marked.initMarked({\n      markedOptions: ctx.getConf().markedOptions,\n      imgLazyLoad: ctx.getConf().imgLazyLoad,\n    })\n  })\n\n  ctx.watchConf(['markedReplacers'], (conf) => {\n    conf.markedReplacers && marked.setReplacers(conf.markedReplacers)\n  })\n}\n","import type PlugKit from './_kit'\nimport EditorPlug from './_plug'\nimport $t from '@/i18n'\n\nconst LocalStorageKey = 'ArtalkContent'\n\nexport default class LocalStorage extends EditorPlug {\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const onContentUpdated = () => {\n      this.save()\n    }\n\n    this.kit.useMounted(() => {\n      // load editor content from localStorage when init\n      const localContent = window.localStorage.getItem(LocalStorageKey) || ''\n      if (localContent.trim() !== '') {\n        this.kit.useEditor().showNotify($t('restoredMsg'), 'i')\n        this.kit.useEditor().setContent(localContent)\n      }\n\n      // bind event\n      this.kit.useEvents().on('content-updated', onContentUpdated)\n    })\n\n    this.kit.useUnmounted(() => {\n      this.kit.useEvents().off('content-updated', onContentUpdated)\n    })\n  }\n\n  // Save editor content to localStorage\n  public save() {\n    window.localStorage.setItem(LocalStorageKey, this.kit.useEditor().getContentRaw().trim())\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport $t from '@/i18n'\n\nexport default class Textarea extends EditorPlug {\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const onKeydown = (e: KeyboardEvent) => this.onKeydown(e)\n    const onInput = () => this.onInput()\n\n    this.kit.useMounted(() => {\n      // 占位符\n      this.kit.useUI().$textarea.placeholder = this.kit.useConf().placeholder || $t('placeholder')\n\n      // bind the event\n      this.kit.useUI().$textarea.addEventListener('keydown', onKeydown)\n      this.kit.useUI().$textarea.addEventListener('input', onInput)\n    })\n\n    this.kit.useUnmounted(() => {\n      // unmount the event\n      this.kit.useUI().$textarea.removeEventListener('keydown', onKeydown)\n      this.kit.useUI().$textarea.removeEventListener('input', onInput)\n    })\n\n    this.kit.useEvents().on('content-updated', () => {\n      // delay 80ms to prevent invalid execution\n      window.setTimeout(() => {\n        this.adaptiveHeightByContent()\n      }, 80)\n    })\n  }\n\n  // 按下 Tab 输入内容，而不是失去焦距\n  private onKeydown(e: KeyboardEvent) {\n    const keyCode = e.keyCode || e.which\n\n    if (keyCode === 9) {\n      e.preventDefault()\n      this.kit.useEditor().insertContent('\\t')\n    }\n  }\n\n  private onInput() {\n    this.kit.useEvents().trigger('content-updated', this.kit.useEditor().getContentRaw())\n  }\n\n  // Resize the textarea height by content\n  public adaptiveHeightByContent() {\n    const diff = this.kit.useUI().$textarea.offsetHeight - this.kit.useUI().$textarea.clientHeight\n    this.kit.useUI().$textarea.style.height = '0px' // it's a magic. 若不加此行，内容减少，高度回不去\n    this.kit.useUI().$textarea.style.height = `${this.kit.useUI().$textarea.scrollHeight + diff}px`\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport $t from '@/i18n'\n\nexport default class SubmitBtn extends EditorPlug {\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const onClick = () => {\n      this.kit.useEditor().submit()\n    }\n\n    this.kit.useMounted(() => {\n      // apply the submit button text from user custom config\n      this.kit.useUI().$submitBtn.innerText = this.kit.useConf().sendBtn || $t('send')\n\n      // bind the event when click the submit button\n      this.kit.useUI().$submitBtn.addEventListener('click', onClick)\n    })\n\n    this.kit.useUnmounted(() => {\n      this.kit.useUI().$submitBtn.removeEventListener('click', onClick)\n    })\n  }\n}\n","import type PlugKit from './_kit'\nimport type { CommentData } from '@/types'\nimport * as Utils from '@/lib/utils'\n\nexport default class SubmitAddPreset {\n  constructor(private kit: PlugKit) {}\n\n  async reqAdd() {\n    const nComment = (\n      await this.kit.useApi().comments.createComment({\n        ...(await this.getSubmitAddParams()),\n      })\n    ).data\n    return nComment\n  }\n\n  async getSubmitAddParams() {\n    const { name, email, link } = this.kit.useUser().getData()\n    const conf = this.kit.useConf()\n\n    return {\n      content: this.kit.useEditor().getContentFinal(),\n      name,\n      email,\n      link,\n      rid: 0,\n      page_key: conf.pageKey,\n      page_title: conf.pageTitle,\n      site_name: conf.site,\n      ua: await Utils.getCorrectUserAgent(), // Get the corrected UA\n    }\n  }\n\n  postSubmitAdd(commentNew: CommentData) {\n    // insert the new comment to list\n    this.kit.useGlobalCtx().getData().insertComment(commentNew)\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport SubmitAddPreset from './submit-add'\nimport $t from '@/i18n'\nimport type { CommentData } from '@/types'\n\ninterface CustomSubmit {\n  activeCond: () => void\n  pre?: () => void\n  req?: () => Promise<CommentData>\n  /** The `post` method is called after the comment is successfully submitted */\n  post?: (nComment: CommentData) => void\n}\n\nexport default class Submit extends EditorPlug {\n  private customs: CustomSubmit[] = []\n  private defaultPreset: SubmitAddPreset\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    this.defaultPreset = new SubmitAddPreset(this.kit)\n\n    const onEditorSubmit = () => this.do()\n\n    this.kit.useMounted(() => {\n      // invoke `do()` when event `editor-submit` is triggered\n      this.kit.useGlobalCtx().on('editor-submit', onEditorSubmit)\n    })\n    this.kit.useUnmounted(() => {\n      this.kit.useGlobalCtx().off('editor-submit', onEditorSubmit)\n    })\n  }\n\n  registerCustom(c: CustomSubmit) {\n    this.customs.push(c)\n  }\n\n  private async do() {\n    if (this.kit.useEditor().getContentFinal().trim() === '') {\n      this.kit.useEditor().focus()\n      return\n    }\n\n    const custom = this.customs.find((o) => o.activeCond())\n\n    this.kit.useEditor().showLoading()\n\n    try {\n      // pre submit\n      if (custom?.pre) custom.pre()\n\n      let nComment: CommentData\n\n      // submit request\n      if (custom?.req) nComment = await custom.req()\n      else nComment = await this.defaultPreset.reqAdd()\n\n      // post submit\n      if (custom?.post) custom.post(nComment)\n      else this.defaultPreset.postSubmitAdd(nComment)\n    } catch (err: any) {\n      // submit error\n      console.error(err)\n      this.kit.useEditor().showNotify(`${$t('commentFail')}: ${err.message || String(err)}`, 'e')\n      return\n    } finally {\n      this.kit.useEditor().hideLoading()\n    }\n\n    this.kit.useEditor().reset() // 复原编辑器\n    this.kit.useGlobalCtx().trigger('editor-submitted')\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport Submit from './submit'\nimport SubmitAddPreset from './submit-add'\nimport type { CommentData } from '@/types'\nimport * as Utils from '@/lib/utils'\nimport * as Ui from '@/lib/ui'\nimport $t from '@/i18n'\n\nexport default class StateReply extends EditorPlug {\n  private comment?: CommentData\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    // add effect when state switch to `reply`\n    this.useEditorStateEffect('reply', (commentData) => {\n      this.setReply(commentData)\n\n      return () => {\n        this.cancelReply()\n      }\n    })\n\n    // register submit preset\n    this.kit.useEvents().on('mounted', () => {\n      const submitPlug = this.kit.useDeps(Submit)\n      if (!submitPlug) throw Error('SubmitPlug not initialized')\n\n      const defaultPreset = new SubmitAddPreset(this.kit)\n\n      submitPlug.registerCustom({\n        activeCond: () => !!this.comment, // active this custom submit when reply mode\n        req: async () => {\n          if (!this.comment) throw new Error('reply comment cannot be empty')\n\n          const nComment = (\n            await this.kit.useApi().comments.createComment({\n              ...(await defaultPreset.getSubmitAddParams()),\n              rid: this.comment.id,\n              page_key: this.comment.page_key,\n              page_title: undefined,\n              site_name: this.comment.site_name,\n            })\n          ).data\n\n          return nComment\n        },\n        post: (nComment: CommentData) => {\n          // open another page when reply comment is not the same pageKey\n          const conf = this.kit.useConf()\n          if (nComment.page_key !== conf.pageKey) {\n            window.open(`${nComment.page_url}#atk-comment-${nComment.id}`)\n          }\n\n          defaultPreset.postSubmitAdd(nComment)\n        },\n      })\n    })\n  }\n\n  private setReply(commentData: CommentData) {\n    const ui = this.kit.useUI()\n    if (!ui.$sendReplyBtn) {\n      const $btn = Utils.createElement(\n        `<span class=\"atk-state-btn\">` +\n          `<span class=\"atk-text-wrap\">` +\n          `${$t('reply')} <span class=\"atk-text\"></span>` +\n          `</span>` +\n          `<span class=\"atk-cancel atk-icon-close atk-icon\"></span>` +\n          `</span>`,\n      )\n      $btn.querySelector<HTMLElement>('.atk-text')!.innerText = `@${commentData.nick}`\n      $btn.addEventListener('click', () => {\n        this.kit.useEditor().resetState()\n      })\n      ui.$stateWrap.append($btn)\n      ui.$sendReplyBtn = $btn\n    }\n\n    this.comment = commentData\n\n    ui.$textarea.focus()\n  }\n\n  private cancelReply() {\n    if (!this.comment) return\n\n    const ui = this.kit.useUI()\n    if (ui.$sendReplyBtn) {\n      ui.$sendReplyBtn.remove()\n      ui.$sendReplyBtn = undefined\n    }\n    this.comment = undefined\n  }\n}\n","import type PlugKit from './_kit'\nimport EditorPlug from './_plug'\nimport Submit from './submit'\nimport type { CommentData } from '@/types'\nimport $t from '@/i18n'\nimport * as Utils from '@/lib/utils'\n\nexport default class StateEdit extends EditorPlug {\n  private comment?: CommentData\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    // add effect when state switch to `edit`\n    this.useEditorStateEffect('edit', (comment) => {\n      this.edit(comment)\n\n      return () => {\n        this.cancelEdit()\n      }\n    })\n\n    // register submit preset\n    this.kit.useMounted(() => {\n      const submitPlug = this.kit.useDeps(Submit)\n      if (!submitPlug) throw Error('SubmitPlug not initialized')\n\n      submitPlug.registerCustom({\n        activeCond: () => !!this.comment, // active this custom submit when edit mode\n        req: async () => {\n          const saveData = {\n            content: this.kit.useEditor().getContentFinal(),\n            nick: this.kit.useUI().$name.value,\n            email: this.kit.useUI().$email.value,\n            link: this.kit.useUI().$link.value,\n          }\n          const comment = this.comment!\n          const nComment = await this.kit.useApi().comments.updateComment(comment.id, {\n            ...comment,\n            ...saveData,\n          })\n          return nComment.data\n        },\n        post: (nComment: CommentData) => {\n          this.kit.useGlobalCtx().getData().updateComment(nComment)\n        },\n      })\n    })\n  }\n\n  private edit(comment: CommentData) {\n    const ui = this.kit.useUI()\n    if (!ui.$editCancelBtn) {\n      const $btn = Utils.createElement(\n        `<span class=\"atk-state-btn\">` +\n          `<span class=\"atk-text-wrap\">` +\n          `${$t('editCancel')}` +\n          `</span>` +\n          `<span class=\"atk-cancel atk-icon-close atk-icon\"></span>` +\n          `</span>`,\n      )\n      $btn.onclick = () => {\n        this.kit.useEditor().resetState()\n      }\n      ui.$stateWrap.append($btn)\n      ui.$editCancelBtn = $btn\n    }\n    this.comment = comment\n\n    ui.$header.style.display = 'none' // TODO: support modify header information\n\n    ui.$name.value = comment.nick || ''\n    ui.$email.value = comment.email || ''\n    ui.$link.value = comment.link || ''\n\n    this.kit.useEditor().setContent(comment.content)\n    ui.$textarea.focus()\n\n    this.updateSubmitBtnText($t('save'))\n  }\n\n  private cancelEdit() {\n    if (!this.comment) return\n\n    const ui = this.kit.useUI()\n\n    if (ui.$editCancelBtn) {\n      ui.$editCancelBtn.remove()\n      ui.$editCancelBtn = undefined\n    }\n\n    this.comment = undefined\n\n    const { name, email, link } = this.kit.useUser().getData()\n    ui.$name.value = name\n    ui.$email.value = email\n    ui.$link.value = link\n\n    this.kit.useEditor().setContent('')\n    this.restoreSubmitBtnText()\n\n    ui.$header.style.display = '' // TODO: support modify header information\n  }\n\n  // -------------------------------------------------------------------\n  //  Submit Btn Text Modifier\n  // -------------------------------------------------------------------\n\n  private originalSubmitBtnText = 'Send'\n\n  private updateSubmitBtnText(text: string) {\n    this.originalSubmitBtnText = this.kit.useUI().$submitBtn.innerText\n    this.kit.useUI().$submitBtn.innerText = text\n  }\n\n  private restoreSubmitBtnText() {\n    this.kit.useUI().$submitBtn.innerText = this.originalSubmitBtnText\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport * as Utils from '@/lib/utils'\nimport $t from '@/i18n'\n\nexport default class Closable extends EditorPlug {\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const onOpen = () => this.open()\n    const onClose = () => this.close()\n\n    this.kit.useMounted(() => {\n      this.kit.useEvents().on('editor-open', onOpen)\n      this.kit.useEvents().on('editor-close', onClose)\n    })\n    this.kit.useUnmounted(() => {\n      this.kit.useEvents().off('editor-open', onOpen)\n      this.kit.useEvents().off('editor-close', onClose)\n    })\n  }\n\n  private open() {\n    this.kit.useUI().$textareaWrap.querySelector('.atk-comment-closed')?.remove()\n    this.kit.useUI().$textarea.style.display = ''\n    this.kit.useUI().$bottom.style.display = ''\n  }\n\n  private close() {\n    if (!this.kit.useUI().$textareaWrap.querySelector('.atk-comment-closed'))\n      this.kit\n        .useUI()\n        .$textareaWrap.prepend(\n          Utils.createElement(`<div class=\"atk-comment-closed\">${$t('onlyAdminCanReply')}</div>`),\n        )\n\n    if (!this.kit.useUser().getData().is_admin) {\n      this.kit.useUI().$textarea.style.display = 'none'\n      this.kit.useEvents().trigger('panel-close')\n      this.kit.useUI().$bottom.style.display = 'none'\n    } else {\n      // 管理员一直打开评论\n      this.kit.useUI().$textarea.style.display = ''\n      this.kit.useUI().$bottom.style.display = ''\n    }\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\n\nexport default class HeaderEvent extends EditorPlug {\n  private get $inputs() {\n    return this.kit.useEditor().getHeaderInputEls()\n  }\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const inputEventFns: { [name: string]: () => void } = {}\n    const changeEventFns: { [name: string]: () => void } = {}\n\n    const trigger =\n      (evt: 'header-input' | 'header-change', $input: HTMLInputElement, field: string) => () => {\n        this.kit.useEvents().trigger(evt, { field, $input })\n      }\n\n    this.kit.useMounted(() => {\n      // batch bind the events\n      Object.entries(this.$inputs).forEach(([key, $input]) => {\n        $input.addEventListener(\n          'input',\n          (inputEventFns[key] = trigger('header-input', $input, key)),\n        )\n        $input.addEventListener(\n          'change',\n          (changeEventFns[key] = trigger('header-change', $input, key)),\n        )\n      })\n    })\n\n    this.kit.useUnmounted(() => {\n      // unmount the event\n      Object.entries(this.$inputs).forEach(([key, $input]) => {\n        $input.removeEventListener('input', inputEventFns[key])\n        $input.removeEventListener('change', changeEventFns[key])\n      })\n    })\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport $t from '@/i18n'\nimport type { UserInfoApiResponseData } from '@/types'\n\nexport default class HeaderUser extends EditorPlug {\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const onInput = ({ $input, field }: { $input: HTMLInputElement; field: string }) => {\n      if (this.kit.useEditor().getState() === 'edit') return // TODO: prevent execute when editing, since update comment.user not support\n\n      // update user data\n      this.kit.useUser().update({ [field]: $input.value.trim() })\n\n      // remote fetch user info\n      if (field === 'name' || field === 'email') this.fetchUserInfo() // must after update user data, since fetchUserInfo() will use User.data\n    }\n\n    const placeholders = {\n      name: $t('nick'),\n      email: $t('email'),\n      link: $t('link'),\n    }\n\n    this.kit.useMounted(() => {\n      Object.entries(this.kit.useEditor().getHeaderInputEls()).forEach(([key, $input]) => {\n        // set placeholder\n        $input.placeholder = placeholders[key]\n\n        // sync header values from User.data\n        $input.value = this.kit.useUser().getData()[key] || ''\n      })\n\n      // bind events\n      this.kit.useEvents().on('header-input', onInput)\n    })\n\n    this.kit.useUnmounted(() => {\n      this.kit.useEvents().off('header-input', onInput)\n    })\n  }\n\n  private query = {\n    timer: <number | null>null,\n    abortFn: <(() => void) | null>null,\n  }\n\n  /**\n   * Fetch user info from server\n   */\n  private fetchUserInfo() {\n    this.kit.useUser().logout() // clear login status\n\n    if (this.query.timer) window.clearTimeout(this.query.timer) // clear the not executed timeout task\n    if (this.query.abortFn) this.query.abortFn() // abort the last request (if request is pending not finished)\n\n    this.query.timer = window.setTimeout(() => {\n      this.query.timer = null // clear the timer (clarify the timer is executing)\n\n      const api = this.kit.useApi()\n      const CANCEL_TOKEN = 'getUserCancelToken'\n      this.query.abortFn = () => api.abortRequest(CANCEL_TOKEN)\n\n      api.user\n        .getUser(\n          { ...api.getUserFields() },\n          {\n            cancelToken: CANCEL_TOKEN,\n          },\n        )\n        .then((res) => this.onUserInfoFetched(res.data))\n        .catch((err) => {})\n        .finally(() => {\n          this.query.abortFn = null // clear the abort function (clarify the request is finished)\n        })\n    }, 400) // delay to reduce request\n  }\n\n  /**\n   * Function called when user info fetched\n   *\n   * @param data The response data from server\n   */\n  private onUserInfoFetched(data: UserInfoApiResponseData) {\n    // If api response is not login, logout\n    if (!data.is_login) this.kit.useUser().logout()\n\n    // Update unread notifies\n    this.kit.useGlobalCtx().getData().updateNotifies(data.notifies)\n\n    // If user is admin and not login,\n    if (this.kit.useUser().checkHasBasicUserInfo() && !data.is_login && data.user?.is_admin) {\n      // then show login window\n      this.kit.useGlobalCtx().checkAdmin({\n        onSuccess: () => {},\n      })\n    }\n\n    // Auto fill user link from server\n    if (data.user && data.user.link) {\n      this.kit.useUI().$link.value = data.user.link\n      this.kit.useUser().update({ link: data.user.link })\n    }\n  }\n}\n","import EditorPlug from './_plug'\nimport type PlugKit from './_kit'\n\nexport default class HeaderLink extends EditorPlug {\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    const onLinkChange = ({ field }: { field: string }) => {\n      if (field === 'link') this.onLinkInputChange()\n    }\n\n    // bind events\n    this.kit.useMounted(() => {\n      this.kit.useEvents().on('header-change', onLinkChange)\n    })\n\n    this.kit.useUnmounted(() => {\n      this.kit.useEvents().off('header-change', onLinkChange)\n    })\n  }\n\n  private onLinkInputChange() {\n    // auto and force add protocol prefix for user input link\n    const link = this.kit.useUI().$link.value.trim()\n    if (!!link && !/^(http|https):\\/\\//.test(link)) {\n      this.kit.useUI().$link.value = `https://${link}`\n      this.kit.useUser().update({ link: this.kit.useUI().$link.value })\n    }\n  }\n}\n","import './emoticons.scss'\n\nimport EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport type { EmoticonListData, EmoticonGrpData } from '@/types'\nimport * as Utils from '@/lib/utils'\nimport * as Ui from '@/lib/ui'\nimport $t from '@/i18n'\n\ntype OwOFormatType = {\n  [key: string]: {\n    type: 'emoticon' | 'emoji' | 'image'\n    container: { icon: string; text: string }[]\n  }\n}\n\nexport default class Emoticons extends EditorPlug {\n  private emoticons: EmoticonListData = []\n  private loadingTask: Promise<void> | null = null\n\n  private $grpWrap!: HTMLElement\n  private $grpSwitcher!: HTMLElement\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    this.kit.useMounted(() => {\n      this.usePanel(`<div class=\"atk-editor-plug-emoticons\"></div>`)\n      this.useBtn(\n        `<i aria-label=\"${$t('emoticon')}\"><svg fill=\"currentColor\" aria-hidden=\"true\" height=\"14\" viewBox=\"0 0 14 14\" width=\"14\"><path d=\"m4.26829 5.29294c0-.94317.45893-1.7074 1.02439-1.7074.56547 0 1.02439.76423 1.02439 1.7074s-.45892 1.7074-1.02439 1.7074c-.56546 0-1.02439-.76423-1.02439-1.7074zm4.43903 1.7074c.56546 0 1.02439-.76423 1.02439-1.7074s-.45893-1.7074-1.02439-1.7074c-.56547 0-1.02439.76423-1.02439 1.7074s.45892 1.7074 1.02439 1.7074zm-1.70732 2.73184c-1.51883 0-2.06312-1.52095-2.08361-1.58173l-1.29551.43231c.03414.10244.868 2.51604 3.3798 2.51604 2.51181 0 3.34502-2.41291 3.37982-2.51604l-1.29484-.43573c-.02254.06488-.56683 1.58583-2.08498 1.58583zm7-2.73252c0 3.86004-3.1401 7.00034-7 7.00034s-7-3.1396-7-6.99966c0-3.86009 3.1401-7.00034 7-7.00034s7 3.14025 7 7.00034zm-1.3659 0c0-3.10679-2.5275-5.63442-5.6341-5.63442-3.10663 0-5.63415 2.52832-5.63415 5.6351 0 3.10676 2.52752 5.63446 5.63415 5.63446 3.1066 0 5.6341-2.5277 5.6341-5.63446z\"/></svg></i>`,\n      )\n    })\n    this.kit.useUnmounted(() => {})\n\n    this.useContentTransformer((raw) => this.transEmoticonImageText(raw))\n    this.usePanelShow(() => {\n      ;(async () => {\n        await this.loadEmoticonsData()\n\n        // 初始化元素\n        if (!this.isImgLoaded) {\n          this.initEmoticonsList()\n          this.isImgLoaded = true\n        }\n\n        // 延迟执行，防止无法读取高度\n        setTimeout(() => {\n          this.changeListHeight()\n        }, 30)\n      })()\n    })\n    this.usePanelHide(() => {\n      this.$panel!.parentElement!.style.height = ''\n    })\n\n    // 表情包预加载\n    window.setTimeout(() => {\n      this.loadEmoticonsData()\n    }, 1000) // 延迟 1s 加载\n  }\n\n  private isListLoaded = false\n  private isImgLoaded = false\n\n  public async loadEmoticonsData() {\n    if (this.isListLoaded) return\n    if (this.loadingTask !== null) {\n      await this.loadingTask\n      return\n    }\n\n    // 数据处理\n    this.loadingTask = (async () => {\n      Ui.showLoading(this.$panel!)\n      this.emoticons = await this.handleData(this.kit.useConf().emoticons)\n      Ui.hideLoading(this.$panel!)\n      this.loadingTask = null\n      this.isListLoaded = true\n    })()\n    await this.loadingTask\n  }\n\n  private async handleData(data: any): Promise<any[]> {\n    if (!Array.isArray(data) && ['object', 'string'].includes(typeof data)) {\n      data = [data]\n    }\n\n    if (!Array.isArray(data)) {\n      Ui.setError(this.$panel!, `[${$t('emoticon')}] Data must be of Array/Object/String type`)\n      Ui.hideLoading(this.$panel!)\n      return []\n    }\n\n    const pushGrp = (grp: EmoticonGrpData) => {\n      if (typeof grp !== 'object') return\n      if (grp.name && data.find((o) => o.name === grp.name)) return\n      data.push(grp)\n    }\n\n    // 加载子内容\n    const remoteLoad = async (d: any[]) => {\n      await Promise.all(\n        d.map(async (grp, index) => {\n          if (typeof grp === 'object' && !Array.isArray(grp)) {\n            pushGrp(grp)\n          } else if (Array.isArray(grp)) {\n            await remoteLoad(grp)\n          } else if (typeof grp === 'string') {\n            const grpData = await this.remoteLoad(grp)\n\n            if (Array.isArray(grpData)) await remoteLoad(grpData)\n            else if (typeof grpData === 'object') pushGrp(grpData)\n          }\n        }),\n      )\n    }\n    await remoteLoad(data)\n\n    // 处理数组数据\n    data.forEach((item: any) => {\n      if (this.isOwOFormat(item)) {\n        const c = this.convertOwO(item)\n        c.forEach((grp) => {\n          pushGrp(grp)\n        })\n      } else if (Array.isArray(item)) {\n        item.forEach((grp) => {\n          pushGrp(grp)\n        })\n      }\n    })\n\n    // 剔除非法数据\n    data = data.filter(\n      (item: any) => typeof item === 'object' && !Array.isArray(item) && !!item && !!item.name,\n    )\n\n    // console.log(data)\n\n    this.solveNullKey(data)\n    this.solveSameKey(data)\n\n    return data\n  }\n\n  /** 远程加载 */\n  private async remoteLoad(url: string): Promise<any> {\n    if (!url) return []\n\n    try {\n      const resp = await fetch(url)\n      const json = await resp.json()\n      return json\n    } catch (err) {\n      Ui.hideLoading(this.$panel!)\n      console.error('[Emoticons] Load Failed:', err)\n      Ui.setError(this.$panel!, `[${$t('emoticon')}] ${$t('loadFail')}: ${String(err)}`)\n      return []\n    }\n  }\n\n  /** 避免表情 item.key 为 null 的情况 */\n  private solveNullKey(data: EmoticonGrpData[]) {\n    data.forEach((grp) => {\n      grp.items.forEach((item, index) => {\n        if (!item.key) item.key = `${grp.name} ${index + 1}`\n      })\n    })\n  }\n\n  /** 避免相同 item.key */\n  private solveSameKey(data: EmoticonGrpData[]) {\n    const tmp: { [key: string]: number } = {}\n    data.forEach((grp) => {\n      grp.items.forEach((item) => {\n        if (!item.key || String(item.key).trim() === '') return\n        if (!tmp[item.key]) tmp[item.key] = 1\n        else tmp[item.key]++\n\n        if (tmp[item.key] > 1) item.key = `${item.key} ${tmp[item.key]}`\n      })\n    })\n  }\n\n  /** 判断是否为 OwO 格式 */\n  private isOwOFormat(data: any) {\n    try {\n      return (\n        typeof data === 'object' &&\n        !!Object.values(data).length &&\n        Array.isArray(Object.keys(Object.values<any>(data)[0].container)) &&\n        Object.keys(Object.values<any>(data)[0].container[0]).includes('icon')\n      )\n    } catch {\n      return false\n    }\n  }\n\n  /** 转换 OwO 格式数据 */\n  private convertOwO(owoData: OwOFormatType): EmoticonListData {\n    const dest: EmoticonListData = []\n    Object.entries(owoData).forEach(([grpName, grp]) => {\n      const nGrp: EmoticonGrpData = { name: grpName, type: grp.type, items: [] }\n      grp.container.forEach((item, index) => {\n        // 图片标签提取 src 属性值\n        const iconStr = item.icon\n        if (/<(img|IMG)/.test(iconStr)) {\n          const find = /src=[\"'](.*?)[\"']/.exec(iconStr)\n          if (find && find.length > 1) item.icon = find[1]\n        }\n        nGrp.items.push({\n          key: item.text || `${grpName} ${index + 1}`,\n          val: item.icon,\n        })\n      })\n      dest.push(nGrp)\n    })\n    return dest\n  }\n\n  /** 初始化表情列表界面 */\n  private initEmoticonsList() {\n    // 表情列表\n    this.$grpWrap = Utils.createElement(`<div class=\"atk-grp-wrap\"></div>`)\n    this.$panel!.append(this.$grpWrap)\n\n    this.emoticons.forEach((grp, index) => {\n      const $grp = Utils.createElement(`<div class=\"atk-grp\" style=\"display: none;\"></div>`)\n      this.$grpWrap.append($grp)\n      $grp.setAttribute('data-index', String(index))\n      $grp.setAttribute('data-grp-name', grp.name)\n      $grp.setAttribute('data-type', grp.type)\n      grp.items.forEach((item) => {\n        const $item = Utils.createElement(`<span class=\"atk-item\"></span>`)\n        $grp.append($item)\n\n        if (!!item.key && !new RegExp(`^(${grp.name})?\\\\s?[0-9]+$`).test(item.key))\n          $item.setAttribute('title', item.key)\n\n        if (grp.type === 'image') {\n          const imgEl = document.createElement('img')\n          imgEl.src = item.val\n          imgEl.alt = item.key\n          $item.append(imgEl)\n        } else {\n          $item.innerText = item.val\n        }\n\n        $item.onclick = () => {\n          if (grp.type === 'image') {\n            this.kit.useEditor().insertContent(`:[${item.key}]`)\n          } else {\n            this.kit.useEditor().insertContent(item.val || '')\n          }\n        }\n      })\n    })\n\n    // 表情分类切换 bar\n    if (this.emoticons.length > 1) {\n      this.$grpSwitcher = Utils.createElement(`<div class=\"atk-grp-switcher\"></div>`)\n      this.$panel!.append(this.$grpSwitcher)\n      this.emoticons.forEach((grp, index) => {\n        const $item = Utils.createElement('<span />')\n        $item.innerText = grp.name\n        $item.setAttribute('data-index', String(index))\n        $item.onclick = () => this.openGrp(index)\n        this.$grpSwitcher.append($item)\n      })\n    }\n\n    // 默认打开第一个分类\n    if (this.emoticons.length > 0) this.openGrp(0)\n  }\n\n  /** 打开一个表情组 */\n  public openGrp(index: number) {\n    Array.from(this.$grpWrap.children).forEach((item) => {\n      const el = item as HTMLElement\n      if (el.getAttribute('data-index') !== String(index)) {\n        el.style.display = 'none'\n      } else {\n        el.style.display = ''\n      }\n    })\n\n    this.$grpSwitcher\n      ?.querySelectorAll('span.active')\n      .forEach((item) => item.classList.remove('active'))\n    this.$grpSwitcher?.querySelector(`span[data-index=\"${index}\"]`)?.classList.add('active')\n\n    this.changeListHeight()\n  }\n\n  private changeListHeight() {\n    /* const listWrapHeight = Utils.getHeight(this.$grpWrapem)\n    this.editor.plugWrapEl.style.height = `${listWrapHeight > 150 ? listWrapHeight : 150}px` */\n  }\n\n  /** 处理评论 content 中的表情内容 */\n  public transEmoticonImageText(text: string) {\n    if (!this.emoticons || !Array.isArray(this.emoticons)) return text\n\n    this.emoticons.forEach((grp) => {\n      if (grp.type !== 'image') return\n      Object.entries(grp.items).forEach(([index, item]) => {\n        text = text\n          .split(`:[${item.key}]`)\n          .join(`<img src=\"${item.val}\" atk-emoticon=\"${item.key}\">`) // replaceAll(...)\n      })\n    })\n\n    return text\n  }\n}\n","import type PlugKit from './_kit'\nimport EditorPlug from './_plug'\nimport * as Utils from '@/lib/utils'\nimport $t from '@/i18n'\n\n/** 允许的图片格式 */\nconst AllowImgExts = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'svg', 'webp']\n\nexport default class Upload extends EditorPlug {\n  private $imgUploadInput?: HTMLInputElement\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    this.kit.useMounted(() => this.init())\n\n    this.initDragImg()\n  }\n\n  private init() {\n    this.$imgUploadInput = document.createElement('input')\n    this.$imgUploadInput.type = 'file'\n    this.$imgUploadInput.style.display = 'none'\n    this.$imgUploadInput.accept = AllowImgExts.map((o) => `.${o}`).join(',')\n\n    // TODO: Use btn cannot refresh when mounted event is triggered\n    const $btn = this.useBtn(\n      `<i aria-label=\"${$t('uploadImage')}\"><svg fill=\"currentColor\" aria-hidden=\"true\" height=\"14\" viewBox=\"0 0 14 14\" width=\"14\"><path d=\"m0 1.94444c0-1.074107.870333-1.94444 1.94444-1.94444h10.11116c1.0741 0 1.9444.870333 1.9444 1.94444v10.11116c0 1.0741-.8703 1.9444-1.9444 1.9444h-10.11116c-1.074107 0-1.94444-.8703-1.94444-1.9444zm1.94444-.38888c-.21466 0-.38888.17422-.38888.38888v7.06689l2.33333-2.33333 2.33333 2.33333 3.88888-3.88889 2.3333 2.33334v-5.51134c0-.21466-.1742-.38888-.3888-.38888zm10.49996 8.09977-2.3333-2.33333-3.88888 3.8889-2.33333-2.33334-2.33333 2.33334v.8447c0 .2146.17422.3888.38888.3888h10.11116c.2146 0 .3888-.1742.3888-.3888zm-7.1944-6.54422c-.75133 0-1.36111.60978-1.36111 1.36111 0 .75134.60978 1.36111 1.36111 1.36111s1.36111-.60977 1.36111-1.36111c0-.75133-.60978-1.36111-1.36111-1.36111z\"/></svg></i>`,\n    )\n    $btn.after(this.$imgUploadInput)\n    $btn.onclick = () => {\n      // 选择图片\n      const $input = this.$imgUploadInput!\n      $input.onchange = () => {\n        ;(async () => {\n          // 解决阻塞 UI 问题\n          if (!$input.files || $input.files.length === 0) return\n          const file = $input.files[0]\n          this.uploadImg(file)\n        })()\n      }\n      $input.click() // 显示选择图片对话框\n    }\n\n    if (!this.kit.useConf().imgUpload) {\n      this.$btn!.setAttribute('atk-only-admin-show', '')\n    }\n  }\n\n  private initDragImg() {\n    // 统一从 FileList 获取文件并上传图片方法\n    const uploadFromFileList = (files?: FileList) => {\n      if (!files) return\n\n      for (let i = 0; i < files.length; i++) {\n        const file = files[i]\n        this.uploadImg(file)\n      }\n    }\n\n    // 拖拽图片\n    // @link https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop\n    // 阻止浏览器的默认释放行为\n    const onDragover = (evt: Event) => {\n      evt.stopPropagation()\n      evt.preventDefault()\n    }\n\n    const onDrop = (evt: DragEvent) => {\n      const files = evt.dataTransfer?.files\n      if (files?.length) {\n        evt.preventDefault()\n        uploadFromFileList(files)\n      }\n    }\n\n    // 粘贴图片\n    const onPaste = (evt: ClipboardEvent) => {\n      const files = evt.clipboardData?.files\n      if (files?.length) {\n        evt.preventDefault()\n        uploadFromFileList(files)\n      }\n    }\n\n    this.kit.useMounted(() => {\n      this.kit.useUI().$textarea.addEventListener('dragover', onDragover)\n      this.kit.useUI().$textarea.addEventListener('drop', onDrop)\n      this.kit.useUI().$textarea.addEventListener('paste', onPaste)\n    })\n    this.kit.useUnmounted(() => {\n      this.kit.useUI().$textarea.removeEventListener('dragover', onDragover)\n      this.kit.useUI().$textarea.removeEventListener('drop', onDrop)\n      this.kit.useUI().$textarea.removeEventListener('paste', onPaste)\n    })\n  }\n\n  async uploadImg(file: File) {\n    const fileExt = /[^.]+$/.exec(file.name)\n    if (!fileExt || !AllowImgExts.includes(String(fileExt[0]).toLowerCase())) return\n\n    // 未登录提示\n    if (!this.kit.useUser().checkHasBasicUserInfo()) {\n      this.kit.useEditor().showNotify($t('uploadLoginMsg'), 'w')\n      return\n    }\n\n    // 插入图片前换一行\n    let insertPrefix = '\\n'\n    if (this.kit.useUI().$textarea.value.trim() === '') insertPrefix = ''\n\n    // 插入占位加载文字\n    const uploadPlaceholderTxt = `${insertPrefix}![](Uploading ${file.name}...)`\n    this.kit.useEditor().insertContent(uploadPlaceholderTxt)\n\n    // 上传图片\n    let resp: { public_url: string } | undefined\n    try {\n      const customUploaderFn = this.kit.useConf().imgUploader\n      if (!customUploaderFn) {\n        // 使用 Artalk 进行图片上传\n        resp = (await this.kit.useApi().upload.upload({ file })).data\n      } else {\n        // 使用自定义的图片上传器\n        resp = { public_url: await customUploaderFn(file) }\n      }\n    } catch (err: any) {\n      console.error(err)\n      this.kit.useEditor().showNotify(`${$t('uploadFail')}: ${err.message}`, 'e')\n    }\n    if (!!resp && resp.public_url) {\n      let imgURL = resp.public_url as string\n\n      // 若为相对路径，加上 artalk server\n      if (!Utils.isValidURL(imgURL))\n        imgURL = Utils.getURLBasedOnApi({\n          base: this.kit.useConf().server,\n          path: imgURL,\n        })\n\n      // 上传成功插入图片\n      this.kit\n        .useEditor()\n        .setContent(\n          this.kit\n            .useUI()\n            .$textarea.value.replace(uploadPlaceholderTxt, `${insertPrefix}![](${imgURL})`),\n        )\n    } else {\n      // 上传失败删除加载文字\n      this.kit\n        .useEditor()\n        .setContent(this.kit.useUI().$textarea.value.replace(uploadPlaceholderTxt, ''))\n    }\n  }\n}\n","import './preview.scss'\n\nimport EditorPlug from './_plug'\nimport type PlugKit from './_kit'\nimport * as marked from '@/lib/marked'\nimport $t from '@/i18n'\n\nexport default class Preview extends EditorPlug {\n  private isPlugPanelShow = false\n\n  constructor(kit: PlugKit) {\n    super(kit)\n\n    this.kit.useMounted(() => {\n      this.usePanel(`<div class=\"atk-editor-plug-preview\"></div>`)\n\n      // initialize plug button\n      this.useBtn(\n        `<i aria-label=\"${$t('preview')}\"><svg fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\"><path fill-rule=\"evenodd\" d=\"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z\"></path></svg></i>`,\n      )\n    })\n    this.kit.useUnmounted(() => {})\n\n    // function to update content\n    this.kit.useEvents().on('content-updated', (content) => {\n      this.isPlugPanelShow && this.updateContent()\n    })\n\n    this.usePanelShow(() => {\n      this.isPlugPanelShow = true\n      this.updateContent()\n    })\n    this.usePanelHide(() => {\n      this.isPlugPanelShow = false\n    })\n  }\n\n  updateContent() {\n    this.$panel!.innerHTML = this.kit.useEditor().getContentMarked()\n  }\n}\n","import type EditorPlug from './_plug'\nimport LocalStorage from './local-storage'\nimport Textarea from './textarea'\nimport SubmitBtn from './submit-btn'\nimport Submit from './submit'\nimport StateReply from './state-reply'\nimport StateEdit from './state-edit'\nimport Closable from './closable'\nimport HeaderEvent from './header-event'\nimport HeaderUser from './header-user'\nimport HeaderLink from './header-link'\nimport Mover from './mover'\nimport Emoticons from './emoticons'\nimport Upload from './upload'\nimport Preview from './preview'\nimport type { ArtalkConfig } from '@/types'\n\n/** The default enabled plugs */\nconst EDITOR_PLUGS: (typeof EditorPlug)[] = [\n  // Core\n  LocalStorage,\n  HeaderEvent,\n  HeaderUser,\n  HeaderLink,\n  Textarea,\n  Submit,\n  SubmitBtn,\n  Mover,\n  StateReply,\n  StateEdit,\n  Closable,\n\n  // Extensions\n  Emoticons,\n  Upload,\n  Preview,\n]\n\n/**\n * Get the enabled plugs by config\n */\nexport function getEnabledPlugs(\n  conf: Pick<ArtalkConfig, 'imgUpload' | 'emoticons' | 'preview' | 'editorTravel'>,\n): (typeof EditorPlug)[] {\n  // The reference map of config and plugs\n  // (for check if the plug is enabled)\n  const confRefs = new Map<typeof EditorPlug, any>()\n  confRefs.set(Upload, conf.imgUpload)\n  confRefs.set(Emoticons, conf.emoticons)\n  confRefs.set(Preview, conf.preview)\n  confRefs.set(Mover, conf.editorTravel)\n\n  return EDITOR_PLUGS.filter((p) => !confRefs.has(p) || !!confRefs.get(p))\n}\n","import type { PlugManager } from '../editor-kit'\nimport type EditorPlug from './_plug'\n\n/**\n * PlugKit provides a set of methods to help you develop editor plug\n */\nexport default class PlugKit {\n  constructor(private plugs: PlugManager) {}\n\n  /** Use the editor */\n  useEditor() {\n    return this.plugs.editor\n  }\n\n  /**\n   * Use the context of global\n   *\n   * @deprecated The calls to this function should be reduced as much as possible\n   */\n  useGlobalCtx() {\n    return this.plugs.editor.ctx\n  }\n\n  /** Use the config of Artalk */\n  useConf() {\n    return this.plugs.editor.ctx.conf\n  }\n\n  /** Use the http api client */\n  useApi() {\n    return this.plugs.editor.ctx.getApi()\n  }\n\n  /** Use the user manager */\n  useUser() {\n    return this.plugs.editor.ctx.get('user')\n  }\n\n  /** Use the ui of editor */\n  useUI() {\n    return this.plugs.editor.getUI()\n  }\n\n  /** Use the events in editor scope */\n  useEvents() {\n    return this.plugs.getEvents()\n  }\n\n  /** Listen the event when plug is mounted */\n  useMounted(func: () => void) {\n    this.useEvents().on('mounted', func)\n  }\n\n  /** Listen the event when plug is unmounted */\n  useUnmounted(func: () => void) {\n    this.useEvents().on('unmounted', func)\n  }\n\n  /** Use the deps of other plug */\n  useDeps<T extends typeof EditorPlug>(plug: T) {\n    return this.plugs.get(plug)\n  }\n}\n","import { getEnabledPlugs } from './editor'\nimport EditorPlug from './editor/_plug'\nimport PlugKit from './editor/_kit'\nimport EventManager from '@/lib/event-manager'\nimport type { EditorApi, ArtalkPlugin } from '@/types'\n\nexport interface EditorEventPayloadMap {\n  mounted: undefined\n  unmounted: undefined\n  'header-input': { field: string; $input: HTMLInputElement }\n  'header-change': { field: string; $input: HTMLInputElement }\n  'content-updated': string\n  'panel-show': EditorPlug\n  'panel-hide': EditorPlug\n  'panel-close': undefined\n\n  'editor-close': undefined\n  'editor-open': undefined\n}\n\nexport const EditorKit: ArtalkPlugin = (ctx) => {\n  const editor = ctx.get('editor')\n\n  const editorPlugs = new PlugManager(editor)\n  ctx.inject('editorPlugs', editorPlugs)\n}\n\nexport class PlugManager {\n  private plugs: EditorPlug[] = []\n  private openedPlug: EditorPlug | null = null\n  private events = new EventManager<EditorEventPayloadMap>()\n\n  getPlugs() {\n    return this.plugs\n  }\n  getEvents() {\n    return this.events\n  }\n\n  private clear() {\n    this.plugs = []\n    this.events = new EventManager()\n    if (this.openedPlug) this.closePlugPanel()\n  }\n\n  constructor(public editor: EditorApi) {\n    let confLoaded = false // config not loaded at first time\n    this.editor.ctx.watchConf(\n      ['imgUpload', 'emoticons', 'preview', 'editorTravel', 'locale'],\n      (conf) => {\n        // trigger unmount event will call all plugs' unmount function\n        // (this will only be called while conf reloaded, not be called at first time)\n        confLoaded && this.getEvents().trigger('unmounted')\n\n        // reset the plugs\n        this.clear()\n\n        // init the all enabled plugs\n        getEnabledPlugs(conf).forEach((Plug) => {\n          // create the plug instance\n          const kit = new PlugKit(this)\n          this.plugs.push(new Plug(kit))\n        })\n\n        // trigger event for plug initialization\n        this.getEvents().trigger('mounted')\n        confLoaded = true\n\n        // refresh the plug UI\n        this.loadPluginUI()\n      },\n    )\n\n    this.events.on('panel-close', () => this.closePlugPanel())\n  }\n\n  private loadPluginUI() {\n    // handle ui, clear and reset the plug btns and plug panels\n    this.editor.getUI().$plugPanelWrap.innerHTML = ''\n    this.editor.getUI().$plugPanelWrap.style.display = 'none'\n    this.editor.getUI().$plugBtnWrap.innerHTML = ''\n\n    // load the plug UI\n    this.plugs.forEach((plug) => this.loadPluginItem(plug))\n  }\n\n  /** Load the plug btn and plug panel on editor ui */\n  private loadPluginItem(plug: EditorPlug) {\n    const $btn = plug.$btn\n    if (!$btn) return\n    this.editor.getUI().$plugBtnWrap.appendChild($btn)\n\n    // bind the event when click plug btn\n    !$btn.onclick &&\n      ($btn.onclick = () => {\n        // removing the active class from all the buttons\n        this.editor\n          .getUI()\n          .$plugBtnWrap.querySelectorAll('.active')\n          .forEach((item) => item.classList.remove('active'))\n\n        // if the plug is not the same as the openedPlug,\n        if (plug !== this.openedPlug) {\n          // then open the plug current clicked plug panel\n          this.openPlugPanel(plug)\n\n          // add active class for current plug panel\n          $btn.classList.add('active')\n        } else {\n          // then close the plug\n          this.closePlugPanel()\n        }\n      })\n\n    // initialization of plug panel\n    const $panel = plug.$panel\n    if ($panel) {\n      $panel.style.display = 'none'\n      this.editor.getUI().$plugPanelWrap.appendChild($panel)\n    }\n  }\n\n  get<T extends typeof EditorPlug>(plug: T) {\n    return this.plugs.find((p) => p instanceof plug) as InstanceType<T> | undefined\n  }\n\n  /** Open the editor plug panel */\n  openPlugPanel(plug: EditorPlug) {\n    this.plugs.forEach((aPlug) => {\n      const plugPanel = aPlug.$panel\n      if (!plugPanel) return\n\n      if (aPlug === plug) {\n        plugPanel.style.display = ''\n        this.events.trigger('panel-show', plug)\n      } else {\n        plugPanel.style.display = 'none'\n        this.events.trigger('panel-hide', plug)\n      }\n    })\n\n    this.editor.getUI().$plugPanelWrap.style.display = ''\n    this.openedPlug = plug\n  }\n\n  /** Close the editor plug panel */\n  closePlugPanel() {\n    if (!this.openedPlug) return\n\n    this.editor.getUI().$plugPanelWrap.style.display = 'none'\n    this.events.trigger('panel-hide', this.openedPlug)\n    this.openedPlug = null\n  }\n\n  /** Get the content which is transformed by plugs */\n  getTransformedContent(rawContent: string) {\n    let result = rawContent\n    this.plugs.forEach((aPlug) => {\n      if (!aPlug.contentTransformer) return\n      result = aPlug.contentTransformer(result)\n    })\n    return result\n  }\n}\n","import type { ContextApi, ArtalkPlugin, PageData } from '@/types'\nimport $t from '@/i18n'\n\nexport const WithEditor: ArtalkPlugin = (ctx) => {\n  let $closeCommentBtn: HTMLElement | undefined\n\n  // on Artalk mounted\n  // (after all components had mounted)\n  ctx.on('mounted', () => {\n    const list = ctx.get('list')\n\n    $closeCommentBtn = list.$el.querySelector<HTMLElement>('[data-action=\"admin-close-comment\"]')!\n\n    // bind editor close button click event\n    $closeCommentBtn.addEventListener('click', () => {\n      const page = ctx.getData().getPage()\n      if (!page) throw new Error('Page data not found')\n\n      page.admin_only = !page.admin_only\n      adminPageEditSave(ctx, page)\n    })\n  })\n\n  // on comment list loaded (it will include page data update)\n  ctx.on('page-loaded', (page) => {\n    const editor = ctx.get('editor')\n\n    // if page comment is closed\n    if (page?.admin_only === true) {\n      // then close editor\n      editor.getPlugs()?.getEvents().trigger('editor-close')\n      $closeCommentBtn && ($closeCommentBtn.innerText = $t('openComment'))\n    } else {\n      // the open editor\n      editor.getPlugs()?.getEvents().trigger('editor-open')\n      $closeCommentBtn && ($closeCommentBtn.innerText = $t('closeComment'))\n    }\n  })\n\n  ctx.on('list-loaded', (comments) => {\n    // 防止评论框被吞\n    ctx.editorResetState()\n  })\n}\n\n/** 管理员设置页面信息 */\nfunction adminPageEditSave(ctx: ContextApi, page: PageData) {\n  ctx.editorShowLoading()\n  ctx\n    .getApi()\n    .pages.updatePage(page.id, page)\n    .then(({ data }) => {\n      ctx.getData().updatePage(data)\n    })\n    .catch((err) => {\n      ctx.editorShowNotify(`${$t('editFail')}: ${err.message || String(err)}`, 'e')\n    })\n    .finally(() => {\n      ctx.editorHideLoading()\n    })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\n\nexport const Unread: ArtalkPlugin = (ctx) => {\n  ctx.on('comment-rendered', (comment) => {\n    // comment unread highlight\n    if (ctx.conf.listUnreadHighlight === true) {\n      const notifies = ctx.getData().getNotifies()\n      const notify = notifies.find((o) => o.comment_id === comment.getID())\n\n      if (notify) {\n        // if comment contains in unread list\n        comment.getRender().setUnread(true)\n        comment.getRender().setOpenAction(() => {\n          window.open(notify.read_link)\n\n          // remove notify which has been read\n          ctx.getData().updateNotifies(notifies.filter((o) => o.comment_id !== comment.getID()))\n        })\n      } else {\n        // comment not in unread list\n        comment.getRender().setUnread(false)\n      }\n    }\n  })\n\n  ctx.on('list-goto', (commentID) => {\n    const notifyKey = Utils.getQueryParam('atk_notify_key')\n    if (notifyKey) {\n      // mark as read\n      ctx\n        .getApi()\n        .notifies.markNotifyRead(commentID, notifyKey)\n        .then(() => {\n          // remove from unread list\n          ctx.getData().updateNotifies(\n            ctx\n              .getData()\n              .getNotifies()\n              .filter((o) => o.comment_id !== commentID),\n          )\n        })\n    }\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\nimport $t from '@/i18n'\n\nexport const Count: ArtalkPlugin = (ctx) => {\n  const refreshCountNumEl = () => {\n    const list = ctx.get('list')\n\n    const $count = list.$el.querySelector('.atk-comment-count .atk-text')\n    if (!$count) return\n\n    const text = Utils.htmlEncode(\n      $t('counter', {\n        count: `${Number(ctx.getData().getListLastFetch()?.data?.count) || 0}`,\n      }),\n    )\n    $count.innerHTML = text.replace(/(\\d+)/, '<span class=\"atk-comment-count-num\">$1</span>')\n  }\n\n  ctx.on('list-loaded', () => {\n    refreshCountNumEl()\n  })\n\n  ctx.on('comment-inserted', () => {\n    // 评论数增加 1\n    const last = ctx.getData().getListLastFetch()\n    if (last?.data) last.data.count += 1\n  })\n\n  ctx.on('comment-deleted', () => {\n    // 评论数减 1\n    const last = ctx.getData().getListLastFetch()\n    if (last?.data) last.data.count -= 1\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport $t from '@/i18n'\n\nexport const SidebarBtn: ArtalkPlugin = (ctx) => {\n  let $openSidebarBtn: HTMLElement | null = null\n\n  const syncByUser = () => {\n    if (!$openSidebarBtn) return\n    const user = ctx.get('user').getData()\n\n    // 已输入个人信息\n    if (!!user.name && !!user.email) {\n      $openSidebarBtn.classList.remove('atk-hide')\n\n      // update button text (normal user or admin)\n      const $btnText = $openSidebarBtn.querySelector<HTMLElement>('.atk-text')\n      if ($btnText) $btnText.innerText = !user.is_admin ? $t('msgCenter') : $t('ctrlCenter')\n    } else {\n      $openSidebarBtn.classList.add('atk-hide')\n    }\n  }\n\n  ctx.watchConf(['locale'], (conf) => {\n    const list = ctx.get('list')\n\n    $openSidebarBtn = list.$el.querySelector<HTMLElement>('[data-action=\"open-sidebar\"]')\n    if (!$openSidebarBtn) return\n\n    $openSidebarBtn.onclick = () => {\n      // use onclick rather than addEventListener to prevent duplicate event\n      ctx.showSidebar()\n    }\n\n    syncByUser()\n  })\n\n  ctx.on('user-changed', (user) => {\n    syncByUser()\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\n\nexport const UnreadBadge: ArtalkPlugin = (ctx) => {\n  let $unreadBadge: HTMLElement | null = null\n\n  const showUnreadBadge = (count: number) => {\n    if (!$unreadBadge) return\n\n    if (count > 0) {\n      $unreadBadge.innerText = `${Number(count || 0)}`\n      $unreadBadge.style.display = 'block'\n    } else {\n      $unreadBadge.style.display = 'none'\n    }\n  }\n\n  ctx.on('mounted', () => {\n    const list = ctx.get('list')\n\n    $unreadBadge = list.$el.querySelector<HTMLElement>('.atk-unread-badge')\n  })\n\n  ctx.on('notifies-updated', (notifies) => {\n    showUnreadBadge(notifies.length || 0)\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\n\nexport const GotoDispatcher: ArtalkPlugin = (ctx) => {\n  let lastID = 0\n  const check = ({ locker }: { locker: boolean }) => {\n    const commentID = extractCommentID()\n    if (!commentID) return\n\n    if (locker && lastID === commentID) return // if the commentID is the same as the last one, do nothing\n    lastID = commentID // record the last commentID\n\n    ctx.trigger('list-goto', commentID) // trigger event\n  }\n\n  const hashChangeHandler = () => check({ locker: false })\n  const listLoadedHandler = () => check({ locker: true })\n  ctx.on('mounted', () => {\n    window.addEventListener('hashchange', hashChangeHandler)\n    ctx.on('list-loaded', listLoadedHandler)\n  })\n  ctx.on('unmounted', () => {\n    window.removeEventListener('hashchange', hashChangeHandler)\n    ctx.off('list-loaded', listLoadedHandler)\n  })\n}\n\nfunction extractCommentID(): number | null {\n  // Try get from hash\n  // Hash retrieval priority is higher than query,\n  // Because click goto will change hash.\n  const match = window.location.hash.match(/#atk-comment-([0-9]+)/)\n  let commentId =\n    match && match[1] && !Number.isNaN(parseFloat(match[1])) ? parseFloat(match[1]) : null\n\n  // Fail over to get from query\n  if (!commentId) {\n    commentId = Number(Utils.getQueryParam('atk_comment')) // same as backend GetReplyLink()\n  }\n\n  return commentId || null\n}\n","import type { ArtalkPlugin } from '@/types'\n\nexport const GotoFocus: ArtalkPlugin = (ctx) => {\n  ctx.on('list-goto', async (commentID) => {\n    // find the comment node\n    let comment = ctx.getCommentNodes().find((c) => c.getID() === commentID)\n    if (!comment) {\n      // fetch and insert the comment from the server\n      const data = (await ctx.getApi().comments.getComment(commentID)).data\n      ctx\n        .get('list')\n        .getListLayout({ forceFlatMode: true })\n        .insert(data.comment, data.reply_comment)\n      comment = ctx.getCommentNodes().find((c) => c.getID() === commentID)\n    }\n    if (!comment) return\n    comment.focus()\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport { version as ARTALK_VERSION } from '~/package.json'\n\nexport const Copyright: ArtalkPlugin = (ctx) => {\n  ctx.on('mounted', () => {\n    const list = ctx.get('list')\n\n    const $copyright = list.$el.querySelector<HTMLElement>('.atk-copyright')\n    if (!$copyright) return\n\n    $copyright.innerHTML =\n      `Powered By <a href=\"https://artalk.js.org\" ` +\n      `target=\"_blank\" title=\"Artalk v${ARTALK_VERSION}\">` +\n      `Artalk</a>`\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\nimport { sanitize } from '@/lib/sanitizer'\n\nexport const NoComment: ArtalkPlugin = (ctx) => {\n  ctx.on('list-loaded', (comments) => {\n    const list = ctx.get('list')!\n\n    // 无评论\n    const isNoComment = comments.length <= 0\n    let $noComment = list.getCommentsWrapEl().querySelector<HTMLElement>('.atk-list-no-comment')\n\n    if (isNoComment) {\n      if (!$noComment) {\n        $noComment = Utils.createElement('<div class=\"atk-list-no-comment\"></div>')\n\n        // sanitize before set innerHTML\n        $noComment.innerHTML = sanitize(list.ctx.conf.noComment || list.ctx.$t('noComment'))\n        list.getCommentsWrapEl().appendChild($noComment)\n      }\n    } else {\n      $noComment?.remove()\n    }\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\nimport $t from '@/i18n'\n\nexport const Dropdown: ArtalkPlugin = (ctx) => {\n  const reloadUseParamsEditor = (func: (p: any) => void) => {\n    ctx.conf.listFetchParamsModifier = func\n    ctx.reload()\n  }\n\n  const initDropdown = ($dropdownOn: HTMLElement) => {\n    renderDropdown({\n      $dropdownWrap: $dropdownOn,\n      dropdownList: [\n        [\n          $t('sortLatest'),\n          () => {\n            reloadUseParamsEditor((p) => {\n              p.sort_by = 'date_desc'\n            })\n          },\n        ],\n        [\n          $t('sortBest'),\n          () => {\n            reloadUseParamsEditor((p) => {\n              p.sort_by = 'vote'\n            })\n          },\n        ],\n        [\n          $t('sortOldest'),\n          () => {\n            reloadUseParamsEditor((p) => {\n              p.sort_by = 'date_asc'\n            })\n          },\n        ],\n        [\n          $t('sortAuthor'),\n          () => {\n            reloadUseParamsEditor((p) => {\n              p.view_only_admin = true\n            })\n          },\n        ],\n      ],\n    })\n  }\n\n  ctx.watchConf(['listSort', 'locale'], (conf) => {\n    const list = ctx.get('list')\n\n    const $count = list.$el.querySelector<HTMLElement>('.atk-comment-count')\n    if (!$count) return\n\n    // 评论列表排序 Dropdown 下拉选择层\n    if (conf.listSort) {\n      initDropdown($count)\n    } else {\n      removeDropdown({\n        $dropdownWrap: $count,\n      })\n    }\n  })\n}\n\n/** 评论排序方式选择下拉菜单 */\nfunction renderDropdown(conf: {\n  $dropdownWrap: HTMLElement\n  dropdownList: [string, () => void][]\n}) {\n  const { $dropdownWrap, dropdownList } = conf\n  if ($dropdownWrap.querySelector('.atk-dropdown')) return\n\n  // 修改 class\n  $dropdownWrap.classList.add('atk-dropdown-wrap')\n\n  // 插入图标\n  $dropdownWrap.append(Utils.createElement(`<span class=\"atk-arrow-down-icon\"></span>`))\n\n  // 列表项点击事件\n  let curtActive = 0 // 当前选中\n  const onItemClick = (i: number, $item: HTMLElement, name: string, action: () => void) => {\n    action()\n\n    // set active\n    curtActive = i\n    $dropdown.querySelectorAll('.active').forEach((e) => {\n      e.classList.remove('active')\n    })\n    $item.classList.add('active')\n\n    // 关闭层 (临时消失，取消 :hover)\n    $dropdown.style.display = 'none'\n    setTimeout(() => {\n      $dropdown.style.display = ''\n    }, 80)\n  }\n\n  // 生成列表元素\n  const $dropdown = Utils.createElement(`<ul class=\"atk-dropdown atk-fade-in\"></ul>`)\n  dropdownList.forEach((item, i) => {\n    const [name, action] = item\n\n    const $item = Utils.createElement(`<li class=\"atk-dropdown-item\"><span></span></li>`)\n    const $link = $item.querySelector<HTMLElement>('span')!\n    $link.innerText = name\n    $link.onclick = () => {\n      onItemClick(i, $item, name, action)\n    }\n    $dropdown.append($item)\n\n    if (i === curtActive) $item.classList.add('active') // 默认选中项\n  })\n\n  $dropdownWrap.append($dropdown)\n}\n\n/** 删除评论排序方式选择下拉菜单 */\nfunction removeDropdown(conf: { $dropdownWrap: HTMLElement }) {\n  const { $dropdownWrap } = conf\n  $dropdownWrap.classList.remove('atk-dropdown-wrap')\n  $dropdownWrap.querySelector('.atk-arrow-down-icon')?.remove()\n  $dropdownWrap.querySelector('.atk-dropdown')?.remove()\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\n\n/** 评论时间自动更新 */\nexport const TimeTicking: ArtalkPlugin = (ctx) => {\n  let timer: number | null = null\n\n  ctx.on('mounted', () => {\n    timer = window.setInterval(() => {\n      const list = ctx.get('list')\n\n      list.$el.querySelectorAll<HTMLElement>('[data-atk-comment-date]').forEach((el) => {\n        const date = new Date(Number(el.getAttribute('data-atk-comment-date')))\n        el.innerText = ctx.getConf().dateFormatter?.(date) || Utils.timeAgo(date, ctx.$t)\n      })\n    }, 30 * 1000) // 30s 更新一次\n  })\n\n  ctx.on('unmounted', () => {\n    timer && window.clearInterval(timer)\n  })\n}\n","import * as Utils from '@/lib/utils'\nimport * as Ui from '@/lib/ui'\nimport $t from '@/i18n'\n\nexport interface ErrorDialogOptions {\n  $err: HTMLElement\n\n  errMsg: string\n  errData?: any\n  retryFn?: () => void\n\n  onOpenSidebar?: () => void\n}\n\nexport function showErrorDialog(opts: ErrorDialogOptions) {\n  const errEl = Utils.createElement(`<span><span class=\"error-message\"></span><br/><br/></span>`)\n  errEl.querySelector<HTMLElement>('.error-message')!.innerText =\n    `${$t('listLoadFailMsg')}\\n${opts.errMsg}`\n\n  if (opts.retryFn) {\n    const $retryBtn = Utils.createElement(`<span style=\"cursor:pointer;\">${$t('listRetry')}</span>`)\n    $retryBtn.onclick = () => opts.retryFn && opts.retryFn()\n    errEl.appendChild($retryBtn)\n  }\n\n  if (opts.onOpenSidebar) {\n    const $openSidebar = Utils.createElement(\n      `<span atk-only-admin-show> | <span style=\"cursor:pointer;\">${$t('openName', { name: $t('ctrlCenter') })}</span></span>`,\n    )\n    errEl.appendChild($openSidebar)\n    $openSidebar.onclick = () => opts.onOpenSidebar && opts.onOpenSidebar()\n  }\n\n  Ui.setError(opts.$err, errEl)\n}\n","import * as Ui from '../../lib/ui'\nimport type { ArtalkPlugin, ContextApi } from '@/types'\nimport { showErrorDialog } from '@/components/error-dialog'\n\nexport const ErrorDialog: ArtalkPlugin = (ctx) => {\n  ctx.on('list-fetch', () => {\n    const list = ctx.get('list')\n\n    // clear the original error when a new fetch is triggered\n    Ui.setError(list.$el, null)\n  })\n\n  ctx.on('list-failed', (err) => {\n    showErrorDialog({\n      $err: ctx.get('list').$el,\n      errMsg: err.msg,\n      errData: err.data,\n      retryFn: () => ctx.fetch({ offset: 0 }),\n    })\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Ui from '@/lib/ui'\n\nexport const Loading: ArtalkPlugin = (ctx) => {\n  ctx.on('list-fetch', (p) => {\n    const list = ctx.get('list')\n\n    if (p.offset === 0)\n      // only show loading when fetch first page\n      Ui.setLoading(true, list.$el)\n    // else if not first page, show loading in paginator (code not there)\n  })\n\n  ctx.on('list-fetched', () => {\n    const list = ctx.get('list')\n    Ui.setLoading(false, list.$el)\n  })\n}\n","import type { ListFetchParams, ArtalkPlugin } from '@/types'\n\nexport const Fetch: ArtalkPlugin = (ctx) => {\n  ctx.on('list-fetch', (_params) => {\n    if (ctx.getData().getLoading()) return\n    ctx.getData().setLoading(true)\n\n    const params: ListFetchParams = {\n      // default params\n      offset: 0,\n      limit: ctx.conf.pagination.pageSize,\n      flatMode: ctx.conf.flatMode as boolean, // always be boolean because had been handled in Artalk.init\n      paramsModifier: ctx.conf.listFetchParamsModifier,\n      ..._params,\n    }\n\n    // must before other function call\n    ctx.getData().setListLastFetch({\n      params,\n    })\n\n    // prepare params for request\n    const reqParams = {\n      limit: params.limit,\n      offset: params.offset,\n      flat_mode: params.flatMode,\n      page_key: ctx.getConf().pageKey,\n      site_name: ctx.getConf().site,\n    }\n\n    // call the modifier function\n    if (params.paramsModifier) params.paramsModifier(reqParams)\n\n    // start request\n    ctx\n      .getApi()\n      .comments.getComments({\n        ...reqParams,\n        ...ctx.getApi().getUserFields(),\n      })\n      .then(({ data }) => {\n        // Must before all other function call and event trigger,\n        // because it will depend on the lastData\n        // TODO: this is global variable, easy to use, but not good, consider to refactor.\n        // refactor work is hard, because it is used in many places.\n        ctx.getData().setListLastFetch({ params, data })\n\n        // 装置评论\n        ctx.getData().loadComments(data.comments)\n\n        // 更新页面数据\n        ctx.getData().updatePage(data.page)\n\n        // trigger events when success\n        params.onSuccess && params.onSuccess(data)\n\n        ctx.trigger('list-fetched', { params, data })\n      })\n      .catch((e) => {\n        // 显示错误对话框\n        const error = {\n          msg: e.msg || String(e),\n          data: e.data,\n        }\n\n        params.onError && params.onError(error)\n\n        // trigger events when error\n        ctx.trigger('list-failed', error)\n        ctx.trigger('list-fetched', { params, error })\n\n        throw e\n      })\n      .finally(() => {\n        ctx.getData().setLoading(false)\n      })\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\n\nexport const ReachBottom: ArtalkPlugin = (ctx) => {\n  let observer: IntersectionObserver | null = null\n\n  const setupObserver = ($target: HTMLElement) => {\n    const scrollEvtAt = (ctx.conf.scrollRelativeTo && ctx.conf.scrollRelativeTo()) || null\n\n    observer = new IntersectionObserver(\n      ([entries]) => {\n        if (entries.isIntersecting) {\n          clearObserver() // clear before trigger event to avoid trigger twice `list-reach-bottom`\n\n          // note that this event will be triggered only once\n          // until the next list is loaded\n          ctx.trigger('list-reach-bottom')\n        }\n      },\n      {\n        threshold: 0.9, // when the target is 90% visible\n\n        // @see https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/root\n        // If the root is null, then the bounds of the actual document viewport are used.\n        root: scrollEvtAt,\n      },\n    )\n    observer.observe($target)\n  }\n\n  const clearObserver = () => {\n    observer?.disconnect()\n    observer = null\n  }\n\n  ctx.on('list-loaded', () => {\n    clearObserver()\n\n    const list = ctx.get('list')\n\n    // get the second last child\n    const children = list.getCommentsWrapEl().childNodes\n    const $target = children.length > 2 ? (children[children.length - 2] as HTMLElement) : null\n    if (!$target) return\n\n    // check IntersectionObserver support\n    if (!('IntersectionObserver' in window)) {\n      console.warn('IntersectionObserver api not supported')\n      return\n    }\n\n    // use IntersectionObserver to detect reach bottom\n    setupObserver($target)\n  })\n\n  ctx.on('unmounted', () => {\n    clearObserver()\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport * as Utils from '@/lib/utils'\n\n/** List scroll to the first comment */\nexport const GotoFirst: ArtalkPlugin = (ctx) => {\n  const handler = () => {\n    const list = ctx.get('list')\n\n    const $relative = ctx.conf.scrollRelativeTo && ctx.conf.scrollRelativeTo()\n    ;($relative || window).scroll({\n      top: Utils.getOffset(list.$el, $relative).top,\n      left: 0,\n    })\n  }\n\n  ctx.on('mounted', () => {\n    ctx.on('list-goto-first', handler)\n  })\n\n  ctx.on('unmounted', () => {\n    ctx.off('list-goto-first', handler)\n  })\n}\n","import { WithEditor } from './with-editor'\nimport { Unread } from './unread'\nimport { Count } from './count'\nimport { SidebarBtn } from './sidebar-btn'\nimport { UnreadBadge } from './unread-badge'\nimport { GotoDispatcher } from './goto-dispatcher'\nimport { GotoFocus } from './goto-focus'\nimport { Copyright } from './copyright'\nimport { NoComment } from './no-comment'\nimport { Dropdown } from './dropdown'\nimport { TimeTicking } from './time-ticking'\nimport { ErrorDialog } from './error-dialog'\nimport { Loading } from './loading'\nimport { Fetch } from './fetch'\nimport { ReachBottom } from './reach-bottom'\nimport { GotoFirst } from './goto-first'\nimport type { ArtalkPlugin } from '@/types'\n\nconst ListPlugins: ArtalkPlugin[] = [\n  Fetch,\n  Loading,\n  Unread,\n  WithEditor,\n  Count,\n  SidebarBtn,\n  UnreadBadge,\n  Dropdown,\n  GotoDispatcher,\n  GotoFocus,\n  NoComment,\n  Copyright,\n  TimeTicking,\n  ErrorDialog,\n  ReachBottom,\n  GotoFirst,\n]\n\nexport { ListPlugins }\n","import type { ArtalkPlugin } from '@/types'\n\nexport const Notifies: ArtalkPlugin = (ctx) => {\n  ctx.on('list-fetch', (params) => {\n    if (params.offset !== 0) return\n\n    const user = ctx.getApi().getUserFields()\n    if (!user) return\n\n    // Fetch all unread notifies\n    ctx\n      .getApi()\n      .notifies.getNotifies(user)\n      .then((res) => {\n        ctx.getData().updateNotifies(res.data.notifies)\n      })\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\nimport { version as ARTALK_VERSION } from '~/package.json'\nimport type List from '~/src/list/list'\nimport * as Ui from '@/lib/ui'\nimport * as Utils from '@/lib/utils'\nimport $t from '@/i18n'\n\nlet IgnoreVersionCheck = false\n\nexport const VersionCheck: ArtalkPlugin = (ctx) => {\n  ctx.watchConf(['apiVersion', 'versionCheck'], (conf) => {\n    const list = ctx.get('list')\n    if (conf.apiVersion && conf.versionCheck && !IgnoreVersionCheck)\n      versionCheck(list, ARTALK_VERSION, conf.apiVersion)\n  })\n}\n\nfunction versionCheck(list: List, feVer: string, beVer: string) {\n  const comp = Utils.versionCompare(feVer, beVer)\n  const sameVer = comp === 0\n  if (sameVer) return\n\n  const errEl = Utils.createElement(\n    `<div class=\"atk-version-check-notice\">${$t('updateMsg', {\n      name: comp < 0 ? $t('frontend') : $t('backend'),\n    })} <span class=\"atk-info\">` +\n      `${$t('currentVersion')}: ${$t('frontend')} ${feVer} / ${$t('backend')} ${beVer}` +\n      `</span></div>`,\n  )\n  const ignoreBtn = Utils.createElement(`<span class=\"atk-ignore-btn\">${$t('ignore')}</span>`)\n  ignoreBtn.onclick = () => {\n    errEl.remove()\n    IgnoreVersionCheck = true\n  }\n  errEl.append(ignoreBtn)\n  list.$el.parentElement!.prepend(errEl)\n}\n","import type { ArtalkPlugin } from '@/types'\n\nexport const AdminOnlyElem: ArtalkPlugin = (ctx) => {\n  const scanApply = () => {\n    applyAdminOnlyEls(\n      ctx.get('user').getData().is_admin,\n      getAdminOnlyEls({\n        $root: ctx.$root,\n      }),\n    )\n  }\n\n  ctx.on('list-loaded', () => {\n    scanApply()\n  })\n\n  ctx.on('user-changed', (user) => {\n    scanApply()\n  })\n}\n\nfunction getAdminOnlyEls(opts: { $root: HTMLElement }): HTMLElement[] {\n  const els: HTMLElement[] = []\n\n  // elements in $root\n  opts.$root\n    .querySelectorAll<HTMLElement>(`[atk-only-admin-show]`)\n    .forEach((item) => els.push(item))\n\n  // TODO: provide a Artalk.conf hook to set whitelist of admin-only elements,\n  // and move following code to that hook (move into @artalk/artalk-sidebar)\n\n  // elements in sidebar\n  const $sidebarEl = document.querySelector<HTMLElement>('.atk-sidebar')\n  if ($sidebarEl)\n    $sidebarEl\n      .querySelectorAll<HTMLElement>(`[atk-only-admin-show]`)\n      .forEach((item) => els.push(item))\n\n  return els\n}\n\nfunction applyAdminOnlyEls(isAdmin: boolean, els: HTMLElement[]) {\n  els.forEach(($item: HTMLElement) => {\n    if (isAdmin) $item.classList.remove('atk-hide')\n    else $item.classList.add('atk-hide')\n  })\n}\n","import type { ArtalkPlugin } from '@/types'\n\n// Notice: Singleton pattern needs to be loaded as lazy as possible,\n//         because the SSG application does not have a `window` context.\nlet darkModeMedia: MediaQueryList | undefined\n\nfunction updateClassnames($els: HTMLElement[], darkMode: boolean) {\n  const DarkModeClassName = 'atk-dark-mode'\n\n  $els.forEach(($el) => {\n    if (darkMode) $el.classList.add(DarkModeClassName)\n    else $el.classList.remove(DarkModeClassName)\n  })\n}\n\nexport const DarkMode: ArtalkPlugin = (ctx) => {\n  // the handler bind to Artalk instance, don't forget to remove it when Artalk instance destroyed\n  let darkModeAutoHandler: ((evt: MediaQueryListEvent) => void) | undefined\n\n  const sync = (darkMode: boolean | 'auto') => {\n    // the elements that classnames need to be updated when darkMode changed\n    const $els = [ctx.$root, ctx.get('layerManager').getEl()]\n\n    // init darkModeMedia if not exists, and only create once\n    if (!darkModeMedia) {\n      darkModeMedia = window.matchMedia('(prefers-color-scheme: dark)')\n    }\n\n    if (darkMode === 'auto') {\n      // if darkMode is 'auto', add handler\n      if (!darkModeAutoHandler) {\n        // the handler that will be called when darkModeMedia changed\n        darkModeAutoHandler = (evt) => updateClassnames($els, evt.matches)\n        darkModeMedia.addEventListener('change', darkModeAutoHandler)\n      }\n\n      // update classnames immediately\n      updateClassnames($els, darkModeMedia.matches)\n    } else {\n      // if darkMode is boolean, remove handler\n      if (darkModeAutoHandler) {\n        darkModeMedia.removeEventListener('change', darkModeAutoHandler)\n        darkModeAutoHandler = undefined\n      }\n\n      // update classnames immediately\n      updateClassnames($els, darkMode)\n    }\n  }\n\n  ctx.watchConf(['darkMode'], (conf) => sync(conf.darkMode))\n  ctx.on('created', () => sync(ctx.conf.darkMode))\n  ctx.on('unmounted', () => {\n    // if handler exists, don't forget to remove it, or it will cause memory leak\n    darkModeAutoHandler && darkModeMedia?.removeEventListener('change', darkModeAutoHandler)\n    darkModeAutoHandler = undefined\n  })\n}\n","import { Markdown } from './markdown'\nimport { EditorKit } from './editor-kit'\nimport { ListPlugins } from './list'\nimport { Notifies } from './notifies'\nimport { PvCountWidget } from './stat'\nimport { VersionCheck } from './version-check'\nimport { AdminOnlyElem } from './admin-only-elem'\nimport { DarkMode } from './dark-mode'\nimport type { ArtalkPlugin } from '@/types'\n\nexport const DefaultPlugins: ArtalkPlugin[] = [\n  Markdown,\n  EditorKit,\n  AdminOnlyElem,\n  ...ListPlugins,\n  Notifies,\n  PvCountWidget,\n  VersionCheck,\n  DarkMode,\n]\n","import { DefaultPlugins } from './plugins'\nimport type { ArtalkConfig, ArtalkPlugin, ContextApi } from '@/types'\nimport { handleConfFormServer } from '@/config'\nimport { showErrorDialog } from '@/components/error-dialog'\n\n/**\n * Global Plugins for all Artalk instances\n */\nexport const GlobalPlugins: Set<ArtalkPlugin> = new Set([...DefaultPlugins])\n\n/**\n * Plugin options for plugin initialization\n */\nexport const PluginOptions: WeakMap<ArtalkPlugin, any> = new WeakMap()\n\nexport async function load(ctx: ContextApi) {\n  const loadedPlugins = new Set<ArtalkPlugin>()\n  const loadPlugins = (plugins: Set<ArtalkPlugin>) => {\n    plugins.forEach((plugin) => {\n      if (typeof plugin === 'function' && !loadedPlugins.has(plugin)) {\n        plugin(ctx, PluginOptions.get(plugin))\n        loadedPlugins.add(plugin)\n      }\n    })\n  }\n\n  // Load local plugins\n  loadPlugins(GlobalPlugins)\n\n  // Get conf from server\n  const { data } = await ctx\n    .getApi()\n    .conf.conf()\n    .catch((err) => {\n      onLoadErr(ctx, err)\n      throw err\n    })\n\n  // Initial config\n  let conf: Partial<ArtalkConfig> = {\n    apiVersion: data.version?.version, // version info\n  }\n\n  // Reference conf from backend\n  if (ctx.conf.useBackendConf) {\n    if (!data.frontend_conf)\n      throw new Error(\n        'The remote backend does not respond to the frontend conf, but `useBackendConf` conf is enabled',\n      )\n    conf = { ...conf, ...handleConfFormServer(data.frontend_conf) }\n  }\n\n  // Apply conf modifier\n  ctx.conf.remoteConfModifier && ctx.conf.remoteConfModifier(conf)\n\n  // Dynamically load network plugins\n  conf.pluginURLs &&\n    (await loadNetworkPlugins(conf.pluginURLs, ctx.conf.server)\n      .then((plugins) => {\n        loadPlugins(plugins)\n      })\n      .catch((err) => {\n        console.error('Failed to load plugin', err)\n      }))\n\n  // After all plugins are loaded\n  ctx.trigger('created')\n\n  // Apply conf updating\n  ctx.updateConf(conf)\n\n  // Trigger mounted event\n  ctx.trigger('mounted')\n\n  // Load comment list\n  if (!ctx.conf.remoteConfModifier) {\n    // only auto fetch when no remoteConfModifier\n    ctx.fetch({ offset: 0 })\n  }\n}\n\n/**\n * Dynamically load plugins from Network\n */\nasync function loadNetworkPlugins(scripts: string[], apiBase: string): Promise<Set<ArtalkPlugin>> {\n  const networkPlugins = new Set<ArtalkPlugin>()\n  if (!scripts || !Array.isArray(scripts)) return networkPlugins\n\n  const tasks: Promise<void>[] = []\n\n  scripts.forEach((url) => {\n    // check url valid\n    if (!/^(http|https):\\/\\//.test(url))\n      url = `${apiBase.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`\n\n    tasks.push(\n      new Promise<void>((resolve) => {\n        // check if loaded\n        if (document.querySelector(`script[src=\"${url}\"]`)) {\n          resolve()\n          return\n        }\n\n        // load script\n        const script = document.createElement('script')\n        script.src = url\n        document.head.appendChild(script)\n        script.onload = () => resolve()\n        script.onerror = (err) => {\n          console.error('[artalk] Failed to load plugin', err)\n          resolve()\n        }\n      }),\n    )\n  })\n\n  await Promise.all(tasks)\n\n  // Read ArtalkPlugins object from window\n  Object.values(window.ArtalkPlugins || {}).forEach((plugin) => {\n    if (typeof plugin === 'function') networkPlugins.add(plugin)\n  })\n\n  return networkPlugins\n}\n\nexport function onLoadErr(ctx: ContextApi, err: any) {\n  let sidebarOpenView = ''\n\n  // if response err_no_site, modify the sidebar open view to create site\n  if (err.data?.err_no_site) {\n    const viewLoadParam = {\n      create_name: ctx.conf.site,\n      create_urls: `${window.location.protocol}//${window.location.host}`,\n    }\n    sidebarOpenView = `sites|${JSON.stringify(viewLoadParam)}`\n  }\n\n  showErrorDialog({\n    $err: ctx.get('list').$el,\n    errMsg: err.msg || String(err),\n    errData: err.data,\n    retryFn: () => load(ctx),\n    onOpenSidebar: ctx.get('user').getData().is_admin\n      ? () =>\n          ctx.showSidebar({\n            view: sidebarOpenView as any,\n          })\n      : undefined, // only show open sidebar button when user is admin\n  })\n}\n","import './style/main.scss'\n\nimport type { EventHandler } from './lib/event-manager'\nimport Context from './context'\nimport { handelCustomConf, convertApiOptions } from './config'\nimport Services from './service'\nimport * as Stat from './plugins/stat'\nimport { Api } from './api'\nimport type { TInjectedServices } from './service'\nimport { GlobalPlugins, PluginOptions, load } from './load'\nimport type { ArtalkConfig, EventPayloadMap, ArtalkPlugin, ContextApi } from '@/types'\n\n/**\n * Artalk\n *\n * @see https://artalk.js.org\n */\nexport default class Artalk {\n  public ctx!: ContextApi\n\n  constructor(conf: Partial<ArtalkConfig>) {\n    // Init Config\n    const handledConf = handelCustomConf(conf, true)\n\n    // Init Context\n    this.ctx = new Context(handledConf)\n\n    // Init Services\n    Object.entries(Services).forEach(([name, initService]) => {\n      const obj = initService(this.ctx)\n      obj && this.ctx.inject(name as keyof TInjectedServices, obj) // auto inject deps to ctx\n    })\n\n    if (import.meta.env.DEV && import.meta.env.VITEST) {\n      global.devLoadArtalk = () => load(this.ctx)\n    } else {\n      load(this.ctx)\n    }\n  }\n\n  /** Get the config of Artalk */\n  public getConf() {\n    return this.ctx.getConf()\n  }\n\n  /** Get the root element of Artalk */\n  public getEl() {\n    return this.ctx.$root\n  }\n\n  /** Update config of Artalk */\n  public update(conf: Partial<ArtalkConfig>) {\n    this.ctx.updateConf(conf)\n    return this\n  }\n\n  /** Reload comment list of Artalk */\n  public reload() {\n    this.ctx.reload()\n  }\n\n  /** Destroy instance of Artalk */\n  public destroy() {\n    this.ctx.trigger('unmounted')\n    while (this.ctx.$root.firstChild) {\n      this.ctx.$root.removeChild(this.ctx.$root.firstChild)\n    }\n  }\n\n  /** Add an event listener */\n  public on<K extends keyof EventPayloadMap>(name: K, handler: EventHandler<EventPayloadMap[K]>) {\n    this.ctx.on(name, handler)\n  }\n\n  /** Remove an event listener */\n  public off<K extends keyof EventPayloadMap>(name: K, handler: EventHandler<EventPayloadMap[K]>) {\n    this.ctx.off(name, handler)\n  }\n\n  /** Trigger an event */\n  public trigger<K extends keyof EventPayloadMap>(name: K, payload?: EventPayloadMap[K]) {\n    this.ctx.trigger(name, payload)\n  }\n\n  /** Set dark mode */\n  public setDarkMode(darkMode: boolean) {\n    this.ctx.setDarkMode(darkMode)\n  }\n\n  // ===========================\n  //       Static Members\n  // ===========================\n\n  /** Init Artalk */\n  public static init(conf: Partial<ArtalkConfig>): Artalk {\n    return new Artalk(conf)\n  }\n\n  /** Use plugin, the plugin will be used when Artalk.init */\n  public static use<T = any>(plugin: ArtalkPlugin<T>, options?: T) {\n    GlobalPlugins.add(plugin)\n    PluginOptions.set(plugin, options)\n  }\n\n  /** Load count widget */\n  public static loadCountWidget(c: Partial<ArtalkConfig>) {\n    const conf = handelCustomConf(c, true)\n\n    Stat.initCountWidget({\n      getApi: () => new Api(convertApiOptions(conf)),\n      siteName: conf.site,\n      countEl: conf.countEl,\n      pvEl: conf.pvEl,\n      pageKeyAttr: conf.statPageKeyAttr,\n      pvAdd: false,\n    })\n  }\n\n  // ===========================\n  //         Deprecated\n  // ===========================\n\n  /** @deprecated Please use `getEl()` instead */\n  public get $root() {\n    return this.ctx.$root\n  }\n\n  /** @description Please use `getConf()` instead */\n  public get conf() {\n    return this.ctx.getConf()\n  }\n}\n","import Artalk from './artalk'\nimport type * as ArtalkType from './types'\n\nexport type * from './types'\nexport { ArtalkType }\n\nexport default Artalk\n\n// Expose the static methods from the Artalk class\n// because direct export of static methods is not supported\n// for adapting to different environments like CommonJS and browser IIFE\n// for example, we can use `Artalk.init()` rather than `Artalk.default.init()`\n// therefore, we need to manually expose the static methods in the Artalk class.\nexport const init = Artalk.init\nexport const use = Artalk.use\nexport const loadCountWidget = Artalk.loadCountWidget\n"],"names":["abortController","data","Fetch","init","Api","ApiV2","html","link","list","t","tag","text","parser","tokens","args","ret","src","marked","lowercase","toMap","require$$0","attributes","elements","he","require$$1","require$$3","require$$2","sanitizer","start","defaults","require$$4","insane","global","this","module","index","Utils.htmlEncode","Defaults","I18n.t","marked.getInstance","Utils.createElement","$t","Ui.showLoading","Ui.hideLoading","render.iframeBody","render.imgBody","Ui.scrollIntoView","Ui.showNotify","Utils.getURLBasedOnApi","ListNest.makeNestCommentNodeList","version","Utils.getHeight","Utils.isValidURL","render","Ui.playFadeInAnim","Avatar","Header","Content","ReplyAt","ReplyTo","Pending","Actions","HeightLimit.check","HeightLimit.disposeHeightLimit","CommentUI","Utils.getGravatarURL","Utils.timeAgo","UADetect","instance","PaginationComponent","Ui.getScrollBarWidth","I18n.setLocale","marked.initMarked","marked.setReplacers","Utils.getCorrectUserAgent","Ui.setError","Utils.getQueryParam","check","ARTALK_VERSION","Ui.setLoading","Utils.getOffset","Utils.versionCompare","Services","Stat.initCountWidget"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,16]}