{namespace buck}

/**
 * @param title
 * @param content
 * @param? prettify true if https://code.google.com/p/google-code-prettify/
 *     should be used.
 */
{template .page}
  {call .header}
    {param title: $title /}
    {param prettify: $prettify /}
  {/call}

  <div class="{css overview}">
    {$content|noAutoescape}
  </div>

  {call .footer}
    {param prettify: $prettify /}
  {/call}
{/template}

/**
 * @param title
 * @param? prettify true if https://code.google.com/p/google-code-prettify/
 *     should be used.
 */
{template .header}
{let $fullTitle}
  Buck: {$title}
{/let}
<!doctype html>
<html>
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns#">
  <title>{$fullTitle}</title>
  <link type="image/png" rel="icon" href="{ROOT}favicon.png" />
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  {if $prettify}
    <link type="text/css"
          rel="stylesheet"
          href="{ROOT}google-code-prettify/prettify.css"
          >
  {/if}
  // List buck.css second to override prettify.
  <link type="text/css" rel="stylesheet" href="{ROOT}buck.css">

// Google Analytics.
<script>
(function(i,s,o,g,r,a,m){lb}i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){lb}
(i[r].q=i[r].q||[]).push(arguments){rb},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
{rb})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-40185670-1', 'github.io');
ga('send', 'pageview');
</script>

  // TODO(mbolin): Pass $og_type in as a parameter.
  {let $og_type}
    {if $title == 'An Android build tool'}
      website
    {else}
      article
    {/if}
  {/let}

  <meta property="og:locale" content="en_US">
  <meta property="og:title" content="{$title}">
  <meta property="og:site_name" content="Buck: an Android build tool">
  <meta property="og:image" content="http://newsroom.fb.com/display-media/265/4">
  <meta property="og:image:type" content="image/png">
  <meta property="og:image:width" content="690">
  <meta property="og:image:height" content="690">
  <meta property="og:type" content="{$og_type}">
  <meta property="fb:admins" content="{FB_APP_ID}">

</head>
<body>

// Image copied from https://github.com/blog/273-github-ribbons
<a href="https://github.com/facebook/buck">
  <img id="fork" src="{ROOT}fork_me.png" alt="Fork me on GitHub">
</a>

<div id="fb-root"></div>
<script>(function(d, s, id) {lb}
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId={FB_APP_ID}";
  fjs.parentNode.insertBefore(js, fjs);
{rb}(document, 'script', 'facebook-jssdk'));</script>

<h1>
  <div class="{css titlebar}">
    <div class="fb-like {css buck_like}"
         data-send="false"
         data-layout="standard"
         data-width="350"
         data-show-faces="false"
         data-colorscheme="light"
         data-action="like">
    </div>

    <div>{$fullTitle}</div>
  </div>
</h1>
<div class="{css content_frame}">

  {call buck.tableOfContents data="all" /}
  <div class="{css content}">

{/template}

