string-differ
Version:
A Javascript library to compare and transform strings.
163 lines (115 loc) • 4.49 kB
Markdown
# string-differ
## Description
A library to compare and transform strings. This library can:
- Generate operations to convert one string to another string.
- Apply a given set of operations to a string to transform it into another string.
## Installation
npm i string-differ
## Usage
This library uses a rough implementation of Myers algorithm to calculate the _shortest edit script_ between two strings. It assumes that a string can be converted to another using 3 types of operations:
- **insertion**
- **retention**
- **deletion**
These types describe the operations that can be performed on string `s1` to convert it to string `s2`.
**Note**: string-differ v1 uses Levenshtein distance to compare strings and is usually slower than v2, especially for strings with smaller differences.
### Generate Steps for Conversion
#### Character Operations
This method generates an operation for every character in the base string (`s1`).
```ts
import { getStepsForTransformation } from 'string-differ';
const s1 = 'initial string';
const s2 = 'final string';
const steps = getStepsForTransformation("Char", { s1, s2 });
console.log(steps);
```
will output:
```
[
{ type: 'delete', value: 0 },
{ type: 'delete', value: 1 },
{ type: 'insert', value: 'f' },
{ type: 'retain', value: 2 },
{ type: 'delete', value: 3 },
{ type: 'delete', value: 4 },
{ type: 'insert', value: 'n' },
{ type: 'retain', value: 5 },
{ type: 'retain', value: 6 },
{ type: 'retain', value: 7 },
{ type: 'retain', value: 8 },
{ type: 'retain', value: 9 },
{ type: 'retain', value: 10 },
{ type: 'retain', value: 11 },
{ type: 'retain', value: 12 },
{ type: 'retain', value: 13 }
]
```
For `delete` and `retain` operations, the `value` field in the output contains the character's index in the base string (`s1`). However, for `insert` operations, the `value` field contains the character to be inserted.
#### Range Operations
This is a minor optimization over character operations. If the output type is specified as `"Range"`, certain consecutive operations of the same type are grouped together.
```ts
import { getStepsForTransformation } from 'string-differ';
const s1 = 'initial string';
const s2 = 'final string';
const steps = getStepsForTransformation("Range", { s1, s2 });
console.log(steps);
```
will output:
```
[
{ type: 'delete', startIndex: 0, endIndex: 1 },
{ type: 'insert', value: 'f' },
{ type: 'retain', startIndex: 2, endIndex: 2 },
{ type: 'delete', startIndex: 3, endIndex: 4 },
{ type: 'insert', value: 'n' },
{ type: 'retain', startIndex: 5, endIndex: 13 }
]
```
For `"Range"` output type, the `delete` and `retain` operations will have `startIndex` and `endIndex` fields which represent the range of indices in the base string (`s1`). The `insert` operations, however, contain the `value` field which may specify one or more than one characters to be inserted.
### Apply Operations to a String
Given a set of operations, and a base string (`s1`), the `transformString` function can be used to apply the steps to `s1` to get the resultant string `s2`.
#### Range Operations
```ts
import { transformString } from 'string-differ';
const operations = [
{ type: 'delete', startIndex: 0, endIndex: 1 },
{ type: 'insert', value: 'f' },
{ type: 'retain', startIndex: 2, endIndex: 2 },
{ type: 'delete', startIndex: 3, endIndex: 4 },
{ type: 'insert', value: 'n' },
{ type: 'retain', startIndex: 5, endIndex: 13 }
];
const s1 = 'base string';
const s2 = transformString("Range", s1, operations);
console.log(s2);
```
will output:
`'final string'`
#### Character Operations
```ts
import { transformString } from 'string-differ';
const operations = [
{ type: 'delete', value: 0 },
{ type: 'delete', value: 1 },
{ type: 'insert', value: 'f' },
{ type: 'retain', value: 2 },
{ type: 'delete', value: 3 },
{ type: 'delete', value: 4 },
{ type: 'insert', value: 'n' },
{ type: 'retain', value: 5 },
{ type: 'retain', value: 6 },
{ type: 'retain', value: 7 },
{ type: 'retain', value: 8 },
{ type: 'retain', value: 9 },
{ type: 'retain', value: 10 },
{ type: 'retain', value: 11 },
{ type: 'retain', value: 12 },
{ type: 'retain', value: 13 }
];
const s1 = 'base string';
const s2 = transformString("Char", s1, operations);
console.log(s2);
```
will output:
`'final string'`
## License
This library is distributed under the MIT License. See [LICENSE](LICENSE) for more information.