рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рдг рдореЗрдВ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ


рдХрд╛рд░реНрдп


рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдРрд▓рд┐рд╕ рдХреЗ рд▓рд┐рдП рдХреМрд╢рд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд▓рдЧрд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд▓рд╛рдн рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдЗрдЯ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд╛рдВрдд рдЧреЗрдо рд╣реИрдВ (рдореЗрд░рд╛ рд╕рд╣рд┐рдд), рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдХрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╛рдЬ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЬрд░реВрд░реА рд╣реЛ, рдФрд░ рди рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдЪреИрдЯ рдмреЙрдЯ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдмрдЯрди рдХреЗ рд╕рд╛рдеред


рдЖрд╡рд╛рдЬ рддрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрддреА рд╣реИ рдЬрдм рдпрд╛ рддреЛ рд╣рд╛рде рд╡реНрдпрд╕реНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдкрдХреЛ рдХрдИ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдлреЛрди рд╕реНрдХреНрд░реАрди рдкрд░ред рддреЛ рдПрдХ рдХреМрд╢рд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЬреЛ рдПрдХ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛, рдкрд╛рда рд╕реЗ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдХреЛ 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 рдмрдЬреЗ рдмреИрдардХ


рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рдмреНрдж рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ:


  1. рд╡реЗ рдЬреЛ рд╣рдореЗрд╢рд╛ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп (рдорд╣реАрдиреЛрдВ рдФрд░ рджрд┐рдиреЛрдВ рдХреЗ рдирд╛рдо) рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ
  2. рд╡реЗ рдЬреЛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ ("рджрд┐рди", "рд╢рд╛рдо", "рдЕрдЧрд▓рд╛", рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдкрд░ рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ)
  3. рд╡реЛ рдЬреЛ рдХрднреА рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рдирд╣реАрдВ

рдкрд╣рд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рднрдпрд╛рдирдХ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдерд╛ if , рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдФрд░ рд╢рдмреНрджреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдЬрд╝рд░реВрд░рдд рдереА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЖрдпрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирд╡рддрд╛ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрдВрдЬрдиред


рдЦрд╛рдирд╛ рдмрдирд╛рдирд╛ рдПрдХ рд▓рд╛рдЗрди


рд╣рдо рд▓рд╛рдЗрди рдХреЛ рдЯреЛрдХрди рдореЗрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЧреИрд░-рдЦрд╛рд▓реА рдЯреЛрдХрди рдХреЛ рдПрдХ рдПрдХрд▓ рд╡рд░реНрдг рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗред


рдЯреЛрдХрди (рд╢рдмреНрдж)рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рддреАрдХ
"рд╡рд░реНрд╖"Y
рдорд╣реАрдиреЗ рдХрд╛ рдирд╛рдордПрдо
рд╕рдкреНрддрд╛рд╣ рдХрд╛ рдирд╛рдордбреА
"рдкрд┐рдЫрдбрд╝рд╛"рдЦ
"рдмрд╛рдж рдореЗрдВ"рдПрд▓ (рдХрдо рдПрд▓)
"рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ"рдореИрдВ
"рджрд┐рди рдмрдВрдж"рдбрдмреНрд▓реНрдпреВ
"рдорд┐рдирдЯ"рдИ
"рдШрдВрдЯреЗ"рдЬ
"рджрд┐рд╡рд╕"рдШ
"рд╕рдкреНрддрд╛рд╣"w
"рдорд╣реАрдирд╛"рдореАрдЯрд░
"рдЕрддреАрдд", "рдЕрддреАрдд", "рдкрд┐рдЫрд▓рд╛"рд░реЛрдВ
"рдпрд╣", "рд╡рд░реНрддрдорд╛рди", "рд╡рд░реНрддрдорд╛рди"рдпреВ
"рдирд┐рдХрдЯрддрдо", "рднрд╡рд┐рд╖реНрдп"y
"рдЕрдЧрд▓рд╛", "рднрд╡рд┐рд╖реНрдп"рдПрдХреНрд╕
"рдкрд░рд╕реЛрдВ"6
"рдХрд▓"5
"рдЖрдЬ"4
"рдХрд▓"3
"рдХрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рджрд┐рди"2
"рдореЙрд░реНрдирд┐рдВрдЧ"рдЖрд░
"рджреЛрдкрд╣рд░"n
"рд╢рд╛рдо"v
"рд░рд╛рдд"рдЬреА
"рдЖрдзрд╛"рдПрдЪ
"рдХреНрд╡рд╛рд░реНрдЯрд░"рдХреНрдпреВ
рд╕реА, рд╕реАрдЪ
"рд╕реЗ", "рджреНрд╡рд╛рд░рд╛"рдЯреА
"рдЪрд╛рд▓реВ"рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
"рд╕рдВрдЦреНрдпрд╛"#
"рдФрд░"рдПрди
рд╕рдВрдЦреНрдпрд╛ 1900 рд╕реЗ рдЕрдзрд┐рдХ рдФрд░ 9999 рд╕реЗ рдХрдо рд╣реИ1
рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ 1901 рд╕реЗ рдХрдо рд╣реИ0
рджрд┐рдирд╛рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд@
рдХреЛрдИ рдЕрдиреНрдп рдЯреЛрдХрди_