/**
 * Consider passing in the path to the URL of the page that the user
 * is currently on and not hyperlinking that item in the table of contents.
 */
{template .tableOfContents}
<div class="{css toc}">
<ul class="{css toc_root}">
  <li><span class="{css toc_header}">Getting Started</span>
  <ul>
    <li><a href="{ROOT}">Overview</a>
    <li><a href="{ROOT}setup/quickstart.html">Quick Start</a>
    <li><a href="{ROOT}setup/install.html">Downloading and Installing Buck</a>
  </ul>
  <li><span class="{css toc_header}">Concepts</span>
  <ul>
    <li><a href="{ROOT}concept/build_rule.html">Build Rule</a>
    <li><a href="{ROOT}concept/build_target.html">Build Target</a>
    <li><a href="{ROOT}concept/build_file.html">Build File</a>
    <li><a href="{ROOT}concept/buckversion.html">.buckversion</a>
    <li><a href="{ROOT}concept/nobuckcheck.html">.nobuckcheck</a>
    <li><a href="{ROOT}concept/buckconfig.html">.buckconfig</a>
    <li><a href="{ROOT}concept/build_target_pattern.html">Build Target Pattern</a>
    <li><a href="{ROOT}concept/visibility.html">Visibility</a>
    <li><a href="{ROOT}concept/troubleshooting.html">Troubleshooting</a>
    <li><a href="{ROOT}concept/faq.html">FAQ</a>
  </ul>
  <li><span class="{css toc_header}">Build Rules</span>
  <ul>
    // TODO(mbolin): document android_instrumentation_apk
    // TODO(mbolin): document robolectric_test
    {foreach $rule in [
        'android_binary',
        'android_library',
        'android_resource',
        'apk_genrule',
        'gen_aidl',
        'genrule',
        'java_binary',
        'java_library',
        'java_test',
        'ndk_library',
        'prebuilt_jar',
        'prebuilt_native_library',
        'project_config',
        ]}
      <li><a href="{ROOT}rule/{$rule}.html">{$rule}()</a>
    {/foreach}
  </ul>
  <li><span class="{css toc_header}">Functions</span>
  <ul>
    {foreach $function in [
        'genfile',
        'glob',
        'include_defs',
        ]}
      <li><a href="{ROOT}function/{$function}.html">{$function}()</a>
    {/foreach}
  </ul>
  <li><span class="{css toc_header}">Commands</span>
  <ul>
    {foreach $command in [
        'audit',
        'build',
        'clean',
        'install',
        'project',
        'targets',
        'test',
        'uninstall',
        ]}
      <li><a href="{ROOT}command/{$command}.html">buck {$command}</a>
    {/foreach}
    <li><a href="{ROOT}command/buckd.html">buckd</a>
  </ul>
  <li><span class="{css toc_header}">Extending Buck</span>
  <ul>
    <li><a href="{ROOT}extending/macros.html">Custom Macros</a>
    <li><a href="{ROOT}extending/rules.html">Custom Rules</a>
  </ul>
  <li><span class="{css toc_header}">Contributing to Buck</span>
  <ul>
    <li><a href="https://groups.google.com/group/buck-build">Discussion Group</a>
    <li><a href="https://github.com/facebook/buck/issues/new">Report a Bug</a>
    <li><a href="{ROOT}contributing/development.html">Development Workflow</a>
    <li><a href="{ROOT}contributing/codestyle.html">Code Style</a>
    <li><a href="{ROOT}javadoc">API</a>
    <li><a href="https://github.com/facebook/buck">Browse the Source Code</a>
  </ul>
</ul>
</div>
{/template}

/**
 * @param? prettify true if https://code.google.com/p/google-code-prettify/
 *     should be used.
 */
{template .footer}
  </div> // closes .content
</div>   // closes .contentFrame


{if hasData() and $prettify}
  <script src="{ROOT}google-code-prettify/prettify.js"></script>
  <script>prettyPrint()</script>
{/if}

</body>
</html>
{/template}


/**
 * Used to format an argument to a build rule.
 *
 * @param name Name of the argument.
 * @param? default What the default value should be. If null, the argument is
 *     required.
 * @param desc Prose description of the argument.
 */
{template .arg}
  <li class="{css arg}"><code>{$name}</code>

  {sp}
  {if isNonnull($default)}
    (defaults to <code>{$default}</code>)
  {else}
    (required)
  {/if}
  {sp}

  {$desc|noAutoescape}

{/template}


/**
 * @param overview HTML description of the rule.
 * @param args HTML documentation for each arg for the rule.
 *     Should be created using multiple applications of the {buck.arg}
 *     template.
 * @param? examples HTML documentation that shows examples of the build
 *     rule in action.
 * @param? furtherexp Further explanation; HTML shown after arguments and
        examples.
 */
{template .rule}
{$overview|noAutoescape}

