use expect_test::{expect, Expect}; use crate::parse_bibtex; fn check(input: &str, expect: Expect) { let root = syntax::bibtex::SyntaxNode::new_root(parse_bibtex(input)); expect.assert_debug_eq(&root); } #[test] fn test_smoke() { check( r#""#, expect![[r#" ROOT@0..0 "#]], ); } #[test] fn test_preamble() { check( r#"@article{test, author = {\"{\i}}}"#, expect![[r#" ROOT@0..33 ENTRY@0..33 TYPE@0..8 "@article" L_DELIM@8..9 "{" NAME@9..13 "test" COMMA@13..14 "," WHITESPACE@14..15 " " FIELD@15..32 NAME@15..21 "author" WHITESPACE@21..22 " " EQ@22..23 "=" WHITESPACE@23..24 " " CURLY_GROUP@24..32 L_CURLY@24..25 "{" ACCENT@25..31 ACCENT_NAME@25..27 "\\\"" L_CURLY@27..28 "{" COMMAND_NAME@28..30 "\\i" R_CURLY@30..31 "}" R_CURLY@31..32 "}" R_DELIM@32..33 "}" "#]], ); } #[test] fn test_comment() { check( r#"Some junk here @comment{foo, author = {Foo Bar}, title = {Some Title}, } "#, expect![[r#" ROOT@0..82 JUNK@0..16 "Some junk here\n\n" TYPE@16..24 "@comment" JUNK@24..82 "{foo,\n author = {F ..." "#]], ); } #[test] fn test_issue_809() { check( r#"@article{issue_809, title = {foo (" bar) baz}, }"#, expect![[r#" ROOT@0..50 ENTRY@0..50 TYPE@0..8 "@article" L_DELIM@8..9 "{" NAME@9..18 "issue_809" COMMA@18..19 "," WHITESPACE@19..22 "\n " FIELD@22..48 NAME@22..27 "title" WHITESPACE@27..28 " " EQ@28..29 "=" WHITESPACE@29..30 " " CURLY_GROUP@30..47 L_CURLY@30..31 "{" WORD@31..34 "foo" WHITESPACE@34..35 " " WORD@35..36 "(" QUOTE@36..37 "\"" WHITESPACE@37..38 " " WORD@38..42 "bar)" WHITESPACE@42..43 " " WORD@43..46 "baz" R_CURLY@46..47 "}" COMMA@47..48 "," WHITESPACE@48..49 "\n" R_DELIM@49..50 "}" "#]], ); } #[test] fn test_issue_945() { check( r#"@article{test, author = {\"{\i}}}"#, expect![[r#" ROOT@0..33 ENTRY@0..33 TYPE@0..8 "@article" L_DELIM@8..9 "{" NAME@9..13 "test" COMMA@13..14 "," WHITESPACE@14..15 " " FIELD@15..32 NAME@15..21 "author" WHITESPACE@21..22 " " EQ@22..23 "=" WHITESPACE@23..24 " " CURLY_GROUP@24..32 L_CURLY@24..25 "{" ACCENT@25..31 ACCENT_NAME@25..27 "\\\"" L_CURLY@27..28 "{" COMMAND_NAME@28..30 "\\i" R_CURLY@30..31 "}" R_CURLY@31..32 "}" R_DELIM@32..33 "}" "#]], ); } #[test] fn test_aho_2006() { check( r#"@book{10.5555/1177220, author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.}, title = {Compilers: Principles, Techniques, and Tools (2nd Edition)}, year = {2006}, isbn = {0321486811}, publisher = {Addison-Wesley Longman Publishing Co., Inc.}, address = {USA} }"#, expect![[r#" ROOT@0..314 ENTRY@0..314 TYPE@0..5 "@book" L_DELIM@5..6 "{" NAME@6..21 "10.5555/1177220" COMMA@21..22 "," WHITESPACE@22..27 "\n " FIELD@27..111 NAME@27..33 "author" WHITESPACE@33..34 " " EQ@34..35 "=" WHITESPACE@35..36 " " CURLY_GROUP@36..110 L_CURLY@36..37 "{" WORD@37..40 "Aho" COMMA@40..41 "," WHITESPACE@41..42 " " WORD@42..48 "Alfred" WHITESPACE@48..49 " " WORD@49..51 "V." WHITESPACE@51..52 " " WORD@52..55 "and" WHITESPACE@55..56 " " WORD@56..59 "Lam" COMMA@59..60 "," WHITESPACE@60..61 " " WORD@61..67 "Monica" WHITESPACE@67..68 " " WORD@68..70 "S." WHITESPACE@70..71 " " WORD@71..74 "and" WHITESPACE@74..75 " " WORD@75..80 "Sethi" COMMA@80..81 "," WHITESPACE@81..82 " " WORD@82..86 "Ravi" WHITESPACE@86..87 " " WORD@87..90 "and" WHITESPACE@90..91 " " WORD@91..97 "Ullman" COMMA@97..98 "," WHITESPACE@98..99 " " WORD@99..106 "Jeffrey" WHITESPACE@106..107 " " WORD@107..109 "D." R_CURLY@109..110 "}" COMMA@110..111 "," WHITESPACE@111..116 "\n " FIELD@116..185 NAME@116..121 "title" WHITESPACE@121..122 " " EQ@122..123 "=" WHITESPACE@123..124 " " CURLY_GROUP@124..184 L_CURLY@124..125 "{" WORD@125..135 "Compilers:" WHITESPACE@135..136 " " WORD@136..146 "Principles" COMMA@146..147 "," WHITESPACE@147..148 " " WORD@148..158 "Techniques" COMMA@158..159 "," WHITESPACE@159..160 " " WORD@160..163 "and" WHITESPACE@163..164 " " WORD@164..169 "Tools" WHITESPACE@169..170 " " WORD@170..174 "(2nd" WHITESPACE@174..175 " " WORD@175..183 "Edition)" R_CURLY@183..184 "}" COMMA@184..185 "," WHITESPACE@185..190 "\n " FIELD@190..204 NAME@190..194 "year" WHITESPACE@194..195 " " EQ@195..196 "=" WHITESPACE@196..197 " " CURLY_GROUP@197..203 L_CURLY@197..198 "{" INTEGER@198..202 "2006" R_CURLY@202..203 "}" COMMA@203..204 "," WHITESPACE@204..209 "\n " FIELD@209..229 NAME@209..213 "isbn" WHITESPACE@213..214 " " EQ@214..215 "=" WHITESPACE@215..216 " " CURLY_GROUP@216..228 L_CURLY@216..217 "{" INTEGER@217..227 "0321486811" R_CURLY@227..228 "}" COMMA@228..229 "," WHITESPACE@229..234 "\n " FIELD@234..292 NAME@234..243 "publisher" WHITESPACE@243..244 " " EQ@244..245 "=" WHITESPACE@245..246 " " CURLY_GROUP@246..291 L_CURLY@246..247 "{" WORD@247..261 "Addison-Wesley" WHITESPACE@261..262 " " WORD@262..269 "Longman" WHITESPACE@269..270 " " WORD@270..280 "Publishing" WHITESPACE@280..281 " " WORD@281..284 "Co." COMMA@284..285 "," WHITESPACE@285..286 " " WORD@286..290 "Inc." R_CURLY@290..291 "}" COMMA@291..292 "," WHITESPACE@292..297 "\n " FIELD@297..313 NAME@297..304 "address" WHITESPACE@304..305 " " EQ@305..306 "=" WHITESPACE@306..307 " " CURLY_GROUP@307..312 L_CURLY@307..308 "{" WORD@308..311 "USA" R_CURLY@311..312 "}" WHITESPACE@312..313 "\n" R_DELIM@313..314 "}" "#]], ); } #[test] fn test_aksin_2006() { check( r#"@string{jomch = {J.~Organomet. Chem.}} @article{aksin, author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent and {\c{C}}etinkaya, Bekir and Ni, Chaoying and B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan}, title = {Effect of immobilization on catalytic characteristics of saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck} reactions}, journaltitle = jomch, date = 2006, volume = 691, number = 13, pages = {3027-3036}, indextitle = {Effect of immobilization on catalytic characteristics}, }"#, expect![[r#" ROOT@0..679 STRING@0..40 TYPE@0..7 "@string" L_DELIM@7..8 "{" NAME@8..13 "jomch" WHITESPACE@13..16 " " EQ@16..17 "=" WHITESPACE@17..18 " " CURLY_GROUP@18..39 L_CURLY@18..19 "{" WORD@19..21 "J." NBSP@21..22 "~" WORD@22..32 "Organomet." WHITESPACE@32..33 " " WORD@33..38 "Chem." R_CURLY@38..39 "}" R_DELIM@39..40 "}" JUNK@40..42 "\n\n" ENTRY@42..679 TYPE@42..50 "@article" L_DELIM@50..51 "{" NAME@51..56 "aksin" COMMA@56..57 "," WHITESPACE@57..62 "\n " FIELD@62..284 NAME@62..68 "author" WHITESPACE@68..75 " " EQ@75..76 "=" WHITESPACE@76..77 " " CURLY_GROUP@77..283 L_CURLY@77..78 "{" WORD@78..81 "Aks" CURLY_GROUP@81..85 L_CURLY@81..82 "{" COMMAND@82..84 COMMAND_NAME@82..84 "\\i" R_CURLY@84..85 "}" WORD@85..86 "n" COMMA@86..87 "," WHITESPACE@87..88 " " CURLY_GROUP@88..93 L_CURLY@88..89 "{" ACCENT@89..92 ACCENT_NAME@89..91 "\\\"" WORD@91..92 "O" R_CURLY@92..93 "}" WORD@93..96 "zge" WHITESPACE@96..97 " " WORD@97..100 "and" WHITESPACE@100..101 " " WORD@101..102 "T" CURLY_GROUP@102..107 L_CURLY@102..103 "{" ACCENT@103..106 ACCENT_NAME@103..105 "\\\"" WORD@105..106 "u" R_CURLY@106..107 "}" WORD@107..112 "rkmen" COMMA@112..113 "," WHITESPACE@113..114 " " WORD@114..120 "Hayati" WHITESPACE@120..121 " " WORD@121..124 "and" WHITESPACE@124..125 " " WORD@125..130 "Artok" COMMA@130..131 "," WHITESPACE@131..132 " " WORD@132..138 "Levent" WHITESPACE@138..159 "\n " WORD@159..162 "and" WHITESPACE@162..163 " " CURLY_GROUP@163..170 L_CURLY@163..164 "{" ACCENT@164..169 ACCENT_NAME@164..166 "\\c" L_CURLY@166..167 "{" WORD@167..168 "C" R_CURLY@168..169 "}" R_CURLY@169..170 "}" WORD@170..178 "etinkaya" COMMA@178..179 "," WHITESPACE@179..180 " " WORD@180..185 "Bekir" WHITESPACE@185..186 " " WORD@186..189 "and" WHITESPACE@189..190 " " WORD@190..192 "Ni" COMMA@192..193 "," WHITESPACE@193..194 " " WORD@194..202 "Chaoying" WHITESPACE@202..203 " " WORD@203..206 "and" WHITESPACE@206..227 "\n " WORD@227..228 "B" CURLY_GROUP@228..233 L_CURLY@228..229 "{" ACCENT@229..232 ACCENT_NAME@229..231 "\\\"" WORD@231..232 "u" R_CURLY@232..233 "}" WORD@233..234 "y" CURLY_GROUP@234..239 L_CURLY@234..235 "{" ACCENT@235..238 ACCENT_NAME@235..237 "\\\"" WORD@237..238 "u" R_CURLY@238..239 "}" WORD@239..241 "kg" CURLY_GROUP@241..246 L_CURLY@241..242 "{" ACCENT@242..245 ACCENT_NAME@242..244 "\\\"" WORD@244..245 "u" R_CURLY@245..246 "}" WORD@246..248 "ng" CURLY_GROUP@248..253 L_CURLY@248..249 "{" ACCENT@249..252 ACCENT_NAME@249..251 "\\\"" WORD@251..252 "o" R_CURLY@252..253 "}" WORD@253..254 "r" COMMA@254..255 "," WHITESPACE@255..256 " " WORD@256..261 "Orhan" WHITESPACE@261..262 " " WORD@262..265 "and" WHITESPACE@265..266 " " CURLY_GROUP@266..271 L_CURLY@266..267 "{" ACCENT@267..270 ACCENT_NAME@267..269 "\\\"" WORD@269..270 "O" R_CURLY@270..271 "}" WORD@271..275 "zkal" COMMA@275..276 "," WHITESPACE@276..277 " " WORD@277..282 "Erhan" R_CURLY@282..283 "}" COMMA@283..284 "," WHITESPACE@284..289 "\n " FIELD@289..471 NAME@289..294 "title" WHITESPACE@294..302 " " EQ@302..303 "=" WHITESPACE@303..304 " " CURLY_GROUP@304..470 L_CURLY@304..305 "{" WORD@305..311 "Effect" WHITESPACE@311..312 " " WORD@312..314 "of" WHITESPACE@314..315 " " WORD@315..329 "immobilization" WHITESPACE@329..330 " " WORD@330..332 "on" WHITESPACE@332..333 " " WORD@333..342 "catalytic" WHITESPACE@342..343 " " WORD@343..358 "characteristics" WHITESPACE@358..359 " " WORD@359..361 "of" WHITESPACE@361..382 "\n " WORD@382..391 "saturated" WHITESPACE@391..392 " " CURLY_GROUP@392..398 L_CURLY@392..393 "{" WORD@393..397 "Pd-N" R_CURLY@397..398 "}" WORD@398..411 "-heterocyclic" WHITESPACE@411..412 " " WORD@412..420 "carbenes" WHITESPACE@420..421 " " WORD@421..423 "in" WHITESPACE@423..424 " " CURLY_GROUP@424..439 L_CURLY@424..425 "{" WORD@425..438 "Mizoroki-Heck" R_CURLY@438..439 "}" WHITESPACE@439..460 "\n " WORD@460..469 "reactions" R_CURLY@469..470 "}" COMMA@470..471 "," WHITESPACE@471..476 "\n " FIELD@476..497 NAME@476..488 "journaltitle" WHITESPACE@488..489 " " EQ@489..490 "=" WHITESPACE@490..491 " " LITERAL@491..496 NAME@491..496 "jomch" COMMA@496..497 "," WHITESPACE@497..502 "\n " FIELD@502..522 NAME@502..506 "date" WHITESPACE@506..515 " " EQ@515..516 "=" WHITESPACE@516..517 " " LITERAL@517..521 INTEGER@517..521 "2006" COMMA@521..522 "," WHITESPACE@522..527 "\n " FIELD@527..546 NAME@527..533 "volume" WHITESPACE@533..540 " " EQ@540..541 "=" WHITESPACE@541..542 " " LITERAL@542..545 INTEGER@542..545 "691" COMMA@545..546 "," WHITESPACE@546..551 "\n " FIELD@551..569 NAME@551..557 "number" WHITESPACE@557..564 " " EQ@564..565 "=" WHITESPACE@565..566 " " LITERAL@566..568 INTEGER@566..568 "13" COMMA@568..569 "," WHITESPACE@569..574 "\n " FIELD@574..601 NAME@574..579 "pages" WHITESPACE@579..587 " " EQ@587..588 "=" WHITESPACE@588..589 " " CURLY_GROUP@589..600 L_CURLY@589..590 "{" WORD@590..599 "3027-3036" R_CURLY@599..600 "}" COMMA@600..601 "," WHITESPACE@601..606 "\n " FIELD@606..677 NAME@606..616 "indextitle" WHITESPACE@616..619 " " EQ@619..620 "=" WHITESPACE@620..621 " " CURLY_GROUP@621..676 L_CURLY@621..622 "{" WORD@622..628 "Effect" WHITESPACE@628..629 " " WORD@629..631 "of" WHITESPACE@631..632 " " WORD@632..646 "immobilization" WHITESPACE@646..647 " " WORD@647..649 "on" WHITESPACE@649..650 " " WORD@650..659 "catalytic" WHITESPACE@659..660 " " WORD@660..675 "characteristics" R_CURLY@675..676 "}" COMMA@676..677 "," WHITESPACE@677..678 "\n" R_DELIM@678..679 "}" "#]], ); } #[test] fn test_almendro_1998() { check( r#"@patent{almendro, author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez, Alberto and Nozal, Fernando}, title = {Elektromagnetisches Signalhorn}, number = {EU-29702195U}, date = 1998, location = {countryfr and countryuk and countryde}, langid = {german}, annotation = {This is a \texttt{patent} entry with a \texttt{location} field. The number is given in the \texttt{number} field. Note the format of the \texttt{location} field in the database file. Compare \texttt{laufenberg}, \texttt{sorace}, and \texttt{kowalik}}, }"#, expect![[r#" ROOT@0..706 ENTRY@0..706 TYPE@0..7 "@patent" L_DELIM@7..8 "{" NAME@8..16 "almendro" COMMA@16..17 "," WHITESPACE@17..22 "\n " FIELD@22..150 NAME@22..28 "author" WHITESPACE@28..35 " " EQ@35..36 "=" WHITESPACE@36..37 " " CURLY_GROUP@37..149 L_CURLY@37..38 "{" WORD@38..46 "Almendro" COMMA@46..47 "," WHITESPACE@47..48 " " WORD@48..51 "Jos" CURLY_GROUP@51..56 L_CURLY@51..52 "{" ACCENT@52..55 ACCENT_NAME@52..54 "\\'" WORD@54..55 "e" R_CURLY@55..56 "}" WHITESPACE@56..57 " " WORD@57..59 "L." WHITESPACE@59..60 " " WORD@60..63 "and" WHITESPACE@63..64 " " WORD@64..68 "Mart" CURLY_GROUP@68..73 L_CURLY@68..69 "{" ACCENT@69..72 ACCENT_NAME@69..71 "\\'" WORD@71..72 "i" R_CURLY@72..73 "}" WORD@73..74 "n" COMMA@74..75 "," WHITESPACE@75..76 " " WORD@76..83 "Jacinto" WHITESPACE@83..84 " " WORD@84..87 "and" WHITESPACE@87..88 " " WORD@88..89 "S" CURLY_GROUP@89..94 L_CURLY@89..90 "{" ACCENT@90..93 ACCENT_NAME@90..92 "\\'" WORD@92..93 "a" R_CURLY@93..94 "}" WORD@94..99 "nchez" COMMA@99..100 "," WHITESPACE@100..121 "\n " WORD@121..128 "Alberto" WHITESPACE@128..129 " " WORD@129..132 "and" WHITESPACE@132..133 " " WORD@133..138 "Nozal" COMMA@138..139 "," WHITESPACE@139..140 " " WORD@140..148 "Fernando" R_CURLY@148..149 "}" COMMA@149..150 "," WHITESPACE@150..155 "\n " FIELD@155..203 NAME@155..160 "title" WHITESPACE@160..168 " " EQ@168..169 "=" WHITESPACE@169..170 " " CURLY_GROUP@170..202 L_CURLY@170..171 "{" WORD@171..190 "Elektromagnetisches" WHITESPACE@190..191 " " WORD@191..201 "Signalhorn" R_CURLY@201..202 "}" COMMA@202..203 "," WHITESPACE@203..208 "\n " FIELD@208..238 NAME@208..214 "number" WHITESPACE@214..221 " " EQ@221..222 "=" WHITESPACE@222..223 " " CURLY_GROUP@223..237 L_CURLY@223..224 "{" WORD@224..236 "EU-29702195U" R_CURLY@236..237 "}" COMMA@237..238 "," WHITESPACE@238..243 "\n " FIELD@243..263 NAME@243..247 "date" WHITESPACE@247..256 " " EQ@256..257 "=" WHITESPACE@257..258 " " LITERAL@258..262 INTEGER@258..262 "1998" COMMA@262..263 "," WHITESPACE@263..268 "\n " FIELD@268..323 NAME@268..276 "location" WHITESPACE@276..281 " " EQ@281..282 "=" WHITESPACE@282..283 " " CURLY_GROUP@283..322 L_CURLY@283..284 "{" WORD@284..293 "countryfr" WHITESPACE@293..294 " " WORD@294..297 "and" WHITESPACE@297..298 " " WORD@298..307 "countryuk" WHITESPACE@307..308 " " WORD@308..311 "and" WHITESPACE@311..312 " " WORD@312..321 "countryde" R_CURLY@321..322 "}" COMMA@322..323 "," WHITESPACE@323..328 "\n " FIELD@328..352 NAME@328..334 "langid" WHITESPACE@334..341 " " EQ@341..342 "=" WHITESPACE@342..343 " " CURLY_GROUP@343..351 L_CURLY@343..344 "{" WORD@344..350 "german" R_CURLY@350..351 "}" COMMA@351..352 "," WHITESPACE@352..357 "\n " FIELD@357..704 NAME@357..367 "annotation" WHITESPACE@367..370 " " EQ@370..371 "=" WHITESPACE@371..372 " " CURLY_GROUP@372..703 L_CURLY@372..373 "{" WORD@373..377 "This" WHITESPACE@377..378 " " WORD@378..380 "is" WHITESPACE@380..381 " " WORD@381..382 "a" WHITESPACE@382..383 " " COMMAND@383..390 COMMAND_NAME@383..390 "\\texttt" CURLY_GROUP@390..398 L_CURLY@390..391 "{" WORD@391..397 "patent" R_CURLY@397..398 "}" WHITESPACE@398..399 " " WORD@399..404 "entry" WHITESPACE@404..405 " " WORD@405..409 "with" WHITESPACE@409..410 " " WORD@410..411 "a" WHITESPACE@411..412 " " COMMAND@412..419 COMMAND_NAME@412..419 "\\texttt" CURLY_GROUP@419..429 L_CURLY@419..420 "{" WORD@420..428 "location" R_CURLY@428..429 "}" WHITESPACE@429..450 "\n " WORD@450..456 "field." WHITESPACE@456..457 " " WORD@457..460 "The" WHITESPACE@460..461 " " WORD@461..467 "number" WHITESPACE@467..468 " " WORD@468..470 "is" WHITESPACE@470..471 " " WORD@471..476 "given" WHITESPACE@476..477 " " WORD@477..479 "in" WHITESPACE@479..480 " " WORD@480..483 "the" WHITESPACE@483..484 " " COMMAND@484..491 COMMAND_NAME@484..491 "\\texttt" CURLY_GROUP@491..499 L_CURLY@491..492 "{" WORD@492..498 "number" R_CURLY@498..499 "}" WHITESPACE@499..500 " " WORD@500..506 "field." WHITESPACE@506..507 " " WORD@507..511 "Note" WHITESPACE@511..532 "\n " WORD@532..535 "the" WHITESPACE@535..536 " " WORD@536..542 "format" WHITESPACE@542..543 " " WORD@543..545 "of" WHITESPACE@545..546 " " WORD@546..549 "the" WHITESPACE@549..550 " " COMMAND@550..557 COMMAND_NAME@550..557 "\\texttt" CURLY_GROUP@557..567 L_CURLY@557..558 "{" WORD@558..566 "location" R_CURLY@566..567 "}" WHITESPACE@567..568 " " WORD@568..573 "field" WHITESPACE@573..574 " " WORD@574..576 "in" WHITESPACE@576..577 " " WORD@577..580 "the" WHITESPACE@580..581 " " WORD@581..589 "database" WHITESPACE@589..610 "\n " WORD@610..615 "file." WHITESPACE@615..616 " " WORD@616..623 "Compare" WHITESPACE@623..624 " " COMMAND@624..631 COMMAND_NAME@624..631 "\\texttt" CURLY_GROUP@631..643 L_CURLY@631..632 "{" WORD@632..642 "laufenberg" R_CURLY@642..643 "}" COMMA@643..644 "," WHITESPACE@644..645 " " COMMAND@645..652 COMMAND_NAME@645..652 "\\texttt" CURLY_GROUP@652..660 L_CURLY@652..653 "{" WORD@653..659 "sorace" R_CURLY@659..660 "}" COMMA@660..661 "," WHITESPACE@661..662 " " WORD@662..665 "and" WHITESPACE@665..686 "\n " COMMAND@686..693 COMMAND_NAME@686..693 "\\texttt" CURLY_GROUP@693..702 L_CURLY@693..694 "{" WORD@694..701 "kowalik" R_CURLY@701..702 "}" R_CURLY@702..703 "}" COMMA@703..704 "," WHITESPACE@704..705 "\n" R_DELIM@705..706 "}" "#]], ); } #[test] fn test_averroes_1998() { check( r#"@book{averroes/bland, author = {Averroes}, title = {The Epistle on the Possibility of Conjunction with the Active Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}}, date = 1982, editor = {Bland, Kalman P.}, translator = {Bland, Kalman P.}, series = {Moreshet: Studies in {Jewish} History, Literature and Thought}, number = 7, publisher = {Jewish Theological Seminary of America}, location = {New York}, keywords = {primary}, langid = {english}, langidopts = {variant=american}, indextitle = {Epistle on the Possibility of Conjunction, The}, shorttitle = {Possibility of Conjunction}, annotation = {A \texttt{book} entry with a \texttt{series} and a \texttt{number}. Note the concatenation of the \texttt{editor} and \texttt{translator} fields as well as the \texttt{indextitle} field}, }"#, expect![[r#" ROOT@0..1008 ENTRY@0..1008 TYPE@0..5 "@book" L_DELIM@5..6 "{" NAME@6..20 "averroes/bland" COMMA@20..21 "," WHITESPACE@21..26 "\n " FIELD@26..52 NAME@26..32 "author" WHITESPACE@32..39 " " EQ@39..40 "=" WHITESPACE@40..41 " " CURLY_GROUP@41..51 L_CURLY@41..42 "{" WORD@42..50 "Averroes" R_CURLY@50..51 "}" COMMA@51..52 "," WHITESPACE@52..57 "\n " FIELD@57..220 NAME@57..62 "title" WHITESPACE@62..70 " " EQ@70..71 "=" WHITESPACE@71..72 " " CURLY_GROUP@72..219 L_CURLY@72..73 "{" WORD@73..76 "The" WHITESPACE@76..77 " " WORD@77..84 "Epistle" WHITESPACE@84..85 " " WORD@85..87 "on" WHITESPACE@87..88 " " WORD@88..91 "the" WHITESPACE@91..92 " " WORD@92..103 "Possibility" WHITESPACE@103..104 " " WORD@104..106 "of" WHITESPACE@106..107 " " WORD@107..118 "Conjunction" WHITESPACE@118..119 " " WORD@119..123 "with" WHITESPACE@123..124 " " WORD@124..127 "the" WHITESPACE@127..128 " " WORD@128..134 "Active" WHITESPACE@134..155 "\n " WORD@155..164 "Intellect" WHITESPACE@164..165 " " WORD@165..167 "by" WHITESPACE@167..168 " " CURLY_GROUP@168..179 L_CURLY@168..169 "{" WORD@169..172 "Ibn" WHITESPACE@172..173 " " WORD@173..178 "Rushd" R_CURLY@178..179 "}" WHITESPACE@179..180 " " WORD@180..184 "with" WHITESPACE@184..185 " " WORD@185..188 "the" WHITESPACE@188..189 " " WORD@189..199 "Commentary" WHITESPACE@199..200 " " WORD@200..202 "of" WHITESPACE@202..203 " " CURLY_GROUP@203..218 L_CURLY@203..204 "{" WORD@204..209 "Moses" WHITESPACE@209..210 " " WORD@210..217 "Narboni" R_CURLY@217..218 "}" R_CURLY@218..219 "}" COMMA@219..220 "," WHITESPACE@220..225 "\n " FIELD@225..245 NAME@225..229 "date" WHITESPACE@229..238 " " EQ@238..239 "=" WHITESPACE@239..240 " " LITERAL@240..244 INTEGER@240..244 "1982" COMMA@244..245 "," WHITESPACE@245..250 "\n " FIELD@250..284 NAME@250..256 "editor" WHITESPACE@256..263 " " EQ@263..264 "=" WHITESPACE@264..265 " " CURLY_GROUP@265..283 L_CURLY@265..266 "{" WORD@266..271 "Bland" COMMA@271..272 "," WHITESPACE@272..273 " " WORD@273..279 "Kalman" WHITESPACE@279..280 " " WORD@280..282 "P." R_CURLY@282..283 "}" COMMA@283..284 "," WHITESPACE@284..289 "\n " FIELD@289..323 NAME@289..299 "translator" WHITESPACE@299..302 " " EQ@302..303 "=" WHITESPACE@303..304 " " CURLY_GROUP@304..322 L_CURLY@304..305 "{" WORD@305..310 "Bland" COMMA@310..311 "," WHITESPACE@311..312 " " WORD@312..318 "Kalman" WHITESPACE@318..319 " " WORD@319..321 "P." R_CURLY@321..322 "}" COMMA@322..323 "," WHITESPACE@323..328 "\n " FIELD@328..407 NAME@328..334 "series" WHITESPACE@334..341 " " EQ@341..342 "=" WHITESPACE@342..343 " " CURLY_GROUP@343..406 L_CURLY@343..344 "{" WORD@344..353 "Moreshet:" WHITESPACE@353..354 " " WORD@354..361 "Studies" WHITESPACE@361..362 " " WORD@362..364 "in" WHITESPACE@364..365 " " CURLY_GROUP@365..373 L_CURLY@365..366 "{" WORD@366..372 "Jewish" R_CURLY@372..373 "}" WHITESPACE@373..374 " " WORD@374..381 "History" COMMA@381..382 "," WHITESPACE@382..383 " " WORD@383..393 "Literature" WHITESPACE@393..394 " " WORD@394..397 "and" WHITESPACE@397..398 " " WORD@398..405 "Thought" R_CURLY@405..406 "}" COMMA@406..407 "," WHITESPACE@407..412 "\n " FIELD@412..429 NAME@412..418 "number" WHITESPACE@418..425 " " EQ@425..426 "=" WHITESPACE@426..427 " " LITERAL@427..428 INTEGER@427..428 "7" COMMA@428..429 "," WHITESPACE@429..434 "\n " FIELD@434..490 NAME@434..443 "publisher" WHITESPACE@443..447 " " EQ@447..448 "=" WHITESPACE@448..449 " " CURLY_GROUP@449..489 L_CURLY@449..450 "{" WORD@450..456 "Jewish" WHITESPACE@456..457 " " WORD@457..468 "Theological" WHITESPACE@468..469 " " WORD@469..477 "Seminary" WHITESPACE@477..478 " " WORD@478..480 "of" WHITESPACE@480..481 " " WORD@481..488 "America" R_CURLY@488..489 "}" COMMA@489..490 "," WHITESPACE@490..495 "\n " FIELD@495..521 NAME@495..503 "location" WHITESPACE@503..508 " " EQ@508..509 "=" WHITESPACE@509..510 " " CURLY_GROUP@510..520 L_CURLY@510..511 "{" WORD@511..514 "New" WHITESPACE@514..515 " " WORD@515..519 "York" R_CURLY@519..520 "}" COMMA@520..521 "," WHITESPACE@521..526 "\n " FIELD@526..551 NAME@526..534 "keywords" WHITESPACE@534..539 " " EQ@539..540 "=" WHITESPACE@540..541 " " CURLY_GROUP@541..550 L_CURLY@541..542 "{" WORD@542..549 "primary" R_CURLY@549..550 "}" COMMA@550..551 "," WHITESPACE@551..556 "\n " FIELD@556..581 NAME@556..562 "langid" WHITESPACE@562..569 " " EQ@569..570 "=" WHITESPACE@570..571 " " CURLY_GROUP@571..580 L_CURLY@571..572 "{" WORD@572..579 "english" R_CURLY@579..580 "}" COMMA@580..581 "," WHITESPACE@581..586 "\n " FIELD@586..620 NAME@586..596 "langidopts" WHITESPACE@596..599 " " EQ@599..600 "=" WHITESPACE@600..601 " " CURLY_GROUP@601..619 L_CURLY@601..602 "{" WORD@602..618 "variant=american" R_CURLY@618..619 "}" COMMA@619..620 "," WHITESPACE@620..625 "\n " FIELD@625..689 NAME@625..635 "indextitle" WHITESPACE@635..638 " " EQ@638..639 "=" WHITESPACE@639..640 " " CURLY_GROUP@640..688 L_CURLY@640..641 "{" WORD@641..648 "Epistle" WHITESPACE@648..649 " " WORD@649..651 "on" WHITESPACE@651..652 " " WORD@652..655 "the" WHITESPACE@655..656 " " WORD@656..667 "Possibility" WHITESPACE@667..668 " " WORD@668..670 "of" WHITESPACE@670..671 " " WORD@671..682 "Conjunction" COMMA@682..683 "," WHITESPACE@683..684 " " WORD@684..687 "The" R_CURLY@687..688 "}" COMMA@688..689 "," WHITESPACE@689..694 "\n " FIELD@694..738 NAME@694..704 "shorttitle" WHITESPACE@704..707 " " EQ@707..708 "=" WHITESPACE@708..709 " " CURLY_GROUP@709..737 L_CURLY@709..710 "{" WORD@710..721 "Possibility" WHITESPACE@721..722 " " WORD@722..724 "of" WHITESPACE@724..725 " " WORD@725..736 "Conjunction" R_CURLY@736..737 "}" COMMA@737..738 "," WHITESPACE@738..743 "\n " FIELD@743..1006 NAME@743..753 "annotation" WHITESPACE@753..756 " " EQ@756..757 "=" WHITESPACE@757..758 " " CURLY_GROUP@758..1005 L_CURLY@758..759 "{" WORD@759..760 "A" WHITESPACE@760..761 " " COMMAND@761..768 COMMAND_NAME@761..768 "\\texttt" CURLY_GROUP@768..774 L_CURLY@768..769 "{" WORD@769..773 "book" R_CURLY@773..774 "}" WHITESPACE@774..775 " " WORD@775..780 "entry" WHITESPACE@780..781 " " WORD@781..785 "with" WHITESPACE@785..786 " " WORD@786..787 "a" WHITESPACE@787..788 " " COMMAND@788..795 COMMAND_NAME@788..795 "\\texttt" CURLY_GROUP@795..803 L_CURLY@795..796 "{" WORD@796..802 "series" R_CURLY@802..803 "}" WHITESPACE@803..804 " " WORD@804..807 "and" WHITESPACE@807..808 " " WORD@808..809 "a" WHITESPACE@809..830 "\n " COMMAND@830..837 COMMAND_NAME@830..837 "\\texttt" CURLY_GROUP@837..845 L_CURLY@837..838 "{" WORD@838..844 "number" R_CURLY@844..845 "}" WORD@845..846 "." WHITESPACE@846..847 " " WORD@847..851 "Note" WHITESPACE@851..852 " " WORD@852..855 "the" WHITESPACE@855..856 " " WORD@856..869 "concatenation" WHITESPACE@869..870 " " WORD@870..872 "of" WHITESPACE@872..873 " " WORD@873..876 "the" WHITESPACE@876..877 " " COMMAND@877..884 COMMAND_NAME@877..884 "\\texttt" CURLY_GROUP@884..892 L_CURLY@884..885 "{" WORD@885..891 "editor" R_CURLY@891..892 "}" WHITESPACE@892..913 "\n " WORD@913..916 "and" WHITESPACE@916..917 " " COMMAND@917..924 COMMAND_NAME@917..924 "\\texttt" CURLY_GROUP@924..936 L_CURLY@924..925 "{" WORD@925..935 "translator" R_CURLY@935..936 "}" WHITESPACE@936..937 " " WORD@937..943 "fields" WHITESPACE@943..944 " " WORD@944..946 "as" WHITESPACE@946..947 " " WORD@947..951 "well" WHITESPACE@951..952 " " WORD@952..954 "as" WHITESPACE@954..955 " " WORD@955..958 "the" WHITESPACE@958..979 "\n " COMMAND@979..986 COMMAND_NAME@979..986 "\\texttt" CURLY_GROUP@986..998 L_CURLY@986..987 "{" WORD@987..997 "indextitle" R_CURLY@997..998 "}" WHITESPACE@998..999 " " WORD@999..1004 "field" R_CURLY@1004..1005 "}" COMMA@1005..1006 "," WHITESPACE@1006..1007 "\n" R_DELIM@1007..1008 "}" "#]], ); } #[test] fn test_betram_1996() { check( r#"@string{jams = {J.~Amer. Math. Soc.}} @article{bertram, author = {Bertram, Aaron and Wentworth, Richard}, title = {Gromov invariants for holomorphic maps on {Riemann} surfaces}, journaltitle = jams, date = 1996, volume = 9, number = 2, pages = {529-571}, langid = {english}, langidopts = {variant=american}, shorttitle = {Gromov invariants}, annotation = {An \texttt{article} entry with a \texttt{volume} and a \texttt{number} field}, }"#, expect![[r#" ROOT@0..556 STRING@0..40 TYPE@0..7 "@string" L_DELIM@7..8 "{" NAME@8..12 "jams" WHITESPACE@12..16 " " EQ@16..17 "=" WHITESPACE@17..18 " " CURLY_GROUP@18..39 L_CURLY@18..19 "{" WORD@19..21 "J." NBSP@21..22 "~" WORD@22..27 "Amer." WHITESPACE@27..28 " " WORD@28..33 "Math." WHITESPACE@33..34 " " WORD@34..38 "Soc." R_CURLY@38..39 "}" R_DELIM@39..40 "}" JUNK@40..42 "\n\n" ENTRY@42..556 TYPE@42..50 "@article" L_DELIM@50..51 "{" NAME@51..58 "bertram" COMMA@58..59 "," WHITESPACE@59..64 "\n " FIELD@64..119 NAME@64..70 "author" WHITESPACE@70..77 " " EQ@77..78 "=" WHITESPACE@78..79 " " CURLY_GROUP@79..118 L_CURLY@79..80 "{" WORD@80..87 "Bertram" COMMA@87..88 "," WHITESPACE@88..89 " " WORD@89..94 "Aaron" WHITESPACE@94..95 " " WORD@95..98 "and" WHITESPACE@98..99 " " WORD@99..108 "Wentworth" COMMA@108..109 "," WHITESPACE@109..110 " " WORD@110..117 "Richard" R_CURLY@117..118 "}" COMMA@118..119 "," WHITESPACE@119..124 "\n " FIELD@124..202 NAME@124..129 "title" WHITESPACE@129..137 " " EQ@137..138 "=" WHITESPACE@138..139 " " CURLY_GROUP@139..201 L_CURLY@139..140 "{" WORD@140..146 "Gromov" WHITESPACE@146..147 " " WORD@147..157 "invariants" WHITESPACE@157..158 " " WORD@158..161 "for" WHITESPACE@161..162 " " WORD@162..173 "holomorphic" WHITESPACE@173..174 " " WORD@174..178 "maps" WHITESPACE@178..179 " " WORD@179..181 "on" WHITESPACE@181..182 " " CURLY_GROUP@182..191 L_CURLY@182..183 "{" WORD@183..190 "Riemann" R_CURLY@190..191 "}" WHITESPACE@191..192 " " WORD@192..200 "surfaces" R_CURLY@200..201 "}" COMMA@201..202 "," WHITESPACE@202..207 "\n " FIELD@207..227 NAME@207..219 "journaltitle" WHITESPACE@219..220 " " EQ@220..221 "=" WHITESPACE@221..222 " " LITERAL@222..226 NAME@222..226 "jams" COMMA@226..227 "," WHITESPACE@227..232 "\n " FIELD@232..252 NAME@232..236 "date" WHITESPACE@236..245 " " EQ@245..246 "=" WHITESPACE@246..247 " " LITERAL@247..251 INTEGER@247..251 "1996" COMMA@251..252 "," WHITESPACE@252..257 "\n " FIELD@257..274 NAME@257..263 "volume" WHITESPACE@263..270 " " EQ@270..271 "=" WHITESPACE@271..272 " " LITERAL@272..273 INTEGER@272..273 "9" COMMA@273..274 "," WHITESPACE@274..279 "\n " FIELD@279..296 NAME@279..285 "number" WHITESPACE@285..292 " " EQ@292..293 "=" WHITESPACE@293..294 " " LITERAL@294..295 INTEGER@294..295 "2" COMMA@295..296 "," WHITESPACE@296..301 "\n " FIELD@301..326 NAME@301..306 "pages" WHITESPACE@306..314 " " EQ@314..315 "=" WHITESPACE@315..316 " " CURLY_GROUP@316..325 L_CURLY@316..317 "{" WORD@317..324 "529-571" R_CURLY@324..325 "}" COMMA@325..326 "," WHITESPACE@326..331 "\n " FIELD@331..356 NAME@331..337 "langid" WHITESPACE@337..344 " " EQ@344..345 "=" WHITESPACE@345..346 " " CURLY_GROUP@346..355 L_CURLY@346..347 "{" WORD@347..354 "english" R_CURLY@354..355 "}" COMMA@355..356 "," WHITESPACE@356..361 "\n " FIELD@361..395 NAME@361..371 "langidopts" WHITESPACE@371..374 " " EQ@374..375 "=" WHITESPACE@375..376 " " CURLY_GROUP@376..394 L_CURLY@376..377 "{" WORD@377..393 "variant=american" R_CURLY@393..394 "}" COMMA@394..395 "," WHITESPACE@395..400 "\n " FIELD@400..435 NAME@400..410 "shorttitle" WHITESPACE@410..413 " " EQ@413..414 "=" WHITESPACE@414..415 " " CURLY_GROUP@415..434 L_CURLY@415..416 "{" WORD@416..422 "Gromov" WHITESPACE@422..423 " " WORD@423..433 "invariants" R_CURLY@433..434 "}" COMMA@434..435 "," WHITESPACE@435..440 "\n " FIELD@440..554 NAME@440..450 "annotation" WHITESPACE@450..453 " " EQ@453..454 "=" WHITESPACE@454..455 " " CURLY_GROUP@455..553 L_CURLY@455..456 "{" WORD@456..458 "An" WHITESPACE@458..459 " " COMMAND@459..466 COMMAND_NAME@459..466 "\\texttt" CURLY_GROUP@466..475 L_CURLY@466..467 "{" WORD@467..474 "article" R_CURLY@474..475 "}" WHITESPACE@475..476 " " WORD@476..481 "entry" WHITESPACE@481..482 " " WORD@482..486 "with" WHITESPACE@486..487 " " WORD@487..488 "a" WHITESPACE@488..489 " " COMMAND@489..496 COMMAND_NAME@489..496 "\\texttt" CURLY_GROUP@496..504 L_CURLY@496..497 "{" WORD@497..503 "volume" R_CURLY@503..504 "}" WHITESPACE@504..505 " " WORD@505..508 "and" WHITESPACE@508..509 " " WORD@509..510 "a" WHITESPACE@510..531 "\n " COMMAND@531..538 COMMAND_NAME@531..538 "\\texttt" CURLY_GROUP@538..546 L_CURLY@538..539 "{" WORD@539..545 "number" R_CURLY@545..546 "}" WHITESPACE@546..547 " " WORD@547..552 "field" R_CURLY@552..553 "}" COMMA@553..554 "," WHITESPACE@554..555 "\n" R_DELIM@555..556 "}" "#]], ); } #[test] fn test_blom_2021() { check( r#"@article{DBLP:journals/corr/abs-2107-11903, author = {Michelle L. Blom and Jurlind Budurushi and Ronald L. Rivest and Philip B. Stark and Peter J. Stuckey and Vanessa Teague and Damjan Vukcevic}, title = {Assertion-based Approaches to Auditing Complex Elections, with application to party-list proportional elections}, journal = {CoRR}, volume = {abs/2107.11903}, year = {2021}, url = {https://arxiv.org/abs/2107.11903}, eprinttype = {arXiv}, eprint = {2107.11903}, timestamp = {Thu, 29 Jul 2021 16:14:15 +0200}, biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib}, bibsource = {dblp computer science bibliography, https://dblp.org} }"#, expect![[r#" ROOT@0..860 ENTRY@0..860 TYPE@0..8 "@article" L_DELIM@8..9 "{" NAME@9..42 "DBLP:journals/corr/ab ..." COMMA@42..43 "," WHITESPACE@43..48 "\n " FIELD@48..322 NAME@48..54 "author" WHITESPACE@54..58 " " EQ@58..59 "=" WHITESPACE@59..60 " " CURLY_GROUP@60..321 L_CURLY@60..61 "{" WORD@61..69 "Michelle" WHITESPACE@69..70 " " WORD@70..72 "L." WHITESPACE@72..73 " " WORD@73..77 "Blom" WHITESPACE@77..78 " " WORD@78..81 "and" WHITESPACE@81..102 "\n " WORD@102..109 "Jurlind" WHITESPACE@109..110 " " WORD@110..119 "Budurushi" WHITESPACE@119..120 " " WORD@120..123 "and" WHITESPACE@123..144 "\n " WORD@144..150 "Ronald" WHITESPACE@150..151 " " WORD@151..153 "L." WHITESPACE@153..154 " " WORD@154..160 "Rivest" WHITESPACE@160..161 " " WORD@161..164 "and" WHITESPACE@164..185 "\n " WORD@185..191 "Philip" WHITESPACE@191..192 " " WORD@192..194 "B." WHITESPACE@194..195 " " WORD@195..200 "Stark" WHITESPACE@200..201 " " WORD@201..204 "and" WHITESPACE@204..225 "\n " WORD@225..230 "Peter" WHITESPACE@230..231 " " WORD@231..233 "J." WHITESPACE@233..234 " " WORD@234..241 "Stuckey" WHITESPACE@241..242 " " WORD@242..245 "and" WHITESPACE@245..266 "\n " WORD@266..273 "Vanessa" WHITESPACE@273..274 " " WORD@274..280 "Teague" WHITESPACE@280..281 " " WORD@281..284 "and" WHITESPACE@284..305 "\n " WORD@305..311 "Damjan" WHITESPACE@311..312 " " WORD@312..320 "Vukcevic" R_CURLY@320..321 "}" COMMA@321..322 "," WHITESPACE@322..327 "\n " FIELD@327..473 NAME@327..332 "title" WHITESPACE@332..337 " " EQ@337..338 "=" WHITESPACE@338..339 " " CURLY_GROUP@339..472 L_CURLY@339..340 "{" WORD@340..355 "Assertion-based" WHITESPACE@355..356 " " WORD@356..366 "Approaches" WHITESPACE@366..367 " " WORD@367..369 "to" WHITESPACE@369..370 " " WORD@370..378 "Auditing" WHITESPACE@378..379 " " WORD@379..386 "Complex" WHITESPACE@386..387 " " WORD@387..396 "Elections" COMMA@396..397 "," WHITESPACE@397..398 " " WORD@398..402 "with" WHITESPACE@402..403 " " WORD@403..414 "application" WHITESPACE@414..435 "\n " WORD@435..437 "to" WHITESPACE@437..438 " " WORD@438..448 "party-list" WHITESPACE@448..449 " " WORD@449..461 "proportional" WHITESPACE@461..462 " " WORD@462..471 "elections" R_CURLY@471..472 "}" COMMA@472..473 "," WHITESPACE@473..478 "\n " FIELD@478..497 NAME@478..485 "journal" WHITESPACE@485..488 " " EQ@488..489 "=" WHITESPACE@489..490 " " CURLY_GROUP@490..496 L_CURLY@490..491 "{" WORD@491..495 "CoRR" R_CURLY@495..496 "}" COMMA@496..497 "," WHITESPACE@497..502 "\n " FIELD@502..531 NAME@502..508 "volume" WHITESPACE@508..512 " " EQ@512..513 "=" WHITESPACE@513..514 " " CURLY_GROUP@514..530 L_CURLY@514..515 "{" WORD@515..529 "abs/2107.11903" R_CURLY@529..530 "}" COMMA@530..531 "," WHITESPACE@531..536 "\n " FIELD@536..555 NAME@536..540 "year" WHITESPACE@540..546 " " EQ@546..547 "=" WHITESPACE@547..548 " " CURLY_GROUP@548..554 L_CURLY@548..549 "{" INTEGER@549..553 "2021" R_CURLY@553..554 "}" COMMA@554..555 "," WHITESPACE@555..560 "\n " FIELD@560..607 NAME@560..563 "url" WHITESPACE@563..570 " " EQ@570..571 "=" WHITESPACE@571..572 " " CURLY_GROUP@572..606 L_CURLY@572..573 "{" WORD@573..605 "https://arxiv.org/abs ..." R_CURLY@605..606 "}" COMMA@606..607 "," WHITESPACE@607..612 "\n " FIELD@612..633 NAME@612..622 "eprinttype" WHITESPACE@622..623 " " EQ@623..624 "=" WHITESPACE@624..625 " " CURLY_GROUP@625..632 L_CURLY@625..626 "{" WORD@626..631 "arXiv" R_CURLY@631..632 "}" COMMA@632..633 "," WHITESPACE@633..638 "\n " FIELD@638..663 NAME@638..644 "eprint" WHITESPACE@644..648 " " EQ@648..649 "=" WHITESPACE@649..650 " " CURLY_GROUP@650..662 L_CURLY@650..651 "{" WORD@651..661 "2107.11903" R_CURLY@661..662 "}" COMMA@662..663 "," WHITESPACE@663..668 "\n " FIELD@668..714 NAME@668..677 "timestamp" WHITESPACE@677..678 " " EQ@678..679 "=" WHITESPACE@679..680 " " CURLY_GROUP@680..713 L_CURLY@680..681 "{" WORD@681..684 "Thu" COMMA@684..685 "," WHITESPACE@685..686 " " INTEGER@686..688 "29" WHITESPACE@688..689 " " WORD@689..692 "Jul" WHITESPACE@692..693 " " INTEGER@693..697 "2021" WHITESPACE@697..698 " " WORD@698..706 "16:14:15" WHITESPACE@706..707 " " WORD@707..712 "+0200" R_CURLY@712..713 "}" COMMA@713..714 "," WHITESPACE@714..719 "\n " FIELD@719..787 NAME@719..725 "biburl" WHITESPACE@725..729 " " EQ@729..730 "=" WHITESPACE@730..731 " " CURLY_GROUP@731..786 L_CURLY@731..732 "{" WORD@732..785 "https://dblp.org/rec/ ..." R_CURLY@785..786 "}" COMMA@786..787 "," WHITESPACE@787..792 "\n " FIELD@792..859 NAME@792..801 "bibsource" WHITESPACE@801..802 " " EQ@802..803 "=" WHITESPACE@803..804 " " CURLY_GROUP@804..858 L_CURLY@804..805 "{" WORD@805..809 "dblp" WHITESPACE@809..810 " " WORD@810..818 "computer" WHITESPACE@818..819 " " WORD@819..826 "science" WHITESPACE@826..827 " " WORD@827..839 "bibliography" COMMA@839..840 "," WHITESPACE@840..841 " " WORD@841..857 "https://dblp.org" R_CURLY@857..858 "}" WHITESPACE@858..859 "\n" R_DELIM@859..860 "}" "#]], ); } #[test] fn test_combi_2004() { check( r#"@inproceedings{10.1145/967900.968040, author = {Combi, Carlo and Pozzi, Giuseppe}, title = {Architectures for a Temporal Workflow Management System}, year = {2004}, isbn = {1581138121}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, url = {https://doi.org/10.1145/967900.968040}, doi = {10.1145/967900.968040}, booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing}, pages = {659-666}, numpages = {8}, keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system}, location = {Nicosia, Cyprus}, series = {SAC '04} }"#, expect![[r#" ROOT@0..674 ENTRY@0..674 TYPE@0..14 "@inproceedings" L_DELIM@14..15 "{" NAME@15..36 "10.1145/967900.968040" COMMA@36..37 "," WHITESPACE@37..42 "\n " FIELD@42..86 NAME@42..48 "author" WHITESPACE@48..49 " " EQ@49..50 "=" WHITESPACE@50..51 " " CURLY_GROUP@51..85 L_CURLY@51..52 "{" WORD@52..57 "Combi" COMMA@57..58 "," WHITESPACE@58..59 " " WORD@59..64 "Carlo" WHITESPACE@64..65 " " WORD@65..68 "and" WHITESPACE@68..69 " " WORD@69..74 "Pozzi" COMMA@74..75 "," WHITESPACE@75..76 " " WORD@76..84 "Giuseppe" R_CURLY@84..85 "}" COMMA@85..86 "," WHITESPACE@86..91 "\n " FIELD@91..157 NAME@91..96 "title" WHITESPACE@96..97 " " EQ@97..98 "=" WHITESPACE@98..99 " " CURLY_GROUP@99..156 L_CURLY@99..100 "{" WORD@100..113 "Architectures" WHITESPACE@113..114 " " WORD@114..117 "for" WHITESPACE@117..118 " " WORD@118..119 "a" WHITESPACE@119..120 " " WORD@120..128 "Temporal" WHITESPACE@128..129 " " WORD@129..137 "Workflow" WHITESPACE@137..138 " " WORD@138..148 "Management" WHITESPACE@148..149 " " WORD@149..155 "System" R_CURLY@155..156 "}" COMMA@156..157 "," WHITESPACE@157..162 "\n " FIELD@162..176 NAME@162..166 "year" WHITESPACE@166..167 " " EQ@167..168 "=" WHITESPACE@168..169 " " CURLY_GROUP@169..175 L_CURLY@169..170 "{" INTEGER@170..174 "2004" R_CURLY@174..175 "}" COMMA@175..176 "," WHITESPACE@176..181 "\n " FIELD@181..201 NAME@181..185 "isbn" WHITESPACE@185..186 " " EQ@186..187 "=" WHITESPACE@187..188 " " CURLY_GROUP@188..200 L_CURLY@188..189 "{" INTEGER@189..199 "1581138121" R_CURLY@199..200 "}" COMMA@200..201 "," WHITESPACE@201..206 "\n " FIELD@206..256 NAME@206..215 "publisher" WHITESPACE@215..216 " " EQ@216..217 "=" WHITESPACE@217..218 " " CURLY_GROUP@218..255 L_CURLY@218..219 "{" WORD@219..230 "Association" WHITESPACE@230..231 " " WORD@231..234 "for" WHITESPACE@234..235 " " WORD@235..244 "Computing" WHITESPACE@244..245 " " WORD@245..254 "Machinery" R_CURLY@254..255 "}" COMMA@255..256 "," WHITESPACE@256..261 "\n " FIELD@261..291 NAME@261..268 "address" WHITESPACE@268..269 " " EQ@269..270 "=" WHITESPACE@270..271 " " CURLY_GROUP@271..290 L_CURLY@271..272 "{" WORD@272..275 "New" WHITESPACE@275..276 " " WORD@276..280 "York" COMMA@280..281 "," WHITESPACE@281..282 " " WORD@282..284 "NY" COMMA@284..285 "," WHITESPACE@285..286 " " WORD@286..289 "USA" R_CURLY@289..290 "}" COMMA@290..291 "," WHITESPACE@291..296 "\n " FIELD@296..342 NAME@296..299 "url" WHITESPACE@299..300 " " EQ@300..301 "=" WHITESPACE@301..302 " " CURLY_GROUP@302..341 L_CURLY@302..303 "{" WORD@303..340 "https://doi.org/10.11 ..." R_CURLY@340..341 "}" COMMA@341..342 "," WHITESPACE@342..347 "\n " FIELD@347..377 NAME@347..350 "doi" WHITESPACE@350..351 " " EQ@351..352 "=" WHITESPACE@352..353 " " CURLY_GROUP@353..376 L_CURLY@353..354 "{" WORD@354..375 "10.1145/967900.968040" R_CURLY@375..376 "}" COMMA@376..377 "," WHITESPACE@377..382 "\n " FIELD@382..455 NAME@382..391 "booktitle" WHITESPACE@391..392 " " EQ@392..393 "=" WHITESPACE@393..394 " " CURLY_GROUP@394..454 L_CURLY@394..395 "{" WORD@395..406 "Proceedings" WHITESPACE@406..407 " " WORD@407..409 "of" WHITESPACE@409..410 " " WORD@410..413 "the" WHITESPACE@413..414 " " INTEGER@414..418 "2004" WHITESPACE@418..419 " " WORD@419..422 "ACM" WHITESPACE@422..423 " " WORD@423..432 "Symposium" WHITESPACE@432..433 " " WORD@433..435 "on" WHITESPACE@435..436 " " WORD@436..443 "Applied" WHITESPACE@443..444 " " WORD@444..453 "Computing" R_CURLY@453..454 "}" COMMA@454..455 "," WHITESPACE@455..460 "\n " FIELD@460..478 NAME@460..465 "pages" WHITESPACE@465..466 " " EQ@466..467 "=" WHITESPACE@467..468 " " CURLY_GROUP@468..477 L_CURLY@468..469 "{" WORD@469..476 "659-666" R_CURLY@476..477 "}" COMMA@477..478 "," WHITESPACE@478..483 "\n " FIELD@483..498 NAME@483..491 "numpages" WHITESPACE@491..492 " " EQ@492..493 "=" WHITESPACE@493..494 " " CURLY_GROUP@494..497 L_CURLY@494..495 "{" INTEGER@495..496 "8" R_CURLY@496..497 "}" COMMA@497..498 "," WHITESPACE@498..503 "\n " FIELD@503..615 NAME@503..511 "keywords" WHITESPACE@511..512 " " EQ@512..513 "=" WHITESPACE@513..514 " " CURLY_GROUP@514..614 L_CURLY@514..515 "{" WORD@515..521 "active" WHITESPACE@521..522 " " WORD@522..526 "DBMS" COMMA@526..527 "," WHITESPACE@527..528 " " WORD@528..536 "temporal" WHITESPACE@536..537 " " WORD@537..541 "DBMS" COMMA@541..542 "," WHITESPACE@542..543 " " WORD@543..551 "workflow" WHITESPACE@551..552 " " WORD@552..562 "management" WHITESPACE@562..563 " " WORD@563..569 "system" WHITESPACE@569..570 " " WORD@570..571 "-" WHITESPACE@571..572 " " WORD@572..576 "WfMS" COMMA@576..577 "," WHITESPACE@577..578 " " WORD@578..586 "temporal" WHITESPACE@586..587 " " WORD@587..595 "workflow" WHITESPACE@595..596 " " WORD@596..606 "management" WHITESPACE@606..607 " " WORD@607..613 "system" R_CURLY@613..614 "}" COMMA@614..615 "," WHITESPACE@615..620 "\n " FIELD@620..649 NAME@620..628 "location" WHITESPACE@628..629 " " EQ@629..630 "=" WHITESPACE@630..631 " " CURLY_GROUP@631..648 L_CURLY@631..632 "{" WORD@632..639 "Nicosia" COMMA@639..640 "," WHITESPACE@640..641 " " WORD@641..647 "Cyprus" R_CURLY@647..648 "}" COMMA@648..649 "," WHITESPACE@649..654 "\n " FIELD@654..673 NAME@654..660 "series" WHITESPACE@660..661 " " EQ@661..662 "=" WHITESPACE@662..663 " " CURLY_GROUP@663..672 L_CURLY@663..664 "{" WORD@664..667 "SAC" WHITESPACE@667..668 " " WORD@668..671 "'04" R_CURLY@671..672 "}" WHITESPACE@672..673 "\n" R_DELIM@673..674 "}" "#]], ); } #[test] fn test_erwin_2007() { check( r#"@inproceedings{10.5555/1386993.1386994, author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.}, title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets}, year = {2007}, isbn = {9781920682651}, publisher = {Australian Computer Society, Inc.}, address = {AUS}, booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84}, pages = {3-11}, numpages = {9}, keywords = {pattern growth, high utility itemset mining}, location = {Gold Coast, Australia}, series = {AIDM '07} }"#, expect![[r#" ROOT@0..615 ENTRY@0..615 TYPE@0..14 "@inproceedings" L_DELIM@14..15 "{" NAME@15..38 "10.5555/1386993.1386994" COMMA@38..39 "," WHITESPACE@39..44 "\n " FIELD@44..107 NAME@44..50 "author" WHITESPACE@50..51 " " EQ@51..52 "=" WHITESPACE@52..53 " " CURLY_GROUP@53..106 L_CURLY@53..54 "{" WORD@54..59 "Erwin" COMMA@59..60 "," WHITESPACE@60..61 " " WORD@61..65 "Alva" WHITESPACE@65..66 " " WORD@66..69 "and" WHITESPACE@69..70 " " WORD@70..77 "Gopalan" COMMA@77..78 "," WHITESPACE@78..79 " " WORD@79..82 "Raj" WHITESPACE@82..83 " " WORD@83..85 "P." WHITESPACE@85..86 " " WORD@86..89 "and" WHITESPACE@89..90 " " WORD@90..98 "Achuthan" COMMA@98..99 "," WHITESPACE@99..100 " " WORD@100..102 "N." WHITESPACE@102..103 " " WORD@103..105 "R." R_CURLY@105..106 "}" COMMA@106..107 "," WHITESPACE@107..112 "\n " FIELD@112..194 NAME@112..117 "title" WHITESPACE@117..118 " " EQ@118..119 "=" WHITESPACE@119..120 " " CURLY_GROUP@120..193 L_CURLY@120..121 "{" WORD@121..122 "A" WHITESPACE@122..123 " " WORD@123..132 "Bottom-up" WHITESPACE@132..133 " " WORD@133..143 "Projection" WHITESPACE@143..144 " " WORD@144..149 "Based" WHITESPACE@149..150 " " WORD@150..159 "Algorithm" WHITESPACE@159..160 " " WORD@160..163 "for" WHITESPACE@163..164 " " WORD@164..170 "Mining" WHITESPACE@170..171 " " WORD@171..175 "High" WHITESPACE@175..176 " " WORD@176..183 "Utility" WHITESPACE@183..184 " " WORD@184..192 "Itemsets" R_CURLY@192..193 "}" COMMA@193..194 "," WHITESPACE@194..199 "\n " FIELD@199..213 NAME@199..203 "year" WHITESPACE@203..204 " " EQ@204..205 "=" WHITESPACE@205..206 " " CURLY_GROUP@206..212 L_CURLY@206..207 "{" INTEGER@207..211 "2007" R_CURLY@211..212 "}" COMMA@212..213 "," WHITESPACE@213..218 "\n " FIELD@218..241 NAME@218..222 "isbn" WHITESPACE@222..223 " " EQ@223..224 "=" WHITESPACE@224..225 " " CURLY_GROUP@225..240 L_CURLY@225..226 "{" INTEGER@226..239 "9781920682651" R_CURLY@239..240 "}" COMMA@240..241 "," WHITESPACE@241..246 "\n " FIELD@246..294 NAME@246..255 "publisher" WHITESPACE@255..256 " " EQ@256..257 "=" WHITESPACE@257..258 " " CURLY_GROUP@258..293 L_CURLY@258..259 "{" WORD@259..269 "Australian" WHITESPACE@269..270 " " WORD@270..278 "Computer" WHITESPACE@278..279 " " WORD@279..286 "Society" COMMA@286..287 "," WHITESPACE@287..288 " " WORD@288..292 "Inc." R_CURLY@292..293 "}" COMMA@293..294 "," WHITESPACE@294..299 "\n " FIELD@299..315 NAME@299..306 "address" WHITESPACE@306..307 " " EQ@307..308 "=" WHITESPACE@308..309 " " CURLY_GROUP@309..314 L_CURLY@309..310 "{" WORD@310..313 "AUS" R_CURLY@313..314 "}" COMMA@314..315 "," WHITESPACE@315..320 "\n " FIELD@320..447 NAME@320..329 "booktitle" WHITESPACE@329..330 " " EQ@330..331 "=" WHITESPACE@331..332 " " CURLY_GROUP@332..446 L_CURLY@332..333 "{" WORD@333..344 "Proceedings" WHITESPACE@344..345 " " WORD@345..347 "of" WHITESPACE@347..348 " " WORD@348..351 "the" WHITESPACE@351..352 " " WORD@352..355 "2nd" WHITESPACE@355..356 " " WORD@356..369 "International" WHITESPACE@369..370 " " WORD@370..378 "Workshop" WHITESPACE@378..379 " " WORD@379..381 "on" WHITESPACE@381..382 " " WORD@382..393 "Integrating" WHITESPACE@393..394 " " WORD@394..404 "Artificial" WHITESPACE@404..405 " " WORD@405..417 "Intelligence" WHITESPACE@417..418 " " WORD@418..421 "and" WHITESPACE@421..422 " " WORD@422..426 "Data" WHITESPACE@426..427 " " WORD@427..433 "Mining" WHITESPACE@433..434 " " WORD@434..435 "-" WHITESPACE@435..436 " " WORD@436..442 "Volume" WHITESPACE@442..443 " " INTEGER@443..445 "84" R_CURLY@445..446 "}" COMMA@446..447 "," WHITESPACE@447..452 "\n " FIELD@452..467 NAME@452..457 "pages" WHITESPACE@457..458 " " EQ@458..459 "=" WHITESPACE@459..460 " " CURLY_GROUP@460..466 L_CURLY@460..461 "{" WORD@461..465 "3-11" R_CURLY@465..466 "}" COMMA@466..467 "," WHITESPACE@467..472 "\n " FIELD@472..487 NAME@472..480 "numpages" WHITESPACE@480..481 " " EQ@481..482 "=" WHITESPACE@482..483 " " CURLY_GROUP@483..486 L_CURLY@483..484 "{" INTEGER@484..485 "9" R_CURLY@485..486 "}" COMMA@486..487 "," WHITESPACE@487..492 "\n " FIELD@492..549 NAME@492..500 "keywords" WHITESPACE@500..501 " " EQ@501..502 "=" WHITESPACE@502..503 " " CURLY_GROUP@503..548 L_CURLY@503..504 "{" WORD@504..511 "pattern" WHITESPACE@511..512 " " WORD@512..518 "growth" COMMA@518..519 "," WHITESPACE@519..520 " " WORD@520..524 "high" WHITESPACE@524..525 " " WORD@525..532 "utility" WHITESPACE@532..533 " " WORD@533..540 "itemset" WHITESPACE@540..541 " " WORD@541..547 "mining" R_CURLY@547..548 "}" COMMA@548..549 "," WHITESPACE@549..554 "\n " FIELD@554..589 NAME@554..562 "location" WHITESPACE@562..563 " " EQ@563..564 "=" WHITESPACE@564..565 " " CURLY_GROUP@565..588 L_CURLY@565..566 "{" WORD@566..570 "Gold" WHITESPACE@570..571 " " WORD@571..576 "Coast" COMMA@576..577 "," WHITESPACE@577..578 " " WORD@578..587 "Australia" R_CURLY@587..588 "}" COMMA@588..589 "," WHITESPACE@589..594 "\n " FIELD@594..614 NAME@594..600 "series" WHITESPACE@600..601 " " EQ@601..602 "=" WHITESPACE@602..603 " " CURLY_GROUP@603..613 L_CURLY@603..604 "{" WORD@604..608 "AIDM" WHITESPACE@608..609 " " WORD@609..612 "'07" R_CURLY@612..613 "}" WHITESPACE@613..614 "\n" R_DELIM@614..615 "}" "#]], ); } #[test] fn test_jain_1999() { check( r#"@article{10.1145/331499.331504, author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.}, title = {Data Clustering: A Review}, year = {1999}, issue_date = {Sept. 1999}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, volume = {31}, number = {3}, issn = {0360-0300}, url = {https://doi.org/10.1145/331499.331504}, doi = {10.1145/331499.331504}, journal = {ACM Comput. Surv.}, month = {sep}, pages = {264-323}, numpages = {60}, keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning} }"#, expect![[r#" ROOT@0..674 ENTRY@0..674 TYPE@0..8 "@article" L_DELIM@8..9 "{" NAME@9..30 "10.1145/331499.331504" COMMA@30..31 "," WHITESPACE@31..36 "\n " FIELD@36..93 NAME@36..42 "author" WHITESPACE@42..43 " " EQ@43..44 "=" WHITESPACE@44..45 " " CURLY_GROUP@45..92 L_CURLY@45..46 "{" WORD@46..50 "Jain" COMMA@50..51 "," WHITESPACE@51..52 " " WORD@52..54 "A." WHITESPACE@54..55 " " WORD@55..57 "K." WHITESPACE@57..58 " " WORD@58..61 "and" WHITESPACE@61..62 " " WORD@62..67 "Murty" COMMA@67..68 "," WHITESPACE@68..69 " " WORD@69..71 "M." WHITESPACE@71..72 " " WORD@72..74 "N." WHITESPACE@74..75 " " WORD@75..78 "and" WHITESPACE@78..79 " " WORD@79..84 "Flynn" COMMA@84..85 "," WHITESPACE@85..86 " " WORD@86..88 "P." WHITESPACE@88..89 " " WORD@89..91 "J." R_CURLY@91..92 "}" COMMA@92..93 "," WHITESPACE@93..98 "\n " FIELD@98..134 NAME@98..103 "title" WHITESPACE@103..104 " " EQ@104..105 "=" WHITESPACE@105..106 " " CURLY_GROUP@106..133 L_CURLY@106..107 "{" WORD@107..111 "Data" WHITESPACE@111..112 " " WORD@112..123 "Clustering:" WHITESPACE@123..124 " " WORD@124..125 "A" WHITESPACE@125..126 " " WORD@126..132 "Review" R_CURLY@132..133 "}" COMMA@133..134 "," WHITESPACE@134..139 "\n " FIELD@139..153 NAME@139..143 "year" WHITESPACE@143..144 " " EQ@144..145 "=" WHITESPACE@145..146 " " CURLY_GROUP@146..152 L_CURLY@146..147 "{" INTEGER@147..151 "1999" R_CURLY@151..152 "}" COMMA@152..153 "," WHITESPACE@153..158 "\n " FIELD@158..184 NAME@158..168 "issue_date" WHITESPACE@168..169 " " EQ@169..170 "=" WHITESPACE@170..171 " " CURLY_GROUP@171..183 L_CURLY@171..172 "{" WORD@172..177 "Sept." WHITESPACE@177..178 " " INTEGER@178..182 "1999" R_CURLY@182..183 "}" COMMA@183..184 "," WHITESPACE@184..189 "\n " FIELD@189..239 NAME@189..198 "publisher" WHITESPACE@198..199 " " EQ@199..200 "=" WHITESPACE@200..201 " " CURLY_GROUP@201..238 L_CURLY@201..202 "{" WORD@202..213 "Association" WHITESPACE@213..214 " " WORD@214..217 "for" WHITESPACE@217..218 " " WORD@218..227 "Computing" WHITESPACE@227..228 " " WORD@228..237 "Machinery" R_CURLY@237..238 "}" COMMA@238..239 "," WHITESPACE@239..244 "\n " FIELD@244..274 NAME@244..251 "address" WHITESPACE@251..252 " " EQ@252..253 "=" WHITESPACE@253..254 " " CURLY_GROUP@254..273 L_CURLY@254..255 "{" WORD@255..258 "New" WHITESPACE@258..259 " " WORD@259..263 "York" COMMA@263..264 "," WHITESPACE@264..265 " " WORD@265..267 "NY" COMMA@267..268 "," WHITESPACE@268..269 " " WORD@269..272 "USA" R_CURLY@272..273 "}" COMMA@273..274 "," WHITESPACE@274..279 "\n " FIELD@279..293 NAME@279..285 "volume" WHITESPACE@285..286 " " EQ@286..287 "=" WHITESPACE@287..288 " " CURLY_GROUP@288..292 L_CURLY@288..289 "{" INTEGER@289..291 "31" R_CURLY@291..292 "}" COMMA@292..293 "," WHITESPACE@293..298 "\n " FIELD@298..311 NAME@298..304 "number" WHITESPACE@304..305 " " EQ@305..306 "=" WHITESPACE@306..307 " " CURLY_GROUP@307..310 L_CURLY@307..308 "{" INTEGER@308..309 "3" R_CURLY@309..310 "}" COMMA@310..311 "," WHITESPACE@311..316 "\n " FIELD@316..335 NAME@316..320 "issn" WHITESPACE@320..321 " " EQ@321..322 "=" WHITESPACE@322..323 " " CURLY_GROUP@323..334 L_CURLY@323..324 "{" WORD@324..333 "0360-0300" R_CURLY@333..334 "}" COMMA@334..335 "," WHITESPACE@335..340 "\n " FIELD@340..386 NAME@340..343 "url" WHITESPACE@343..344 " " EQ@344..345 "=" WHITESPACE@345..346 " " CURLY_GROUP@346..385 L_CURLY@346..347 "{" WORD@347..384 "https://doi.org/10.11 ..." R_CURLY@384..385 "}" COMMA@385..386 "," WHITESPACE@386..391 "\n " FIELD@391..421 NAME@391..394 "doi" WHITESPACE@394..395 " " EQ@395..396 "=" WHITESPACE@396..397 " " CURLY_GROUP@397..420 L_CURLY@397..398 "{" WORD@398..419 "10.1145/331499.331504" R_CURLY@419..420 "}" COMMA@420..421 "," WHITESPACE@421..426 "\n " FIELD@426..456 NAME@426..433 "journal" WHITESPACE@433..434 " " EQ@434..435 "=" WHITESPACE@435..436 " " CURLY_GROUP@436..455 L_CURLY@436..437 "{" WORD@437..440 "ACM" WHITESPACE@440..441 " " WORD@441..448 "Comput." WHITESPACE@448..449 " " WORD@449..454 "Surv." R_CURLY@454..455 "}" COMMA@455..456 "," WHITESPACE@456..461 "\n " FIELD@461..475 NAME@461..466 "month" WHITESPACE@466..467 " " EQ@467..468 "=" WHITESPACE@468..469 " " CURLY_GROUP@469..474 L_CURLY@469..470 "{" WORD@470..473 "sep" R_CURLY@473..474 "}" COMMA@474..475 "," WHITESPACE@475..480 "\n " FIELD@480..498 NAME@480..485 "pages" WHITESPACE@485..486 " " EQ@486..487 "=" WHITESPACE@487..488 " " CURLY_GROUP@488..497 L_CURLY@488..489 "{" WORD@489..496 "264-323" R_CURLY@496..497 "}" COMMA@497..498 "," WHITESPACE@498..503 "\n " FIELD@503..519 NAME@503..511 "numpages" WHITESPACE@511..512 " " EQ@512..513 "=" WHITESPACE@513..514 " " CURLY_GROUP@514..518 L_CURLY@514..515 "{" INTEGER@515..517 "60" R_CURLY@517..518 "}" COMMA@518..519 "," WHITESPACE@519..524 "\n " FIELD@524..673 NAME@524..532 "keywords" WHITESPACE@532..533 " " EQ@533..534 "=" WHITESPACE@534..535 " " CURLY_GROUP@535..672 L_CURLY@535..536 "{" WORD@536..547 "incremental" WHITESPACE@547..548 " " WORD@548..558 "clustering" COMMA@558..559 "," WHITESPACE@559..560 " " WORD@560..570 "clustering" WHITESPACE@570..571 " " WORD@571..583 "applications" COMMA@583..584 "," WHITESPACE@584..585 " " WORD@585..596 "exploratory" WHITESPACE@596..597 " " WORD@597..601 "data" WHITESPACE@601..602 " " WORD@602..610 "analysis" COMMA@610..611 "," WHITESPACE@611..612 " " WORD@612..619 "cluster" WHITESPACE@619..620 " " WORD@620..628 "analysis" COMMA@628..629 "," WHITESPACE@629..630 " " WORD@630..640 "similarity" WHITESPACE@640..641 " " WORD@641..648 "indices" COMMA@648..649 "," WHITESPACE@649..650 " " WORD@650..662 "unsupervised" WHITESPACE@662..663 " " WORD@663..671 "learning" R_CURLY@671..672 "}" WHITESPACE@672..673 "\n" R_DELIM@673..674 "}" "#]], ); } #[test] fn test_kastenholz_2006() { check( r#"@string{jchph = {J.~Chem. Phys.}} @article{kastenholz, author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.}, title = {Computation of methodology\hyphen independent ionic solvation free energies from molecular simulations}, journaltitle = jchph, date = 2006, subtitle = {{I}. {The} electrostatic potential in molecular liquids}, volume = 124, eid = 124106, doi = {10.1063/1.2172593}, langid = {english}, langidopts = {variant=american}, indextitle = {Computation of ionic solvation free energies}, annotation = {An \texttt{article} entry with an \texttt{eid} and a \texttt{doi} field. Note that the \textsc{doi} is transformed into a clickable link if \texttt{hyperref} support has been enabled}, }"#, expect![[r#" ROOT@0..898 STRING@0..35 TYPE@0..7 "@string" L_DELIM@7..8 "{" NAME@8..13 "jchph" WHITESPACE@13..16 " " EQ@16..17 "=" WHITESPACE@17..18 " " CURLY_GROUP@18..34 L_CURLY@18..19 "{" WORD@19..21 "J." NBSP@21..22 "~" WORD@22..27 "Chem." WHITESPACE@27..28 " " WORD@28..33 "Phys." R_CURLY@33..34 "}" R_DELIM@34..35 "}" JUNK@35..37 "\n\n" ENTRY@37..898 TYPE@37..45 "@article" L_DELIM@45..46 "{" NAME@46..56 "kastenholz" COMMA@56..57 "," WHITESPACE@57..62 "\n " FIELD@62..130 NAME@62..68 "author" WHITESPACE@68..75 " " EQ@75..76 "=" WHITESPACE@76..77 " " CURLY_GROUP@77..129 L_CURLY@77..78 "{" WORD@78..88 "Kastenholz" COMMA@88..89 "," WHITESPACE@89..90 " " WORD@90..92 "M." WHITESPACE@92..93 " " WORD@93..95 "A." WHITESPACE@95..96 " " WORD@96..99 "and" WHITESPACE@99..100 " " WORD@100..101 "H" CURLY_GROUP@101..106 L_CURLY@101..102 "{" ACCENT@102..105 ACCENT_NAME@102..104 "\\\"" WORD@104..105 "u" R_CURLY@105..106 "}" WORD@106..115 "nenberger" COMMA@115..116 "," WHITESPACE@116..117 " " WORD@117..125 "Philippe" WHITESPACE@125..126 " " WORD@126..128 "H." R_CURLY@128..129 "}" COMMA@129..130 "," WHITESPACE@130..135 "\n " FIELD@135..275 NAME@135..140 "title" WHITESPACE@140..148 " " EQ@148..149 "=" WHITESPACE@149..150 " " CURLY_GROUP@150..274 L_CURLY@150..151 "{" WORD@151..162 "Computation" WHITESPACE@162..163 " " WORD@163..165 "of" WHITESPACE@165..166 " " WORD@166..177 "methodology" COMMAND@177..184 COMMAND_NAME@177..184 "\\hyphen" WHITESPACE@184..185 " " WORD@185..196 "independent" WHITESPACE@196..197 " " WORD@197..202 "ionic" WHITESPACE@202..203 " " WORD@203..212 "solvation" WHITESPACE@212..233 "\n " WORD@233..237 "free" WHITESPACE@237..238 " " WORD@238..246 "energies" WHITESPACE@246..247 " " WORD@247..251 "from" WHITESPACE@251..252 " " WORD@252..261 "molecular" WHITESPACE@261..262 " " WORD@262..273 "simulations" R_CURLY@273..274 "}" COMMA@274..275 "," WHITESPACE@275..280 "\n " FIELD@280..301 NAME@280..292 "journaltitle" WHITESPACE@292..293 " " EQ@293..294 "=" WHITESPACE@294..295 " " LITERAL@295..300 NAME@295..300 "jchph" COMMA@300..301 "," WHITESPACE@301..306 "\n " FIELD@306..326 NAME@306..310 "date" WHITESPACE@310..319 " " EQ@319..320 "=" WHITESPACE@320..321 " " LITERAL@321..325 INTEGER@321..325 "2006" COMMA@325..326 "," WHITESPACE@326..331 "\n " FIELD@331..404 NAME@331..339 "subtitle" WHITESPACE@339..344 " " EQ@344..345 "=" WHITESPACE@345..346 " " CURLY_GROUP@346..403 L_CURLY@346..347 "{" CURLY_GROUP@347..350 L_CURLY@347..348 "{" WORD@348..349 "I" R_CURLY@349..350 "}" WORD@350..351 "." WHITESPACE@351..352 " " CURLY_GROUP@352..357 L_CURLY@352..353 "{" WORD@353..356 "The" R_CURLY@356..357 "}" WHITESPACE@357..358 " " WORD@358..371 "electrostatic" WHITESPACE@371..372 " " WORD@372..381 "potential" WHITESPACE@381..382 " " WORD@382..384 "in" WHITESPACE@384..385 " " WORD@385..394 "molecular" WHITESPACE@394..395 " " WORD@395..402 "liquids" R_CURLY@402..403 "}" COMMA@403..404 "," WHITESPACE@404..409 "\n " FIELD@409..428 NAME@409..415 "volume" WHITESPACE@415..422 " " EQ@422..423 "=" WHITESPACE@423..424 " " LITERAL@424..427 INTEGER@424..427 "124" COMMA@427..428 "," WHITESPACE@428..433 "\n " FIELD@433..455 NAME@433..436 "eid" WHITESPACE@436..446 " " EQ@446..447 "=" WHITESPACE@447..448 " " LITERAL@448..454 INTEGER@448..454 "124106" COMMA@454..455 "," WHITESPACE@455..460 "\n " FIELD@460..495 NAME@460..463 "doi" WHITESPACE@463..473 " " EQ@473..474 "=" WHITESPACE@474..475 " " CURLY_GROUP@475..494 L_CURLY@475..476 "{" WORD@476..493 "10.1063/1.2172593" R_CURLY@493..494 "}" COMMA@494..495 "," WHITESPACE@495..500 "\n " FIELD@500..525 NAME@500..506 "langid" WHITESPACE@506..513 " " EQ@513..514 "=" WHITESPACE@514..515 " " CURLY_GROUP@515..524 L_CURLY@515..516 "{" WORD@516..523 "english" R_CURLY@523..524 "}" COMMA@524..525 "," WHITESPACE@525..530 "\n " FIELD@530..564 NAME@530..540 "langidopts" WHITESPACE@540..543 " " EQ@543..544 "=" WHITESPACE@544..545 " " CURLY_GROUP@545..563 L_CURLY@545..546 "{" WORD@546..562 "variant=american" R_CURLY@562..563 "}" COMMA@563..564 "," WHITESPACE@564..569 "\n " FIELD@569..631 NAME@569..579 "indextitle" WHITESPACE@579..582 " " EQ@582..583 "=" WHITESPACE@583..584 " " CURLY_GROUP@584..630 L_CURLY@584..585 "{" WORD@585..596 "Computation" WHITESPACE@596..597 " " WORD@597..599 "of" WHITESPACE@599..600 " " WORD@600..605 "ionic" WHITESPACE@605..606 " " WORD@606..615 "solvation" WHITESPACE@615..616 " " WORD@616..620 "free" WHITESPACE@620..621 " " WORD@621..629 "energies" R_CURLY@629..630 "}" COMMA@630..631 "," WHITESPACE@631..636 "\n " FIELD@636..896 NAME@636..646 "annotation" WHITESPACE@646..649 " " EQ@649..650 "=" WHITESPACE@650..651 " " CURLY_GROUP@651..895 L_CURLY@651..652 "{" WORD@652..654 "An" WHITESPACE@654..655 " " COMMAND@655..662 COMMAND_NAME@655..662 "\\texttt" CURLY_GROUP@662..671 L_CURLY@662..663 "{" WORD@663..670 "article" R_CURLY@670..671 "}" WHITESPACE@671..672 " " WORD@672..677 "entry" WHITESPACE@677..678 " " WORD@678..682 "with" WHITESPACE@682..683 " " WORD@683..685 "an" WHITESPACE@685..686 " " COMMAND@686..693 COMMAND_NAME@686..693 "\\texttt" CURLY_GROUP@693..698 L_CURLY@693..694 "{" WORD@694..697 "eid" R_CURLY@697..698 "}" WHITESPACE@698..699 " " WORD@699..702 "and" WHITESPACE@702..703 " " WORD@703..704 "a" WHITESPACE@704..725 "\n " COMMAND@725..732 COMMAND_NAME@725..732 "\\texttt" CURLY_GROUP@732..737 L_CURLY@732..733 "{" WORD@733..736 "doi" R_CURLY@736..737 "}" WHITESPACE@737..738 " " WORD@738..744 "field." WHITESPACE@744..745 " " WORD@745..749 "Note" WHITESPACE@749..750 " " WORD@750..754 "that" WHITESPACE@754..755 " " WORD@755..758 "the" WHITESPACE@758..759 " " COMMAND@759..766 COMMAND_NAME@759..766 "\\textsc" CURLY_GROUP@766..771 L_CURLY@766..767 "{" WORD@767..770 "doi" R_CURLY@770..771 "}" WHITESPACE@771..772 " " WORD@772..774 "is" WHITESPACE@774..775 " " WORD@775..786 "transformed" WHITESPACE@786..807 "\n " WORD@807..811 "into" WHITESPACE@811..812 " " WORD@812..813 "a" WHITESPACE@813..814 " " WORD@814..823 "clickable" WHITESPACE@823..824 " " WORD@824..828 "link" WHITESPACE@828..829 " " WORD@829..831 "if" WHITESPACE@831..832 " " COMMAND@832..839 COMMAND_NAME@832..839 "\\texttt" CURLY_GROUP@839..849 L_CURLY@839..840 "{" WORD@840..848 "hyperref" R_CURLY@848..849 "}" WHITESPACE@849..850 " " WORD@850..857 "support" WHITESPACE@857..858 " " WORD@858..861 "has" WHITESPACE@861..862 " " WORD@862..866 "been" WHITESPACE@866..887 "\n " WORD@887..894 "enabled" R_CURLY@894..895 "}" COMMA@895..896 "," WHITESPACE@896..897 "\n" R_DELIM@897..898 "}" "#]], ); } #[test] fn test_knuth_1984() { check( r#"@book{knuth:ct:a, author = {Knuth, Donald E.}, title = {The {\TeX book}}, date = 1984, maintitle = {Computers \& Typesetting}, volume = {A}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, langid = {english}, langidopts = {variant=american}, sorttitle = {Computers & Typesetting A}, indexsorttitle= {The TeXbook}, indextitle = {\protect\TeX book, The}, shorttitle = {\TeX book}, annotation = {The first volume of a five-volume book. Note the \texttt{sorttitle} field. We want this volume to be listed after the entry referring to the entire five-volume set. Also note the \texttt{indextitle} and \texttt{indexsorttitle} fields. Indexing packages that don't generate robust index entries require some control sequences to be protected from expansion}, }"#, expect![[r#" ROOT@0..993 ENTRY@0..993 TYPE@0..5 "@book" L_DELIM@5..6 "{" NAME@6..16 "knuth:ct:a" COMMA@16..17 "," WHITESPACE@17..22 "\n " FIELD@22..56 NAME@22..28 "author" WHITESPACE@28..35 " " EQ@35..36 "=" WHITESPACE@36..37 " " CURLY_GROUP@37..55 L_CURLY@37..38 "{" WORD@38..43 "Knuth" COMMA@43..44 "," WHITESPACE@44..45 " " WORD@45..51 "Donald" WHITESPACE@51..52 " " WORD@52..54 "E." R_CURLY@54..55 "}" COMMA@55..56 "," WHITESPACE@56..61 "\n " FIELD@61..94 NAME@61..66 "title" WHITESPACE@66..74 " " EQ@74..75 "=" WHITESPACE@75..76 " " CURLY_GROUP@76..93 L_CURLY@76..77 "{" WORD@77..80 "The" WHITESPACE@80..81 " " CURLY_GROUP@81..92 L_CURLY@81..82 "{" COMMAND@82..86 COMMAND_NAME@82..86 "\\TeX" WHITESPACE@86..87 " " WORD@87..91 "book" R_CURLY@91..92 "}" R_CURLY@92..93 "}" COMMA@93..94 "," WHITESPACE@94..99 "\n " FIELD@99..119 NAME@99..103 "date" WHITESPACE@103..112 " " EQ@112..113 "=" WHITESPACE@113..114 " " LITERAL@114..118 INTEGER@114..118 "1984" COMMA@118..119 "," WHITESPACE@119..124 "\n " FIELD@124..166 NAME@124..133 "maintitle" WHITESPACE@133..137 " " EQ@137..138 "=" WHITESPACE@138..139 " " CURLY_GROUP@139..165 L_CURLY@139..140 "{" WORD@140..149 "Computers" WHITESPACE@149..150 " " COMMAND@150..152 COMMAND_NAME@150..152 "\\&" WHITESPACE@152..153 " " WORD@153..164 "Typesetting" R_CURLY@164..165 "}" COMMA@165..166 "," WHITESPACE@166..171 "\n " FIELD@171..190 NAME@171..177 "volume" WHITESPACE@177..184 " " EQ@184..185 "=" WHITESPACE@185..186 " " CURLY_GROUP@186..189 L_CURLY@186..187 "{" WORD@187..188 "A" R_CURLY@188..189 "}" COMMA@189..190 "," WHITESPACE@190..195 "\n " FIELD@195..227 NAME@195..204 "publisher" WHITESPACE@204..208 " " EQ@208..209 "=" WHITESPACE@209..210 " " CURLY_GROUP@210..226 L_CURLY@210..211 "{" WORD@211..225 "Addison-Wesley" R_CURLY@225..226 "}" COMMA@226..227 "," WHITESPACE@227..232 "\n " FIELD@232..264 NAME@232..240 "location" WHITESPACE@240..245 " " EQ@245..246 "=" WHITESPACE@246..247 " " CURLY_GROUP@247..263 L_CURLY@247..248 "{" WORD@248..255 "Reading" COMMA@255..256 "," WHITESPACE@256..257 " " WORD@257..262 "Mass." R_CURLY@262..263 "}" COMMA@263..264 "," WHITESPACE@264..269 "\n " FIELD@269..294 NAME@269..275 "langid" WHITESPACE@275..282 " " EQ@282..283 "=" WHITESPACE@283..284 " " CURLY_GROUP@284..293 L_CURLY@284..285 "{" WORD@285..292 "english" R_CURLY@292..293 "}" COMMA@293..294 "," WHITESPACE@294..299 "\n " FIELD@299..333 NAME@299..309 "langidopts" WHITESPACE@309..312 " " EQ@312..313 "=" WHITESPACE@313..314 " " CURLY_GROUP@314..332 L_CURLY@314..315 "{" WORD@315..331 "variant=american" R_CURLY@331..332 "}" COMMA@332..333 "," WHITESPACE@333..338 "\n " FIELD@338..381 NAME@338..347 "sorttitle" WHITESPACE@347..351 " " EQ@351..352 "=" WHITESPACE@352..353 " " CURLY_GROUP@353..380 L_CURLY@353..354 "{" WORD@354..363 "Computers" WHITESPACE@363..364 " " WORD@364..365 "&" WHITESPACE@365..366 " " WORD@366..377 "Typesetting" WHITESPACE@377..378 " " WORD@378..379 "A" R_CURLY@379..380 "}" COMMA@380..381 "," WHITESPACE@381..386 "\n " FIELD@386..416 NAME@386..400 "indexsorttitle" EQ@400..401 "=" WHITESPACE@401..402 " " CURLY_GROUP@402..415 L_CURLY@402..403 "{" WORD@403..406 "The" WHITESPACE@406..407 " " WORD@407..414 "TeXbook" R_CURLY@414..415 "}" COMMA@415..416 "," WHITESPACE@416..421 "\n " FIELD@421..461 NAME@421..431 "indextitle" WHITESPACE@431..434 " " EQ@434..435 "=" WHITESPACE@435..436 " " CURLY_GROUP@436..460 L_CURLY@436..437 "{" COMMAND@437..445 COMMAND_NAME@437..445 "\\protect" COMMAND@445..449 COMMAND_NAME@445..449 "\\TeX" WHITESPACE@449..450 " " WORD@450..454 "book" COMMA@454..455 "," WHITESPACE@455..456 " " WORD@456..459 "The" R_CURLY@459..460 "}" COMMA@460..461 "," WHITESPACE@461..466 "\n " FIELD@466..493 NAME@466..476 "shorttitle" WHITESPACE@476..479 " " EQ@479..480 "=" WHITESPACE@480..481 " " CURLY_GROUP@481..492 L_CURLY@481..482 "{" COMMAND@482..486 COMMAND_NAME@482..486 "\\TeX" WHITESPACE@486..487 " " WORD@487..491 "book" R_CURLY@491..492 "}" COMMA@492..493 "," WHITESPACE@493..498 "\n " FIELD@498..991 NAME@498..508 "annotation" WHITESPACE@508..511 " " EQ@511..512 "=" WHITESPACE@512..513 " " CURLY_GROUP@513..990 L_CURLY@513..514 "{" WORD@514..517 "The" WHITESPACE@517..518 " " WORD@518..523 "first" WHITESPACE@523..524 " " WORD@524..530 "volume" WHITESPACE@530..531 " " WORD@531..533 "of" WHITESPACE@533..534 " " WORD@534..535 "a" WHITESPACE@535..536 " " WORD@536..547 "five-volume" WHITESPACE@547..548 " " WORD@548..553 "book." WHITESPACE@553..554 " " WORD@554..558 "Note" WHITESPACE@558..559 " " WORD@559..562 "the" WHITESPACE@562..583 "\n " COMMAND@583..590 COMMAND_NAME@583..590 "\\texttt" CURLY_GROUP@590..601 L_CURLY@590..591 "{" WORD@591..600 "sorttitle" R_CURLY@600..601 "}" WHITESPACE@601..602 " " WORD@602..608 "field." WHITESPACE@608..609 " " WORD@609..611 "We" WHITESPACE@611..612 " " WORD@612..616 "want" WHITESPACE@616..617 " " WORD@617..621 "this" WHITESPACE@621..642 "\n " WORD@642..648 "volume" WHITESPACE@648..649 " " WORD@649..651 "to" WHITESPACE@651..652 " " WORD@652..654 "be" WHITESPACE@654..655 " " WORD@655..661 "listed" WHITESPACE@661..662 " " WORD@662..667 "after" WHITESPACE@667..668 " " WORD@668..671 "the" WHITESPACE@671..672 " " WORD@672..677 "entry" WHITESPACE@677..678 " " WORD@678..687 "referring" WHITESPACE@687..688 " " WORD@688..690 "to" WHITESPACE@690..691 " " WORD@691..694 "the" WHITESPACE@694..695 " " WORD@695..701 "entire" WHITESPACE@701..722 "\n " WORD@722..733 "five-volume" WHITESPACE@733..734 " " WORD@734..738 "set." WHITESPACE@738..739 " " WORD@739..743 "Also" WHITESPACE@743..744 " " WORD@744..748 "note" WHITESPACE@748..749 " " WORD@749..752 "the" WHITESPACE@752..753 " " COMMAND@753..760 COMMAND_NAME@753..760 "\\texttt" CURLY_GROUP@760..772 L_CURLY@760..761 "{" WORD@761..771 "indextitle" R_CURLY@771..772 "}" WHITESPACE@772..773 " " WORD@773..776 "and" WHITESPACE@776..797 "\n " COMMAND@797..804 COMMAND_NAME@797..804 "\\texttt" CURLY_GROUP@804..820 L_CURLY@804..805 "{" WORD@805..819 "indexsorttitle" R_CURLY@819..820 "}" WHITESPACE@820..821 " " WORD@821..828 "fields." WHITESPACE@828..829 " " WORD@829..837 "Indexing" WHITESPACE@837..838 " " WORD@838..846 "packages" WHITESPACE@846..847 " " WORD@847..851 "that" WHITESPACE@851..852 " " WORD@852..857 "don't" WHITESPACE@857..878 "\n " WORD@878..886 "generate" WHITESPACE@886..887 " " WORD@887..893 "robust" WHITESPACE@893..894 " " WORD@894..899 "index" WHITESPACE@899..900 " " WORD@900..907 "entries" WHITESPACE@907..908 " " WORD@908..915 "require" WHITESPACE@915..916 " " WORD@916..920 "some" WHITESPACE@920..921 " " WORD@921..928 "control" WHITESPACE@928..929 " " WORD@929..938 "sequences" WHITESPACE@938..959 "\n " WORD@959..961 "to" WHITESPACE@961..962 " " WORD@962..964 "be" WHITESPACE@964..965 " " WORD@965..974 "protected" WHITESPACE@974..975 " " WORD@975..979 "from" WHITESPACE@979..980 " " WORD@980..989 "expansion" R_CURLY@989..990 "}" COMMA@990..991 "," WHITESPACE@991..992 "\n" R_DELIM@992..993 "}" "#]], ); } #[test] fn test_matuz_1990() { check( r#"@collection{matuz:doody, editor = {Matuz, Roger}, title = {Contemporary Literary Criticism}, year = 1990, volume = 61, publisher = {Gale}, location = {Detroit}, pages = {204-208}, langid = {english}, langidopts = {variant=american}, annotation = {A \texttt{collection} entry providing the excerpt information for the \texttt{doody} entry. Note the format of the \texttt{pages} field}, }"#, expect![[r#" ROOT@0..517 ENTRY@0..517 TYPE@0..11 "@collection" L_DELIM@11..12 "{" NAME@12..23 "matuz:doody" COMMA@23..24 "," WHITESPACE@24..29 "\n " FIELD@29..59 NAME@29..35 "editor" WHITESPACE@35..42 " " EQ@42..43 "=" WHITESPACE@43..44 " " CURLY_GROUP@44..58 L_CURLY@44..45 "{" WORD@45..50 "Matuz" COMMA@50..51 "," WHITESPACE@51..52 " " WORD@52..57 "Roger" R_CURLY@57..58 "}" COMMA@58..59 "," WHITESPACE@59..64 "\n " FIELD@64..113 NAME@64..69 "title" WHITESPACE@69..77 " " EQ@77..78 "=" WHITESPACE@78..79 " " CURLY_GROUP@79..112 L_CURLY@79..80 "{" WORD@80..92 "Contemporary" WHITESPACE@92..93 " " WORD@93..101 "Literary" WHITESPACE@101..102 " " WORD@102..111 "Criticism" R_CURLY@111..112 "}" COMMA@112..113 "," WHITESPACE@113..118 "\n " FIELD@118..138 NAME@118..122 "year" WHITESPACE@122..131 " " EQ@131..132 "=" WHITESPACE@132..133 " " LITERAL@133..137 INTEGER@133..137 "1990" COMMA@137..138 "," WHITESPACE@138..143 "\n " FIELD@143..161 NAME@143..149 "volume" WHITESPACE@149..156 " " EQ@156..157 "=" WHITESPACE@157..158 " " LITERAL@158..160 INTEGER@158..160 "61" COMMA@160..161 "," WHITESPACE@161..166 "\n " FIELD@166..188 NAME@166..175 "publisher" WHITESPACE@175..179 " " EQ@179..180 "=" WHITESPACE@180..181 " " CURLY_GROUP@181..187 L_CURLY@181..182 "{" WORD@182..186 "Gale" R_CURLY@186..187 "}" COMMA@187..188 "," WHITESPACE@188..193 "\n " FIELD@193..218 NAME@193..201 "location" WHITESPACE@201..206 " " EQ@206..207 "=" WHITESPACE@207..208 " " CURLY_GROUP@208..217 L_CURLY@208..209 "{" WORD@209..216 "Detroit" R_CURLY@216..217 "}" COMMA@217..218 "," WHITESPACE@218..223 "\n " FIELD@223..248 NAME@223..228 "pages" WHITESPACE@228..236 " " EQ@236..237 "=" WHITESPACE@237..238 " " CURLY_GROUP@238..247 L_CURLY@238..239 "{" WORD@239..246 "204-208" R_CURLY@246..247 "}" COMMA@247..248 "," WHITESPACE@248..253 "\n " FIELD@253..278 NAME@253..259 "langid" WHITESPACE@259..266 " " EQ@266..267 "=" WHITESPACE@267..268 " " CURLY_GROUP@268..277 L_CURLY@268..269 "{" WORD@269..276 "english" R_CURLY@276..277 "}" COMMA@277..278 "," WHITESPACE@278..283 "\n " FIELD@283..317 NAME@283..293 "langidopts" WHITESPACE@293..296 " " EQ@296..297 "=" WHITESPACE@297..298 " " CURLY_GROUP@298..316 L_CURLY@298..299 "{" WORD@299..315 "variant=american" R_CURLY@315..316 "}" COMMA@316..317 "," WHITESPACE@317..322 "\n " FIELD@322..515 NAME@322..332 "annotation" WHITESPACE@332..335 " " EQ@335..336 "=" WHITESPACE@336..337 " " CURLY_GROUP@337..514 L_CURLY@337..338 "{" WORD@338..339 "A" WHITESPACE@339..340 " " COMMAND@340..347 COMMAND_NAME@340..347 "\\texttt" CURLY_GROUP@347..359 L_CURLY@347..348 "{" WORD@348..358 "collection" R_CURLY@358..359 "}" WHITESPACE@359..360 " " WORD@360..365 "entry" WHITESPACE@365..366 " " WORD@366..375 "providing" WHITESPACE@375..376 " " WORD@376..379 "the" WHITESPACE@379..380 " " WORD@380..387 "excerpt" WHITESPACE@387..388 " " WORD@388..399 "information" WHITESPACE@399..420 "\n " WORD@420..423 "for" WHITESPACE@423..424 " " WORD@424..427 "the" WHITESPACE@427..428 " " COMMAND@428..435 COMMAND_NAME@428..435 "\\texttt" CURLY_GROUP@435..442 L_CURLY@435..436 "{" WORD@436..441 "doody" R_CURLY@441..442 "}" WHITESPACE@442..443 " " WORD@443..449 "entry." WHITESPACE@449..450 " " WORD@450..454 "Note" WHITESPACE@454..455 " " WORD@455..458 "the" WHITESPACE@458..459 " " WORD@459..465 "format" WHITESPACE@465..466 " " WORD@466..468 "of" WHITESPACE@468..469 " " WORD@469..472 "the" WHITESPACE@472..493 "\n " COMMAND@493..500 COMMAND_NAME@493..500 "\\texttt" CURLY_GROUP@500..507 L_CURLY@500..501 "{" WORD@501..506 "pages" R_CURLY@506..507 "}" WHITESPACE@507..508 " " WORD@508..513 "field" R_CURLY@513..514 "}" COMMA@514..515 "," WHITESPACE@515..516 "\n" R_DELIM@516..517 "}" "#]], ); } #[test] fn test_nietzsche_1998() { check( r#"@string{dtv = {Deutscher Taschenbuch-Verlag}} @mvbook{nietzsche:ksa, author = {Nietzsche, Friedrich}, title = {S{\"a}mtliche Werke}, date = 1988, editor = {Colli, Giorgio and Montinari, Mazzino}, edition = 2, volumes = 15, publisher = dtv # { and Walter de Gruyter}, location = {M{\"u}nchen and Berlin and New York}, langid = {german}, sorttitle = {Werke-00-000}, indexsorttitle= {Samtliche Werke}, subtitle = {Kritische Studienausgabe}, annotation = {The critical edition of Nietzsche's works. This is a \texttt{mvbook} entry referring to a 15-volume work as a whole. Note the \texttt{volumes} field and the format of the \texttt{publisher} and \texttt{location} fields in the database file. Also note the \texttt{sorttitle} and field which is used to fine-tune the sorting order of the bibliography. We want this item listed first in the bibliography}, }"#, expect![[r##" ROOT@0..1112 STRING@0..49 TYPE@0..7 "@string" L_DELIM@7..8 "{" NAME@8..11 "dtv" WHITESPACE@11..16 " " EQ@16..17 "=" WHITESPACE@17..18 " " CURLY_GROUP@18..48 L_CURLY@18..19 "{" WORD@19..28 "Deutscher" WHITESPACE@28..29 " " WORD@29..47 "Taschenbuch-Verlag" R_CURLY@47..48 "}" R_DELIM@48..49 "}" JUNK@49..51 "\n\n" ENTRY@51..1112 TYPE@51..58 "@mvbook" L_DELIM@58..59 "{" NAME@59..72 "nietzsche:ksa" COMMA@72..73 "," WHITESPACE@73..78 "\n " FIELD@78..116 NAME@78..84 "author" WHITESPACE@84..91 " " EQ@91..92 "=" WHITESPACE@92..93 " " CURLY_GROUP@93..115 L_CURLY@93..94 "{" WORD@94..103 "Nietzsche" COMMA@103..104 "," WHITESPACE@104..105 " " WORD@105..114 "Friedrich" R_CURLY@114..115 "}" COMMA@115..116 "," WHITESPACE@116..121 "\n " FIELD@121..158 NAME@121..126 "title" WHITESPACE@126..134 " " EQ@134..135 "=" WHITESPACE@135..136 " " CURLY_GROUP@136..157 L_CURLY@136..137 "{" WORD@137..138 "S" CURLY_GROUP@138..143 L_CURLY@138..139 "{" ACCENT@139..142 ACCENT_NAME@139..141 "\\\"" WORD@141..142 "a" R_CURLY@142..143 "}" WORD@143..150 "mtliche" WHITESPACE@150..151 " " WORD@151..156 "Werke" R_CURLY@156..157 "}" COMMA@157..158 "," WHITESPACE@158..163 "\n " FIELD@163..183 NAME@163..167 "date" WHITESPACE@167..176 " " EQ@176..177 "=" WHITESPACE@177..178 " " LITERAL@178..182 INTEGER@178..182 "1988" COMMA@182..183 "," WHITESPACE@183..188 "\n " FIELD@188..243 NAME@188..194 "editor" WHITESPACE@194..201 " " EQ@201..202 "=" WHITESPACE@202..203 " " CURLY_GROUP@203..242 L_CURLY@203..204 "{" WORD@204..209 "Colli" COMMA@209..210 "," WHITESPACE@210..211 " " WORD@211..218 "Giorgio" WHITESPACE@218..219 " " WORD@219..222 "and" WHITESPACE@222..223 " " WORD@223..232 "Montinari" COMMA@232..233 "," WHITESPACE@233..234 " " WORD@234..241 "Mazzino" R_CURLY@241..242 "}" COMMA@242..243 "," WHITESPACE@243..248 "\n " FIELD@248..265 NAME@248..255 "edition" WHITESPACE@255..261 " " EQ@261..262 "=" WHITESPACE@262..263 " " LITERAL@263..264 INTEGER@263..264 "2" COMMA@264..265 "," WHITESPACE@265..270 "\n " FIELD@270..288 NAME@270..277 "volumes" WHITESPACE@277..283 " " EQ@283..284 "=" WHITESPACE@284..285 " " LITERAL@285..287 INTEGER@285..287 "15" COMMA@287..288 "," WHITESPACE@288..293 "\n " FIELD@293..339 NAME@293..302 "publisher" WHITESPACE@302..306 " " EQ@306..307 "=" WHITESPACE@307..308 " " JOIN@308..338 LITERAL@308..311 NAME@308..311 "dtv" WHITESPACE@311..312 " " POUND@312..313 "#" WHITESPACE@313..314 " " CURLY_GROUP@314..338 L_CURLY@314..315 "{" WHITESPACE@315..316 " " WORD@316..319 "and" WHITESPACE@319..320 " " WORD@320..326 "Walter" WHITESPACE@326..327 " " WORD@327..329 "de" WHITESPACE@329..330 " " WORD@330..337 "Gruyter" R_CURLY@337..338 "}" COMMA@338..339 "," WHITESPACE@339..344 "\n " FIELD@344..397 NAME@344..352 "location" WHITESPACE@352..357 " " EQ@357..358 "=" WHITESPACE@358..359 " " CURLY_GROUP@359..396 L_CURLY@359..360 "{" WORD@360..361 "M" CURLY_GROUP@361..366 L_CURLY@361..362 "{" ACCENT@362..365 ACCENT_NAME@362..364 "\\\"" WORD@364..365 "u" R_CURLY@365..366 "}" WORD@366..371 "nchen" WHITESPACE@371..372 " " WORD@372..375 "and" WHITESPACE@375..376 " " WORD@376..382 "Berlin" WHITESPACE@382..383 " " WORD@383..386 "and" WHITESPACE@386..387 " " WORD@387..390 "New" WHITESPACE@390..391 " " WORD@391..395 "York" R_CURLY@395..396 "}" COMMA@396..397 "," WHITESPACE@397..402 "\n " FIELD@402..426 NAME@402..408 "langid" WHITESPACE@408..415 " " EQ@415..416 "=" WHITESPACE@416..417 " " CURLY_GROUP@417..425 L_CURLY@417..418 "{" WORD@418..424 "german" R_CURLY@424..425 "}" COMMA@425..426 "," WHITESPACE@426..431 "\n " FIELD@431..461 NAME@431..440 "sorttitle" WHITESPACE@440..444 " " EQ@444..445 "=" WHITESPACE@445..446 " " CURLY_GROUP@446..460 L_CURLY@446..447 "{" WORD@447..459 "Werke-00-000" R_CURLY@459..460 "}" COMMA@460..461 "," WHITESPACE@461..466 "\n " FIELD@466..500 NAME@466..480 "indexsorttitle" EQ@480..481 "=" WHITESPACE@481..482 " " CURLY_GROUP@482..499 L_CURLY@482..483 "{" WORD@483..492 "Samtliche" WHITESPACE@492..493 " " WORD@493..498 "Werke" R_CURLY@498..499 "}" COMMA@499..500 "," WHITESPACE@500..505 "\n " FIELD@505..547 NAME@505..513 "subtitle" WHITESPACE@513..518 " " EQ@518..519 "=" WHITESPACE@519..520 " " CURLY_GROUP@520..546 L_CURLY@520..521 "{" WORD@521..530 "Kritische" WHITESPACE@530..531 " " WORD@531..545 "Studienausgabe" R_CURLY@545..546 "}" COMMA@546..547 "," WHITESPACE@547..552 "\n " FIELD@552..1110 NAME@552..562 "annotation" WHITESPACE@562..565 " " EQ@565..566 "=" WHITESPACE@566..567 " " CURLY_GROUP@567..1109 L_CURLY@567..568 "{" WORD@568..571 "The" WHITESPACE@571..572 " " WORD@572..580 "critical" WHITESPACE@580..581 " " WORD@581..588 "edition" WHITESPACE@588..589 " " WORD@589..591 "of" WHITESPACE@591..592 " " WORD@592..603 "Nietzsche's" WHITESPACE@603..604 " " WORD@604..610 "works." WHITESPACE@610..611 " " WORD@611..615 "This" WHITESPACE@615..616 " " WORD@616..618 "is" WHITESPACE@618..619 " " WORD@619..620 "a" WHITESPACE@620..641 "\n " COMMAND@641..648 COMMAND_NAME@641..648 "\\texttt" CURLY_GROUP@648..656 L_CURLY@648..649 "{" WORD@649..655 "mvbook" R_CURLY@655..656 "}" WHITESPACE@656..657 " " WORD@657..662 "entry" WHITESPACE@662..663 " " WORD@663..672 "referring" WHITESPACE@672..673 " " WORD@673..675 "to" WHITESPACE@675..676 " " WORD@676..677 "a" WHITESPACE@677..678 " " WORD@678..687 "15-volume" WHITESPACE@687..688 " " WORD@688..692 "work" WHITESPACE@692..693 " " WORD@693..695 "as" WHITESPACE@695..696 " " WORD@696..697 "a" WHITESPACE@697..718 "\n " WORD@718..724 "whole." WHITESPACE@724..725 " " WORD@725..729 "Note" WHITESPACE@729..730 " " WORD@730..733 "the" WHITESPACE@733..734 " " COMMAND@734..741 COMMAND_NAME@734..741 "\\texttt" CURLY_GROUP@741..750 L_CURLY@741..742 "{" WORD@742..749 "volumes" R_CURLY@749..750 "}" WHITESPACE@750..751 " " WORD@751..756 "field" WHITESPACE@756..757 " " WORD@757..760 "and" WHITESPACE@760..761 " " WORD@761..764 "the" WHITESPACE@764..765 " " WORD@765..771 "format" WHITESPACE@771..772 " " WORD@772..774 "of" WHITESPACE@774..775 " " WORD@775..778 "the" WHITESPACE@778..799 "\n " COMMAND@799..806 COMMAND_NAME@799..806 "\\texttt" CURLY_GROUP@806..817 L_CURLY@806..807 "{" WORD@807..816 "publisher" R_CURLY@816..817 "}" WHITESPACE@817..818 " " WORD@818..821 "and" WHITESPACE@821..822 " " COMMAND@822..829 COMMAND_NAME@822..829 "\\texttt" CURLY_GROUP@829..839 L_CURLY@829..830 "{" WORD@830..838 "location" R_CURLY@838..839 "}" WHITESPACE@839..840 " " WORD@840..846 "fields" WHITESPACE@846..847 " " WORD@847..849 "in" WHITESPACE@849..850 " " WORD@850..853 "the" WHITESPACE@853..874 "\n " WORD@874..882 "database" WHITESPACE@882..883 " " WORD@883..888 "file." WHITESPACE@888..889 " " WORD@889..893 "Also" WHITESPACE@893..894 " " WORD@894..898 "note" WHITESPACE@898..899 " " WORD@899..902 "the" WHITESPACE@902..903 " " COMMAND@903..910 COMMAND_NAME@903..910 "\\texttt" CURLY_GROUP@910..921 L_CURLY@910..911 "{" WORD@911..920 "sorttitle" R_CURLY@920..921 "}" WHITESPACE@921..922 " " WORD@922..925 "and" WHITESPACE@925..946 "\n " WORD@946..951 "field" WHITESPACE@951..952 " " WORD@952..957 "which" WHITESPACE@957..958 " " WORD@958..960 "is" WHITESPACE@960..961 " " WORD@961..965 "used" WHITESPACE@965..966 " " WORD@966..968 "to" WHITESPACE@968..969 " " WORD@969..978 "fine-tune" WHITESPACE@978..979 " " WORD@979..982 "the" WHITESPACE@982..1003 "\n " WORD@1003..1010 "sorting" WHITESPACE@1010..1011 " " WORD@1011..1016 "order" WHITESPACE@1016..1017 " " WORD@1017..1019 "of" WHITESPACE@1019..1020 " " WORD@1020..1023 "the" WHITESPACE@1023..1024 " " WORD@1024..1037 "bibliography." WHITESPACE@1037..1038 " " WORD@1038..1040 "We" WHITESPACE@1040..1041 " " WORD@1041..1045 "want" WHITESPACE@1045..1046 " " WORD@1046..1050 "this" WHITESPACE@1050..1051 " " WORD@1051..1055 "item" WHITESPACE@1055..1056 " " WORD@1056..1062 "listed" WHITESPACE@1062..1083 "\n " WORD@1083..1088 "first" WHITESPACE@1088..1089 " " WORD@1089..1091 "in" WHITESPACE@1091..1092 " " WORD@1092..1095 "the" WHITESPACE@1095..1096 " " WORD@1096..1108 "bibliography" R_CURLY@1108..1109 "}" COMMA@1109..1110 "," WHITESPACE@1110..1111 "\n" R_DELIM@1111..1112 "}" "##]], ); } #[test] fn test_rivest_1978() { check( r#"@article{10.1145/359340.359342, author = {Rivest, R. L. and Shamir, A. and Adleman, L.}, title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems}, year = {1978}, issue_date = {Feb. 1978}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, volume = {21}, number = {2}, issn = {0001-0782}, url = {https://doi.org/10.1145/359340.359342}, doi = {10.1145/359340.359342}, journal = {Commun. ACM}, month = {feb}, pages = {120-126}, numpages = {7}, }"#, expect![[r#" ROOT@0..557 ENTRY@0..557 TYPE@0..8 "@article" L_DELIM@8..9 "{" NAME@9..30 "10.1145/359340.359342" COMMA@30..31 "," WHITESPACE@31..36 "\n " FIELD@36..92 NAME@36..42 "author" WHITESPACE@42..43 " " EQ@43..44 "=" WHITESPACE@44..45 " " CURLY_GROUP@45..91 L_CURLY@45..46 "{" WORD@46..52 "Rivest" COMMA@52..53 "," WHITESPACE@53..54 " " WORD@54..56 "R." WHITESPACE@56..57 " " WORD@57..59 "L." WHITESPACE@59..60 " " WORD@60..63 "and" WHITESPACE@63..64 " " WORD@64..70 "Shamir" COMMA@70..71 "," WHITESPACE@71..72 " " WORD@72..74 "A." WHITESPACE@74..75 " " WORD@75..78 "and" WHITESPACE@78..79 " " WORD@79..86 "Adleman" COMMA@86..87 "," WHITESPACE@87..88 " " WORD@88..90 "L." R_CURLY@90..91 "}" COMMA@91..92 "," WHITESPACE@92..97 "\n " FIELD@97..178 NAME@97..102 "title" WHITESPACE@102..103 " " EQ@103..104 "=" WHITESPACE@104..105 " " CURLY_GROUP@105..177 L_CURLY@105..106 "{" WORD@106..107 "A" WHITESPACE@107..108 " " WORD@108..114 "Method" WHITESPACE@114..115 " " WORD@115..118 "for" WHITESPACE@118..119 " " WORD@119..128 "Obtaining" WHITESPACE@128..129 " " WORD@129..136 "Digital" WHITESPACE@136..137 " " WORD@137..147 "Signatures" WHITESPACE@147..148 " " WORD@148..151 "and" WHITESPACE@151..152 " " WORD@152..162 "Public-Key" WHITESPACE@162..163 " " WORD@163..176 "Cryptosystems" R_CURLY@176..177 "}" COMMA@177..178 "," WHITESPACE@178..183 "\n " FIELD@183..197 NAME@183..187 "year" WHITESPACE@187..188 " " EQ@188..189 "=" WHITESPACE@189..190 " " CURLY_GROUP@190..196 L_CURLY@190..191 "{" INTEGER@191..195 "1978" R_CURLY@195..196 "}" COMMA@196..197 "," WHITESPACE@197..202 "\n " FIELD@202..227 NAME@202..212 "issue_date" WHITESPACE@212..213 " " EQ@213..214 "=" WHITESPACE@214..215 " " CURLY_GROUP@215..226 L_CURLY@215..216 "{" WORD@216..220 "Feb." WHITESPACE@220..221 " " INTEGER@221..225 "1978" R_CURLY@225..226 "}" COMMA@226..227 "," WHITESPACE@227..232 "\n " FIELD@232..282 NAME@232..241 "publisher" WHITESPACE@241..242 " " EQ@242..243 "=" WHITESPACE@243..244 " " CURLY_GROUP@244..281 L_CURLY@244..245 "{" WORD@245..256 "Association" WHITESPACE@256..257 " " WORD@257..260 "for" WHITESPACE@260..261 " " WORD@261..270 "Computing" WHITESPACE@270..271 " " WORD@271..280 "Machinery" R_CURLY@280..281 "}" COMMA@281..282 "," WHITESPACE@282..287 "\n " FIELD@287..317 NAME@287..294 "address" WHITESPACE@294..295 " " EQ@295..296 "=" WHITESPACE@296..297 " " CURLY_GROUP@297..316 L_CURLY@297..298 "{" WORD@298..301 "New" WHITESPACE@301..302 " " WORD@302..306 "York" COMMA@306..307 "," WHITESPACE@307..308 " " WORD@308..310 "NY" COMMA@310..311 "," WHITESPACE@311..312 " " WORD@312..315 "USA" R_CURLY@315..316 "}" COMMA@316..317 "," WHITESPACE@317..322 "\n " FIELD@322..336 NAME@322..328 "volume" WHITESPACE@328..329 " " EQ@329..330 "=" WHITESPACE@330..331 " " CURLY_GROUP@331..335 L_CURLY@331..332 "{" INTEGER@332..334 "21" R_CURLY@334..335 "}" COMMA@335..336 "," WHITESPACE@336..341 "\n " FIELD@341..354 NAME@341..347 "number" WHITESPACE@347..348 " " EQ@348..349 "=" WHITESPACE@349..350 " " CURLY_GROUP@350..353 L_CURLY@350..351 "{" INTEGER@351..352 "2" R_CURLY@352..353 "}" COMMA@353..354 "," WHITESPACE@354..359 "\n " FIELD@359..378 NAME@359..363 "issn" WHITESPACE@363..364 " " EQ@364..365 "=" WHITESPACE@365..366 " " CURLY_GROUP@366..377 L_CURLY@366..367 "{" WORD@367..376 "0001-0782" R_CURLY@376..377 "}" COMMA@377..378 "," WHITESPACE@378..383 "\n " FIELD@383..429 NAME@383..386 "url" WHITESPACE@386..387 " " EQ@387..388 "=" WHITESPACE@388..389 " " CURLY_GROUP@389..428 L_CURLY@389..390 "{" WORD@390..427 "https://doi.org/10.11 ..." R_CURLY@427..428 "}" COMMA@428..429 "," WHITESPACE@429..434 "\n " FIELD@434..464 NAME@434..437 "doi" WHITESPACE@437..438 " " EQ@438..439 "=" WHITESPACE@439..440 " " CURLY_GROUP@440..463 L_CURLY@440..441 "{" WORD@441..462 "10.1145/359340.359342" R_CURLY@462..463 "}" COMMA@463..464 "," WHITESPACE@464..469 "\n " FIELD@469..493 NAME@469..476 "journal" WHITESPACE@476..477 " " EQ@477..478 "=" WHITESPACE@478..479 " " CURLY_GROUP@479..492 L_CURLY@479..480 "{" WORD@480..487 "Commun." WHITESPACE@487..488 " " WORD@488..491 "ACM" R_CURLY@491..492 "}" COMMA@492..493 "," WHITESPACE@493..498 "\n " FIELD@498..512 NAME@498..503 "month" WHITESPACE@503..504 " " EQ@504..505 "=" WHITESPACE@505..506 " " CURLY_GROUP@506..511 L_CURLY@506..507 "{" WORD@507..510 "feb" R_CURLY@510..511 "}" COMMA@511..512 "," WHITESPACE@512..517 "\n " FIELD@517..535 NAME@517..522 "pages" WHITESPACE@522..523 " " EQ@523..524 "=" WHITESPACE@524..525 " " CURLY_GROUP@525..534 L_CURLY@525..526 "{" WORD@526..533 "120-126" R_CURLY@533..534 "}" COMMA@534..535 "," WHITESPACE@535..540 "\n " FIELD@540..555 NAME@540..548 "numpages" WHITESPACE@548..549 " " EQ@549..550 "=" WHITESPACE@550..551 " " CURLY_GROUP@551..554 L_CURLY@551..552 "{" INTEGER@552..553 "7" R_CURLY@553..554 "}" COMMA@554..555 "," WHITESPACE@555..556 "\n" R_DELIM@556..557 "}" "#]], ); }