registry.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * Copyright (c) 2019-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. * @author David Sehnal <david.sehnal@gmail.com>
  6. */
  7. import { FileInfo } from '../../mol-util/file-info';
  8. import { PluginStateObject } from '../objects';
  9. import { DataFormatProvider } from './provider';
  10. import { BuiltInTrajectoryFormats } from './trajectory';
  11. import { BuiltInVolumeFormats } from './volume';
  12. import { BuiltInShapeFormats } from './shape';
  13. import { BuiltInStructureFormats } from './structure';
  14. export class DataFormatRegistry {
  15. private _list: { name: string, provider: DataFormatProvider }[] = [];
  16. private _map = new Map<string, DataFormatProvider>();
  17. private _extensions: Set<string> | undefined = undefined;
  18. private _binaryExtensions: Set<string> | undefined = undefined;
  19. private _options: [name: string, label: string, category: string][] | undefined = undefined;
  20. get types(): [name: string, label: string][] {
  21. return this._list.map(e => [e.name, e.provider.label] as [name: string, label: string]);
  22. }
  23. get extensions() {
  24. if (this._extensions) return this._extensions;
  25. const extensions = new Set<string>();
  26. this._list.forEach(({ provider }) => {
  27. provider.stringExtensions?.forEach(ext => extensions.add(ext));
  28. provider.binaryExtensions?.forEach(ext => extensions.add(ext));
  29. });
  30. this._extensions = extensions;
  31. return extensions;
  32. }
  33. get binaryExtensions() {
  34. if (this._binaryExtensions) return this._binaryExtensions;
  35. const binaryExtensions = new Set<string>();
  36. this._list.forEach(({ provider }) => provider.binaryExtensions?.forEach(ext => binaryExtensions.add(ext)));
  37. this._binaryExtensions = binaryExtensions;
  38. return binaryExtensions;
  39. }
  40. get options() {
  41. if (this._options) return this._options;
  42. const options: [name: string, label: string, category: string][] = [];
  43. this._list.forEach(({ name, provider }) => options.push([name, provider.label, provider.category || '']));
  44. this._options = options;
  45. return options;
  46. }
  47. constructor() {
  48. for (const [id, p] of BuiltInVolumeFormats) this.add(id, p);
  49. for (const [id, p] of BuiltInStructureFormats) this.add(id, p);
  50. for (const [id, p] of BuiltInShapeFormats) this.add(id, p);
  51. for (const [id, p] of BuiltInTrajectoryFormats) this.add(id, p);
  52. };
  53. private _clear() {
  54. this._extensions = undefined;
  55. this._binaryExtensions = undefined;
  56. this._options = undefined;
  57. }
  58. add(name: string, provider: DataFormatProvider) {
  59. this._clear();
  60. this._list.push({ name, provider });
  61. this._map.set(name, provider);
  62. }
  63. remove(name: string) {
  64. this._clear();
  65. this._list.splice(this._list.findIndex(e => e.name === name), 1);
  66. this._map.delete(name);
  67. }
  68. auto(info: FileInfo, dataStateObject: PluginStateObject.Data.Binary | PluginStateObject.Data.String) {
  69. for (let i = 0, il = this.list.length; i < il; ++i) {
  70. const { provider } = this._list[i];
  71. let hasExt = false;
  72. if (provider.binaryExtensions && provider.binaryExtensions.indexOf(info.ext) >= 0) hasExt = true;
  73. else if (provider.stringExtensions && provider.stringExtensions.indexOf(info.ext) >= 0) hasExt = true;
  74. if (hasExt && (!provider.isApplicable || provider.isApplicable(info, dataStateObject.data))) return provider;
  75. }
  76. return;
  77. }
  78. get(name: string): DataFormatProvider | undefined {
  79. if (this._map.has(name)) {
  80. return this._map.get(name)!;
  81. } else {
  82. throw new Error(`unknown data format name '${name}'`);
  83. }
  84. }
  85. get list() {
  86. return this._list;
  87. }
  88. }