// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

namespace string_html {
  extern runtime StringEscapeQuotes(Context, String): String;

  // https://tc39.github.io/ecma262/#sec-createhtml
  transitioning builtin CreateHTML(implicit context: Context)(
      receiver: Object, methodName: String, tagName: String, attr: String,
      attrValue: Object): String {
    const tagContents: String = ToThisString(receiver, methodName);
    let result = '<' + tagName;
    if (attr != kEmptyString) {
      const attrStringValue: String =
          StringEscapeQuotes(context, ToString_Inline(context, attrValue));
      result = result + ' ' + attr + '=\"' + attrStringValue + '\"';
    }

    return result + '>' + tagContents + '</' + tagName + '>';
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.anchor
  transitioning javascript builtin StringPrototypeAnchor(
      js-implicit context: Context, receiver: Object)(...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.anchor', 'a', 'name', arguments[0]);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.big
  transitioning javascript builtin
  StringPrototypeBig(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.big', 'big', kEmptyString, kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.blink
  transitioning javascript builtin
  StringPrototypeBlink(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.blink', 'blink', kEmptyString,
        kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.bold
  transitioning javascript builtin
  StringPrototypeBold(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.bold', 'b', kEmptyString, kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor
  transitioning javascript builtin
  StringPrototypeFontcolor(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.fontcolor', 'font', 'color', arguments[0]);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.fontsize
  transitioning javascript builtin
  StringPrototypeFontsize(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.fontsize', 'font', 'size', arguments[0]);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.fixed
  transitioning javascript builtin
  StringPrototypeFixed(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.fixed', 'tt', kEmptyString, kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.italics
  transitioning javascript builtin
  StringPrototypeItalics(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.italics', 'i', kEmptyString, kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.link
  transitioning javascript builtin
  StringPrototypeLink(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.link', 'a', 'href', arguments[0]);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.small
  transitioning javascript builtin
  StringPrototypeSmall(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.small', 'small', kEmptyString,
        kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.strike
  transitioning javascript builtin
  StringPrototypeStrike(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.strike', 'strike', kEmptyString,
        kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.sub
  transitioning javascript builtin
  StringPrototypeSub(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.sub', 'sub', kEmptyString, kEmptyString);
  }

  // https://tc39.github.io/ecma262/#sec-string.prototype.sup
  transitioning javascript builtin
  StringPrototypeSup(js-implicit context: Context, receiver: Object)(
      ...arguments): String {
    return CreateHTML(
        receiver, 'String.prototype.sup', 'sup', kEmptyString, kEmptyString);
  }
}
