From 494098f270fb1fed266ac6694382eed5f841f70d Mon Sep 17 00:00:00 2001 From: customcommander Date: Sun, 25 Apr 2021 17:01:17 +0000 Subject: [PATCH] feat: implement RIS.toMendeley to convert bibliographic records to Mendeley references --- Makefile | 7 +- README.md | 116 ++ package.json | 3 + resources/all.jq | 19 + resources/all.json | 121 ++ resources/all.ris | 3304 ++++++++++++++++++++++++++++++++ src/grammar.js | 12 +- src/grammar.ne | 12 +- src/index.js | 1 + src/mendeley.js | 178 ++ src/mendeley.schema.json | 250 +++ test/features/mendeley.feature | 524 +++++ test/steps.js | 10 + test/world.js | 5 + yarn.lock | 27 + 15 files changed, 4571 insertions(+), 18 deletions(-) create mode 100644 resources/all.jq create mode 100644 resources/all.json create mode 100644 resources/all.ris create mode 100644 src/mendeley.js create mode 100644 src/mendeley.schema.json create mode 100644 test/features/mendeley.feature diff --git a/Makefile b/Makefile index a11acce..687f3db 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ -CC=java -jar /devtools/closure-compiler/compiler.jar src_files=$(shell find src -type f) dist_files=$(patsubst src/%,dist/%,$(src_files)) dist/browser.min.js @@ -13,6 +12,9 @@ parse: src/grammar.js src/grammar.js: src/grammar.ne src/lexer.js yarn -s nearleyc $< > $@ +resources/all.ris: resources/all.jq resources/all.json + jq -M -S -r -f $^ > $@ + resources/fields-map.csv: resources/fields-map.jq src/fields-map.json jq -M -S -r -f $^ > $@ @@ -34,8 +36,7 @@ dist: $(dist_files) dist/browser.min.js dist/browser.min.js: $(src_files) mkdir -p $(@D) - yarn -s browserify --standalone RIS src/index.js > /tmp/ris.js - $(CC) --js /tmp/ris.js --language_in ECMASCRIPT_NEXT --language_out ECMASCRIPT5_STRICT > $@ + yarn -s browserify --standalone RIS src/index.js >$@ dist/%: src/% mkdir -p $(@D) diff --git a/README.md b/README.md index adf3f2e..11b25f6 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,122 @@ See the complete [map for each type of RIS reference](./resources/fields-map.csv See [list of reference types](./resources/types.csv). Based on https://en.wikipedia.org/wiki/RIS_(file_format). +## Mendeley + +Bibliographic records in RIS format can be converted to Mendeley references: + +```javascript +RIS.toMendeley(` +TY - JOUR +TI - Mission to the Moon +AU - Armstrong, Neil +DA - 1969/07/20 +ER - +`); +//=> [{ type: 'journal' +//=> , authors: [{last_name: 'Armstrong', first_name: 'Neil'}] +//=> , accessed: '1969-07-20' +//=> , title: 'Mission to the Moon' }] +``` + +**Warning:** not all RIS fields can be mapped to a Mendeley fields. The following tables show which RIS fields are supported by Mendeley. + +**Warning:** each Mendeley references is validated before it is returned. If one field in the reference is invalid the _entire_ reference is discarded. e.g., + + +```javascript +RIS.toMendeley(` +TY - JOUR +AU - Armstrong, Neil +DA - 1969/07/20 +ER - +`); +//=> [] +// In Mendeley all references MUST have a title! +``` + +### All Records + +| RIS | Mendeley | +|:----|:-----------------| +| A1 | authors | +| A2 | editors | +| A3 | authors | +| A4 | authors | +| AB | abstract | +| AN | identifiers.pmid | +| AU | authors | +| CY | city | +| DA | accessed | +| DO | identifiers.doi | +| ET | edition | +| IS | issue | +| KW | keywords | +| L1 | websites | +| L4 | websites | +| LA | language | +| LB | tags | +| N1 | notes | +| PB | publisher | +| PY | year | +| RN | notes | +| SE | chapter | +| SN | identifiers.isbn | +| SP | pages | +| ST | short_title | +| T2 | source | +| T3 | series | +| TA | authors | +| TI | title | +| UR | websites | +| VL | volume | + +### PAT Records + +| RIS | Mendeley | +|:----|:--------------------------| +| C6 | patent_legal_status | +| M1 | patent_application_number | + +### JOUR & JFULL Records + +| RIS | Mendeley | +|:----|:-----------------| +| SN | identifiers.issn | + +### RPRT Records + +| RIS | Mendeley | +|:----|:-----------------| +| VL | series_number | + +### Types Conversion + +| RIS | Mendeley | +|:----------|:-----------------------| +| BILL | bill | +| BOOK | book | +| CASE | case | +| CHAP | book_section | +| COMP | computer_program | +| CONF | conference_proceedings | +| ENCYC | encyclopedia_article | +| GEN | generic | +| HEAR | hearing | +| ICOMM | web_page | +| JFULL | journal | +| JOUR | journal | +| MGZN | magazine_article | +| MPCT | film | +| NEWS | newspaper_article | +| PAT | patent | +| RPRT | report | +| STAT | statute | +| THES | thesis | +| UNPB | working_paper | +| *Others* | generic | + + ## Development The following command will: diff --git a/package.json b/package.json index 7e2d092..4ee1092 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "academia", "bibliography", "citation", + "mendeley", "reference-manager", "ris-format" ], @@ -39,6 +40,8 @@ "access": "public" }, "dependencies": { + "ajv": "^8.1.0", + "ajv-formats": "^2.0.2", "moo": "^0.5.1", "nearley": "^2.20.1" } diff --git a/resources/all.jq b/resources/all.jq new file mode 100644 index 0000000..60f68b7 --- /dev/null +++ b/resources/all.jq @@ -0,0 +1,19 @@ +# Some RIS fields have specific formatting rules. +# Default is to set the field value to the field name +def generate_value: + if . == "A1" or . == "A2" or . == "A3" or . == "A4" or . == "AU" or . == "TA" then + "\(.)Doe, \(.)John" + elif . == "PY" then + "1666" + elif . == "DA" then + "1969/07/20" + elif . == "RP" then + "IN FILE" + else + . + end; + + .fields as $f +| .types[] +| ["TY - \(.)"] + ($f | map("\(.) - \(. | generate_value)")) + ["ER - \n"] +| join("\n") \ No newline at end of file diff --git a/resources/all.json b/resources/all.json new file mode 100644 index 0000000..5e9c272 --- /dev/null +++ b/resources/all.json @@ -0,0 +1,121 @@ +{ + "//1": "Used to generate a .ris file with all types and fields to see how different reference managers handle RIS records", + "//2": "The original list of types and fields comes from https://web.archive.org/web/20120526103719/http://refman.com/support/risformat_intro.asp", + "//3": "However some database providers have defined other fields. These can be included here too.", + "types": [ + "ABST", + "ADVS", + "AGGR", + "ANCIENT", + "ART", + "BILL", + "BLOG", + "BOOK", + "CASE", + "CHAP", + "CHART", + "CLSWK", + "COMP", + "CONF", + "CPAPER", + "CTLG", + "DATA", + "DBASE", + "DICT", + "EBOOK", + "ECHAP", + "EDBOOK", + "EJOUR", + "ELEC", + "ENCYC", + "EQUA", + "FIGURE", + "GEN", + "GOVDOC", + "GRANT", + "HEAR", + "ICOMM", + "INPR", + "JFULL", + "JOUR", + "LEGAL", + "MANSCPT", + "MAP", + "MGZN", + "MPCT", + "MULTI", + "MUSIC", + "NEWS", + "PAMP", + "PAT", + "PCOMM", + "RPRT", + "SER", + "SLIDE", + "SOUND", + "STAND", + "STAT", + "THES", + "UNBILL", + "UNPB", + "VIDEO" + ], + "fields": [ + "A1", + "A2", + "A3", + "A4", + "AB", + "AD", + "AN", + "AU", + "C1", + "C2", + "C3", + "C4", + "C5", + "C6", + "C7", + "C8", + "CA", + "CN", + "CT", + "CY", + "DA", + "DB", + "DO", + "DP", + "ET", + "IS", + "J2", + "KW", + "L1", + "L4", + "LA", + "LB", + "M1", + "M2", + "M3", + "N1", + "NV", + "OP", + "PB", + "PY", + "RI", + "RN", + "RP", + "SE", + "SN", + "SP", + "ST", + "SV", + "T2", + "T3", + "TA", + "TI", + "TT", + "UR", + "VL", + "Y2" + ] +} \ No newline at end of file diff --git a/resources/all.ris b/resources/all.ris new file mode 100644 index 0000000..1660b48 --- /dev/null +++ b/resources/all.ris @@ -0,0 +1,3304 @@ +TY - ABST +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ADVS +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - AGGR +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ANCIENT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ART +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - BILL +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - BLOG +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - BOOK +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CASE +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CHAP +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CHART +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CLSWK +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - COMP +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CONF +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CPAPER +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - CTLG +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - DATA +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - DBASE +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - DICT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - EBOOK +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ECHAP +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - EDBOOK +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - EJOUR +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ELEC +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ENCYC +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - EQUA +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - FIGURE +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - GEN +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - GOVDOC +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - GRANT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - HEAR +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - ICOMM +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - INPR +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - JFULL +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - JOUR +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - LEGAL +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - MANSCPT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - MAP +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - MGZN +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - MPCT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - MULTI +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - MUSIC +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - NEWS +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - PAMP +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - PAT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - PCOMM +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - RPRT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - SER +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - SLIDE +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - SOUND +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - STAND +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - STAT +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - THES +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - UNBILL +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - UNPB +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + +TY - VIDEO +A1 - A1Doe, A1John +A2 - A2Doe, A2John +A3 - A3Doe, A3John +A4 - A4Doe, A4John +AB - AB +AD - AD +AN - AN +AU - AUDoe, AUJohn +C1 - C1 +C2 - C2 +C3 - C3 +C4 - C4 +C5 - C5 +C6 - C6 +C7 - C7 +C8 - C8 +CA - CA +CN - CN +CT - CT +CY - CY +DA - 1969/07/20 +DB - DB +DO - DO +DP - DP +ET - ET +IS - IS +J2 - J2 +KW - KW +L1 - L1 +L4 - L4 +LA - LA +LB - LB +M1 - M1 +M2 - M2 +M3 - M3 +N1 - N1 +NV - NV +OP - OP +PB - PB +PY - 1666 +RI - RI +RN - RN +RP - IN FILE +SE - SE +SN - SN +SP - SP +ST - ST +SV - SV +T2 - T2 +T3 - T3 +TA - TADoe, TAJohn +TI - TI +TT - TT +UR - UR +VL - VL +Y2 - Y2 +ER - + diff --git a/src/grammar.js b/src/grammar.js index 109b6d5..083ac98 100644 --- a/src/grammar.js +++ b/src/grammar.js @@ -32,10 +32,8 @@ const processName = (name) => { }; } -const processUrls = value => - ( /(?:\d{4})?\/(?:(?:\d\d)?\/){2}(?:[A-Za-z \-]+)?/.test(value) - ? zip(['year', 'month', 'day', 'info'], value.split('/')) - : value ); +const processAccessDate = value => + zip(['year', 'month', 'day', 'info'], value.split('/')); var grammar = { Lexer: lexer, @@ -69,11 +67,9 @@ var grammar = { ({ key, value: lines.flatMap(line => line.split(';').map(s => s.trim()).filter(Boolean))}) }, - {"name": "dateaccessEntry$ebnf$1", "symbols": ["value"]}, - {"name": "dateaccessEntry$ebnf$1", "symbols": ["dateaccessEntry$ebnf$1", "value"], "postprocess": function arrpush(d) {return d[0].concat([d[1]]);}}, - {"name": "dateaccessEntry", "symbols": [(lexer.has("dateaccess") ? {type: "dateaccess"} : dateaccess), (lexer.has("sep") ? {type: "sep"} : sep), "dateaccessEntry$ebnf$1"], "postprocess": ([{value: key},/*sep (ignored)*/, lines]) => + {"name": "dateaccessEntry", "symbols": [(lexer.has("dateaccess") ? {type: "dateaccess"} : dateaccess), (lexer.has("sep") ? {type: "sep"} : sep), "value"], "postprocess": ([{value: key},/*sep (ignored)*/, value]) => ({ key - , value: processUrls(lines.join(''))}) }, + , value: processAccessDate(value)}) }, {"name": "reprintEntry", "symbols": [(lexer.has("reprint") ? {type: "reprint"} : reprint), (lexer.has("sep") ? {type: "sep"} : sep), "value"], "postprocess": ([{value: key},/*sep (ignored)*/, value]) => ({ key , value: ((value === 'IN FILE' || value === 'NOT IN FILE') diff --git a/src/grammar.ne b/src/grammar.ne index 1fdfe36..aa0a6f3 100644 --- a/src/grammar.ne +++ b/src/grammar.ne @@ -33,10 +33,8 @@ const processName = (name) => { }; } -const processUrls = value => - ( /(?:\d{4})?\/(?:(?:\d\d)?\/){2}(?:[A-Za-z \-]+)?/.test(value) - ? zip(['year', 'month', 'day', 'info'], value.split('/')) - : value ); +const processAccessDate = value => + zip(['year', 'month', 'day', 'info'], value.split('/')); %} @@ -75,10 +73,10 @@ urlEntry -> line.split(';').map(s => s.trim()).filter(Boolean))}) %} dateaccessEntry -> - %dateaccess %sep value:+ - {% ([{value: key},/*sep (ignored)*/, lines]) => + %dateaccess %sep value + {% ([{value: key},/*sep (ignored)*/, value]) => ({ key - , value: processUrls(lines.join(''))}) %} + , value: processAccessDate(value)}) %} reprintEntry -> %reprint %sep value diff --git a/src/index.js b/src/index.js index 1b6e220..38bcfaa 100644 --- a/src/index.js +++ b/src/index.js @@ -2,3 +2,4 @@ * Copyright (c) 2021 Julien Gonzalez */ module.exports = require('./parser.js'); +module.exports.toMendeley = require('./mendeley').to; \ No newline at end of file diff --git a/src/mendeley.js b/src/mendeley.js new file mode 100644 index 0000000..dd396f0 --- /dev/null +++ b/src/mendeley.js @@ -0,0 +1,178 @@ +/** + * @license MIT + * @copyright (c) 2021 Julien Gonzalez + */ + +const Ajv = require('ajv'); +const ajvFormats = require('ajv-formats'); +const schema = require('./mendeley.schema.json'); +const parser = require('./parser'); + +const name = ({last_name, first_name}) => ({last_name, first_name}); +const ymd = ({year, month, day}) => `${year}-${month}-${day}`; + +const ajv = new Ajv(); +ajvFormats(ajv); + +const validate = ajv.compile(schema); + +/* +-- TL; DR --------------------------------------------------------------------- + +The following RIS record: + +TY - JOUR +TI - lorem ipsum +AU - Doe, John +AU - Foo, Bart +A1 - Baz, Nina +DO - doi123 +ER - + +Produces the following raw object: + +[ { TY: 'JOUR' + , TI: 'lorem ipsum' + , AU: [ {last_name: 'Doe', first_name: 'John', initials: '', suffix: ''} + , {last_name: 'Foo', first_name: 'Bart', initials: '', suffix: ''}] + , A1: [ {last_name: 'Baz', first_name: 'Nina', initials: '', suffix: ''}] + , DO: 'doi123' + }] + +Which is reprocessed into a Mendeley-compatible object: +(See also mendeley.schema.json) + +[ { type: 'journal' + , title: 'lorem ipsum + , authors: [ {last_name: 'Doe', first_name: 'John'} + , {last_name: 'Foo', first_name: 'Bart'} + , {last_name: 'Baz', first_name: 'Nina'}] + , identifiers: {doi: 'doi123'} + }] + +------------------------------------------------------------------------------- + +The following map defines a set of rules for translating objects +from one domain into another. + +Each rule is a tuple of one or two elements. + +The first element is always the name of the destination key. +There are some special processing notations: + +- `[]` e.g. 'authors[]' + Indicates that the destination is an array. + Incoming values should be accumulated into the array. + +- `.` e.g. 'identifiers.doi` + Indicates that the destination is an object. + Incoming value should be assigned to `doi` within the `identifiers` object. + +- `+` e.g. 'notes+' + Incoming values should be appended to the destination + using a new line character. + +The second element (optional) can be either a string or a function: + +- When set to a string, the destination value will be that string. + +- When set to a function, the function is applied to the corresponding + property in the raw object and the result becomes the destination value. + +Don't forget to update the README.md file when appropriate.*/ + +const map = { + 'A1': ['authors[]' , name ], + 'A2': ['editors[]' , name ], + 'A3': ['authors[]' , name ], + 'A4': ['authors[]' , name ], + 'AB': ['abstract' ], + 'AN': ['identifiers.pmid' ], + 'AU': ['authors[]' , name ], + 'C6.PAT': ['patent_legal_status' ], + 'CY': ['city' ], + 'DA': ['accessed' , ymd ], + 'DO': ['identifiers.doi' ], + 'ET': ['edition' ], + 'IS': ['issue' ], + 'KW': ['keywords[]' ], + 'L1': ['websites[]' ], + 'L4': ['websites[]' ], + 'LA': ['language' ], + 'LB': ['tags[]' ], + 'M1.PAT': ['patent_application_number' ], + 'N1': ['notes+' ], + 'PB': ['publisher' ], + 'PY': ['year' , Number ], + 'RN': ['notes+' ], + 'SE': ['chapter' ], + 'SN.JFULL': ['identifiers.issn' ], + 'SN.JOUR': ['identifiers.issn' ], + 'SN': ['identifiers.isbn' ], + 'SP': ['pages' ], + 'ST': ['short_title' ], + 'T2': ['source' ], + 'T3': ['series' ], + 'TA': ['authors[]' , name ], + 'TI': ['title' ], + 'TY.BILL': ['type' , 'bill' ], + 'TY.BOOK': ['type' , 'book' ], + 'TY.CASE': ['type' , 'case' ], + 'TY.CHAP': ['type' , 'book_section' ], + 'TY.COMP': ['type' , 'computer_program' ], + 'TY.CONF': ['type' , 'conference_proceedings'], + 'TY.ENCYC': ['type' , 'encyclopedia_article' ], + 'TY.HEAR': ['type' , 'hearing' ], + 'TY.ICOMM': ['type' , 'web_page' ], + 'TY.JFULL': ['type' , 'journal' ], + 'TY.JOUR': ['type' , 'journal' ], + 'TY.MGZN': ['type' , 'magazine_article' ], + 'TY.MPCT': ['type' , 'film' ], + 'TY.NEWS': ['type' , 'newspaper_article' ], + 'TY.PAT': ['type' , 'patent' ], + 'TY.RPRT': ['type' , 'report' ], + 'TY.STAT': ['type' , 'statute' ], + 'TY.THES': ['type' , 'thesis' ], + 'TY.UNPB': ['type' , 'working_paper' ], + 'TY': ['type' , 'generic' ], + 'UR': ['websites[]' ], + 'VL.RPRT': ['series_number' ], + 'VL': ['volume' ] +}; + +module.exports.to = risText => parser(risText).reduce((arr, ris) => { + const mdly = Object.entries(ris).reduce((obj, [rkey, rval]) => { + + const [k, v] = ( map[`${rkey}.${ris.TY}`] + || map[rkey] + || []); + + if (!k) return obj; + + const fn = ( typeof v == 'function' ? v + : typeof v == 'string' ? () => v + : x => x); + + if (k.endsWith('[]')) { + let sym = k.slice(0, -2); // e.g. 'authors[]' -> 'authors' + obj[sym] = (obj[sym] || []).concat(Array.isArray(rval) ? rval.map(fn) : fn(rval)); + } else if (k.includes('.')) { + let [root, child] = k.split('.'); // e.g. 'identifiers.doi' -> ['identifiers', 'doi'] + obj[root] = obj[root] || {}; + obj[root][child] = fn(rval); + } else if (k.endsWith('+')) { + let sym = k.slice(0, -1); // e.g. 'notes+' -> 'notes' + obj[sym] = sym in obj ? `${obj[sym]}\n${fn(rval)}` : fn(rval); + } else { + obj[k] = fn(rval); + } + + return obj; + }, {}); + + if (validate(mdly)) { + arr.push(mdly); + } + + return arr; +}, []); diff --git a/src/mendeley.schema.json b/src/mendeley.schema.json new file mode 100644 index 0000000..e55d52e --- /dev/null +++ b/src/mendeley.schema.json @@ -0,0 +1,250 @@ +{ + "$id": "mendeley://schemas/document.json", + "type": "object", + "required": [ + "title", + "type" + ], + "additionalProperties": false, + "properties": { + "abstract": { + "type": "string", + "maxLength": 10000 + }, + "accessed": { + "type": "string", + "format": "date" + }, + "authors": { + "description": "Person; same schema for editors and translators.", + "type": "array", + "items": { + "type": "object", + "required": [ + "last_name" + ], + "additionalProperties": false, + "properties": { + "last_name": { + "type": "string", + "minLength": 1, + "maxLength": 255 + }, + "first_name": { + "type": "string", + "maxLength": 255 + } + } + } + }, + "chapter": { + "type": "string", + "maxLength": 20 + }, + "citation_key": { + "type": "string", + "maxLength": 255 + }, + "city": { + "type": "string", + "maxLength": 255 + }, + "code": { + "type": "string", + "maxLength": 255 + }, + "country": { + "type": "string", + "maxLength": 255 + }, + "day": { + "type": "number" + }, + "department": { + "type": "string", + "maxLength": 255 + }, + "edition": { + "type": "string", + "maxLength": 20 + }, + "editors": { + "$ref": "document.json#/properties/authors" + }, + "genre": { + "type": "string", + "maxLength": 255 + }, + "identifiers": { + "description": "All identifiers in Mendeley are strings; we define one schema and reuse it for all the others.", + "type": "object", + "additionalProperties": false, + "properties": { + "arxiv": { + "type": "string", + "maxLength": 500 + }, + "doi": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "isbn": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "issn": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "pmid": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "scopus": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "pui": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "pii": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + }, + "sgr": { + "$ref": "document.json#/properties/identifiers/properties/arxiv" + } + } + }, + "institution": { + "type": "string", + "maxLength": 255 + }, + "issue": { + "type": "string", + "maxLength": 255 + }, + "keywords": { + "type": "array", + "items": { + "type": "string", + "maxLength": 300 + } + }, + "language": { + "type": "string", + "maxLength": 255 + }, + "medium": { + "type": "string", + "maxLength": 255 + }, + "month": { + "type": "number" + }, + "notes": { + "type": "string" + }, + "pages": { + "type": "string", + "maxLength": 50 + }, + "patent_application_number": { + "type": "string", + "maxLength": 255 + }, + "patent_legal_status": { + "type": "string", + "maxLength": 255 + }, + "patent_owner": { + "type": "string", + "maxLength": 255 + }, + "publisher": { + "type": "string", + "maxLength": 255 + }, + "reprint_edition": { + "type": "string", + "maxLength": 10 + }, + "revision": { + "type": "string", + "maxLength": 255 + }, + "series": { + "type": "string", + "maxLength": 255 + }, + "series_editor": { + "type": "string", + "maxLength": 255 + }, + "series_number": { + "type": "string", + "maxLength": 255 + }, + "short_title": { + "type": "string", + "maxLength": 50 + }, + "source": { + "type": "string", + "maxLength": 255 + }, + "source_type": { + "type": "string", + "maxLength": 255 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "maxLength": 100 + } + }, + "title": { + "type": "string", + "maxLength": 500 + }, + "translators": { + "$ref": "document.json#/properties/authors" + }, + "type": { + "enum": [ + "bill", + "book_section", + "book", + "case", + "computer_program", + "conference_proceedings", + "encyclopedia_article", + "film", + "generic", + "hearing", + "journal", + "magazine_article", + "newspaper_article", + "patent", + "report", + "statute", + "television_broadcast", + "thesis", + "web_page", + "working_paper" + ] + }, + "user_context": { + "type": "string", + "maxLength": 255 + }, + "volume": { + "type": "string", + "maxLength": 20 + }, + "websites": { + "type": "array", + "items": { + "type": "string" + } + }, + "year": { + "type": "number" + } + } +} \ No newline at end of file diff --git a/test/features/mendeley.feature b/test/features/mendeley.feature new file mode 100644 index 0000000..42f6377 --- /dev/null +++ b/test/features/mendeley.feature @@ -0,0 +1,524 @@ +Feature: Mendeley + +Scenario Outline: RIS Types -> Mendeley Types + Given I convert this to Mendeley + """ + TY - + TI - Lorem ipsum + ER - + """ + Then I will find a reference where "type" is set to "" + + Examples: + | RIS | Mendeley | + | ABST | generic | + | ADVS | generic | + | AGGR | generic | + | ANCIENT | generic | + | ART | generic | + | BILL | bill | + | BLOG | generic | + | BOOK | book | + | CASE | case | + | CHAP | book_section | + | CHART | generic | + | CLSWK | generic | + | COMP | computer_program | + | CONF | conference_proceedings | + | CPAPER | generic | + | CTLG | generic | + | DATA | generic | + | DBASE | generic | + | DICT | generic | + | EBOOK | generic | + | ECHAP | generic | + | EDBOOK | generic | + | EJOUR | generic | + | ELEC | generic | + | ENCYC | encyclopedia_article | + | EQUA | generic | + | FIGURE | generic | + | GEN | generic | + | GOVDOC | generic | + | GRANT | generic | + | HEAR | hearing | + | ICOMM | web_page | + | INPR | generic | + | JFULL | journal | + | JOUR | journal | + | LEGAL | generic | + | MANSCPT | generic | + | MAP | generic | + | MGZN | magazine_article | + | MPCT | film | + | MULTI | generic | + | MUSIC | generic | + | NEWS | newspaper_article | + | PAMP | generic | + | PAT | patent | + | PCOMM | generic | + | RPRT | report | + | SER | generic | + | SLIDE | generic | + | SOUND | generic | + | STAND | generic | + | STAT | statute | + | THES | thesis | + | UNBILL | generic | + | UNPB | working_paper | + | VIDEO | generic | + +Scenario: Generic records + Given I convert this to Mendeley + """ + TY - GEN + A1 - Author1, John1 + A2 - Editor1, John1 + A3 - Author2, John2 + A4 - Author3, John3 + AB - abstract + AN - pmid123 + AU - Author0, John0 + CY - city + DA - 1969/07/20 + DO - doi123 + ET - edition + IS - issue + KW - keyword1 + L1 - http://l1.example.com + L4 - http://l4.example.com + LA - language + LB - label1 + N1 - notes1 + PB - publisher + PY - 1666 + RN - notes2 + SE - chapter + SN - isbn123 + SP - pages + ST - short_title + T2 - source + T3 - series + TA - Author4, John4 + TI - title + UR - http://url.example.com + VL - volume + ER - + """ + Then I will get this object + """ + { + "type": "generic", + "abstract": "abstract", + "accessed": "1969-07-20", + "authors": [ + {"last_name": "Author1", "first_name": "John1"}, + {"last_name": "Author2", "first_name": "John2"}, + {"last_name": "Author3", "first_name": "John3"}, + {"last_name": "Author0", "first_name": "John0"}, + {"last_name": "Author4", "first_name": "John4"} + ], + "editors": [ + {"last_name":"Editor1", "first_name": "John1"} + ], + "identifiers": { + "pmid": "pmid123", + "isbn": "isbn123", + "doi": "doi123" + }, + "city": "city", + "edition": "edition", + "issue": "issue", + "keywords": [ + "keyword1" + ], + "websites": [ + "http://l1.example.com", + "http://l4.example.com", + "http://url.example.com" + ], + "language": "language", + "tags": [ + "label1" + ], + "notes": "notes1\nnotes2", + "publisher": "publisher", + "year": 1666, + "chapter": "chapter", + "pages": "pages", + "short_title": "short_title", + "source": "source", + "series": "series", + "title": "title", + "volume": "volume" + } + """ + +Scenario: Journal records + Given I convert this to Mendeley + """ + TY - JOUR + A1 - Author1, John1 + A2 - Editor1, John1 + A3 - Author2, John2 + A4 - Author3, John3 + AB - abstract + AN - pmid123 + AU - Author0, John0 + CY - city + DA - 1969/07/20 + DO - doi123 + ET - edition + IS - issue + KW - keyword1 + L1 - http://l1.example.com + L4 - http://l4.example.com + LA - language + LB - label1 + N1 - notes1 + PB - publisher + PY - 1666 + RN - notes2 + SE - chapter + SN - issn123 + SP - pages + ST - short_title + T2 - source + T3 - series + TA - Author4, John4 + TI - title + UR - http://url.example.com + VL - volume + ER - + """ + Then I will get this object + """ + { + "type": "journal", + "abstract": "abstract", + "accessed": "1969-07-20", + "authors": [ + {"last_name": "Author1", "first_name": "John1"}, + {"last_name": "Author2", "first_name": "John2"}, + {"last_name": "Author3", "first_name": "John3"}, + {"last_name": "Author0", "first_name": "John0"}, + {"last_name": "Author4", "first_name": "John4"} + ], + "editors": [ + {"last_name":"Editor1", "first_name": "John1"} + ], + "identifiers": { + "pmid": "pmid123", + "issn": "issn123", + "doi": "doi123" + }, + "city": "city", + "edition": "edition", + "issue": "issue", + "keywords": [ + "keyword1" + ], + "websites": [ + "http://l1.example.com", + "http://l4.example.com", + "http://url.example.com" + ], + "language": "language", + "tags": [ + "label1" + ], + "notes": "notes1\nnotes2", + "publisher": "publisher", + "year": 1666, + "chapter": "chapter", + "pages": "pages", + "short_title": "short_title", + "source": "source", + "series": "series", + "title": "title", + "volume": "volume" + } + """ + +Scenario: Journal (full) records + Given I convert this to Mendeley + """ + TY - JFULL + A1 - Author1, John1 + A2 - Editor1, John1 + A3 - Author2, John2 + A4 - Author3, John3 + AB - abstract + AN - pmid123 + AU - Author0, John0 + CY - city + DA - 1969/07/20 + DO - doi123 + ET - edition + IS - issue + KW - keyword1 + L1 - http://l1.example.com + L4 - http://l4.example.com + LA - language + LB - label1 + N1 - notes1 + PB - publisher + PY - 1666 + RN - notes2 + SE - chapter + SN - issn123 + SP - pages + ST - short_title + T2 - source + T3 - series + TA - Author4, John4 + TI - title + UR - http://url.example.com + VL - volume + ER - + """ + Then I will get this object + """ + { + "type": "journal", + "abstract": "abstract", + "accessed": "1969-07-20", + "authors": [ + {"last_name": "Author1", "first_name": "John1"}, + {"last_name": "Author2", "first_name": "John2"}, + {"last_name": "Author3", "first_name": "John3"}, + {"last_name": "Author0", "first_name": "John0"}, + {"last_name": "Author4", "first_name": "John4"} + ], + "editors": [ + {"last_name":"Editor1", "first_name": "John1"} + ], + "identifiers": { + "pmid": "pmid123", + "issn": "issn123", + "doi": "doi123" + }, + "city": "city", + "edition": "edition", + "issue": "issue", + "keywords": [ + "keyword1" + ], + "websites": [ + "http://l1.example.com", + "http://l4.example.com", + "http://url.example.com" + ], + "language": "language", + "tags": [ + "label1" + ], + "notes": "notes1\nnotes2", + "publisher": "publisher", + "year": 1666, + "chapter": "chapter", + "pages": "pages", + "short_title": "short_title", + "source": "source", + "series": "series", + "title": "title", + "volume": "volume" + } + """ + +Scenario: Patent records + Given I convert this to Mendeley + """ + TY - PAT + A1 - Author1, John1 + A2 - Editor1, John1 + A3 - Author2, John2 + A4 - Author3, John3 + AB - abstract + AN - pmid123 + AU - Author0, John0 + C6 - status123 + CY - city + DA - 1969/07/20 + DO - doi123 + ET - edition + IS - issue + KW - keyword1 + L1 - http://l1.example.com + L4 - http://l4.example.com + LA - language + LB - label1 + M1 - number123 + N1 - notes1 + PB - publisher + PY - 1666 + RN - notes2 + SE - chapter + SN - isbn123 + SP - pages + ST - short_title + T2 - source + T3 - series + TA - Author4, John4 + TI - title + UR - http://url.example.com + VL - volume + ER - + """ + Then I will get this object + """ + { + "type": "patent", + "abstract": "abstract", + "accessed": "1969-07-20", + "authors": [ + {"last_name": "Author1", "first_name": "John1"}, + {"last_name": "Author2", "first_name": "John2"}, + {"last_name": "Author3", "first_name": "John3"}, + {"last_name": "Author0", "first_name": "John0"}, + {"last_name": "Author4", "first_name": "John4"} + ], + "editors": [ + {"last_name":"Editor1", "first_name": "John1"} + ], + "identifiers": { + "pmid": "pmid123", + "isbn": "isbn123", + "doi": "doi123" + }, + "patent_legal_status": "status123", + "patent_application_number": "number123", + "city": "city", + "edition": "edition", + "issue": "issue", + "keywords": [ + "keyword1" + ], + "websites": [ + "http://l1.example.com", + "http://l4.example.com", + "http://url.example.com" + ], + "language": "language", + "tags": [ + "label1" + ], + "notes": "notes1\nnotes2", + "publisher": "publisher", + "year": 1666, + "chapter": "chapter", + "pages": "pages", + "short_title": "short_title", + "source": "source", + "series": "series", + "title": "title", + "volume": "volume" + } + """ + +Scenario: Report records + Given I convert this to Mendeley + """ + TY - RPRT + A1 - Author1, John1 + A2 - Editor1, John1 + A3 - Author2, John2 + A4 - Author3, John3 + AB - abstract + AN - pmid123 + AU - Author0, John0 + CY - city + DA - 1969/07/20 + DO - doi123 + ET - edition + IS - issue + KW - keyword1 + L1 - http://l1.example.com + L4 - http://l4.example.com + LA - language + LB - label1 + N1 - notes1 + PB - publisher + PY - 1666 + RN - notes2 + SE - chapter + SN - isbn123 + SP - pages + ST - short_title + T2 - source + T3 - series + TA - Author4, John4 + TI - title + UR - http://url.example.com + VL - volume + ER - + """ + Then I will get this object + """ + { + "type": "report", + "abstract": "abstract", + "accessed": "1969-07-20", + "authors": [ + {"last_name": "Author1", "first_name": "John1"}, + {"last_name": "Author2", "first_name": "John2"}, + {"last_name": "Author3", "first_name": "John3"}, + {"last_name": "Author0", "first_name": "John0"}, + {"last_name": "Author4", "first_name": "John4"} + ], + "editors": [ + {"last_name":"Editor1", "first_name": "John1"} + ], + "identifiers": { + "pmid": "pmid123", + "isbn": "isbn123", + "doi": "doi123" + }, + "city": "city", + "edition": "edition", + "issue": "issue", + "keywords": [ + "keyword1" + ], + "websites": [ + "http://l1.example.com", + "http://l4.example.com", + "http://url.example.com" + ], + "language": "language", + "tags": [ + "label1" + ], + "notes": "notes1\nnotes2", + "publisher": "publisher", + "year": 1666, + "chapter": "chapter", + "pages": "pages", + "short_title": "short_title", + "source": "source", + "series": "series", + "title": "title", + "series_number": "volume" + } + """ + + +# The point is to show validation does occur. +# Not sure it's worth testing all fields as this would be quite long +# and expensive to do. +Scenario Outline: Validate Mendeley documents + Given I convert this to Mendeley + """ + TY - GEN + TI - Title is mandatory + - + ER - + """ + Then I will get a list of 0 references + + Examples: + | key | value | + | PY | this is not a number | + | DA | 2004 | + | DA | 2021/02/29 | + | ET | no longer than 20 characters | diff --git a/test/steps.js b/test/steps.js index 2204bee..3d550e5 100644 --- a/test/steps.js +++ b/test/steps.js @@ -7,6 +7,10 @@ defineStep('I have this RIS file', function (file) { this.file = file; }); +defineStep('I convert this to Mendeley', async function (file) { + this.list = await this.toMendeley(file); +}); + defineStep('I have this file {word}', function (file) { this.file = fs.readFileSync(path.join(__dirname, 'samples', file), 'utf-8'); }); @@ -51,3 +55,9 @@ defineStep('I will find a reference where {string} is set to', function (field, defineStep('I will find a reference with {word} as a key', function (key) { assert(typeof this.list[0][key] !== 'undefined'); }); + +// TODO: make this works for lists of more than one element. +defineStep('I will get this object', function (text) { + const obj = JSON.parse(text); + assert.deepStrictEqual(this.list[0], obj); +}); diff --git a/test/world.js b/test/world.js index 5d3a49f..b2f3386 100644 --- a/test/world.js +++ b/test/world.js @@ -16,6 +16,11 @@ module.exports = class { if (!this.browser) return this.RIS.map(str); return this.page.evaluate(str_ => RIS.map(str_), str); } + + async toMendeley(risContent) { + if (!this.browser) return this.RIS.toMendeley(risContent); + return this.page.evaluate(risContent_ => RIS.toMendeley(risContent_), risContent); + } }; module.exports.init = async function () { diff --git a/yarn.lock b/yarn.lock index d2d3ac0..b5978b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -541,6 +541,13 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv-formats@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.0.2.tgz#69875cb99d76c74be46e9c7a4444bc232354eba0" + integrity sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw== + dependencies: + ajv "^8.0.0" + ajv@^6.5.5: version "6.12.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" @@ -551,6 +558,16 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.0, ajv@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" + integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -3091,6 +3108,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -5060,6 +5082,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"