تبدیل بلوکهای یونیکد در زیرنویس برای نمایش در تلویزیونها و پلیرها
نویسنده: علی یگانه مقدم
تاریخ: ۱۳۹۴/۰۱/۰۱ ۱۰:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
203 00:16:38,731 --> 00:16:41,325 <i>Happy Christmas, your arse I pray God it's our last</i>
203 00:16:38,731 --> 00:16:41,325 <i>Happy Christmas, your arse I pray God it's our last</i>
private readonly static Regex regex_srt = new Regex(@"(?<sequence>\d+)\r\n(?<start>\d{2}\:\d{2}\:\d{2},\d{3}) --\> " +
@"(?<end>\d{2}\:\d{2}\:\d{2},\d{3})\r\n(?<text>[\s\S]*?)\r\n\r\n", RegexOptions.Compiled);
public string ToUnicode(string lines)
{
string subtitle= regex_srt.Replace(lines,delegate(Match m)
{
string text = m.Groups["text"].Value;
//1.remove tags
text = CleanScriptTags(text);
//2.replace letters
PersianReshape reshaper = new PersianReshape();
text = reshaper.reshape(text);
string[] splitedlines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
text = "";
foreach (string line in splitedlines)
{
//3.reverse tags
text += ReverseText(reshaper.reshape(line))+Environment.NewLine ;
}
return
string.Format("{0}\r\n{1} --> {2}\r\n", m.Groups["sequence"], m.Groups["start"].Value,
m.Groups["end"]) + text + Environment.NewLine+Environment.NewLine ;
}
);
return subtitle;
} m.Groups["text"].Value
private static readonly Regex regex_tags = new Regex("<.*?>", RegexOptions.Compiled);
private string CleanScriptTags(string html)
{
return regex_tags.Replace(html, string.Empty);
} PersianReshape reshaper = new PersianReshape();
text = reshaper.reshape(text);
string[] splitedlines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
text = "";
foreach (string line in splitedlines)
{
//3.reverse tags
text += ReverseText(reshaper.reshape(line))+Environment.NewLine ;
} Dictionary<int ,int> letters=new Dictionary<int, int>();
//0=0x0 ,1=1x0 ,2=0x1 ,3=1x1
private void FillPrimaryTable()
{
//آ
letters.Add(1570, 65153);
//ا
letters.Add(1575, 65166);
//أ
letters.Add(1571, 65155);
//ب
letters.Add(1576, 65167);
//ت
letters.Add(1578, 65173);
//ث
letters.Add(1579, 65177);
//ج
letters.Add(1580, 65181);
.....
}
Dictionary<int,byte> specialchars=new Dictionary<int, byte>();
private void SetSpecialChars()
{
//آ
specialchars.Add(1570, 0);
//ا
specialchars.Add(1575, 0);
//د2
specialchars.Add(1583, 1);
//ذ2
specialchars.Add(1584, 1);
//ر2
specialchars.Add(1585, 1);
//ز2
specialchars.Add(1586, 1);
//ژ
specialchars.Add(1688, 1);
//و2
specialchars.Add(1608, 1);
//أ
specialchars.Add(1571, 1);
} PersianReshape reshaper = new PersianReshape();
text = reshaper.reshape(text); //3.reverse tags
text = ReverseText(text); string[] splitedlines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
text = "";
foreach (string line in splitedlines)
{
//3.reverse tags
text += ReverseText(reshaper.reshape(line))+Environment.NewLine ;
} private string Reverse(string text)
{
return Reverse(text,0,text.Length);
}
private string Reverse(string text,int start,int end)
{
if (end < start)
return text;
string reverseText = "";
for (int i = end-1; i >=start; i--)
{
reverseText += text[i];
}
return reverseText;
} private string ReverseText(string text)
{
char[] chararray = text.ToCharArray();
string reverseText = "";
bool prefixcomp = false;
bool postfixcomp = false;
string prefix = "";
string postfix = "";
#region get prefix symbols
for (int i = 0; i < chararray.Length; i++)
{
if (!prefixcomp)
{
char ch =(char) chararray.GetValue(i) ;
if (ch< 130)
{
prefix += chararray.GetValue(i);
}
else
{
prefixcomp = true;
break;
}
}
}
#endregion
} #region get postfix symbols
for (int i = chararray.Length - 1; i >-1 ; i--)
{
if (!postfixcomp && prefix.Length!=text.Length)
{
char ch = (char)chararray.GetValue(i);
if (ch < 130)
{
postfix += chararray.GetValue(i);
}
else
{
postfixcomp = true;
break;
}
}
}
#endregion #region reverse text
reverseText = Reverse(text, prefix.Length, text.Length-postfix.Length);
reverseText = unTagetdLettersRegex.Replace(reverseText, delegate(Match m)
{
return Reverse(m.Value);
});
#endregion private static readonly Regex unTagetdLettersRegex = new Regex(@"[A-Za-z0-9]+", RegexOptions.Compiled);
return prefix+ reverseText+postfix;
private static readonly Regex unTagetdLettersRegex = new Regex(@"[A-Za-z0-9]+", RegexOptions.Compiled);
private string ReverseText(string text)
{
char[] chararray = text.ToCharArray();
string reverseText = "";
bool prefixcomp = false;
bool postfixcomp = false;
string prefix = "";
string postfix = "";
#region get prefix symbols
for (int i = 0; i < chararray.Length; i++)
{
if (!prefixcomp)
{
char ch =(char) chararray.GetValue(i) ;
if (ch< 130)
{
prefix += chararray.GetValue(i);
}
else
{
prefixcomp = true;
break;
}
}
}
#endregion
#region get postfix symbols
for (int i = chararray.Length - 1; i >-1 ; i--)
{
if (!postfixcomp && prefix.Length!=text.Length)
{
char ch = (char)chararray.GetValue(i);
if (ch < 130)
{
postfix += chararray.GetValue(i);
}
else
{
postfixcomp = true;
break;
}
}
}
#endregion
#region reverse text
reverseText = Reverse(text, prefix.Length, text.Length-postfix.Length);
reverseText = unTagetdLettersRegex.Replace(reverseText, delegate(Match m)
{
return Reverse(m.Value);
});
#endregion
return prefix+ reverseText+postfix;
} return
string.Format("{0}\r\n{1} --> {2}\r\n", m.Groups["sequence"], m.Groups["start"].Value,
m.Groups["end"]) + text + Environment.NewLine+Environment.NewLine ;
//1.remove tags
text = CleanScriptTags(text); text =StringUtils.ConvertToMultiLine(text);
namespace Utils
{
public static class StringUtils
{
public static string ConvertToMultiLine(String text, int min = 30, int max = 40)
{
if (text.Trim() == "")
return text;
string[] words = text.Split(new string[] { " " }, StringSplitOptions.None);
string text1 = "";
string text2 = "";
foreach (string w in words)
{
if (text1.Length < min)
{
if (text1.Length == 0)
{
text1 = w;
continue;
}
if (w.Length + text1.Length <= max)
text1 += " " + w;
}
else
text2 += w + " ";
}
text1 = text1.Trim();
text2 = text2.Trim();
if (text2.Length > 0)
{
text1 += Environment.NewLine + ConvertToMultiLine(text2, min, max);
}
return text1;
}
}
}