script.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 { parse } from './transpile';
  9. import { Expression } from './language/expression';
  10. import { StructureElement, QueryContext, StructureSelection, Structure, QueryFn, QueryContextOptions } from '../mol-model/structure';
  11. import { compile } from './runtime/query/compiler';
  12. import { MolScriptBuilder } from './language/builder';
  13. import { assertUnreachable } from '../mol-util/type-helpers';
  14. export { Script };
  15. interface Script { expression: string, language: Script.Language }
  16. function Script(expression: string, language: Script.Language): Script {
  17. return { expression, language };
  18. }
  19. namespace Script {
  20. export const Info = {
  21. 'mol-script': 'Mol-Script',
  22. 'pymol': 'PyMOL',
  23. 'vmd': 'VMD',
  24. 'jmol': 'Jmol',
  25. };
  26. export type Language = keyof typeof Info;
  27. export function is(x: any): x is Script {
  28. return !!x && typeof (x as Script).expression === 'string' && !!(x as Script).language;
  29. }
  30. export function areEqual(a: Script, b: Script) {
  31. return a.language === b.language && a.expression === b.expression;
  32. }
  33. export function toExpression(script: Script): Expression {
  34. switch (script.language) {
  35. case 'mol-script':
  36. const parsed = parseMolScript(script.expression);
  37. if (parsed.length === 0) throw new Error('No query');
  38. return transpileMolScript(parsed[0]);
  39. case 'pymol':
  40. case 'jmol':
  41. case 'vmd':
  42. return parse(script.language, script.expression);
  43. default:
  44. assertUnreachable(script.language);
  45. }
  46. }
  47. export function toQuery(script: Script): QueryFn<StructureSelection> {
  48. const expression = toExpression(script);
  49. return compile<StructureSelection>(expression);
  50. }
  51. export function toLoci(script: Script, structure: Structure): StructureElement.Loci {
  52. const query = toQuery(script);
  53. const result = query(new QueryContext(structure));
  54. return StructureSelection.toLociWithSourceUnits(result);
  55. }
  56. export function getStructureSelection(expr: Expression | ((builder: typeof MolScriptBuilder) => Expression), structure: Structure, options?: QueryContextOptions) {
  57. const e = typeof expr === 'function' ? expr(MolScriptBuilder) : expr;
  58. const query = compile<StructureSelection>(e);
  59. return query(new QueryContext(structure, options));
  60. }
  61. }