{"version":3,"file":"Artalk.cjs","sources":["../src/api/v2.ts","../src/api/fetch.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/insane.js","../../../node_modules/.pnpm/insane@2.6.2/node_modules/insane/defaults.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/external.ts","../src/i18n/index.ts","../src/i18n/zh-CN.ts","../src/lib/event-manager.ts","../src/defaults.ts","../src/config.ts","../src/lib/watch-conf.ts","../src/context.ts","../src/api/handler.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.ts","../src/layer/sidebar-layer.html?raw","../src/list/layout/nest.ts","../src/list/nest.ts","../src/list/layout/flat.ts","../src/list/layout/index.ts","../src/comment/height-limit.ts","../src/comment/renders/header.ts","../src/components/action-btn.ts","../src/comment/renders/actions.ts","../src/comment/renders/index.ts","../src/comment/renders/avatar.ts","../src/comment/renders/content.ts","../src/comment/renders/reply-at.ts","../src/comment/renders/reply-to.ts","../src/comment/renders/pending.ts","../src/comment/render.ts","../src/comment/comment.html?raw","../src/comment/actions.ts","../src/comment/comment-node.ts","../src/lib/detect.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/list/list.html?raw","../src/list/comment.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/submit-add.ts","../src/plugins/editor/submit.ts","../src/plugins/editor/emoticons.ts","../src/plugins/editor/upload.ts","../src/plugins/editor/preview.ts","../src/plugins/editor/index.ts","../src/plugins/editor/header-event.ts","../src/plugins/editor/header-user.ts","../src/plugins/editor/header-link.ts","../src/plugins/editor/textarea.ts","../src/plugins/editor/submit-btn.ts","../src/plugins/editor/state-reply.ts","../src/plugins/editor/state-edit.ts","../src/plugins/editor/closable.ts","../src/plugins/editor/_kit.ts","../src/plugins/editor-kit.ts","../src/plugins/list/goto-focus.ts","../src/components/error-dialog.ts","../src/plugins/version-check.ts","../src/plugins/dark-mode.ts","../src/plugins/index.ts","../src/plugins/admin-only-elem.ts","../src/plugins/list/index.ts","../src/plugins/list/fetch.ts","../src/plugins/list/loading.ts","../src/plugins/list/unread.ts","../src/plugins/list/with-editor.ts","../src/plugins/list/count.ts","../src/plugins/list/sidebar-btn.ts","../src/plugins/list/unread-badge.ts","../src/plugins/list/dropdown.ts","../src/plugins/list/goto-dispatcher.ts","../src/plugins/list/no-comment.ts","../src/plugins/list/copyright.ts","../src/plugins/list/time-ticking.ts","../src/plugins/list/error-dialog.ts","../src/plugins/list/reach-bottom.ts","../src/plugins/list/goto-first.ts","../src/plugins/notifies.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","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 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","'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","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\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","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","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","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 * 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","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-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 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 { 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, 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","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","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 $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 * 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 * 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 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","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 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","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'\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","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 { 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 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 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 './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 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 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 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 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 { 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 * 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 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\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 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 { 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 { 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'\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 { 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 { 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'\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'\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\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'\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 { 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'\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 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'\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 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 { 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":["HttpClient","constructor","apiConfig","__publicField","this","Map","fetchParams","fetch","credentials","headers","redirect","referrerPolicy","data","securityData","input","JSON","stringify","Object","keys","reduce","formData","key","property","append","Blob","FormData","toQueryString","cancelToken","abortControllers","has","abortController","get","signal","AbortController","set","abort","delete","_a","__async","_b","body","secure","path","type","query","format","baseUrl","params","__objRest","secureParams","baseApiParams","securityWorker","requestParams","mergeRequestParams","queryString","payloadFormatter","contentFormatters","responseFormat","customFetch","__spreadProps","__spreadValues","createAbortSignal","then","response","r","clone","error","ok","catch","e","assign","encodeQueryParam","value","encodeURIComponent","addQueryParam","addArrayQueryParam","map","v","join","rawQuery","filter","Array","isArray","addQueryParams","params1","params2","super","arguments","loginByEmail","request","method","registerByEmail","sendVerifyEmail","checkDataMerge","applyDataMerge","flushCache","warmUpCache","getCaptcha","getCaptchaStatus","verifyCaptcha","getComments","createComment","comment","getComment","id","updateComment","deleteComment","conf","getSocialLoginProviders","getDomain","getNotifies","markAllNotifyRead","options","markNotifyRead","commentId","notifyKey","getPages","fetchAllPages","getPageFetchStatus","logPv","page","updatePage","deletePage","fetchPage","sendEmail","email","getSettings","applySettings","settings","getSettingsTemplate","locale","getSites","createSite","site","updateSite","deleteSite","getStats","exportArtrans","importArtrans","uploadArtrans","upload","getUser","updateProfile","login","user","getUserStatus","createUser","updateUser","deleteUser","getUsers","getVersion","syncVotes","vote","targetId","Fetch","opts","init","exports","apiToken","getApiToken","Headers","Authorization","resp","json","retry","handlers","promise","item","action","handler","Promise","resolve","code","err","FetchException","message","msg","console","createError","status","Error","Api","ApiV2","baseURL","_opts","getUserFields","userInfo","name","_getDefaults","async","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","_defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","RegExp","source","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","escape$1","html","encode","test","replace","caret","edit","regex","opt","obj","val","valSource","getRegex","cleanUrl","href","encodeURI","noopTest","exec","splitCells","tableRow","count","cells","match","offset","str","escaped","curr","split","i","trim","shift","length","pop","splice","push","rtrim","c","invert","l","suffLen","currChar","charAt","slice","outputLink","cap","link","raw","lexer","title","text","state","inLink","token","tokens","inlineTokens","_Tokenizer","space","src","rules","block","newline","codeBlockStyle","fences","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","indentCodeCompensation","lang","inline","anyPunctuation","heading","trimmed","depth","hr","blockquote","lines","inBlockquote","currentLines","currentRaw","currentText","top","blockTokens","lastToken","oldToken","newText","newToken","substring","list","bull","isordered","ordered","start","loose","items","itemRegex","endsWithBlankLine","endEarly","itemContents","line","t","repeat","nextLine","blankLine","indent","trimStart","search","nextBulletRegex","Math","min","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","rawLine","nextLineWithoutTabs","ischecked","istask","task","checked","trimEnd","spacers","hasMultipleLineBreaks","some","pre","def","tag","toLowerCase","table","aligns","rows","header","align","row","cell","lheading","paragraph","escape","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","b","indexOf","level","findClosingBracket","linkLen","reflink","links","nolink","emStrong","maskedSrc","prevChar","emStrongLDelim","punctuation","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","emStrongRDelimAst","emStrongRDelimUnd","lastIndex","lastCharLength","index","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","br","del","autolink","url","prevCapZero","_backpedal","inlineText","bullet","_paragraph","_blockLabel","_tag","_comment","blockNormal","gfmTable","blockGfm","blockPedantic","_punctuation","_inlineComment","_inlineLabel","inlineNormal","blockSkip","reflinkSearch","inlinePedantic","inlineGfm","inlineBreaks","normal","_Lexer","create","inlineQueue","lex","lexInline","next","lastParagraphClipped","cutSrc","extTokenizer","call","startBlock","startIndex","Infinity","tempSrc","tempStart","forEach","getStartIndex","errMsg","charCodeAt","keepPrevChar","includes","lastIndexOf","startInline","_Renderer","langString","parser","parse","parseInline","j","listitem","itemBody","checkbox","unshift","tablecell","tablerow","k","content","strong","em","cleanHref","out","image","_TextRenderer","_Parser","textRenderer","anyToken","renderers","genericToken","ret","textToken","_Hooks","preprocess","markdown","postprocess","processAllTokens","provideLexer","provideParser","Set","Marked","args","setOptions","parseMarkdown","use","callback","values","concat","tableToken","listToken","defaults","childTokens","flat","pack","ext","prevRenderer","apply","extLevel","prop","rendererProp","rendererFunc","tokenizerProp","tokenizerFunc","prevTokenizer","hooksProp","hooksFunc","prevHook","passThroughHooks","arg","packWalktokens","blockType","origOpt","throwError","onError","prototype","toString","all","reject","markedInstance","marked","getDefaults","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","escapes","unescapes","rescaped","runescaped","escapeHtmlChar","unescapeHtmlChar","escapeHtml","String","unescapeHtml","she","decode","unescape","version","assignment_1","assignment","result","stack","hasOwnProperty","lowercase","string","asKey","accumulator","toMap_1","attributes","uris","require$$0","elements","voids","he","require$$1","require$$3","rstart","rend","rattrs","rtag","rtagend","require$$2","chars","lastItem","createStack","last","parsePart","substr","parseEdge","parseEndTag","parseStartTag","same","tagName","rest","unary","attrs","low","u","doubleQuotedValue","singleQuotedValue","unquotedValue","pos","end","sanitizer","buffer","context","o","ignoring","ignore","allowedTags","classesOk","allowedClasses","attrsOk","allowedAttributes","lkey","className","colon","questionmark","hash","allowedSchemes","matches","scheme","testUrl","unignore","transformText","reset","a","iframe","img","insane","strict","configuration","insaneOptions","span","reg","class","style","sanitize","createCommonjsModule","fn","module","index$1","defaultColors","toComment","cm","ref","colors","cache","re","m","word","color","factory","renderCode","hanabi","getRenderer","markedLinkRenderer","markedCodeRenderer","markedImageRenderer","orgLinkRenderer","isSameOriginLink","URL","origin","getLinkOrigin","window","location","realLang","colorized","hljs","getLanguage","highlight","orgImageRenderer","imgLazyLoad","instance","replacers","markedOptions","getInstance","markedContent","_","alt","imgSrc","simpleMarked","dest","replacer","mergeDeep","objects","isObject","prev","pVal","oVal","DataManager","events","getLoading","loading","setLoading","getListLastFetch","listLastFetch","setListLastFetch","comments","fetchComments","trigger","findComment","find","clearComments","loadComments","partialComments","insertComment","notifies","updateNotifies","getPage","pageData","createElement","htmlStr","div","document","innerHTML","firstElementChild","htmlEncode","temp","innerText","getQueryParam","decodeURIComponent","getOffset","el","relativeTo","getOffsetRecursive","element","rect","getBoundingClientRect","scrollLeft","pageXOffset","documentElement","scrollTop","pageYOffset","left","elOffset","relativeToOffset","padWithZeros","vNumber","width","numAsString","timeAgo","date","$t","n","oldTime","getTime","diffValue","Date","days","floor","leave1","hours","leave2","minutes","leave3","seconds","round","vDay","getDate","vMonth","getMonth","getFullYear","dateFormat","getCorrectUserAgent","uaRaw","navigator","userAgent","userAgentData","getHighEntropyValues","uaData","uaGot","majorPlatformVersion","Number","platformVersion","platform","isValidURL","urlRaw","protocol","getURLBasedOnApi","base","en","placeholder","noComment","send","signIn","signUp","save","nick","emoticon","preview","uploadImage","uploadFail","commentFail","restoredMsg","onlyAdminCanReply","uploadLoginMsg","counter","sortLatest","sortOldest","sortBest","sortAuthor","openComment","closeComment","listLoadFailMsg","listRetry","loadMore","admin","reply","voteUp","voteDown","voteFail","readMore","actionConfirm","collapse","collapsed","collapsedMsg","expand","approved","pending","pendingMsg","editCancel","deleteConfirm","pin","unpin","now","adminCheck","captchaCheck","confirm","cancel","msgCenter","ctrlCenter","userProfile","noAccountPrompt","haveAccountPrompt","forgetPassword","resetPassword","changePassword","confirmPassword","passwordMismatch","verificationCode","verifySend","verifyResend","waitSeconds","emailVerified","password","username","nextStep","skipVerify","logoutConfirm","accountMergeNotice","accountMergeSelectOne","accountMergeConfirm","dismiss","merge","frontend","backend","loadFail","editing","editFail","deleting","deleteFail","reqGot","reqAborted","updateMsg","currentVersion","open","openName","GLOBAL_LOCALES_KEY","internal","findLocaleSet","p1","p2","toUpperCase","LocaleConf","LocaleDict","setLocale","Utils.htmlEncode","EventManager","on","off","evt","payload","once","pageKey","pageTitle","server","sendBtn","darkMode","editorTravel","flatMode","nestMax","nestSort","emoticons","uaBadge","listSort","countEl","pvEl","statPageKeyAttr","gravatar","mirror","pagination","pageSize","autoLoad","heightLimit","children","scrollable","imgUpload","reqTimeout","versionCheck","useBackendConf","handelCustomConf","customConf","full","Defaults","findEl","querySelector","pathname","language","matchMedia","convertApiOptions","ctx","siteName","timeout","getData","checkHasBasicUserInfo","getApiHandlers","watchConf","effect","lastVal","newVal","getConf","res","Context","getCommentNodes","$root","classList","add","mounted","inject","depName","getApi","apiHandlers","h","remove","findIndex","createApiHandlers","checkCaptcha","checkAdmin","createNewApiHandlers","replyComment","commentData","$comment","editor","setReply","editComment","setEditComment","reload","listGotoFirst","editorShowLoading","showLoading","editorHideLoading","hideLoading","editorShowNotify","showNotify","editorResetState","resetState","showSidebar","sidebarLayer","show","hideSidebar","hide","checkerLauncher","I18n.t","setDarkMode","updateConf","nConf","getEl","getMarked","marked.getInstance","parentElem","$loading","Utils.createElement","transparentBg","background","appendChild","display","$spinner","setTimeout","isConnected","scrollIntoView","elem","enableAnim","containerRect","clientHeight","scrollY","innerHeight","height","scrollOptions","behavior","scroll","playFadeInAnim","after","onAnimEnded","removeEventListener","addEventListener","playFadeAnim","setError","errorTextEl","HTMLElement","iframeBody","checker","$iframeWrap","$iframe","Ui.showLoading","getOpts","getCaptchaIframeURL","onload","Ui.hideLoading","$closeBtn","hideInteractInput","stop","queryStatus","ms","isPass","captcha","is_pass","triggerSuccess","onclick","CaptchaChecker","inputVal","render.iframeBody","imgEl","setAttribute","img_data","render.imgBody","onSuccess","formEl","click","AdminChecker","inputType","update","is_admin","onReload","Dialog","contentEl","$el","$actions","$content","setYes","btn","onBtnClick","setNo","currentTarget","wrapPromise","cancelFn","onCancel","successFn","CheckerLauncher","p","fire","postFire","layer","getCtx","close","destroy","checkerStore","checkerCtx","$input","btnTextOrg","focus","onkeyup","keyCode","preventDefault","dialog","btnEl","btnTextRestore","btnText","tf","onfocus","clearTimeout","onMount","Component","Sel","$header","$name","$email","$link","$textareaWrap","$textarea","$bottom","$submitBtn","$notifyWrap","$bottomLeft","$stateWrap","$plugBtnWrap","$plugPanelWrap","EditorPlug","kit","useBtn","$btn","usePanel","$panel","useContentTransformer","func","contentTransformer","usePanelShow","useEvents","aPlug","usePanelHide","useEditorStateEffect","stateName","effectFn","editorStateEffectWhen","editorStateEffect","Mover","move","afterEl","isMoved","editorEl","useUI","$travelPlace","replaceWith","back","useGlobalCtx","EditorStateManager","stateCurt","stateUnmountFn","getPlugs","moveAfterEl","_d","_c","$relative","scrollRelativeTo","Ui.scrollIntoView","getUI","plugin","_e","Editor","ui","entries","sel","render","getState","getHeaderInputEls","getContentFinal","getContentRaw","plugs","getTransformedContent","getContentMarked","setContent","getEvents","insertContent","selection","createRange","selectionStart","sStart","sEnd","selectionEnd","sT","switch","wrapElem","notifyElem","s","w","notifyRemove","timeoutFn","Ui.showNotify","submit","beforeSubmit","SidebarLayer","refreshWhenShow","transform","initLayer","createIframe","view","iFrameSrc","getDarkMode","iframeLoad","authCheck","animTimer","is_login","setOnAfterHide","Utils.getURLBasedOnApi","time","urlParams","URLSearchParams","createNestStrategy","import","srcData","sortBy","nodeList","rid","root","rootNode","parent","loadChildren","parentNode","child","childNode","sortFunc","vote_up","sortLevels","nodes","sort","ListNest.makeNestCommentNodeList","nestSortBy","rootC","createCommentNode","$commentsWrap","getRender","parentC","replyD","childD","childC","putChild","checkHeightLimit","insert","prepend","findCommentNode","getParents","heightLimitRemoveForChildren","insertMode","is_collapsed","is_allow_reply","visible","$listCommentsWrap","ListLayout","getStrategy","check","max","imgCheck","maxHeight","lock","_check","Utils.getHeight","parseFloat","getComputedStyle","contains","HEIGHT_LIMIT_SCROLL_CSS","applyScrollableHeightLimit","HEIGHT_LIMIT_CSS","overflow","$expandBtn","stopPropagation","disposeHeightLimit","afterExpandBtnClick","applyHeightLimit","imgs","querySelectorAll","from","renderNick","$headerNick","$nickA","Utils.isValidURL","renderVerifyBadge","$headerBadgeWrap","badgeText","badge_name","badgeColor","badge_color","$badge","backgroundColor","is_verified","$verifiedBadge","is_pinned","$pinnedBadge","renderDate","$date","getDateFormatted","renderUABadge","ip_region","$uaWrap","$regionBadge","browser","os","getUserUA","$uaBrowser","$usOS","ActionBtn","getText","adminOnly","isMessaging","msgRecTimer","appendTo","dom","setClick","isLoading","confirmRestore","isConfirming","confirmText","confirmRecTimer","fireMsgRecTimer","clearMsgRecTimer","updateText","loadingText","setMsg","setWarn","setSuccess","duringTime","setMsgRecTimer","msgRecTimerFunc","renderVote","voteBtnUp","getActions","voteBtnDown","vote_down","renderReply","replyBtn","renderCollapse","collapseBtn","adminEdit","renderModerator","pendingBtn","is_pending","renderPin","pinnedBtn","renderEdit","editBtn","renderDel","delBtn","adminDelete","Renders","Avatar","$avatar","$avatarImg","avatarURLBuilder","getGravatarURL","$avatarA","Header","Content","collapsedInfoEl","$body","insertAdjacentElement","contentShowBtn","Ui.playFadeInAnim","ReplyAt","replyTo","$replyAt","goToReplyComment","ReplyTo","$replyTo","$nick","replyContent","Pending","pendingEl","Actions","Render","$main","$childrenWrap","contentMaxH","childrenMaxH","HeightLimit.check","getChildren","HeightLimit.disposeHeightLimit","playFadeAnimForBody","playFlashAnim","getChildrenWrap","setUnread","setOpenable","setOpenURL","setOpenAction","CommentActions","actionBtn","votes","up","down","btnElem","modify","setData","onDelete","origHash","modifyHash","dispatchEvent","Event","CommentNode","nestCurt","actionInstance","renderInstance","CommentUI","newEl","onAfterRender","getParent","getNestCurt","getIsRoot","getID","getChildrenWrapEl","$childComment","flattenParents","emailHash","email_encrypted","dateFormatter","Utils.timeAgo","info","win","nav","osVersion","engine","device","engineMatch","Trident","Presto","WebKit","Gecko","browserMatch","Safari","Chrome","IE","Edge","Firefox","Chromium","Opera","Vivaldi","Yandex","Kindle","UC","QQBrowser","QQ","Baidu","Maxthon","Sogou","LBBROWSER","TheWorld","MIUI","Quark","Qiyu","Wechat","Taobao","Alipay","Weibo","Douban","Suning","iQiYi","osMatch","Windows","Linux","macOS","Android","Ubuntu","FreeBSD","Debian","BlackBerry","MeeGo","Symbian","iOS","WebOS","deviceMatch","Mobile","Tablet","showModalDialog","chrome","arr","browserLanguage","UADetect","ua","ReadMoreBtn","origText","$text","hasMore","total","onClick","checkDisabled","showErr","ReadMorePaginator","readMoreAutoLoad","onReachedBottom","getHasMore","getIsClearComments","dispose","Pagination","oninput","onkeydown","keydown","$prevBtn","$nextBtn","maxPage","ceil","setInput","inputTimer","isNaN","change","onChange","which","UpDownPaginator","PaginationComponent","getPageDataByLastData","roots_count","initListPaginatorFunc","paginator","createPaginatorByConf","$paginator","List","initCrudEvents","getCommentsWrapEl","commentNodes","getListLayout","forceFlatMode","d","bodyOrgOverflow","bodyOrgPaddingRight","getScrollbarHelper","paddingRight","unlock","barPaddingRight","parseInt","getPropertyValue","inner","outer","position","visibility","w1","offsetWidth","w2","clientWidth","removeChild","Ui.getScrollBarWidth","Layer","onAfterHide","setAllowMaskClose","allow","allowMaskClose","getAllowMaskClose","onShow","onHide","LayerWrap","$wrap","$mask","createItem","createItemElement","hideWrap","showWrap","getMask","getWrap","LayerManager","wrap","LOCAL_USER_KEY","User","localUser","localStorage","getItem","isAdmin","setItem","onUserChanged","logout","services","i18n","I18n.setLocale","layerManager","editorPlugs","initCountWidget","loadStatCount","containers","loadCommentCount","cacheData","pvAdd","pvCount","pages","page_key","page_title","site_name","pv","incrementPvCount","loadPvCount","els","selector","retrieveElements","pageKeys","pageKeyAttr","getAttribute","getPageKeys","stats","page_keys","defaultPageKey","updateElementsText","LocalStorageKey","SubmitAddPreset","reqAdd","useApi","getSubmitAddParams","useUser","useConf","useEditor","Utils.getCorrectUserAgent","postSubmitAdd","commentNew","Submit","defaultPreset","onEditorSubmit","do","useMounted","useUnmounted","registerCustom","customs","custom","activeCond","nComment","req","post","Emoticons","transEmoticonImageText","loadEmoticonsData","isImgLoaded","initEmoticonsList","changeListHeight","parentElement","isListLoaded","loadingTask","handleData","Ui.setError","pushGrp","grp","remoteLoad","grpData","isOwOFormat","convertOwO","solveNullKey","solveSameKey","tmp","container","owoData","grpName","nGrp","iconStr","icon","$grpWrap","$grp","$item","$grpSwitcher","openGrp","AllowImgExts","Upload","initDragImg","$imgUploadInput","accept","onchange","files","file","uploadImg","uploadFromFileList","onDragover","onDrop","dataTransfer","onPaste","clipboardData","fileExt","insertPrefix","uploadPlaceholderTxt","customUploaderFn","imgUploader","public_url","imgURL","Preview","isPlugPanelShow","updateContent","EDITOR_PLUGS","onContentUpdated","localContent","$inputs","inputEventFns","changeEventFns","field","timer","abortFn","onInput","fetchUserInfo","placeholders","api","CANCEL_TOKEN","abortRequest","onUserInfoFetched","finally","onLinkChange","onLinkInputChange","onKeydown","adaptiveHeightByContent","diff","offsetHeight","scrollHeight","cancelReply","submitPlug","useDeps","page_url","$sendReplyBtn","cancelEdit","saveData","$editCancelBtn","updateSubmitBtnText","restoreSubmitBtnText","originalSubmitBtnText","onOpen","onClose","PlugKit","plug","PlugManager","confLoaded","clear","confRefs","getEnabledPlugs","Plug","loadPluginUI","closePlugPanel","openedPlug","loadPluginItem","openPlugPanel","plugPanel","rawContent","showErrorDialog","errEl","retryFn","$retryBtn","onOpenSidebar","$openSidebar","$err","IgnoreVersionCheck","darkModeMedia","updateClassnames","$els","DarkModeClassName","DefaultPlugins","initMarked","markedReplacers","scanApply","$sidebarEl","getAdminOnlyEls","_params","limit","paramsModifier","listFetchParamsModifier","reqParams","flat_mode","listUnreadHighlight","notify","comment_id","read_link","commentID","Utils.getQueryParam","$closeCommentBtn","admin_only","adminPageEditSave","$count","$openSidebarBtn","syncByUser","$btnText","$unreadBadge","reloadUseParamsEditor","initDropdown","$dropdownOn","$dropdownWrap","dropdownList","curtActive","onItemClick","$dropdown","renderDropdown","sort_by","view_only_admin","removeDropdown","lastID","locker","extractCommentID","hashChangeHandler","listLoadedHandler","reply_comment","isNoComment","$noComment","$copyright","ARTALK_VERSION","setInterval","clearInterval","errData","observer","clearObserver","disconnect","childNodes","$target","scrollEvtAt","IntersectionObserver","isIntersecting","threshold","observe","setupObserver","warn","Utils.getOffset","apiVersion","feVer","beVer","comp","pa","pb","na","nb","Utils.versionCompare","ignoreBtn","darkModeAutoHandler","sync","GlobalPlugins","PluginOptions","WeakMap","load","loadedPlugins","loadPlugins","plugins","sidebarOpenView","err_no_site","viewLoadParam","create_name","create_urls","host","onLoadErr","frontend_conf","ExcludedKeys","startsWith","handleConfFormServer","remoteConfModifier","pluginURLs","scripts","apiBase","networkPlugins","tasks","script","head","onerror","ArtalkPlugins","loadNetworkPlugins","Artalk","handledConf","Services","initService","firstChild","loadCountWidget"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,15]}