From 991eec6f1e1c01d8bf974ac15f7789420e2a7e01 Mon Sep 17 00:00:00 2001 From: Niklaus Giger Date: Mon, 27 Apr 2015 09:08:10 +0200 Subject: [PATCH] Fix handling polysorbatum, 10^4.4, 'q.s.' --- lib/oddb2xml/compositions_syntax.rb | 14 +++++++++----- spec/composition_syntax_spec.rb | 10 +++------- spec/parslet_spec.rb | 10 ++++------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/lib/oddb2xml/compositions_syntax.rb b/lib/oddb2xml/compositions_syntax.rb index 58821e4..f854554 100644 --- a/lib/oddb2xml/compositions_syntax.rb +++ b/lib/oddb2xml/compositions_syntax.rb @@ -29,7 +29,7 @@ class CompositionParser < Parslet::Parser str('0') | (match('[1-9]') >> match('[0-9\']').repeat) ) >> ( (str('*') >> digit.repeat(1)).maybe >> - match(['.,^']) >> digit.repeat(1) + (match(['.,^']) >> digit.repeat(1)).repeat(1) ).maybe >> ( match('[eE]') >> (str('+') | str('-')).maybe >> digit.repeat(1) ).maybe @@ -44,7 +44,7 @@ class CompositionParser < Parslet::Parser rule(:umlaut) { match(['éàèèçïöäüâ']) } rule(:identifier_D12) { match['a-zA-Z'] >> match['0-9'].repeat(1) } rule(:identifier) { str('A + B') | str('ethanol.') | str('poloxamerum 238') | str('TM:') | str('&') | # TODO: why do we have to hard code these identifiers? - str('F.E.I.B.A.') | str('LA 25% TM') | str('50/50') | str('polysorbatum 80') | + str('F.E.I.B.A.') | str('LA 25% TM') | str('50/50') | str('polysorbatum ') >> digit >> digit | str('q.s.') | digit >> digit.maybe >> space >> str('per centum ') >> str('q.s.').maybe| str('1g/9.6 cm²') | str('9 g/L 5.4 ml') | str('spag.') | str('spp.') | str('ssp.') | str('deklar.') | # TODO: Sind diese Abkürzung wirklich Teil eines Substanznamens? @@ -161,6 +161,7 @@ class CompositionParser < Parslet::Parser str('ut alia: ') | str('pro dosi') | str('pro capsula') | + str('pro vitroe') | (digits.repeat(1) >> space >> str(':')) | # match 50 % str('ad globulos') | str('ana ') | @@ -168,7 +169,8 @@ class CompositionParser < Parslet::Parser str('partes') | str('ad pulverem') | str('ad suspensionem') | - str('q.s. ') | + str('q.s. ad ') | + str('q.s. pro ') | str('ad solutionem') | str('ad emulsionem') | str('excipiens') @@ -194,7 +196,7 @@ class CompositionParser < Parslet::Parser name_with_parenthesis | name_without_parenthesis ) >> - str('pro dosi').maybe + str('pro dosi').maybe >> space? } rule(:simple_substance) { substance_name.as(:substance_name) >> space? >> dose.as(:dose).maybe} rule(:simple_subtance_with_digits_in_name_and_dose) { @@ -229,6 +231,7 @@ class CompositionParser < Parslet::Parser str('aqua q.s. ad solutionem pro ') | str('aqua q.s. ad suspensionem pro ') | str('q.s. ad pulverem pro ') | + str('doses pro vase ') | str('pro vase ') | str('excipiens ad emulsionem pro ') | str('excipiens ad pulverem pro ') | @@ -251,8 +254,9 @@ class CompositionParser < Parslet::Parser str('aqua q.s. ad') | str('saccharum ad') | str('aether q.s.') | + str('pro vitro') | str('aqua ad iniectabilia') | - str('aqua ad iniectabilia') | + str('pro praeparatione') | str('q.s. pro praeparatione') | str('ana partes') ) >> space? >> diff --git a/spec/composition_syntax_spec.rb b/spec/composition_syntax_spec.rb index 4d60b7c..87b52e8 100644 --- a/spec/composition_syntax_spec.rb +++ b/spec/composition_syntax_spec.rb @@ -14,10 +14,10 @@ let(:identifier_parser) { parser.identifier } let(:substance_parser) { parser.substance } let(:substance_name_parser) { parser.substance_name } + let(:number_parser) { parser.number } it "parses identifier" do - # >> space? >> str('q.s.').maybe - res1 = identifier_parser.parse_with_debug( "75 U.I. hFSH et 75 U.I. hLH") + res1 = number_parser.parse_with_debug( "min.10^4.4 U..") pp res1 binding.pry end @@ -217,17 +217,13 @@ "40 U.", "50'000 U.I.", "1 Mio. U.I.", -# "3,45", -# "123", -# "123.45", -# 'mg', -# 'ml', '3 Mg', '2 mg', '0.3 ml', '0.01 mg/ml', '3 mg/ml', '2*10^9 CFU', + '10^4.4 U.', '20 mg', '100 % m/m', '308.7 mg/g', diff --git a/spec/parslet_spec.rb b/spec/parslet_spec.rb index 787a415..c8a0316 100644 --- a/spec/parslet_spec.rb +++ b/spec/parslet_spec.rb @@ -35,7 +35,6 @@ string = "nicotinum 4 mg ut nicotini resinas, aromatica, antiox.: E 321, arom.: excipiens pro praeparatione" composition = ParseComposition.from_string(string) specify { expect(composition.source).to eq string} - binding.pry specify { expect( composition.substances.size).to eq 3 } specify { expect( composition.substances.first.name).to eq "Nicotinum" } # TODO: is not Benzocainum end @@ -44,7 +43,6 @@ string = '"pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.: excipiens ad solutionem pro 1 ml' composition = ParseComposition.from_string(string) specify { expect(composition.source).to eq string} - binding.pry specify { expect( composition.substances.size).to eq 0 } specify { expect( composition.label).to eq 'A' } specify { expect( composition.composition.label_description).to eq 'pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.' } @@ -65,7 +63,7 @@ specify { expect( composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum)" } end - context "should handle Praeparatio sicca" do + context "should handle Praeparatio sicca and polysorbatum" do string = 'Praeparatio sicca cum solvens: praeparatio sicca: albiglutidum 66.95 mg, trehalosum dihydricum, mannitolum, dinatrii phosphas anhydricus, natrii dihydrogenophosphas monohydricus, polysorbatum 80, solvens: aqua ad iniectabilia 0.65 ml pro vitro' composition = ParseComposition.from_string(string) specify { expect(composition.source).to eq string} @@ -222,9 +220,9 @@ context 'find corresp doses pro vase.' do string = "doses pro vase 30/60" composition = ParseComposition.from_string(string) - specify { expect(composition.substances.size).to eq 1 } - specify { expect( composition.substances.first.name).to eq 'Doses pro Vase' } - specify { expect( composition.substances.first.dose.to_s).to eq '30/60' } + specify { expect( composition.substances.size).to eq 0 } +# specify { expect( composition.substances.first.name).to eq 'Doses pro Vase' } # TODO: must be found somewher eles +# specify { expect( composition.substances.first.dose.to_s).to eq '30/60' } end context 'find corresp. ca.' do