
рдХрд╛рд░реНрдп
рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдРрд▓рд┐рд╕ рдХреЗ рд▓рд┐рдП рдХреМрд╢рд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд▓рдЧрд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд▓рд╛рдн рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдЗрдЯ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд╛рдВрдд рдЧреЗрдо рд╣реИрдВ (рдореЗрд░рд╛ рд╕рд╣рд┐рдд), рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╛рдЬ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЬрд░реВрд░реА рд╣реЛ, рдФрд░ рди рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдЪреИрдЯ рдмреЙрдЯ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдмрдЯрди рдХреЗ рд╕рд╛рдеред
рдЖрд╡рд╛рдЬ рддрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрддреА рд╣реИ рдЬрдм рдпрд╛ рддреЛ рд╣рд╛рде рд╡реНрдпрд╕реНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдкрдХреЛ рдХрдИ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдлреЛрди рд╕реНрдХреНрд░реАрди рдкрд░ред рддреЛ рдПрдХ рдХреМрд╢рд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЬреЛ рдПрдХ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛, рдкрд╛рда рд╕реЗ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдХреЛ Google рдХреИрд▓реЗрдВрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХрд▓ рдХреЗ рдмрд╛рдж рджреЛрдкрд╣рд░ 11 рдмрдЬреЗ рдПрдХ рд╕реБрдВрджрд░ рд╕реВрд░реНрдпрд╛рд╕реНрдд рд╣реЛрдЧрд╛ , рддреЛ рд▓рд╛рдЗрди 23:00 рдкрд░ рдХрд▓ рдХреЗ рдмрд╛рдж рдХреЗ рджрд┐рди рдХреЗ рд▓рд┐рдП рдХреИрд▓реЗрдВрдбрд░ рдореЗрдВ рдПрдХ рд╕реБрдВрджрд░ рд╕реВрд░реНрдпрд╛рд╕реНрдд рд╣реЛрдЧреА ред
рдХрдЯрд░ рдХреЗ рддрд╣рдд рд╣реЙрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рд╣реИ: рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░реВрд╕реА рднрд╛рд╖рдг рдореЗрдВ рдПрдХ рддрд┐рдерд┐ рдФрд░ рд╕рдордп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ред рдЕрд╢реНрд╡ рд╕реВрд░реНрдп рдХрд╛ рд╕реНрд▓рд╛рд╡ рджреЗрд╡рддрд╛ рд╣реИред
рдЬреАрдардм | NuGet
рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди
рдкрд╛рдЗрдерди рдореЗрдВ рдЦрдЬреВрд░
рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рд░реВрд╕реА рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рд╕реЗ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
>>> import dateparser >>> dateparser.parse(u'13 2015 . 13:34') datetime.datetime(2015, 1, 13, 13, 34) >>> dateparser.parse(u' ') >>> dateparser.parse(u' 9 ') >>> dateparser.parse(u'13 ') datetime.datetime(2019, 10, 13, 0, 0) >>> dateparser.parse(u'13 9 ')
рд░реВрдмреА рдкрд░ рдЬреАрд░реНрдг
рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдорд╛рдгрд┐рдХрд╡рд╛рджрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░реВрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
Google рд╕рд╣рд╛рдпрдХ
рдЪреВрдВрдХрд┐ рд╣рдо Google рдХреИрд▓реЗрдВрдбрд░ рдореЗрдВ рдЖрд╡рд╛рдЬ рдЬреЛрдбрд╝рдиреЗ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛? рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдФрд░ рдЯреИрдкреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдФрд░ рдЗрд╕реЗ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХреЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ:

