.NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ASP.NET WebForms рдореЗрдВ

рд╣рд╛рдп рд╣рдмрджреНрд░реБрдЧ!

рдмреЗрд╢рдХ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рджреГрд╖реНрдЯрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рдж рдХреЗ рдЪрд░рдг рдореЗрдВ рдПрдХ .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ WebForms рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реАред рдЕрдВрдХ рдкрд░:



1. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕: рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкрд░ рдиреНрдпреВрдирддрдо рдзреНрдпрд╛рдиред

2. рд╡рд┐рдХрд╛рд╕ рдкреВрд░рд╛ рдХрд░рдирд╛: рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдордпред

рдФрд░ рдлрд┐рд░ рднреА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд░рд▓ рдерд╛ред



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:



рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА, рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреБрдЫ рдкрд╛рда, рдпрд╛ рдПрдХ рдХреБрдВрдЬреА + рдкрд╛рда рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡рд┐рдзрд┐, рдмрджрд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдПрдЧреА рдпрд╛ рдЬреЛ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рд╣реЛрдЧреА рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХреА рдЦреЛрдЬ рдореЗрдВ * .cs , * .aspx , * .ascx рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреА рд╣реИ, рд╡рд╣рд╛рдВ рд╕реЗ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдкрд╛рда рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдпрд╛ рдпреЗ рдЧреНрд░рдВрде рдФрд░ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╣реИрдВред рдлрд┐рд░ рд╣рдо Google рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдЦрд░рд╛рдм рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдирдП рдЧреНрд░рдВрдереЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдиреБрд╡рд╛рдж рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рд╕рд╣реЗрдЬреЗрдВред рд╣реЛ рдЧрдпрд╛ред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╕рдорд╛рди, рдпрд╛ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рддрдВрддреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЪрдврд╝рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдореЗрдЧрд╛ рднрд╛рд░реА рджреЗрдЦрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рднреА рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред







рддреЛ, рдЪрд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред рдЪрд▓реЛ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, ExpressionBuilder-a рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП:



public static class L

{

private static readonly Regex KeyRepairRegex = new Regex( "[^\\w\\d]" , RegexOptions.Compiled);



public static string Run( string value )

{

var key = GenerateKey( value );

var localized = Resources.ResourceManager.GetString(key);

return string .IsNullOrEmpty(localized) ? value : localized;

}



public static string Run( string key, string value )

{

var localized = Resources.ResourceManager.GetString(key);

return string .IsNullOrEmpty(localized) ? value : localized;

}



public static string Run( string key, string value , params object [] format)

{

var localized = Run(key, value );



if (format != null && format.Length > 0)

{

try

{

localized = string .Format(localized, format);

}

catch

{



}

}

return localized;

}



private static string GenerateKey( string value )

{

if ( string .IsNullOrEmpty( value )) return value ;



value = value .Length > 23 ? value .Substring(0, 23) + "__" : value ;

value = KeyRepairRegex.Replace( value , "_" );

if ( char .IsUpper( value [0])) value = "_" + value ;

value = value .ToLowerInvariant();



return value ;

}

}








рдЕрдм, рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:



<%= L.Run( "Hello, Mr.Everybody" ) %>







L рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ * .ascx рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрдпрд╛рдд рди рдХрд░рдирд╛ рдкрдбрд╝реЗред



<%@ Import Namespace = "Example.Namespace" %>









рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг GenerateKey рддрд░реАрдХрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдмрд┐рдирд╛ рдХреБрдВрдЬреА рдХреЗ рдХреЗрд╡рд▓ рдкрд╛рда рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреА рдФрд░ рд╣рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдЗрд╕ рдХреБрдВрдЬреА рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗред рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдХреБрдВрдЬреА рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдХреНрд╖рд░ [a-z0-9_] рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЪрд╛рдмрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреАред рдЕрдм рд╣рдо ExpressionBuilder рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реА рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕ рдмрд┐рд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?



рд╕рд░реНрд╡рд░ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди <% =%> рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди <% #%> рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмрд┐рдВрдж рд╡рд┐рдзрд┐ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ ExpressionBuilder рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдЪрд╛рд╣рд┐рдПред



public class LExpressionBuilder: ExpressionBuilder

{

public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)

{

var thisType = new CodeTypeReferenceExpression(GetType());

var expression = new CodePrimitiveExpression(entry.Expression.Trim());

const string evaluationMethod = "Localize" ;

return new CodeMethodInvokeExpression(thisType, evaluationMethod, new CodeExpression[] { expression });

}



public static string Localize( string expression)

{

return L.Run(expression);

}



public override object EvaluateExpression( object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)

{

return Localize(entry.Expression);

}



public override bool SupportsEvaluate

{

get { return true ; }

}

}








рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:



<input typ= 'submit' id= 'btnSubmit' runat= 'server' value = "<%$ L:A people free to choose will always choose peace %>" />







рдкрд╣рд▓рд╛ рднрд╛рдЧ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп WinForms рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред



рдХрдХреНрд╖рд╛ рдЪрд╛рд░реНрдЯ



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрд░реЗрдЦ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдмрд╣реБрдд рд╕реАрдзреЗ рдЖрдЧреЗ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдмрд╛рдд рд╕рд░рд▓ рд╣реИред рд╣рдо рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕реЗрдЯрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдФрд░ ... рдЪрд▓реЛ рдЪрд▓реЗрдВ! рд╕рдорд╛рдзрд╛рди рд╡рд░реНрдЧ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред CodeParser рдЕрдиреБрд╡рд╛рдж рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╕рднреА рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рд╕рдм GridView рдореЗрдВ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдЕрдм рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╛ Google рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдореВрд▓ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, xml рдореЗрдВ рдмрдЪрдд рдХрд░рдирд╛ред



рдЕрд╕реЗрдВрдмрд▓рд╛ рддреЛрдбрд╝рдлреЛрдбрд╝ (рдкрдВрдЬреАрдХрд░рдг рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ)



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



рдЖрдк рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:



CodeParser рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдлрд╛рдбрд╝рдХрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЪреВрдБрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд╢реБрд░реВ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреИрдиреЛрд╕реЗрдХреЗрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рддрд╛рд░реЛрдВ рдХреА рдЪрд╛рдмреА рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред



рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднреА, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдпрд╛ рд╕реБрдЭрд╛рд╡ рдХреЛ рд╕реБрдирдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред



рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред



* Source code was highlighted with Source Code Highlighter .






All Articles