field.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  6. */
  7. import { Column, ColumnHelpers } from 'mol-data/db'
  8. import * as TokenColumn from '../../common/text/column/token'
  9. import { Tokens } from '../../common/text/tokenizer'
  10. import * as Data from '../data-model'
  11. import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../../common/text/number-parser'
  12. export default function CifTextField(tokens: Tokens, rowCount: number): Data.Field {
  13. const { data, indices } = tokens;
  14. const str: Data.Field['str'] = row => {
  15. const ret = data.substring(indices[2 * row], indices[2 * row + 1]);
  16. if (ret === '.' || ret === '?') return '';
  17. return ret;
  18. };
  19. const int: Data.Field['int'] = row => {
  20. return fastParseInt(data, indices[2 * row], indices[2 * row + 1]) || 0;
  21. };
  22. const float: Data.Field['float'] = row => {
  23. return fastParseFloat(data, indices[2 * row], indices[2 * row + 1]) || 0;
  24. };
  25. const list: Data.Field['list'] = <T extends string|number>(row: number) => {
  26. const ret = data.substring(indices[2 * row], indices[2 * row + 1]);
  27. if (ret === '.' || ret === '?') return [];
  28. return ret.split(',') as T[];
  29. };
  30. const valueKind: Data.Field['valueKind'] = row => {
  31. const s = indices[2 * row];
  32. if (indices[2 * row + 1] - s !== 1) return Column.ValueKind.Present;
  33. const v = data.charCodeAt(s);
  34. if (v === 46 /* . */) return Column.ValueKind.NotPresent;
  35. if (v === 63 /* ? */) return Column.ValueKind.Unknown;
  36. return Column.ValueKind.Present;
  37. };
  38. return {
  39. '@array': void 0,
  40. isDefined: true,
  41. rowCount,
  42. str,
  43. int,
  44. float,
  45. list,
  46. valueKind,
  47. areValuesEqual: TokenColumn.areValuesEqualProvider(tokens),
  48. toStringArray: params => ColumnHelpers.createAndFillArray(rowCount, str, params),
  49. toIntArray: params => ColumnHelpers.createAndFillArray(rowCount, int, params),
  50. toFloatArray: params => ColumnHelpers.createAndFillArray(rowCount, float, params),
  51. toListArray: params => ColumnHelpers.createAndFillArray(rowCount, list, params)
  52. }
  53. }