LSPlugin.Experiments.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { LSPluginUser } from '../LSPlugin.user'
  2. import { PluginLocal } from '../LSPlugin.core'
  3. import { safeSnakeCase } from '../helpers'
  4. /**
  5. * Some experiment features
  6. */
  7. export class LSPluginExperiments {
  8. constructor(private ctx: LSPluginUser) {}
  9. get React(): unknown {
  10. return this.ensureHostScope().React
  11. }
  12. get ReactDOM(): unknown {
  13. return this.ensureHostScope().ReactDOM
  14. }
  15. get pluginLocal(): PluginLocal {
  16. return this.ensureHostScope().LSPluginCore.ensurePlugin(
  17. this.ctx.baseInfo.id
  18. )
  19. }
  20. private invokeExperMethod(type: string, ...args: Array<any>) {
  21. const host = this.ensureHostScope()
  22. type = safeSnakeCase(type)?.toLowerCase()
  23. return host.logseq.api['exper_' + type]?.apply(host, args)
  24. }
  25. async loadScripts(...scripts: Array<string>) {
  26. scripts = scripts.map((it) => {
  27. if (!it?.startsWith('http')) {
  28. return this.ctx.resolveResourceFullUrl(it)
  29. }
  30. return it
  31. })
  32. scripts.unshift(this.ctx.baseInfo.id)
  33. await this.invokeExperMethod('loadScripts', ...scripts)
  34. }
  35. registerFencedCodeRenderer(
  36. type: string,
  37. opts: {
  38. edit?: boolean
  39. before?: () => Promise<void>
  40. subs?: Array<string>
  41. render: (props: { content: string }) => any
  42. }
  43. ) {
  44. return this.ensureHostScope().logseq.api.exper_register_fenced_code_renderer(
  45. this.ctx.baseInfo.id,
  46. type,
  47. opts
  48. )
  49. }
  50. ensureHostScope(): any {
  51. if (window === top) {
  52. throw new Error('Can not access host scope!')
  53. }
  54. return top
  55. }
  56. }