<h2>Arguments</h2>
<ul class="{css arglist}">
  {$args|noAutoescape}
</ul>

{if $examples}
  <h2>Examples</h2>
  {$examples|noAutoescape}
{/if}
{if $furtherexp}
  {$furtherexp|noAutoescape}
{/if}
{/template}


/**
 * Used to format an argument to a build rule.
 *
 * @param? name Name of the argument.
 * @param? default What the default value should be. If null, the argument is
 *     required.
 * @param desc Prose description of the argument.
 */
{template .functionArg}
  <li class="{css arg}">
    {if $name}
      <code>{$name}</code>{sp}
    {/if}

  {if isNonnull($default)}
    (defaults to <code>{$default}</code>)
    {sp}
  {/if}

  {$desc|noAutoescape}
{/template}


/**
 * Used to format a parameter of a command.
 *
 * @param name Name of the parameter.
 * @param? alias The alias for this parameter.
 * @param desc Prose description of the parameter.
 */
{template .param}
  <li class="{css arg}"><code>--{$name}</code>
  {sp}
  {if $alias}
    <code>(-{$alias})</code>
  {/if}

  {sp}
  {$desc|noAutoescape}

{/template}


/**
 * @param overview HTML description of the command.
 * @param params HTML documentation for each param of the command.
 *     Should be created using multiple applications of the {buck.param}
 *     template.
 * @param? examples HTML documentation that shows examples of the build
 *     rule in action.
 */
{template .command}
{$overview|noAutoescape}

<h2>Parameters</h2>
<ul class="{css arglist}">
  {$params|noAutoescape}
</ul>

{if $examples}
  <h2>Examples</h2>
  {$examples|noAutoescape}
{/if}
{/template}


/**
 * @param overview HTML description of the function.
 * @param args HTML documentation for each arg for the function.
 *     Should be created using multiple applications of the {buck.functionArg}
 *     template.
 * @param? examples HTML documentation that shows examples of the function
 *     in action.
 */
{template .function}
  // For now, functions and build rules should be documented the same way.
  {call .rule data="all" /}
{/template}


/** @param name */
{template .ruleLink}
<a href="{ROOT}rule/{$name}.html"><code>{$name}</code></a>
{/template}


/***/
{template .android_binary}
{call .ruleLink}{param name : 'android_binary' /}{/call}
{/template}


/***/
{template .android_library}
{call .ruleLink}{param name : 'android_library' /}{/call}
{/template}


/***/
{template .android_resource}
{call .ruleLink}{param name : 'android_resource' /}{/call}
{/template}


/***/
{template .genrule}
{call .ruleLink}{param name : 'genrule' /}{/call}
{/template}


/***/
{template .java_library}
{call .ruleLink}{param name : 'java_library' /}{/call}
{/template}

/***/
{template .prebuilt_jar}
{call .ruleLink}{param name : 'prebuilt_jar' /}{/call}
{/template}

/***/
{template .project_config}
{call .ruleLink}{param name : 'project_config' /}{/call}
{/template}

/***/
{template .visibility_arg}
{call buck.arg}
  {param name : 'visibility' /}
  {param default : '[]' /}
  {param desc}
  List of <a href="{ROOT}concept/build_target_pattern.html">build
  target patterns</a> that identify the build rules that can include
  this rule in its <code>deps</code>. 
  {/param}
{/call}
{/template}

/**
 *
 */
{template .platformWarning}
<strong>
Note: Buck works only on Mac OS X and Linux. Windows is not supported.
</strong>
<p>
{/template}


/**
 * @param? withAlias
 */
{template .installationInstructions}
{literal}<pre>
git clone git@github.com:facebook/buck.git
cd buck
ant{/literal}{\n}
{if $withAlias}
sudo ln -s ${lb}PWD{rb}/bin/buck /usr/bin/buck
{else}
./bin/buck --help
{/if}
</pre>
{/template}
