<?php
require_once '/opt/libphutil/src/object/Phobject.php';
require_once '/opt/libphutil/src/moduleutils/core.php';
require_once '/opt/libphutil/src/moduleutils/PhutilBootloader.php';
require_once '/opt/libphutil/src/moduleutils/PhutilBootloaderException.php';
require_once '/opt/libphutil/src/moduleutils/PhutilLibraryConflictException.php';
require_once ("/opt/libphutil/src/utils/utils.php");
require_once ("/opt/libphutil/src/xsprintf/csprintf.php");
require_once ("/opt/libphutil/src/future/exec/execx.php");
require_once ("/opt/libphutil/src/xsprintf/hgsprintf.php");
require_once ("/opt/libphutil/src/markup/render.php");
require_once ("/opt/libphutil/src/xsprintf/jsprintf.php");
require_once ("/opt/libphutil/src/xsprintf/ldapsprintf.php");
require_once ("/opt/libphutil/src/error/phlog.php");
require_once ("/opt/libphutil/src/internationalization/pht.php");
require_once ("/opt/libphutil/src/console/format.php");
require_once ("/opt/libphutil/src/utils/viewutils.php");
require_once ("/opt/libphutil/src/moduleutils/moduleutils.php");
require_once ("/opt/libphutil/src/utils/utf8.php");
require_once ("/opt/libphutil/src/xsprintf/pregsprintf.php");
require_once ("/opt/libphutil/src/xsprintf/qsprintf.php");
require_once ("/opt/libphutil/src/xsprintf/queryfx.php");
require_once ("/opt/libphutil/src/xsprintf/tsprintf.php");
require_once ("/opt/libphutil/src/xsprintf/urisprintf.php");
require_once ("/opt/libphutil/src/parser/xhpast/parser_nodes.php");
require_once ("/opt/libphutil/src/parser/xhpast/parser_tokens.php");
require_once ("/opt/libphutil/src/xsprintf/xsprintf.php");
require_once ("/opt/libphutil/src/filesystem/Filesystem.php");
require_once ("/opt/libphutil/src/object/Phobject.php");
require_once ("/opt/libphutil/src/filesystem/FileFinder.php");
require_once ("/opt/libphutil/src/markup/PhutilMarkupEngine.php");
require_once ("/opt/libphutil/src/markup/engine/PhutilRemarkupEngine.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupEscapeRemarkupRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupMonospaceRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupDocumentLinkRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupHyperlinkRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupBoldRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupItalicRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupDelRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupUnderlineRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/markuprule/PhutilRemarkupHighlightRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupQuotesBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupReplyBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupHeaderBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupHorizontalRuleBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupCodeBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupLiteralBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupNoteBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupTableBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupSimpleTableBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupDefaultBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupListBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupInterpreterBlockRule.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/PhutilRemarkupBlockStorage.php");
require_once ("/opt/libphutil/src/markup/PhutilSafeHTML.php");
require_once ("/opt/libphutil/src/internationalization/PhutilTranslator.php");
require_once ("/opt/libphutil/src/parser/PhutilSimpleOptions.php");
require_once ("/opt/libphutil/src/lexer/PhutilLexer.php");
require_once ("/opt/libphutil/src/lexer/PhutilSimpleOptionsLexer.php");
require_once ("/opt/libphutil/src/parser/PhutilLanguageGuesser.php");
require_once ("/opt/libphutil/src/markup/syntax/engine/PhutilSyntaxHighlighterEngine.php");
require_once ("/opt/libphutil/src/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php");
require_once ("/opt/libphutil/src/markup/syntax/highlighter/PhutilDefaultSyntaxHighlighter.php");
require_once ("/opt/libphutil/src/future/Future.php");
require_once ("/opt/libphutil/src/future/ImmediateFuture.php");
require_once ("/opt/libphutil/src/parser/PhutilURI.php");
require_once ("/opt/libphutil/src/symbols/PhutilSymbolLoader.php");
require_once ("/opt/libphutil/src/symbols/PhutilClassMapQuery.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockInterpreter.php");
require_once ("/opt/libphutil/src/markup/engine/remarkup/blockrule/PhutilRemarkupTestInterpreterRule.php");
require_once ("/opt/libphutil/src/parser/xhpast/bin/PhutilXHPASTBinary.php");
require_once ("/opt/libphutil/src/markup/syntax/highlighter/PhutilSyntaxHighlighter.php");
require_once ("/opt/libphutil/src/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php");
require_once ("/opt/libphutil/src/lexer/PhutilPHPFragmentLexer.php");

