C# to JavaScript compiler

# Calling JavaScript

h5 provides several mechanisms to interact with existing JavaScript code and libraries.

# Using Script.Write and Script.Eval

The most direct way to call JavaScript is by using Script.Write or Script.Eval from the H5 namespace.

# Script.Write

Script.Write injects raw JavaScript code directly into the compiled output.

using H5;

public void SayHello()
{
    // Emits: alert("Hello from JavaScript!");
    Script.Write("alert('Hello from JavaScript!');");
}

You can also use placeholders for arguments:

public void LogMessage(string message)
{
    // Emits: console.log(message);
    Script.Write("console.log({0});", message);
}

# Script.Eval

Script.Eval evaluates a JavaScript expression at runtime and returns the result.

public int Add(int a, int b)
{
    // Evaluates: a + b
    return Script.Eval<int>($"{a} + {b}");
}

# Using Script.Call, Script.Get, Script.Set

Helper methods are available to interact with JavaScript objects and functions dynamically.

using H5;

// Call a global function
Script.Call("myFunction", "arg1", 123);

// Get a global variable
var title = Script.Get<string>("document.title");

// Set a global variable
Script.Set("window.myVar", "value");

# Integrating External Code

For a more type-safe approach, you can define external interfaces using the [External] attribute.

# [External] Attribute

Use [External] to define C# bindings for existing JavaScript libraries. The compiler will not generate implementation code for these types but will assume they exist at runtime.

[External]
[Name("Math")]
public static class Math
{
    [Name("random")]
    public static extern double Random();

    [Name("max")]
    public static extern double Max(double a, double b);
}

// Usage
double r = Math.Random();

# [Template] Attribute

The [Template] attribute allows you to specify exactly how a method call should be translated to JavaScript. This is powerful for adapting C# method signatures to JavaScript APIs.

[External]
public static class Console
{
    [Template("console.log({0})")]
    public static extern void Log(object message);

    [Template("console.warn({0}, {1})")]
    public static extern void Warn(string category, string message);
}

When you call Console.Log("Hello"), h5 generates console.log("Hello").

# [Script] Attribute

The [Script] attribute allows you to inject a script block directly into the generated code for a method.

public class MyClass
{
    [Script("alert('Hello from inline script!');")]
    public void InlineScript()
    {
    }
}

This is similar to Script.Write but declarative.