molstar
Version:
A comprehensive macromolecular library.
160 lines (159 loc) • 5.74 kB
JavaScript
/**
* Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* Adapted from CIFTools.js (https://github.com/dsehnal/CIFTools.js)
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.StringBuilder = void 0;
var StringBuilder;
(function (StringBuilder) {
function create(chunkCapacity = 512) {
return {
current: [],
offset: 0,
capacity: chunkCapacity,
chunks: []
};
}
StringBuilder.create = create;
function getString(builder) {
if (!builder.chunks.length) {
if (builder.current.length === builder.offset)
return builder.current.join('');
return builder.current.splice(0, builder.offset).join('');
}
if (builder.offset > 0) {
builder.chunks[builder.chunks.length] = builder.current.length === builder.offset
? builder.current.join('')
: builder.current.slice(0, builder.offset).join('');
}
return builder.chunks.join('');
}
StringBuilder.getString = getString;
function getSize(builder) {
let size = 0;
for (const c of builder.chunks)
size += c.length;
for (let i = 0; i < builder.offset; i++)
size += builder.current[i].length;
return size;
}
StringBuilder.getSize = getSize;
function getChunks(builder) {
if (builder.offset > 0) {
if (builder.current.length === builder.offset)
builder.chunks[builder.chunks.length] = builder.current.join('');
else
builder.chunks[builder.chunks.length] = builder.current.slice(0, builder.offset).join('');
builder.offset = 0;
}
return builder.chunks;
}
StringBuilder.getChunks = getChunks;
const __paddingSpaces = [];
(function () {
let s = '';
for (let i = 0; i < 512 /* PaddingSpaces.Count */; i++) {
__paddingSpaces[i] = s;
s = s + ' ';
}
})();
function newline(builder) {
writeSafe(builder, '\n');
}
StringBuilder.newline = newline;
function whitespace(builder, len) {
if (len > 0)
writeSafe(builder, __paddingSpaces[len]);
}
StringBuilder.whitespace = whitespace;
function whitespace1(builder) {
writeSafe(builder, ' ');
}
StringBuilder.whitespace1 = whitespace1;
function write(builder, val) {
if (!val)
return;
if (builder.offset === builder.capacity) {
builder.chunks[builder.chunks.length] = builder.current.join('');
builder.offset = 0;
}
builder.current[builder.offset++] = val;
}
StringBuilder.write = write;
/** Write without check. */
function writeSafe(builder, val) {
if (builder.offset === builder.capacity) {
builder.chunks[builder.chunks.length] = builder.current.join('');
builder.offset = 0;
}
builder.current[builder.offset++] = val;
}
StringBuilder.writeSafe = writeSafe;
function writePadLeft(builder, val, totalWidth) {
if (!val) {
whitespace(builder, totalWidth);
return;
}
const padding = totalWidth - val.length;
whitespace(builder, padding);
writeSafe(builder, val);
}
StringBuilder.writePadLeft = writePadLeft;
function writePadRight(builder, val, totalWidth) {
if (!val) {
whitespace(builder, totalWidth);
return;
}
const padding = totalWidth - val.length;
writeSafe(builder, val);
whitespace(builder, padding);
}
StringBuilder.writePadRight = writePadRight;
function writeInteger(builder, val) {
writeSafe(builder, '' + val);
}
StringBuilder.writeInteger = writeInteger;
function writeIntegerAndSpace(builder, val) {
writeSafe(builder, '' + val + ' ');
}
StringBuilder.writeIntegerAndSpace = writeIntegerAndSpace;
function writeIntegerPadLeft(builder, val, totalWidth) {
const s = '' + val;
const padding = totalWidth - s.length;
whitespace(builder, padding);
writeSafe(builder, s);
}
StringBuilder.writeIntegerPadLeft = writeIntegerPadLeft;
function writeIntegerPadRight(builder, val, totalWidth) {
const s = '' + val;
const padding = totalWidth - s.length;
writeSafe(builder, s);
whitespace(builder, padding);
}
StringBuilder.writeIntegerPadRight = writeIntegerPadRight;
/**
* @example writeFloat(123.2123, 100) -- 2 decim
*/
function writeFloat(builder, val, precisionMultiplier) {
writeSafe(builder, '' + Math.round(precisionMultiplier * val) / precisionMultiplier);
}
StringBuilder.writeFloat = writeFloat;
function writeFloatPadLeft(builder, val, precisionMultiplier, totalWidth) {
const s = '' + Math.round(precisionMultiplier * val) / precisionMultiplier;
const padding = totalWidth - s.length;
whitespace(builder, padding);
writeSafe(builder, s);
}
StringBuilder.writeFloatPadLeft = writeFloatPadLeft;
function writeFloatPadRight(builder, val, precisionMultiplier, totalWidth) {
const s = '' + Math.round(precisionMultiplier * val) / precisionMultiplier;
const padding = totalWidth - s.length;
writeSafe(builder, s);
whitespace(builder, padding);
}
StringBuilder.writeFloatPadRight = writeFloatPadRight;
})(StringBuilder || (exports.StringBuilder = StringBuilder = {}));
;