field-classifier.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { Column } from 'mol-data/db'
  7. import { CifField } from 'mol-io/reader/cif/data-model'
  8. import { CifWriter } from 'mol-io/writer/cif'
  9. const intRegex = /^-?\d+$/
  10. const floatRegex = /^-?(([0-9]+)[.]?|([0-9]*[.][0-9]+))([(][0-9]+[)])?([eE][+-]?[0-9]+)?/
  11. // Classify a cif field as str, int or float based the data it contains.
  12. // To classify a field as int or float all items are checked.
  13. function classify(name: string, field: CifField): CifWriter.Field {
  14. let floatCount = 0, hasString = false;
  15. for (let i = 0, _i = field.rowCount; i < _i; i++) {
  16. const k = field.valueKind(i);
  17. if (k !== Column.ValueKind.Present) continue;
  18. const v = field.str(i);
  19. if (intRegex.test(v)) continue;
  20. else if (floatRegex.test(v)) floatCount++;
  21. else { hasString = true; break; }
  22. }
  23. if (hasString) return { name, type: CifWriter.Field.Type.Str, value: field.str, valueKind: field.valueKind };
  24. if (floatCount > 0) return { name, type: CifWriter.Field.Type.Float, value: field.float, valueKind: field.valueKind };
  25. return { name, type: CifWriter.Field.Type.Int, value: field.int, valueKind: field.valueKind };
  26. }
  27. export default classify;