Skip to content
Snippets Groups Projects
Select Git revision
  • d02a97b7f0c00544e0ae2e359c22597a3aac4982
  • master default protected
  • rednatco-v2
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • servers
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

script.ts

Blame
  • script.ts 2.72 KiB
    /**
     * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { transpileMolScript } from './script/mol-script/symbols';
    import { parseMolScript } from './language/parser';
    import { parse } from './transpile';
    import { Expression } from './language/expression';
    import { StructureElement, QueryContext, StructureSelection, Structure, QueryFn, QueryContextOptions } from '../mol-model/structure';
    import { compile } from './runtime/query/compiler';
    import { MolScriptBuilder } from './language/builder';
    import { assertUnreachable } from '../mol-util/type-helpers';
    
    export { Script };
    
    interface Script { expression: string, language: Script.Language }
    
    function Script(expression: string, language: Script.Language): Script {
        return { expression, language };
    }
    
    namespace Script {
        export const Info = {
            'mol-script': 'Mol-Script',
            'pymol': 'PyMOL',
            'vmd': 'VMD',
            'jmol': 'Jmol',
            'rasmol': 'RasMol'
        };
        export type Language = keyof typeof Info;
    
        export function is(x: any): x is Script {
            return !!x && typeof (x as Script).expression === 'string' && !!(x as Script).language;
        }
    
        export function areEqual(a: Script, b: Script) {
            return a.language === b.language && a.expression === b.expression;
        }
    
        export function toExpression(script: Script): Expression {
            switch (script.language) {
                case 'mol-script':
                    const parsed = parseMolScript(script.expression);
                    if (parsed.length === 0) throw new Error('No query');
                    return transpileMolScript(parsed[0]);
                case 'pymol':
                case 'jmol':
                case 'vmd':
                case 'rasmol':
                    return parse(script.language, script.expression);
                default:
                    assertUnreachable(script.language);
            }
        }
    
        export function toQuery(script: Script): QueryFn<StructureSelection> {
            const expression = toExpression(script);
            return compile<StructureSelection>(expression);
        }
    
        export function toLoci(script: Script, structure: Structure): StructureElement.Loci {
            const query = toQuery(script);
            const result = query(new QueryContext(structure));
            return StructureSelection.toLociWithSourceUnits(result);
        }
    
        export function getStructureSelection(expr: Expression | ((builder: typeof MolScriptBuilder) => Expression), structure: Structure, options?: QueryContextOptions) {
            const e = typeof expr === 'function' ? expr(MolScriptBuilder) : expr;
            const query = compile<StructureSelection>(e);
            return query(new QueryContext(structure, options));
        }
    }