ParserExtractors.cs
internal static class ParserExtractors
{
internal static string CreatePatternFromToken(string token)
{
var t = token.ToLower().Replace("[^0-9--]", "").Trim();
if (Morph.HasOneOfLemmas(t, Keywords.Year)) return "Y";
if (Morph.HasOneOfLemmas(t, Keywords.Months().ToArray())) return "M";
if (Morph.HasOneOfLemmas(t, Keywords.DaysOfWeek().ToArray())) return "D";
if (Morph.HasOneOfLemmas(t, Keywords.PreviousPostfix)) return "b";
if (Morph.HasOneOfLemmas(t, Keywords.AfterPostfix)) return "l";
if (Morph.HasOneOfLemmas(t, Keywords.After)) return "i";
if (Morph.HasOneOfLemmas(t, Keywords.Holiday)) return "W";
var p = PeriodFromToken(t);
switch (p)
{
case Period.Minute:
return "e";
case Period.Hour:
return "h";
case Period.Day:
return "d";
case Period.Week:
return "w";
case Period.Month:
return "m";
}
var r = RelativeModeFromToken(t);
switch (r)
{
case RelativeMode.Previous:
return "s";
case RelativeMode.Current:
return "u";
case RelativeMode.CurrentNext:
return "y";
case RelativeMode.Next:
return "x";
}
var n = NeighbourDaysFromToken(t);
if (n > int.MinValue)
{
return (n + 4).ToString();
}
var d = DaytimeFromToken(t);
switch (d)
{
case DayTime.Morning:
return "r";
case DayTime.Noon:
return "n";
case DayTime.Day:
return "a";
case DayTime.Evening:
return "v";
case DayTime.Night:
return "g";
}
var pt = PartTimeFromToken(t);
switch (pt)
{
case PartTime.Quarter:
return "Q";
case PartTime.Half:
return "H";
}
if (int.TryParse(t, out var c))
{
if (c < 0 || c > 9999) return "_";
if (c > 1900) return "1";
return "0";
}
if (Morph.HasOneOfLemmas(t, Keywords.TimeFrom)) return "f";
if (Morph.HasOneOfLemmas(t, Keywords.TimeTo)) return "t";
if (Morph.HasOneOfLemmas(t, Keywords.TimeOn)) return "o";
if (Morph.HasOneOfLemmas(t, Keywords.DayInMonth)) return "#";
if (t == "") return "N";
return "_";
}
private static PartTime PartTimeFromToken(string t)
{
if (Morph.HasOneOfLemmas(t, Keywords.Quarter)) return PartTime.Quarter;
if (Morph.HasOneOfLemmas(t, Keywords.Half)) return PartTime.Half;
return PartTime.None;
}
private static DayTime DaytimeFromToken(string t)
{
if (Morph.HasOneOfLemmas(t, Keywords.Noon)) return DayTime.Noon;
if (Morph.HasOneOfLemmas(t, Keywords.Morning)) return DayTime.Morning;
if (Morph.HasOneOfLemmas(t, Keywords.Evening)) return DayTime.Evening;
if (Morph.HasOneOfLemmas(t, Keywords.Night)) return DayTime.Night;
if (Morph.HasOneOfLemmas(t, Keywords.DaytimeDay)) return DayTime.Day;
return DayTime.None;
}
private static Period PeriodFromToken(string t)
{
if (Morph.HasOneOfLemmas(t, Keywords.Year)) return Period.Year;
if (Morph.HasOneOfLemmas(t, Keywords.Month)) return Period.Month;
if (Morph.HasOneOfLemmas(t, Keywords.Week)) return Period.Week;
if (Morph.HasOneOfLemmas(t, Keywords.Day)) return Period.Day;
if (Morph.HasOneOfLemmas(t, Keywords.Hour)) return Period.Hour;
if (Morph.HasOneOfLemmas(t, Keywords.Minute)) return Period.Minute;
return Period.None;
}
private static int NeighbourDaysFromToken(string t)
{
if (Morph.HasOneOfLemmas(t, Keywords.Tomorrow)) return 1;
if (Morph.HasOneOfLemmas(t, Keywords.Today)) return 0;
if (Morph.HasOneOfLemmas(t, Keywords.AfterTomorrow)) return 2;
if (Morph.HasOneOfLemmas(t, Keywords.Yesterday)) return -1;
if (Morph.HasOneOfLemmas(t, Keywords.BeforeYesterday)) return -2;
return int.MinValue;
}
internal static RelativeMode RelativeModeFromToken(string t)
{
if (Morph.HasOneOfLemmas(t, Keywords.Current)) return RelativeMode.Current;
if (Morph.HasOneOfLemmas(t, Keywords.Next)) return RelativeMode.Next;
if (Morph.HasOneOfLemmas(t, Keywords.Previous)) return RelativeMode.Previous;
if (Morph.HasOneOfLemmas(t, Keywords.CurrentNext)) return RelativeMode.CurrentNext;
return RelativeMode.None;
}
}
view raw ParserExtractors.cs hosted with тЭд by GitHub

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;
}
}
view raw Keywords.cs hosted with тЭд by GitHub

