script.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { transpileMolScript } from './script/mol-script/symbols';
  7. import { parseMolScript } from './language/parser';
  8. import Expression from './language/expression';
  9. import { StructureElement, QueryContext, StructureSelection, Structure, QueryFn } from '../mol-model/structure';
  10. import { compile } from './runtime/query/compiler';
  11. export { Script }
  12. interface Script { expression: string, language: Script.Language }
  13. function Script(expression: string, language: Script.Language): Script {
  14. return { expression, language }
  15. }
  16. namespace Script {
  17. export type Language = 'mol-script'
  18. export function areEqual(a: Script, b: Script) {
  19. return a.language === b.language && a.expression === b.expression
  20. }
  21. export function toExpression(script: Script): Expression {
  22. switch (script.language) {
  23. case 'mol-script':
  24. const parsed = parseMolScript(script.expression)
  25. if (parsed.length === 0) throw new Error('No query')
  26. return transpileMolScript(parsed[0])
  27. }
  28. throw new Error('unsupported script language')
  29. }
  30. export function toQuery(script: Script): QueryFn<StructureSelection> {
  31. const expression = toExpression(script)
  32. return compile<StructureSelection>(expression);
  33. }
  34. export function toLoci(script: Script, structure: Structure): StructureElement.Loci {
  35. const query = toQuery(script)
  36. const result = query(new QueryContext(structure))
  37. return StructureSelection.toLoci2(result)
  38. }
  39. }