require_once '/opt/thrift/lib/php/lib/Thrift/ClassLoader/ThriftClassLoader.php';
use Thrift\ClassLoader\ThriftClassLoader;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TBufferedTransport;

$loader = new ThriftClassLoader();
$loader->registerNamespace('Thrift', '/opt/thrift/lib/php/lib');
$loader->register();

$GEN_DIR = dirname ( __FILE__ ).'/../gen-php';
set_include_path(get_include_path() . PATH_SEPARATOR . $GEN_DIR);
require_once 'Types.php';
require_once 'PhabricatorParserPrivate.php';
//require_once 'RemarkupBlocksParser.php';

class RemarkupBlocksParser implements PhabricatorParserPrivateIf{

  private $engine = null;
  
  public function parse($text) {
  echo "[PHP] RemarkupBlocksParser:: parsing text \n";
  
    $blocks = $this->engine->splitTextIntoBlocks($text);
    
    $output = array();
    foreach($blocks as $block) {
        $additionalData = "";
        
        if ($block['rule'] instanceof PhutilRemarkupNoteBlockRule){
            $additionalData = $block['rule']->additionalData;
        }
        
        $block['rule'] = get_class($block['rule']) . $additionalData;
        $output[] = new Block($block);
    }
    
    return $output;
  }
  
  
  public function __construct() {
    $this->engine = $this->initialize();
    $this->engine->setMode(PhutilRemarkupEngine::MODE_TEXT);
  }
  
  private function initialize() {
    $engine = new PhutilRemarkupEngine();
    $engine->setConfig('uri.prefix', 'http://www.example.com/');

    $engine->setConfig(
      'uri.allowed-protocols',
      array(
        'http' => true,
        'mailto' => true,
        'tel' => true,
      ));

    $rules = array();
    $rules[] = new PhutilRemarkupEscapeRemarkupRule();
    $rules[] = new PhutilRemarkupMonospaceRule();
    $rules[] = new PhutilRemarkupDocumentLinkRule();
    $rules[] = new PhutilRemarkupHyperlinkRule();
    $rules[] = new PhutilRemarkupBoldRule();
    $rules[] = new PhutilRemarkupItalicRule();
    $rules[] = new PhutilRemarkupDelRule();
    $rules[] = new PhutilRemarkupUnderlineRule();
    $rules[] = new PhutilRemarkupHighlightRule();

    $blocks = array();
    $blocks[] = new PhutilRemarkupQuotesBlockRule();
    $blocks[] = new PhutilRemarkupReplyBlockRule();
    $blocks[] = new PhutilRemarkupHeaderBlockRule();
    $blocks[] = new PhutilRemarkupHorizontalRuleBlockRule();
    $blocks[] = new PhutilRemarkupCodeBlockRule();
    $blocks[] = new PhutilRemarkupLiteralBlockRule();
    $blocks[] = new PhutilRemarkupNoteBlockRule();
    $blocks[] = new PhutilRemarkupTableBlockRule();
    $blocks[] = new PhutilRemarkupSimpleTableBlockRule();
    $blocks[] = new PhutilRemarkupDefaultBlockRule();
    $blocks[] = new PhutilRemarkupListBlockRule();
    $blocks[] = new PhutilRemarkupInterpreterBlockRule();

    foreach ($blocks as $block) {
      if (!($block instanceof PhutilRemarkupCodeBlockRule)) {
        $block->setMarkupRules($rules);
      }
    }

    $engine->setBlockRules($blocks);

    return $engine;
  }

}

$handler = new RemarkupBlocksParser();
$processor = new PhabricatorParserPrivateProcessor($handler);

$socketName = $argv[1];
echo "[PHP] socketName: ". $socketName . "\n";
//$transport = new TBufferedTransport(new \Thrift\Transport\TSocketServer("unix://".$socketName));
$transport = new \Thrift\Transport\TSocketServer("unix://".$socketName);
$protocol = new TBinaryProtocol($transport, true, true);

echo "[PHP] RemarkupBlocksParser:: loading.. \n";

$transport->open();

    for (;;) {
        $processor->process($protocol, $protocol);
    }
    
$transport->close();
    


