{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',
        'keystore',
        '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 .keystore}
{call .ruleLink}{param name : 'keystore' /}{/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}
