Skip to content

Commit

Permalink
Merge pull request #397 from Inist-CNRS/bibtex
Browse files Browse the repository at this point in the history
feat: 🎸 add [BIBParse]
  • Loading branch information
touv authored Jan 26, 2024
2 parents 4d3a5fa + be5b984 commit e26d24c
Show file tree
Hide file tree
Showing 9 changed files with 188 additions and 14 deletions.
19 changes: 19 additions & 0 deletions docs/plugin-basics.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ npm install @ezs/basics

#### Table of Contents

- [BIBParse](#bibparse)
- [BUFObject](#bufobject)
- [CSVObject](#csvobject)
- [CSVParse](#csvparse)
Expand Down Expand Up @@ -47,6 +48,24 @@ npm install @ezs/basics
- [XMLString](#xmlstring)
- [ZIPExtract](#zipextract)

### BIBParse

Take a `String` and split it at bibtext entry.

Input:

```json
["@article{my_article,\ntitle = {Hello world},\n", "journal = \"Some Journal\"\n"]
```

Output:

```json
["a", "b", "c", "d"]
```

Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)**

### BUFObject

Take `Mixed` and produce Buffer.
Expand Down
14 changes: 7 additions & 7 deletions docs/plugin-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ npm install @ezs/core

Plusieurs instructions permettent de créer des sous flux (sub pipeline), à partir d'un fichier d’instructions ou d'instructions imbriquées. Si elles s'utilisent toutes de la même manière (avec les mêmes paramètres) centaines peuvent apparaître comme similaires mais leur fonctionnement est différent :

- [delegate] : 1 sous flux pour tous les éléments
- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition
- [spaw] : 1 sous flux par élément
- [loop] : 1 sous flux par élément
- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline
- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux
- [singleton] : 1 sous flux pour le premier élément
- [delegate] : 1 sous flux pour tous les éléments
- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition
- [spaw] : 1 sous flux par élément
- [loop] : 1 sous flux par élément
- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline
- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux
- [singleton] : 1 sous flux pour le premier élément

## usage

Expand Down
19 changes: 19 additions & 0 deletions packages/basics/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ npm install @ezs/basics

#### Table of Contents

- [BIBParse](#bibparse)
- [BUFObject](#bufobject)
- [CSVObject](#csvobject)
- [CSVParse](#csvparse)
Expand Down Expand Up @@ -47,6 +48,24 @@ npm install @ezs/basics
- [XMLString](#xmlstring)
- [ZIPExtract](#zipextract)

### BIBParse

Take a `String` and split it at bibtext entry.

Input:

```json
["@article{my_article,\ntitle = {Hello world},\n", "journal = \"Some Journal\"\n"]
```

Output:

```json
["a", "b", "c", "d"]
```

Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)**

### BUFObject

Take `Mixed` and produce Buffer.
Expand Down
1 change: 1 addition & 0 deletions packages/basics/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"JSONStream": "1.3.5",
"async-retry": "1.3.3",
"better-https-proxy-agent": "1.0.9",
"bib2json": "0.0.1",
"csv-string": "3.2.0",
"debug": "4.3.3",
"fetch-with-proxy": "3.0.1",
Expand Down
53 changes: 53 additions & 0 deletions packages/basics/src/bib-parse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { StringDecoder } from 'string_decoder';
import BibtexParser from 'bib2json';

function BIBParse(data, feed) {
if (!this.decoder) {
this.decoder = new StringDecoder('utf8');
this.remainder = '';
this.counter = 0;
this.parser = new BibtexParser((entry) => {
feed.write(entry);
});
}
if (this.isLast()) {
this.remainder += this.decoder.end();
if (this.remainder && this.counter > 1) {
this.parser.parse(this.remainder);
}
return feed.close();
}
let chunk;
if (Buffer.isBuffer(data)) {
chunk = this.decoder.write(data);
} else if (typeof data === 'string') {
chunk = data;
} else {
chunk = '';
}
this.parser.parse(chunk);
this.counter += 1;
feed.end();
}

/**
* Take a `String` and split it at bibtext entry.
*
* Input:
*
* ```json
* ["@article{my_article,\ntitle = {Hello world},\n", "journal = \"Some Journal\"\n"]
* ```
*
* Output:
*
* ```json
* ["a", "b", "c", "d"]
* ```
*
* @name BIBParse
* @returns {Object}
*/
export default {
BIBParse,
};
2 changes: 2 additions & 0 deletions packages/basics/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import OBJCount from './obj-count';
import OBJNamespaces from './obj-namespaces';
import OBJStandardize from './obj-standardize';
import OBJFlatten from './obj-flatten';
import BIBParse from './bib-parse';
import TXTConcat from './txt-concat';
import TXTObject from './txt-object';
import TXTParse from './txt-parse';
Expand Down Expand Up @@ -37,6 +38,7 @@ const funcs = {
OBJNamespaces,
OBJStandardize,
OBJFlatten,
BIBParse,
TXTParse,
TXTObject,
TXTConcat,
Expand Down
75 changes: 75 additions & 0 deletions packages/basics/test/bib-parse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import from from 'from';
import ezs from '../../core/src';
import ezsBasics from '../src';

ezs.use(ezsBasics);

describe('BIBParse', () => {
it('should return a entry #1', (done) => {
from(['@article{my_article,\ntitle = {Hello world},\n', 'journal = "Some Journal"\n}'])
.pipe(ezs('BIBParse'))
.on('error', (err) => done(err))
.on('data', (data) => {
expect(typeof data).toBe('object');
expect(data.ObjectType).toBe('entry');
})
.on('end', () => {
done();
});
});
it('should return a entry #2', (done) => {
from(['@article{my_article,\ntitle = {Hello world},\njournal = "Some Journal"\n}'])
.pipe(ezs('BIBParse'))
.on('error', (err) => done(err))
.on('data', (data) => {
expect(typeof data).toBe('object');
expect(data.ObjectType).toBe('entry');
})
.on('end', () => {
done();
});
});
it('should return a entry #3', (done) => {
from(['@article{my_article,\ntitle = {Hello world},\n', 1, 'journal = "Some Journal"\n}'])
.pipe(ezs('BIBParse'))
.on('error', (err) => done(err))
.on('data', (data) => {
expect(typeof data).toBe('object');
expect(data.ObjectType).toBe('entry');
})
.on('end', () => {
done();
});
});
it('should return a entry #3', (done) => {
from([
Buffer.from('@article{my_article,\ntitle = {Hello world},\n'),
Buffer.from('journal = "Some'),
Buffer.from([0xE2]),
Buffer.from([0x82]),
Buffer.from([0xAC]),
Buffer.from('Journal"\n}'),
Buffer.from([0xC2]),
])
.pipe(ezs('BIBParse'))
.on('error', (err) => done(err))
.on('data', (data) => {
expect(typeof data).toBe('object');
expect(data.ObjectType).toBe('entry');
})
.on('end', () => {
done();
});
});

it('should return no entry', (done) => {
from(['@my_article,\ntitle = {Hello world},\n', 'journal = '])
.pipe(ezs('BIBParse'))
.on('error', (err) => done(err))
.on('data', () => done(new Error('no way')))
.on('end', () => {
done();
});
});

});
14 changes: 7 additions & 7 deletions packages/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ npm install @ezs/core

Plusieurs instructions permettent de créer des sous flux (sub pipeline), à partir d'un fichier d’instructions ou d'instructions imbriquées. Si elles s'utilisent toutes de la même manière (avec les mêmes paramètres) centaines peuvent apparaître comme similaires mais leur fonctionnement est différent :

- [delegate] : 1 sous flux pour tous les éléments
- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition
- [spaw] : 1 sous flux par élément
- [loop] : 1 sous flux par élément
- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline
- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux
- [singleton] : 1 sous flux pour le premier élément
- [delegate] : 1 sous flux pour tous les éléments
- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition
- [spaw] : 1 sous flux par élément
- [loop] : 1 sous flux par élément
- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline
- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux
- [singleton] : 1 sous flux pour le premier élément

## usage

Expand Down
5 changes: 5 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3671,6 +3671,11 @@ [email protected]:
dependencies:
duplexify "4.0.0"

[email protected]:
version "0.0.1"
resolved "https://registry.yarnpkg.com/bib2json/-/bib2json-0.0.1.tgz#c33bcf6f35edb4647fd75ff76f25bd7999fc3f31"
integrity sha512-6R9dpnE5FpUSH61Wq00XDcivsPAeH1+u+SeXevDh1eUHTfEiORRve5XpHTbCzwh1XytHotllY+ErUErbdxkFHg==

big-integer@^1.6.17:
version "1.6.51"
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
Expand Down

0 comments on commit e26d24c

Please sign in to comment.