рдпрд╣рд╛рдВ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдмрддрд╛рдИ рд╣реИрдВ:


рдкрдВрдХреНрддрд┐рдкрд░рд┐рдгрд╛рдо
рдореИрдВ рдХрд▓ рдЯрд╣рд▓рдиреЗ рдЬрд╛рдКрдВрдЧрд╛5__
рдХрд▓ рд╢рд╛рдо рдореИрдВ рдЯрд╣рд▓рдиреЗ рдЬрд╛рдКрдВрдЧрд╛5v__
рдЕрдЧрд▓реЗ рдЧреБрд░реБрд╡рд╛рд░ рдХреЛ рдореИрдВ рдлрд┐рд▓реНрдореЛрдВ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВfxD_f_
рдЕрдЧрд▓реЗ рдЧреБрд░реБрд╡рд╛рд░ рдХреЛ рд░рд╛рдд 9 рдмрдЬреЗ рдореИрдВ рд╕рд┐рдиреЗрдорд╛ рджреЗрдЦрдиреЗ рдЬрд╛рддрд╛ рд╣реВрдБfxDf0v_f_
21 рдорд╛рд░реНрдЪ рдХреЛ рд╕реБрдмрд╣ 10 рдмрдЬреЗ рдмреИрдардХ0Mf0r_

рдорд╛рдиреНрдпрддрд╛


- рдУрд╣, рдЖрддрдВрдХ! - рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, - рдпрд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рд╣реЛ рдЧрдпрд╛! рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд┐рдмрд░реАрд╢ рдФрд░ рд╡реНрдпрдХреНрддрд┐ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗред рд╣рд╛рдВ, рдореБрдЭреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмреАрдЪ рдХреБрдЫ рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдиреАрдЪреЗ рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗред


