#148 find rhyme api
This commit is contained in:
parent
173ad9caae
commit
c9585b5dc9
@ -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
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 = "" };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user