script.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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, QueryContextOptions } from '../mol-model/structure';
  10. import { compile } from './runtime/query/compiler';
  11. import { MolScriptBuilder } from './language/builder';
  12. export { Script };
  13. interface Script { expression: string, language: Script.Language }
  14. function Script(expression: string, language: Script.Language): Script {
  15. return { expression, language };
  16. }
  17. namespace Script {
  18. export type Language = 'mol-script'
  19. export function is(x: any): x is Script {
  20. return !!x && typeof (x as Script).expression === 'string' && !!(x as Script).language;
  21. }
  22. export function areEqual(a: Script, b: Script) {
  23. return a.language === b.language && a.expression === b.expression;
  24. }
  25. export function toExpression(script: Script): Expression {
  26. switch (script.language) {
  27. case 'mol-script':
  28. const parsed = parseMolScript(script.expression);
  29. if (parsed.length === 0) throw new Error('No query');
  30. return transpileMolScript(parsed[0]);
  31. }
  32. throw new Error('unsupported script language');
  33. }
  34. export function toQuery(script: Script): QueryFn<StructureSelection> {
  35. const expression = toExpression(script);
  36. return compile<StructureSelection>(expression);
  37. }
  38. export function toLoci(script: Script, structure: Structure): StructureElement.Loci {
  39. const query = toQuery(script);
  40. const result = query(new QueryContext(structure));
  41. return StructureSelection.toLociWithSourceUnits(result);
  42. }
  43. export function getStructureSelection(expr: Expression | ((builder: typeof MolScriptBuilder) => Expression), structure: Structure, options?: QueryContextOptions) {
  44. const e = typeof expr === 'function' ? expr(MolScriptBuilder) : expr;
  45. const query = compile<StructureSelection>(e);
  46. return query(new QueryContext(structure, options));
  47. }
  48. }