рдлрд┐рд░ рд╣рдо рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд╛рдордХ рдПрдХ рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ : рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдРрд░реЗ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╣реИрдВрдбрд▓рд░ 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);
}
view raw Recognizer.cs hosted with тЭд by GitHub

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЕрдзрд┐рдХ "рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕" рд╕реЗ рдХрдо рддрдХред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдкрдХреЛ "рд╕рдЦреНрдд" рд╢рдмреНрджреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд╛рд░реАрдЦреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ: рджрд┐рдиреЛрдВ рдХреЗ рдирд╛рдо, рдорд╣реАрдиреЗ, "рдХрд▓", "рдкрд░рд╕реЛрдВ рдХреЗ рдмрд╛рдж рдХреЗ рджрд┐рди" рдЬреИрд╕реЗ рдирд╛рдоред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣реИрдВрдбрд▓рд░ рдЬреЛ рдХрдЪреНрдЪреЗ рд╕рдВрддреБрд▓рди рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рддрд╛рд░реАрдЦ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдФрд░ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


рддрд╛рд░реАрдЦ рдФрд░ рдорд╣реАрдирд╛


 "((0N?)+)(M|#)"; // 24, 25, 26...  27 / 

рдпрд╣рд╛рдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЖрдХрд░реНрд╖рдг рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдХрд╛рдлреА рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рд╣рдордиреЗ рдЯреЛрдХрди рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдХреНрд░рдо рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ: 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;
}
}
view raw DaysMonthRecognizer.cs hosted with тЭд by GitHub

рд╕рдордп рд╡реНрдпрддреАрдд рд╣реЛ рдЧрдпрд╛


 "(i)?((0?[Ymwdhe]N?)+)([bl])?"; // ()     2  4  10  (/) 

рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рд╕рд┐рд░реНрдл рдирд┐рдпрдорд┐рдд рдореМрд╕рдо рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЧ рдХреЗ рддрдереНрдп рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдирддреАрдЬрддрди, рдореИрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ "рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ" рдФрд░ рдЕрдВрддрд┐рдо "рдмрд╛рдж рдореЗрдВ / рдкрд┐рдЫрдбрд╝реЗ" рджреЛрдиреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдПрдХ рдЪреЗрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:


 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;
}
}
view raw TimeSpanRecognizer.cs hosted with тЭд by GitHub

рд╡реИрд╕реЗ, рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЬрди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╕рд╛рд▓


 "(1)Y?|(0)Y"; // [] 15 /2017 () 

рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдирд┐рдпрдорд┐рдд рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдиреЛрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдлрд┐рд░, рдПрдХ рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рддреБрд░рдВрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╡рд░реНрд╖ рдХреЗ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рдмреНрдж "рд╡рд░реНрд╖" рдХреЗ рдмрд┐рдирд╛, рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рджреЛ-рдЕрдВрдХреАрдп рд╕рдВрдЦреНрдпрд╛ (рдЬреЛ рдПрдХ рддрд┐рдерд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ) рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди "рд╡рд░реНрд╖" рд╢рдмреНрдж рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рднрд╛рд╡реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ "рдореЗрдВ"ред 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;
}
}
view raw YearRecognizer.cs hosted with тЭд by GitHub

рд╕рдордп


 "([rvgd])?([fot])?(Q|H)?(h|(0)(h)?)((0)e?)?([rvgd])?"; // (//) (/) /9 () (30 ()) (///) 

рдореЗрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджрд┐рди рдХреЗ рд╕рдордп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╕реБрдмрд╣ 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;
}
}
view raw TimeRecognizer.cs hosted with тЭд by GitHub

рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╕рднреА рд╣реИрдВрдбрд▓рд░


рдкреНрд░рдгрд╛рд▓реА рдореЙрдбреНрдпреВрд▓рд░ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдЬреЛрдбрд╝ / рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдХреНрд░рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореИрдВрдиреЗ рдЗрдирдореЗрдВ рд╕реЗ 11 рдХреЛ рдмрдирд╛рдпрд╛ (рдЖрд╡реЗрджрди рдХреЗ рдХреНрд░рдо рдореЗрдВ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ):


рд╣реИрдВрдбрд▓рд░regexрд▓рд╛рдЗрди рдЙрджрд╛рд╣рд░рдг
HolidaysRecognizer.cs 1Wрд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ , рд╕рдкреНрддрд╛рд╣рд╛рдВрдд
DatesPeriodRecognizer.csf?(0)[ot]0(M|#)26 рдЬрдирд╡рд░реА рд╕реЗ 27 рдЬрдирд╡рд░реА / рддрд╛рд░реАрдЦ
DaysMonthRecognizer.cs((0N?)+)(M|#)24 рдЬрдирд╡рд░реА, 25, 26 ... рдФрд░ 27 рдЬрдирд╡рд░реА / рддрд╛рд░реАрдЦ
MonthRecognizer.cs([usxy])?M[рдЗрди] (рдЕрддреАрдд / рдпрд╣ / рдЕрдЧрд▓рд╛) рдорд╛рд░реНрдЪ
RelativeDayRecognizer.cs[2-6]рдХрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рджрд┐рди, рдХрд▓, рдЖрдЬ, рдкрд░рд╕реЛрдВ, рдкрд░рд╕реЛрдВ
TimeSpanRecognizer.cs(i)?((0?[Ymwdhe]N?)+)([bl])?(рдореЗрдВ) рд╡рд░реНрд╖ рдФрд░ рдорд╣реАрдиреЗ рдФрд░ 2 рджрд┐рди 4 рдШрдВрдЯреЗ 10 рдорд┐рдирдЯ (рдмрд╛рдж рдореЗрдВ / рд╡рд╛рдкрд╕)
YearRecognizer.cs(1)Y?|(0)Y[рдореЗрдВ] 15 рд╕рд╛рд▓ / 2017 (рд╡рд░реНрд╖)
RelativeDateRecognizer.cs([usxy])([Ymwd])[рдкрд░ / рдкрд░] рдЕрдЧрд▓реЗ / рдпрд╣ / рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖ / рдорд╛рд╣ / рд╕рдкреНрддрд╛рд╣ / рджрд┐рди
DayOfWeekRecognizer.cs([usxy])?(D)[рдореЗрдВ] (рдЕрдЧрд▓реЗ / рдЗрд╕ / рдкрд┐рдЫрд▓реЗ) рд╕реЛрдорд╡рд╛рд░
TimeRecognizer.cs([rvgd])?([fot])?(Q|H)?(h|(0)(h)?)((0)e?)?([rvgd])?(w / s / up) (рдЖрдзрд╛ / рдЪреМрдерд╛рдИ) рдШрдВрдЯрд╛ / реп (рдШрдВрдЯреЗ) (рейреж (рдорд┐рдирдЯ)) (рд╕реБрдмрд╣ / рджрд┐рди / рд╢рд╛рдо / рдШрдВрдЯрд╛)
PartOfDayRecognizer.cs(@)?f?([ravgdn])f?(@)?(рддрд┐рдерд┐) (w / s) рд╕реБрдмрд╣ / рджреЛрдкрд╣рд░ / рд╢рд╛рдо / рд░рд╛рдд (w / s) (рддрд╛рд░реАрдЦ)

1 "" "" "" " ",


рдПрдХ рд╕рд╛рде рд╕реАрдирд╛


рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрд┐рдерд┐-рд╕рдордп рдЯреЛрдХрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЛрдХрди рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рджрд┐рди рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдордп рдХрд╛ред рдпрд╛ рдорд╣реАрдиреЗ рдФрд░ рджрд┐рди рдХрд╛ рдирд╛рдоред рдпрджрд┐ рд╡рд╣ рдХреЗрд╡рд▓ рд╕рдордп рдХрд╣рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЖрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕реБрдзрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдирд╛рдВрдХ-рд╕рдордп рдЯреЛрдХрди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рд╣реИ, рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреМрди рд╕реЗ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рддрддреНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВред


 public enum FixPeriod { None = 0, Time = 1, TimeUncertain = 2, Day = 4, Week = 8, Month = 16, Year = 32 } 

TimeUncertain рдЙрд╕ рд╕рдордп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╢реЛрдзрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдо / рд╕реБрдмрд╣ ред рдЗрд╕реЗ рд╕реБрдмрд╣ 18 рдмрдЬреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╢рд╛рдо рдХреЛ 6 рдмрдЬреЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ 6 рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рд╕рдВрдЦреНрдпрд╛ 18 рдореБрдХрд╛рдмрд▓реЗ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо "рдирд┐рд╢реНрдЪрд┐рддрддрд╛" рд╣реИред


рдореБрд╣рд╛рд╡рд░рд╛рдирд┐рд░реНрдзрд╛рд░рдгрдореБрдЦреМрдЯрд╛
26 рдорд╛рд░реНрдЪ 2019рд╡рд░реНрд╖ , рдорд╣реАрдирд╛ , рд╕рдкреНрддрд╛рд╣ , рдорд╛рдВрдж , vrm1, vrm2111100
26 рд╕рдВрдЦреНрдпрд╛рд╡рд░реНрд╖, рдорд╣реАрдирд╛, рд╕рдкреНрддрд╛рд╣, рдорд╛рдВрдж , vrm1, vrm2000100
рд╕реЛрдорд╡рд╛рд░рд╡рд░реНрд╖, рдорд╣реАрдирд╛, рд╕рдкреНрддрд╛рд╣, рдорд╛рдВрдж , vrm1, vrm2000100
рдЕрдЧрд▓реЗ рд╕реЛрдорд╡рд╛рд░рд╡рд░реНрд╖ , рдорд╣реАрдирд╛ , рд╕рдкреНрддрд╛рд╣ , рдорд╛рдВрдж , vrm1, vrm2111100
рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗрд╡рд░реНрд╖ , рдорд╣реАрдирд╛ , рд╕рдкреНрддрд╛рд╣ , рдорд╛рдВрдж, vrm1, vrm2111000
9 рдмрдЬреЗрд╡рд░реНрд╖, рдорд╣реАрдирд╛, рд╕рдкреНрддрд╛рд╣, рдорд╛рдВрдж, vrm1 , vrm2000010
рд░рд╛рдд 9 рдмрдЬреЗредрд╡рд░реНрд╖, рдорд╣реАрдирд╛, рд╕рдкреНрддрд╛рд╣, рдорд╛рдВрдж, vrm1 , vrm2000011

рдЕрдЧрд▓рд╛, рд╣рдо рджреЛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


  • рдпрджрд┐ рддрд┐рдерд┐рдпрд╛рдВ рдирд┐рдХрдЯ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрдо рдмрд┐рдЯреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛ рджреЗрддреЗ рд╣реИрдВ
  • рдпрджрд┐ рддрд┐рдерд┐рдпрд╛рдВ рдирд┐рдХрдЯ рд╣реИрдВ, рдФрд░ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмрд┐рдЯреНрд╕ рд╣реИрдВ рдЬреЛ рджреВрд╕рд░реЗ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдмрд┐рдЯреНрд╕ (рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрд░реВрдк рдореВрд▓реНрдпреЛрдВ) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡реЗ рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП: рдЕрд░реНрдерд╛рддреН, рд╣рдо рдПрдХ рджрд┐рди рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдорд╣реАрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рджрд┐рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдорд╣реАрдирд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЛрдорд╡рд╛рд░ рдХреЛ рд░рд╛рдд 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;
}
view raw Collapse.cs hosted with тЭд by GitHub

рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдЖрдкрдХреЛ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛:


  • рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдПрдХ рджрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдкреНрддрд╛рд╣ рдирд╣реАрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рддрд┐рдерд┐ рд╕реЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзрд╛рд░ рд╕реЗ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рджрд┐рдиред
  • рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЕрд╡рд╢реЛрд╖рд┐рдд рддрд┐рдерд┐ рдХрд╛ рдПрдХ рджрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдкреНрддрд╛рд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЙрд╕ рджрд┐рди рд╕реЗ (рдпрд╛рдиреА, рд╡рд░реНрд╖ + рдорд╣реАрдирд╛ + рддрд┐рдерд┐) рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рдкреНрддрд╛рд╣ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ DateTime рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рдЕрд▓рдЧ рдЗрдХрд╛рдИ "рд╕рдкреНрддрд╛рд╣" рдирд╣реАрдВ рд╣реИред
  • рдпрджрд┐ рдЖрдзрд╛рд░ рддрд┐рдерд┐ рдкрд░ TimeUncertain рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ Time рдЕрд╡рд╢реЛрд╖рд┐рдд рдПрдХ рдкрд░ рдЕрд╡рд╢реЛрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрд╡рд╢реЛрд╖рд┐рдд рдПрдХ рдкрд░ рдШрдВрдЯреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ 12 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдзрд╛рд░ рдПрдХ рдХрдо рд╣реИ, рддреЛ рдЖрдзрд╛рд░ рдореЗрдВ 12 рдШрдВрдЯреЗ рдЬреЛрдбрд╝реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╢рд╛рдо рдХреЛ 5 рд╕реЗ 17 рддрдХ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред "рдЕрдирд┐рд╢реНрдЪрд┐рдд" рддрд┐рдерд┐ рдХрд╛ рд╕рдордп рджрд┐рди рдХреЗ рдПрдХ рдЖрдзреЗ рднрд╛рдЧ рд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ "рдЖрд╢реНрд╡рд╕реНрдд" рддрд┐рдерд┐ рдХрд╛ рд╕рдордп рджрд┐рди рдХреЗ рджреВрд╕рд░реЗ рдЫрдорд╛рд╣реА рд╕реЗ рд╣реИред рд▓реЛрдЧ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕реБрдмрд╣ 5 рдмрдЬреЗ рд╕реЗ рд╢рд╛рдо 5 рдмрдЬреЗ рддрдХ рд╣реИ , рддреЛ рджреЛрдиреЛрдВ рддрд┐рдерд┐рдпреЛрдВ рдореЗрдВ рдПрдХ "рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕" рд╕рдордп рд╣реИ, рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдХреБрдЫ рддрд┐рдерд┐рдпреЛрдВ рдореЗрдВ рд░рд┐рдХреНрдд рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рд╕реЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╡рд░реНрд╖ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд░реНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдиреЗ рдорд╣реАрдиреЗ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдорд╣реАрдирд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдмреЗрд╢рдХ, рдХрд┐рд╕реА рднреА DateTime рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП "рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдмреИрд╕рд╛рдЦреА


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдХреНрд╖рдгреЛрдВ рдХреЛ рдЗрдирд╛рдпрдд рд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреИрд╕рд╛рдЦреА рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:


  • рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╕рдВрдпреЛрдЬрди рдХреА рддрд╛рд░реАрдЦреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ "b \ s \ co" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ рд╕реЗ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВ рдЬреЛ "рд╕реЗ \ _ рдкрд░" рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрд╡рдзрд┐ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рд░рдВрдн рддрд┐рдерд┐ рдФрд░ рдЕрдВрддрд┐рдо рддрд┐рдерд┐ рд╕реЗ рдЯреЛрдХрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
  • рдореИрдВрдиреЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрдзрд╛рд░рдг рд╕реНрддрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬрдЧрд╣ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрдж рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЭрдВрдбрд╛ рдмрдирд╛рдпрд╛ред
  • рдПрдХ рдЕрд▓рдЧ рд░рди рддрд╛рд░реАрдЦреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджреВрд░реА рдкрд░ рд╣реИрдВред рдпрд╣ collapseDistance рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 4 рдЯреЛрдХрди рд╣реИред рдпрд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛рдо рдХрд░реЗрдЧрд╛: рдХрд▓ рдХреЗ рдмрд╛рдж рдХрд╛ рджрд┐рди, 12 рдореЗрдВ рдПрдХ рджреЛрд╕реНрдд рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдардХ ред рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛: рдкрд░рд╕реЛрдВ рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд┐рдп рдФрд░ рдЕрджреНрднреБрдд рджреЛрд╕реНрдд рд╕реЗ 12 рдмрдЬреЗ рдорд┐рд▓реВрдВрдЧрд╛ ред

рдкрд░рд┐рдгрд╛рдо



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

рд▓рд╛рдЗрд╡ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:


Source: https://habr.com/ru/post/hi471204/


All Articles