рдкреНрд░реАрд╕реЗрдЯ
рдореИрдВрдиреЗ .NETStandard 2.0 (C #) рдкрд░ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦреА рд╣реИред рдЪреВрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореВрд▓ рд░реВрдк рд╕реЗ рдРрд▓рд┐рд╕ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд╛рда рдореЗрдВ рд╕рднреА рдЕрдВрдХреЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд▓рд┐рд╕ рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдЕрдВрдХ рд╣реИрдВ, рддреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдПрдХ рдЕрджреНрднреБрдд рдбреВрдорд░ 3 рдбреА рд▓реЗрдЦ рд╣реИ ред
рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди
рд╡реЙрдЗрд╕ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╕рд╣реА рд╢рдмреНрджреЛрдВ рдХреЛ рдЧрд▓рдд рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рд╢рдмреНрдж рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпреИрдВрдбреЗрдХреНрд╕ рдХреЗ рдПрд▓рд┐рд╕ рд╕реНрдХреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдПрдХ рджреЛрд╕реНрдд рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╢рдмреНрдж рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:
Morph.HasOneOfLemmas(t, "", "", "");
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди true
рдпрджрд┐ рд╢рдмреНрдж t
рддреАрди рдирд┐рдореНрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдХреЛрдИ рд░реВрдк рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЕрддреАрдд , рдЕрддреАрдд , рдкрд┐рдЫрд▓рд╛ ред
рд╕рд┐рджреНрдзрд╛рдВрдд
рдкрд╛рда рдореЗрдВ рджрд┐рдирд╛рдВрдХ рдХреИрд╕реЗ рдкрдХрдбрд╝реЗрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдкреЛрдВ рдореЗрдВ рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
- рдореИрдВ рдХрд▓ рдЯрд╣рд▓рдиреЗ рдЬрд╛рдКрдВрдЧрд╛
- рдореИрдВ рдХрд▓ рд░рд╛рдд рдЯрд╣рд▓рдиреЗ рдЬрд╛рдКрдВрдЧрд╛
- рдЕрдЧрд▓реЗ рдЧреБрд░реБрд╡рд╛рд░ рдореИрдВ рдлрд┐рд▓реНрдореЛрдВ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ
- рдЕрдЧрд▓реЗ рдЧреБрд░реБрд╡рд╛рд░ рдХреЛ рд░рд╛рдд 9 рдмрдЬреЗ рдореИрдВ рд╕рд┐рдиреЗрдорд╛ рджреЗрдЦрдиреЗ рдЬрд╛рддрд╛ рд╣реВрдВ
- 21 рдорд╛рд░реНрдЪ рдХреЛ рд╕реБрдмрд╣ 10 рдмрдЬреЗ рдмреИрдардХ
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рдмреНрдж рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ:
- рд╡реЗ рдЬреЛ рд╣рдореЗрд╢рд╛ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп (рдорд╣реАрдиреЛрдВ рдФрд░ рджрд┐рдиреЛрдВ рдХреЗ рдирд╛рдо) рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ
- рд╡реЗ рдЬреЛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ ("рджрд┐рди", "рд╢рд╛рдо", "рдЕрдЧрд▓рд╛", рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдкрд░ рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ)
- рд╡реЛ рдЬреЛ рдХрднреА рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рдирд╣реАрдВ
рдкрд╣рд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рднрдпрд╛рдирдХ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдерд╛ if
, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдФрд░ рд╢рдмреНрджреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдЬрд╝рд░реВрд░рдд рдереА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЖрдпрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирд╡рддрд╛ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрдВрдЬрдиред
рдЦрд╛рдирд╛ рдмрдирд╛рдирд╛ рдПрдХ рд▓рд╛рдЗрди
рд╣рдо рд▓рд╛рдЗрди рдХреЛ рдЯреЛрдХрди рдореЗрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЧреИрд░-рдЦрд╛рд▓реА рдЯреЛрдХрди рдХреЛ рдПрдХ рдПрдХрд▓ рд╡рд░реНрдг рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗред
Keywords.cs | public class Keywords |
| { |
| public static readonly string[] After = {""}; |
| public static readonly string[] AfterPostfix = {""}; |
| public static readonly string[] PreviousPostfix = {""}; |
| public static readonly string[] Next = {"", ""}; |
| public static readonly string[] Previous = {"", "", ""}; |
| public static readonly string[] Current = {"", "", ""}; |
| public static readonly string[] CurrentNext = {"", ""}; |
| |
| public static readonly string[] Today = {""}; |
| public static readonly string[] Tomorrow = {""}; |
| public static readonly string[] AfterTomorrow = {""}; |
| public static readonly string[] Yesterday = {""}; |
| public static readonly string[] BeforeYesterday = {""}; |
| |
| public static readonly string[] Holiday = {""}; |
| |
| public static readonly string[] Second = {"", ""}; |
| public static readonly string[] Minute = {"", ""}; |
| public static readonly string[] Hour = {"", ""}; |
| |
| public static readonly string[] Day = {""}; |
| public static readonly string[] Week = {""}; |
| public static readonly string[] Month = {"", ""}; |
| public static readonly string[] Year = {""}; |
| |
| public static readonly string[] Noon = {""}; |
| public static readonly string[] Morning = {""}; |
| public static readonly string[] Evening = {""}; |
| public static readonly string[] Night = {""}; |
| |
| public static readonly string[] Half = {"", ""}; |
| public static readonly string[] Quarter = {""}; |
| |
| public static readonly string[] DayInMonth = {""}; |
| public static readonly string[] January = {"", ""}; |
| public static readonly string[] February = {"", ""}; |
| public static readonly string[] March = {"", ""}; |
| public static readonly string[] April = {"", ""}; |
| public static readonly string[] May = {"", ""}; |
| public static readonly string[] June = {"", ""}; |
| public static readonly string[] July = {"", ""}; |
| public static readonly string[] August = {"", ""}; |
| public static readonly string[] September = {"", "", ""}; |
| public static readonly string[] October = {"", ""}; |
| public static readonly string[] November = {"", "", ""}; |
| public static readonly string[] December = {"", ""}; |
| |
| public static readonly string[] Monday = {"", ""}; |
| public static readonly string[] Tuesday = {"", ""}; |
| public static readonly string[] Wednesday = {"", ""}; |
| public static readonly string[] Thursday = {"", ""}; |
| public static readonly string[] Friday = {"", ""}; |
| public static readonly string[] Saturday = {"", ""}; |
| public static readonly string[] Sunday = {"", ""}; |
| |
| public static readonly string[] DaytimeDay = {"", ""}; |
| public static readonly string[] TimeFrom = {"", ""}; |
| public static readonly string[] TimeTo = {"", ""}; |
| public static readonly string[] TimeOn = {""}; |
| |
| public static List<string[]> Months() |
| { |
| return new List<string[]> |
| { |
| January, |
| February, |
| March, |
| April, |
| May, |
| June, |
| July, |
| August, |
| September, |
| October, |
| November, |
| December |
| }; |
| } |
| |
| public static List<string[]> DaysOfWeek() |
| { |
| return new List<string[]> |
| { |
| Monday, |
| Tuesday, |
| Wednesday, |
| Thursday, |
| Friday, |
| Saturday, |
| Sunday |
| }; |
| } |
| |
| |
| public List<string> AllValues() |
| { |
| var values = new List<string>(); |
| GetType() |
| .GetFields(BindingFlags.Static | BindingFlags.Public) |
| .ToList() |
| .ForEach(f => |
| { |
| var words = (string[]) f.GetValue(null); |
| words.ToList().ForEach(values.Add); |
| }); |
| |
| return values; |
| } |
| } |
рдпрд╣рд╛рдВ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдмрддрд╛рдИ рд╣реИрдВ:
рдорд╛рдиреНрдпрддрд╛
- рдУрд╣, рдЖрддрдВрдХ! - рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, - рдпрд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рд╣реЛ рдЧрдпрд╛! рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд┐рдмрд░реАрд╢ рдФрд░ рд╡реНрдпрдХреНрддрд┐ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗред рд╣рд╛рдВ, рдореБрдЭреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмреАрдЪ рдХреБрдЫ рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдиреАрдЪреЗ рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗред
рдлрд┐рд░ рд╣рдо рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд╛рдордХ рдПрдХ рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ : рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдРрд░реЗ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╣реИрдВрдбрд▓рд░ Recognizer
рдлреЛрди рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛) рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╛рдХреНрдпрд╛рдВрд╢ред
Recognizer
рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рджрд┐рдП рдЧрдП рд░реЗрдЧреЗрдХреНрд╕ рдкреИрдЯрд░реНрди рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд░рдгреА рдореЗрдВ рдкрдХрдбрд╝реЗ рдЧрдП рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
Recognizer.cs | public abstract class Recognizer |
| { |
| public void ParseTokens(DatesRawData data, DateTime userDate) |
| { |
| ForAllMatches(data.GetPattern, pattern: GetRegexPattern(), action: m => ParseMatch(data, m, userDate)); |
| } |
| |
| public static void ForAllMatches(Func<string> input, string pattern, Predicate<Match> action, bool reversed = false) |
| { |
| var matches = Regex.Matches(input.Invoke(), pattern); |
| if (matches.Count == 0) |
| { |
| return; |
| } |
| |
| var match = reversed ? matches[matches.Count - 1] : matches[0]; |
| var indexesToSkip = new HashSet<int>(); |
| |
| while (match != null && match.Success) |
| { |
| var text = input.Invoke(); |
| var matchIndex = reversed ? text.Length - match.Index : match.Index; |
| |
| if (!action.Invoke(match)) |
| { |
| indexesToSkip.Add(matchIndex); |
| } |
| |
| match = null; |
| text = input.Invoke(); |
| matches = Regex.Matches(text, pattern); |
| for (var i = 0; i < matches.Count; i++) |
| { |
| var index = reversed ? matches.Count - i - 1 : i; |
| matchIndex = reversed ? text.Length - matches[index].Index : matches[index].Index; |
| if (!indexesToSkip.Contains(matchIndex)) |
| { |
| match = matches[index]; |
| break; |
| } |
| } |
| } |
| } |
| |
| protected abstract string GetRegexPattern(); |
| |
| protected abstract bool ParseMatch(DatesRawData data, Match match, DateTime userDate); |
| } |
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЕрдзрд┐рдХ "рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕" рд╕реЗ рдХрдо рддрдХред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдкрдХреЛ "рд╕рдЦреНрдд" рд╢рдмреНрджреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ: рджрд┐рдиреЛрдВ рдХреЗ рдирд╛рдо, рдорд╣реАрдиреЗ, "рдХрд▓", "рдкрд░рд╕реЛрдВ рдХреЗ рдмрд╛рдж рдХреЗ рджрд┐рди" рдЬреИрд╕реЗ рдирд╛рдоред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣реИрдВрдбрд▓рд░ рдЬреЛ рдХрдЪреНрдЪреЗ рд╕рдВрддреБрд▓рди рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рддрд╛рд░реАрдЦ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдФрд░ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рддрд╛рд░реАрдЦ рдФрд░ рдорд╣реАрдирд╛
"((0N?)+)(M|#)";
рдпрд╣рд╛рдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЖрдХрд░реНрд╖рдг рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдХрд╛рдлреА рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рд╣рдордиреЗ рдЯреЛрдХрди рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдХреНрд░рдо рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ: 1901 рд╕реЗ рдХрдо рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЦреНрдпрд╛, рдПрдХ рджреВрд╕рд░реЗ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ "рдФрд░" рдХреЗ рдорд┐рд▓рди рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╛ рддреЛ рдорд╣реАрдиреЗ рдХрд╛ рдирд╛рдо рдпрд╛ "рд╕рдВрдЦреНрдпрд╛" рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдЪ рд╕рдореВрд╣ рдореЗрдВ рд╣рдо рддреБрд░рдВрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрддреНрд╡реЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ рддреЛ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕реЗрдЯ рд╕реЗ рд╣рдо рдЕрдВрддрд┐рдо рддрд┐рдерд┐ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, Fix
, FixPeriod
рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ FixPeriod
рдЕрдиреБрднрд╛рдЧ рд╣реЛрдЧрд╛, рд╣рдо рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
DaysMonthRecognizer.cs | public class DaysMonthRecognizer : Recognizer |
| { |
| protected override string GetRegexPattern() |
| { |
| return "((0N?)+)(M|#)"; // 24, 25, 26... 27 / |
| } |
| |
| protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) |
| { |
| var dates = new List<AbstractPeriod>(); |
| var monthFixed = false; |
| |
| // parse month |
| var mStr = data.Tokens[match.Index + match.Groups[1].Length].Value; |
| var month = ParserUtils.FindIndex(mStr, Keywords.Months()) + 1; |
| if (month == 0) month = userDate.Month; // # instead M |
| else monthFixed = true; |
| |
| // create dates |
| for (var i = match.Index; i < match.Index + match.Groups[1].Length; i++) |
| { |
| var t = data.Tokens[i]; |
| int.TryParse(t.Value, out var day); |
| if (day <= 0) continue; // this is "AND" or other token |
| |
| // current token is number, store it as a day |
| var period = new AbstractPeriod |
| { |
| Date = new DateTime( |
| userDate.Year, |
| month, |
| ParserUtils.GetDayValidForMonth(userDate.Year, month, day) |
| ) |
| }; |
| |
| // fix from week to day, and year/month if it was |
| period.Fix(FixPeriod.Week, FixPeriod.Day); |
| if (monthFixed) period.Fix(FixPeriod.Month); |
| |
| // store |
| dates.Add(period); |
| |
| // compare with last if month not fixed |
| if (!monthFixed && dates.Count > 0 && dates.Last().Date < period.Date) |
| { |
| period.Date = new DateTime( |
| userDate.Year, |
| month + 1, |
| ParserUtils.GetDayValidForMonth(userDate.Year, month + 1, day) |
| ); |
| } |
| } |
| |
| // replace all scanned tokens |
| data.ReplaceTokensByDates(match.Index, match.Length, dates.ToArray()); |
| |
| return true; |
| } |
| } |
рд╕рдордп рд╡реНрдпрддреАрдд рд╣реЛ рдЧрдпрд╛
"(i)?((0?[Ymwdhe]N?)+)([bl])?";
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рд╕рд┐рд░реНрдл рдирд┐рдпрдорд┐рдд рдореМрд╕рдо рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЧ рдХреЗ рддрдереНрдп рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдирддреАрдЬрддрди, рдореИрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ "рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ" рдФрд░ рдЕрдВрддрд┐рдо "рдмрд╛рдж рдореЗрдВ / рдкрд┐рдЫрдбрд╝реЗ" рджреЛрдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдПрдХ рдЪреЗрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
if (match.Groups[1].Success ^ match.Groups[4].Success)
рдХрд╣рд╛рдВ ^
рдЕрдирдиреНрдп рд╣реИ рдпрд╛ред
TimeSpanRecognizer.cs | public class TimeSpanRecognizer : Recognizer |
| { |
| protected override string GetRegexPattern() |
| { |
| return "(i)?((0?[Ymwdhe]N?)+)([bl])?"; // () 2 4 10 (/) |
| } |
| |
| protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) |
| { |
| if (match.Groups[1].Success ^ match.Groups[4].Success) |
| { |
| // if "after" of "before", but not both and not neither |
| var letters = match.Groups[2].Value.Select(s => s.ToString()).ToList(); |
| var lastNumber = 1; |
| var tokenIndex = match.Groups[2].Index; |
| var direction = 1; // moving to the future |
| if (match.Groups[4].Success && match.Groups[4].Value == "b") |
| { |
| direction = -1; // "before" |
| } |
| |
| var date = new AbstractPeriod |
| { |
| SpanDirection = direction, |
| }; |
| |
| // save current day to offser object |
| var offset = new DateTimeOffset(userDate); |
| |
| letters.ForEach(l => |
| { |
| switch (l) |
| { |
| case "N": // "and", skip it |
| break; |
| case "0": // number, store it |
| int.TryParse(data.Tokens[tokenIndex].Value, out lastNumber); |
| break; |
| case "Y": // year(s) |
| offset = offset.AddYears(direction * lastNumber); |
| date.FixDownTo(FixPeriod.Month); |
| lastNumber = 1; |
| break; |
| case "m": // month(s) |
| offset = offset.AddMonths(direction * lastNumber); |
| date.FixDownTo(FixPeriod.Week); |
| lastNumber = 1; |
| break; |
| case "w": // week(s) |
| offset = offset.AddDays(7 * direction * lastNumber); |
| date.FixDownTo(FixPeriod.Day); |
| lastNumber = 1; |
| break; |
| case "d": // day(s) |
| offset = offset.AddDays(direction * lastNumber); |
| date.FixDownTo(FixPeriod.Day); |
| lastNumber = 1; |
| break; |
| case "h": // hour(s) |
| offset = offset.AddHours(direction * lastNumber); |
| date.FixDownTo(FixPeriod.Time); |
| lastNumber = 1; |
| break; |
| case "e": // minute(s) |
| offset = offset.AddMinutes(direction * lastNumber); |
| date.FixDownTo(FixPeriod.Time); |
| break; |
| } |
| |
| tokenIndex++; |
| }); |
| |
| // set date |
| date.Date = new DateTime(offset.DateTime.Year, offset.DateTime.Month, offset.DateTime.Day); |
| if (date.IsFixed(FixPeriod.Time)) |
| date.Time = new TimeSpan(offset.DateTime.Hour, offset.DateTime.Minute, 0); |
| date.Span = offset - userDate; |
| |
| // remove and insert |
| data.ReplaceTokensByDates(match.Index, match.Length, date); |
| |
| return true; |
| } |
| |
| return false; |
| } |
| } |
рд╡реИрд╕реЗ, рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЬрди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╕рд╛рд▓
"(1)Y?|(0)Y";
рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдирд┐рдпрдорд┐рдд рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдиреЛрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдлрд┐рд░, рдПрдХ рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рддреБрд░рдВрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╡рд░реНрд╖ рдХреЗ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рдмреНрдж "рд╡рд░реНрд╖" рдХреЗ рдмрд┐рдирд╛, рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рджреЛ-рдЕрдВрдХреАрдп рд╕рдВрдЦреНрдпрд╛ (рдЬреЛ рдПрдХ рддрд┐рдерд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ) рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди "рд╡рд░реНрд╖" рд╢рдмреНрдж рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рднрд╛рд╡реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ "рдореЗрдВ"ред 18 рд╡рд░реНрд╖, "рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм 1918 рдпрд╛ 2018 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ 2018ред
YearRecognizer.cs | public class YearRecognizer : Recognizer |
| { |
| protected override string GetRegexPattern() |
| { |
| return "(1)Y?|(0)Y"; // [] 15 /2017 () |
| } |
| |
| protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) |
| { |
| // just year number |
| int.TryParse(data.Tokens[match.Index].Value, out var n); |
| var year = ParserUtils.GetYearFromNumber(n); |
| |
| // insert date |
| var date = new AbstractPeriod |
| { |
| Date = new DateTime(year, 1, 1) |
| }; |
| date.Fix(FixPeriod.Year); |
| |
| // remove and insert |
| data.ReplaceTokensByDates(match.Index, match.Length, date); |
| |
| return true; |
| } |
| } |
рд╕рдордп
"([rvgd])?([fot])?(Q|H)?(h|(0)(h)?)((0)e?)?([rvgd])?";
рдореЗрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджрд┐рди рдХреЗ рд╕рдордп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╕реБрдмрд╣ 9.30 рдмрдЬреЗ рд╕реЗ рдПрдХ рдЪреМрдерд╛рдИ рд╕реЗ 11 рдмрдЬреЗ рддрдХред
TimeRecognizer.cs | public class TimeRecognizer : Recognizer |
| { |
| protected override string GetRegexPattern() |
| { |
| return "([rvgd])?([fot])?(Q|H)?(h|(0)(h)?)((0)e?)?([rvgd])?"; // (//) (/) /9 () (30 ()) (///) |
| } |
| |
| protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate) |
| { |
| // determine if it is time |
| if ( |
| match.Groups[5].Success // |
| || match.Groups[6].Success // "" |
| || match.Groups[4].Success // "" |
| || match.Groups[1].Success // "///" |
| || match.Groups[9].Success // |
| ) |
| { |
| if (!match.Groups[5].Success) |
| { |
| // no number in phrase |
| var partOfDay = match.Groups[9].Success |
| ? match.Groups[9].Value |
| : match.Groups[1].Success |
| ? match.Groups[1].Value |
| : ""; |
| |
| // no part of day AND no "from" token in phrase, quit |
| if (partOfDay != "d" && partOfDay != "g" && !match.Groups[2].Success) |
| { |
| return false; |
| } |
| } |
| |
| // hours and minutes |
| var hours = match.Groups[5].Success ? int.Parse(data.Tokens[match.Groups[5].Index].Value) : 1; |
| if (hours >= 0 && hours <= 23) |
| { |
| // try minutes |
| var minutes = 0; |
| if (match.Groups[8].Success) |
| { |
| var m = int.Parse(data.Tokens[match.Groups[8].Index].Value); |
| if (m >= 0 && m <= 59) minutes = m; |
| } |
| else if (match.Groups[3].Success && hours > 0) |
| { |
| switch (match.Groups[3].Value) |
| { |
| case "Q": // quarter |
| hours--; |
| minutes = 15; |
| break; |
| case "H": // half |
| hours--; |
| minutes = 30; |
| break; |
| } |
| } |
| |
| // create time |
| var date = new AbstractPeriod(); |
| date.Fix(FixPeriod.TimeUncertain); |
| if (hours > 12) date.Fix(FixPeriod.Time); |
| |
| // correct time |
| if (hours <= 12) |
| { |
| var part = "d"; // default |
| if (match.Groups[9].Success || match.Groups[1].Success) |
| { |
| // part of day |
| part = match.Groups[1].Success ? match.Groups[1].Value : match.Groups[9].Value; |
| date.Fix(FixPeriod.Time); |
| } |
| else |
| { |
| date.Fix(FixPeriod.TimeUncertain); |
| } |
| |
| switch (part) |
| { |
| case "d": // day |
| if (hours <= 4) hours += 12; |
| break; |
| case "v": // evening |
| if (hours <= 11) hours += 12; |
| break; |
| case "g": // night |
| hours += 12; |
| break; |
| } |
| |
| if (hours == 24) hours = 0; |
| } |
| |
| date.Time = new TimeSpan(hours, minutes, 0); |
| |
| // remove and insert |
| var toTime = data.Tokens[match.Index]; |
| data.ReplaceTokensByDates(match.Index, match.Length, date); |
| |
| if (match.Groups[2].Success && match.Groups[2].Value == "t") |
| { |
| // return "to" to correct period parsing |
| data.ReturnTokens(match.Index, "t", toTime); |
| } |
| |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| } |
рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╕рднреА рд╣реИрдВрдбрд▓рд░
рдкреНрд░рдгрд╛рд▓реА рдореЙрдбреНрдпреВрд▓рд░ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдЬреЛрдбрд╝ / рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдХреНрд░рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореИрдВрдиреЗ рдЗрдирдореЗрдВ рд╕реЗ 11 рдХреЛ рдмрдирд╛рдпрд╛ (рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░рдо рдореЗрдВ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ):
1 "" "" "" " ",
рдПрдХ рд╕рд╛рде рд╕реАрдирд╛
рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрд┐рдерд┐-рд╕рдордп рдЯреЛрдХрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЛрдХрди рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рджрд┐рди рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдордп рдХрд╛ред рдпрд╛ рдорд╣реАрдиреЗ рдФрд░ рджрд┐рди рдХрд╛ рдирд╛рдоред рдпрджрд┐ рд╡рд╣ рдХреЗрд╡рд▓ рд╕рдордп рдХрд╣рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЖрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕реБрдзрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдирд╛рдВрдХ-рд╕рдордп рдЯреЛрдХрди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рд╣реИ, рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреМрди рд╕реЗ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рддрддреНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВред
public enum FixPeriod { None = 0, Time = 1, TimeUncertain = 2, Day = 4, Week = 8, Month = 16, Year = 32 }
TimeUncertain
рдЙрд╕ рд╕рдордп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╢реЛрдзрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдо / рд╕реБрдмрд╣ ред рдЗрд╕реЗ рд╕реБрдмрд╣ 18 рдмрдЬреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╢рд╛рдо рдХреЛ 6 рдмрдЬреЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ 6
рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рд╕рдВрдЦреНрдпрд╛ 18
рдореБрдХрд╛рдмрд▓реЗ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо "рдирд┐рд╢реНрдЪрд┐рддрддрд╛" рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рджреЛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
- рдпрджрд┐ рддрд┐рдерд┐рдпрд╛рдВ рдирд┐рдХрдЯ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрдо рдмрд┐рдЯреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛ рджреЗрддреЗ рд╣реИрдВ
- рдпрджрд┐ рддрд┐рдерд┐рдпрд╛рдВ рдирд┐рдХрдЯ рд╣реИрдВ, рдФрд░ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмрд┐рдЯреНрд╕ рд╣реИрдВ рдЬреЛ рджреВрд╕рд░реЗ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдмрд┐рдЯреНрд╕ (рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрд░реВрдк рдореВрд▓реНрдпреЛрдВ) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡реЗ рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП: рдЕрд░реНрдерд╛рддреН, рд╣рдо рдПрдХ рджрд┐рди рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдорд╣реАрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рджрд┐рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдорд╣реАрдирд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЛрдорд╡рд╛рд░ рдХреЛ рд░рд╛рдд 9 рдмрдЬреЗ рдмреЛрд▓рддрд╛ рд╣реИ, рддреЛ рд╕реЛрдорд╡рд╛рд░ рдХреЛ рдЯреЛрдХрди, рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рджрд┐рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдХреЛ 9 рдмрдЬреЗ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡рд╣ рджрд┐рди рдХреЗ 10 рдФрд░ 15 рдорд╛рд░реНрдЪ рдореЗрдВ рдХрд╣рддрд╛ рд╣реИ , рддреЛ рджрд┐рди рдХреЗ 15 рдкрд░ рдЖрдЦрд┐рд░реА рдЯреЛрдХрди рдмрд╕ рдорд╛рд░реНрдЪ рдХреЗ рдорд╣реАрдиреЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЯреЛрдХрди рд╕реЗ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
рд╕рдВрдШ рддреБрдЪреНрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рдо рдмрд╕ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рд╣рдо рдЙрд╕ рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдХреЛ рдХрд╣реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рджреНрд╡рд┐рддреАрдп, рдЬрд┐рд╕рд╕реЗ рд╣рдо рдХреБрдЫ рдЙрдзрд╛рд░ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдорд╛рдзреНрдпрдорд┐рдХ рддрд┐рдерд┐ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЙрди рдмрд┐рдЯреНрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдзрд╛рд░ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ:
var baseDate = data.Dates[firstIndex]; var secondDate = data.Dates[secondIndex]; var secondCopy = secondDate.CopyOf(); secondCopy.Fixed &= (byte)~baseDate.Fixed;
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдзрд╛рд░ рдореЗрдВ рдПрдХ рд╡рд░реНрд╖ рдерд╛, рддреЛ рд╣рдо рдирд╛рдмрд╛рд▓рд┐рдЧ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд▓рд┐рдП рд╡рд░реНрд╖ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝реЗрдВрдЧреЗ (рднрд▓реЗ рд╣реА рд╡рд╣ рдерд╛)ред рдпрджрд┐ рдЖрдзрд╛рд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рдорд╣реАрдирд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдорд╛рдзреНрдпрдорд┐рдХ рдХреЗ рдкрд╛рд╕ рд╣реИ, рддреЛ рд╡рд╣ рджреНрд╡рд┐рддреАрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд╕рд╛рде рд░рд╣реЗрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдФрд░ рдорд╛рдзреНрдпрдорд┐рдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдФрд░ рдПрдХ рдЕрд╡рд╢реЛрд╖рд┐рдд рднреА рд╣реЛрддреА рд╣реИ ред рд╣рдо рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЕрд╡рдзрд┐ (рд╡рд░реНрд╖) рд╕реЗ тАЛтАЛрд╕рдмрд╕реЗ рдЫреЛрдЯреЗ (рд╕рдордп) рд╕реЗ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдореЗрдВ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрд╡рд╢реЛрд╖рд┐рдд рдПрдХ рдХреЗ рдЖрдзрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
Collapse.cs | public static bool CanCollapse(AbstractPeriod basePeriod, AbstractPeriod coverPeriod) |
| { |
| if ((basePeriod.Fixed & coverPeriod.Fixed) != 0) return false; |
| return basePeriod.SpanDirection != -coverPeriod.SpanDirection || basePeriod.SpanDirection == 0; |
| } |
| |
| public static bool CollapseTwo(AbstractPeriod basePeriod, AbstractPeriod coverPeriod) |
| { |
| if (!CanCollapse(basePeriod, coverPeriod)) return false; |
| |
| // if span |
| if (basePeriod.SpanDirection != 0) |
| { |
| if (coverPeriod.SpanDirection != 0) |
| { |
| // if another date is Span, just add spans together |
| basePeriod.Span += coverPeriod.Span; |
| } |
| } |
| |
| // take year if it is not here, but is in other date |
| if (!basePeriod.IsFixed(FixPeriod.Year) && coverPeriod.IsFixed(FixPeriod.Year)) |
| { |
| basePeriod.Date = new DateTime(coverPeriod.Date.Year, basePeriod.Date.Month, basePeriod.Date.Day); |
| basePeriod.Fix(FixPeriod.Year); |
| } |
| |
| // take month if it is not here, but is in other date |
| if (!basePeriod.IsFixed(FixPeriod.Month) && coverPeriod.IsFixed(FixPeriod.Month)) |
| { |
| basePeriod.Date = new DateTime(basePeriod.Date.Year, coverPeriod.Date.Month, basePeriod.Date.Day); |
| basePeriod.Fix(FixPeriod.Month); |
| } |
| |
| // week and day |
| if (!basePeriod.IsFixed(FixPeriod.Week) && coverPeriod.IsFixed(FixPeriod.Week)) |
| { |
| // the week is in another date, check where is a day |
| if (basePeriod.IsFixed(FixPeriod.Day)) |
| { |
| // set day of week, take date |
| basePeriod.Date = TakeDayOfWeekFrom(coverPeriod.Date, basePeriod.Date); |
| basePeriod.Fix(FixPeriod.Week); |
| } |
| else if (!coverPeriod.IsFixed(FixPeriod.Day)) |
| { |
| // only week here, take it by taking a day |
| basePeriod.Date = new DateTime(basePeriod.Date.Year, basePeriod.Date.Month, coverPeriod.Date.Day); |
| basePeriod.Fix(FixPeriod.Week); |
| } |
| } |
| else if (basePeriod.IsFixed(FixPeriod.Week) && coverPeriod.IsFixed(FixPeriod.Day)) |
| { |
| // here is a week, but day of week in other date |
| basePeriod.Date = TakeDayOfWeekFrom(basePeriod.Date, coverPeriod.Date); |
| basePeriod.Fix(FixPeriod.Week, FixPeriod.Day); |
| } |
| |
| // day |
| if (!basePeriod.IsFixed(FixPeriod.Day) && coverPeriod.IsFixed(FixPeriod.Day)) |
| { |
| if (coverPeriod.FixDayOfWeek) |
| { |
| // take only day of week from cover |
| basePeriod.Date = TakeDayOfWeekFrom( |
| new DateTime( |
| basePeriod.Date.Year, basePeriod.Date.Month, |
| basePeriod.IsFixed(FixPeriod.Week) ? basePeriod.Date.Day : 1 |
| ), |
| coverPeriod.Date, |
| !basePeriod.IsFixed(FixPeriod.Week) |
| ); |
| basePeriod.Fix(FixPeriod.Week, FixPeriod.Day); |
| } |
| else |
| { |
| // take day from cover |
| basePeriod.Date = new DateTime(basePeriod.Date.Year, basePeriod.Date.Month, coverPeriod.Date.Day); |
| basePeriod.Fix(FixPeriod.Week, FixPeriod.Day); |
| } |
| } |
| |
| // time |
| var timeGot = false; |
| |
| if (!basePeriod.IsFixed(FixPeriod.Time) && coverPeriod.IsFixed(FixPeriod.Time)) |
| { |
| basePeriod.Fix(FixPeriod.Time); |
| if (!basePeriod.IsFixed(FixPeriod.TimeUncertain)) |
| { |
| basePeriod.Time = coverPeriod.Time; |
| } |
| else |
| { |
| if (basePeriod.Time.Hours <= 12 && coverPeriod.Time.Hours > 12) |
| { |
| basePeriod.Time += new TimeSpan(12, 0, 0); |
| } |
| } |
| |
| timeGot = true; |
| } |
| |
| if (!basePeriod.IsFixed(FixPeriod.TimeUncertain) && coverPeriod.IsFixed(FixPeriod.TimeUncertain)) |
| { |
| basePeriod.Fix(FixPeriod.TimeUncertain); |
| if (basePeriod.IsFixed(FixPeriod.Time)) |
| { |
| // take time from cover, but day part from base |
| var offset = coverPeriod.Time.Hours <= 12 && basePeriod.Time.Hours > 12 ? 12 : 0; |
| basePeriod.Time = new TimeSpan(coverPeriod.Time.Hours + offset, coverPeriod.Time.Minutes, 0); |
| } |
| else |
| { |
| basePeriod.Time = coverPeriod.Time; |
| timeGot = true; |
| } |
| } |
| |
| // if this date is Span and we just got time from another non-span date, add this time to Span |
| if (timeGot && basePeriod.SpanDirection != 0 && coverPeriod.SpanDirection == 0) |
| { |
| basePeriod.Span += basePeriod.SpanDirection == 1 ? basePeriod.Time : -basePeriod.Time; |
| } |
| |
| // set tokens edges |
| basePeriod.Start = Math.Min(basePeriod.Start, coverPeriod.Start); |
| basePeriod.End = Math.Max(basePeriod.End, coverPeriod.End); |
| |
| return true; |
| } |
рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдЖрдкрдХреЛ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛:
- рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдПрдХ рджрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдкреНрддрд╛рд╣ рдирд╣реАрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рддрд┐рдерд┐ рд╕реЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзрд╛рд░ рд╕реЗ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рджрд┐рдиред
- рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЕрд╡рд╢реЛрд╖рд┐рдд рддрд┐рдерд┐ рдХрд╛ рдПрдХ рджрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдкреНрддрд╛рд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЙрд╕ рджрд┐рди рд╕реЗ (рдпрд╛рдиреА, рд╡рд░реНрд╖ + рдорд╣реАрдирд╛ + рддрд┐рдерд┐) рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рдкреНрддрд╛рд╣ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
DateTime
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рдЕрд▓рдЧ рдЗрдХрд╛рдИ "рд╕рдкреНрддрд╛рд╣" рдирд╣реАрдВ рд╣реИред - рдпрджрд┐ рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдкрд░
TimeUncertain
рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ Time
рдЕрд╡рд╢реЛрд╖рд┐рдд рдПрдХ рдкрд░ рдЕрд╡рд╢реЛрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрд╡рд╢реЛрд╖рд┐рдд рдПрдХ рдкрд░ рдШрдВрдЯреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ 12 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдзрд╛рд░ рдПрдХ рдХрдо рд╣реИ, рддреЛ рдЖрдзрд╛рд░ рдореЗрдВ 12 рдШрдВрдЯреЗ рдЬреЛрдбрд╝реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╢рд╛рдо рдХреЛ 5 рд╕реЗ 17 рддрдХ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред "рдЕрдирд┐рд╢реНрдЪрд┐рдд" рддрд┐рдерд┐ рдХрд╛ рд╕рдордп рджрд┐рди рдХреЗ рдПрдХ рдЖрдзреЗ рднрд╛рдЧ рд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ "рдЖрд╢реНрд╡рд╕реНрдд" рддрд┐рдерд┐ рдХрд╛ рд╕рдордп рджрд┐рди рдХреЗ рджреВрд╕рд░реЗ рдЫрдорд╛рд╣реА рд╕реЗ рд╣реИред рд▓реЛрдЧ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕реБрдмрд╣ 5 рдмрдЬреЗ рд╕реЗ рд╢рд╛рдо 5 рдмрдЬреЗ рддрдХ рд╣реИ , рддреЛ рджреЛрдиреЛрдВ рддрд┐рдерд┐рдпреЛрдВ рдореЗрдВ рдПрдХ "рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕" рд╕рдордп рд╣реИ, рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдХреБрдЫ рддрд┐рдерд┐рдпреЛрдВ рдореЗрдВ рд░рд┐рдХреНрдд рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╡рд░реНрд╖ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд░реНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдиреЗ рдорд╣реАрдиреЗ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдорд╣реАрдирд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдмреЗрд╢рдХ, рдХрд┐рд╕реА рднреА DateTime
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП "рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмреИрд╕рд╛рдЦреА
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдХреНрд╖рдгреЛрдВ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреИрд╕рд╛рдЦреА рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:
- рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╕рдВрдпреЛрдЬрди рдХреА рддрд╛рд░реАрдЦреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ "b \ s \ co" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ рд╕реЗ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВ рдЬреЛ "рд╕реЗ \ _ рдкрд░" рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрд╡рдзрд┐ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рд░рдВрдн рддрд┐рдерд┐ рдФрд░ рдЕрдВрддрд┐рдо рддрд┐рдерд┐ рд╕реЗ рдЯреЛрдХрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
- рдореИрдВрдиреЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрдзрд╛рд░рдг рд╕реНрддрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬрдЧрд╣ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрдж рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЭрдВрдбрд╛ рдмрдирд╛рдпрд╛ред
- рдПрдХ рдЕрд▓рдЧ рд░рди рддрд╛рд░реАрдЦреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджреВрд░реА рдкрд░ рд╣реИрдВред рдпрд╣
collapseDistance
рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 4 рдЯреЛрдХрди рд╣реИред рдпрд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛рдо рдХрд░реЗрдЧрд╛: рдХрд▓ рдХреЗ рдмрд╛рдж рдХрд╛ рджрд┐рди, 12 рдореЗрдВ рдПрдХ рджреЛрд╕реНрдд рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдардХ ред рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛: рдкрд░рд╕реЛрдВ рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд┐рдп рдФрд░ рдЕрджреНрднреБрдд рджреЛрд╕реНрдд рд╕реЗ 12 рдмрдЬреЗ рдорд┐рд▓реВрдВрдЧрд╛ ред
рдкрд░рд┐рдгрд╛рдо

- рдЖрдк рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рдФрд░ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд▓рдЧрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд▓реЛрдЧ рдЬреАрд╡рди рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред
- .NET рдлреЗрд▓реНрдб рдкрд░ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдб рдХреЛ рдХрдерд┐рдд рддреМрд░ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдХрдВрд╕реЛрд▓ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдЖрдк рд░реВрд╕реА рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдирд╣реАрдВ рднреВрд▓ рд╕рдХрддреЗ рдХрд┐ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
- рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдорд╛рди рдбреЗрдореЛ
рд▓рд╛рдЗрд╡ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛: