#148 find rhyme api

This commit is contained in:
Hamid Reza Mohammadi 2021-06-16 18:42:58 +04:30
parent 173ad9caae
commit c9585b5dc9
6 changed files with 271 additions and 2 deletions

View File

@ -1218,7 +1218,28 @@ namespace RMuseum.Controllers
return Ok(res.Result);
}
/// <summary>
/// find poem rhyme
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Route("poem/analysisrhyme/{id}")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjooRhymeAnalysisResult))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> FindPoemRhyme(int id)
{
var res = await _ganjoorService.FindPoemRhyme(id);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
}
/// <summary>
/// examine site pages for broken links

View File

@ -0,0 +1,18 @@
namespace RMuseum.Models.Ganjoor.ViewModels
{
/// <summary>
/// Rhyme Analysis Result
/// </summary>
public class GanjooRhymeAnalysisResult
{
/// <summary>
/// rhyme
/// </summary>
public string Rhyme { get; set; }
/// <summary>
/// the verse analysis stopped at
/// </summary>
public string FailVerse { get; set; }
}
}

View File

@ -1009,6 +1009,13 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.FindPoemRhyme(System.Int32)">
<summary>
find poem rhyme
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.HealthCheckContents">
<summary>
examine site pages for broken links
@ -5137,6 +5144,21 @@
this can be used by clients
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.ViewModels.GanjooRhymeAnalysisResult">
<summary>
Rhyme Analysis Result
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.ViewModels.GanjooRhymeAnalysisResult.Rhyme">
<summary>
rhyme
</summary>
</member>
<member name="P:RMuseum.Models.Ganjoor.ViewModels.GanjooRhymeAnalysisResult.FailVerse">
<summary>
the verse analysis stopped at
</summary>
</member>
<member name="T:RMuseum.Models.Ganjoor.ViewModels.GanjoorModifyPageViewModel">
<summary>
modify page view model
@ -7426,6 +7448,13 @@
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.FindPoemRhyme(System.Int32)">
<summary>
find poem rhyme
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.ArtifactService">
<summary>
IArtifactService implementation
@ -8766,6 +8795,13 @@
<param name="userId"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.FindPoemRhyme(System.Int32)">
<summary>
find poem rhyme
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.PreparePlainText(System.Collections.Generic.List{RMuseum.Models.Ganjoor.GanjoorVerse})">
<summary>
make plain text
@ -8880,6 +8916,14 @@
<param name="text"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.LanguageUtils.FindRhyme(System.Collections.Generic.List{RMuseum.Models.Ganjoor.GanjoorVerse},System.Boolean)">
<summary>
find rhyme
</summary>
<param name="verses"></param>
<param name="secondPhase"></param>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.MusicCatalogueService">
<summary>
Music Catalgue Service Implementation

View File

@ -376,5 +376,12 @@ namespace RMuseum.Services
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<string[]>> BatchRenameCatPoemTitles(int catId, GanjoorBatchNamingModel model, Guid userId);
/// <summary>
/// find poem rhyme
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<RServiceResult<GanjooRhymeAnalysisResult>> FindPoemRhyme(int id);
}
}

View File

@ -2864,6 +2864,25 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// find poem rhyme
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjooRhymeAnalysisResult>> FindPoemRhyme(int id)
{
try
{
return new RServiceResult<GanjooRhymeAnalysisResult>(
LanguageUtils.FindRhyme(await _context.GanjoorVerses.Where(v => v.PoemId == id).OrderBy(v => v.VOrder).ToListAsync())
);
}
catch(Exception exp)
{
return new RServiceResult<GanjooRhymeAnalysisResult>(null, exp.ToString());
}
}
/// <summary>
/// make plain text
/// </summary>

View File

@ -1,4 +1,9 @@
namespace RMuseum.Services.Implementation
using RMuseum.Models.Ganjoor;
using RMuseum.Models.Ganjoor.ViewModels;
using System.Collections.Generic;
using System.Linq;
namespace RMuseum.Services.Implementation
{
/// <summary>
/// Language Utilitis
@ -52,7 +57,162 @@
.Replace("؟", "")
.Replace("ٔ", "")
.Replace(":", "")
.Replace("ئ", "ی")
.Replace("؛", "")
.Replace(";", "")
.Replace("*", "")
.Replace(")", "")
.Replace("(", "")
;
}
public static string PrepareTextForFindingRhyme(string text)
{
return MakeTextSearchable(text)
.Replace("لله", "للاه")
.Replace("آ", "ا")
.Replace("‍", "")
.Replace("‏", "")
.Replace("‌", "")
.Replace(" ", "")
.Trim()
;
;
}
/// <summary>
/// find rhyme
/// </summary>
/// <param name="verses"></param>
/// <param name="secondPhase"></param>
/// <returns></returns>
public static GanjooRhymeAnalysisResult FindRhyme(List<GanjoorVerse> verses, bool secondPhase = false)
{
List<string> verseTextList = verses.Count == 2 ? verses.Select(v => v.Text).ToList()
: verses.Where(v => v.VersePosition == VersePosition.Left).Select(v => v.Text).ToList();
if(verseTextList.Count > 1)
{
string rhyme = PrepareTextForFindingRhyme(verseTextList[0]);
if(string.IsNullOrEmpty(rhyme))
{
return new GanjooRhymeAnalysisResult()
{
Rhyme = "",
FailVerse = verseTextList[0]
};
}
if(secondPhase)
{
if (secondPhase)
if (rhyme[rhyme.Length - 1] == 'ی')
rhyme = rhyme.Remove(rhyme.Length - 1);
}
for (int j = 1; j < verseTextList.Count; j++)
{
string verseText = PrepareTextForFindingRhyme(verseTextList[j]);
if (secondPhase)
{
if (verseText[verseText.Length - 1] == 'ی')
{
verseText = verseText.Remove(verseText.Length - 1);
}
}
string oldRhyme = rhyme;
rhyme = "";
int i = oldRhyme.Length - 1;
while (
(oldRhyme[i] == verseText[verseText.Length - oldRhyme.Length + i])
||
(
(oldRhyme[i] == 'ذ')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'د')
)
||
(
(oldRhyme[i] == 'د')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'ذ')
)
||
(
(oldRhyme[i] == 'ی')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'ا')
)
||
(
(oldRhyme[i] == 'ا')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'ی')
)
||
(oldRhyme[i] == verseText[verseText.Length - oldRhyme.Length + i])
||
(
(oldRhyme[i] == 'پ')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'ب')
)
||
(
(oldRhyme[i] == 'ب')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'پ')
)
||
(oldRhyme[i] == 'ة')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'ت')
||
(oldRhyme[i] == 'ت')
&&
(verseText[verseText.Length - oldRhyme.Length + i] == 'ة')
)
{
rhyme = oldRhyme[i] + rhyme;
i--;
if ((i == -1))
break;
}
if (rhyme.Length == 0)
{
return new GanjooRhymeAnalysisResult()
{
Rhyme = "",
FailVerse = verseText
};
}
}
if(!secondPhase)
{
if(string.IsNullOrEmpty(rhyme))
{
return FindRhyme(verses, true);
}
}
return new GanjooRhymeAnalysisResult()
{
Rhyme = rhyme,
FailVerse = ""
};
}
return new GanjooRhymeAnalysisResult() { Rhyme = "", FailVerse = "" };
}
}
}