1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2024-10-17 09:42:45 +02:00
TweetDuck/lib/TweetLib.Browser/Interfaces/IScriptExecutor.cs

59 lines
1.5 KiB
C#

using System;
using System.Globalization;
using System.Text;
namespace TweetLib.Browser.Interfaces {
public interface IScriptExecutor {
void RunScript(string identifier, string script);
}
public static class ScriptExecutorExtensions {
public static void RunFunction(this IScriptExecutor executor, string name, params object?[] args) {
executor.RunScript("about:blank", GenerateJavaScriptFunctionCall(name, args));
}
private static string GenerateJavaScriptFunctionCall(string name, object?[] args) {
var builder = new StringBuilder();
builder.Append(name);
builder.Append('(');
for (var index = 0; index < args.Length; index++) {
var obj = args[index];
switch (obj) {
case null:
builder.Append("null");
break;
case bool b:
builder.Append(b.ToString().ToLowerInvariant());
break;
case sbyte or byte or short or ushort or int or uint or long or ulong or float or double or decimal:
builder.Append(Convert.ToString(obj, CultureInfo.InvariantCulture));
break;
default:
var str = obj.ToString() ?? string.Empty;
var escaped = str.Replace("\\", "\\\\")
.Replace("'", "\\'")
.Replace("\t", "\\t")
.Replace("\r", "\\r")
.Replace("\n", "\\n");
builder.Append('\'');
builder.Append(escaped);
builder.Append('\'');
break;
}
if (index < args.Length - 1) {
builder.Append(',');
}
}
return builder.Append(");").ToString();
}
}
}