zoukankan      html  css  js  c++  java
  • 代码在线运行工具

    特点:

    1、快捷键 alt + 字母

    2、代码为空直接提交,表示加载代码模板。

    3、扩展编译型语言:在模板中配置代码和运行命令,如果只有代码模板,没配置运行命令,则取 button 传的值,参考 go 的模板。

    4、扩展脚本型语言:直接添加按钮如,<button class="button" value="go_run_go" type="button" accesskey="g">G 语言 (G)</button>   value 值是解释器命令,最后一段表示扩展名。结果: go run filename.go

     

    <?php
    
    /**
    author:zbseoag
    仅限于本地使用,不要放在服务器上
     **/
    error_reporting(E_ALL);
    date_default_timezone_set('Asia/Shanghai');
    
    if (!empty($_REQUEST)){
        (new Tool($_REQUEST['data']))->{$_REQUEST['action']}();
        exit;
    }
    ?>
    
    <!doctype html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>我的工具包</title>
    </head>
    <style>
        * {padding: 0; margin: 0;font: 14px "微软雅黑"; }
        html,body {  100%; }
        button {  padding: 4px 10px; }
        .button {padding: 4px 10px; min- 110px; margin: 4px 0; }
        li {margin-bottom: 10px; }
        table{ border-collapse: collapse;  }
        tr{   border: 1px solid  #CCC; }
        td, th{  border: 1px solid  #CCC; }
    </style>
    
    <body style="padding:10px; box-sizing: border-box;">
        <form id="form" autocomplete="off">
            <ul style="list-style:none;">
                <li><textarea name="data" id="data" style=" 100%;padding: 4px;font:16px 'Courier New'; box-sizing: border-box;" rows="20"></textarea></li>
                <li style="position: absolute; top: 10px; right: 10px;">
                    <button type="button" id="seecode">源码</button>
                    <a target="_blank" href="http://tmp.com"><button type="button">浏览</button></a>
                    <button type="reset">清空</button>
                </li>
            </ul>
        </form>
    
        <button class="button" type="button" accesskey="s" value="bash_sh">Shell (S)</button>
        <button class="button" type="button" accesskey="p" value="python3.8_py" >Python (P)</button>
        <button class="button" type="button" accesskey="l" value="lua" >Lua (L)</button>
        <button class="button" type="button" accesskey="h" value="php" >PHP (H)</button>
        <button class="button" type="button" accesskey="c" value="c" >C 语言 (C)</button>
        <button class="button" type="button" accesskey="j" value="java" >Java (J)</button>
        <button class="button" type="button" accesskey="g" value="go_run_go" >Go (G)</button>
    
        <div id="run" style="margin-top:1.6em;"></div>
        <div id="code"></div>
    </body>
    
    </html>
    <script>
    var log = console.log;
    
    function el(id){
        return document.getElementById(id);
    }
    
    async function get(url){
        if(type == 'json'){
            return await fetch(url).then(response => response.json());
        }else{
            return await fetch(url).then(response => response.text());
        }
    }
    
    async function post(url, data, type='text'){
    
        let form = new FormData();
        for(let key in data) {
            form.append(key, data[key]);
        }
    
        let option = {method:'POST', body:form};
        if(type == 'json'){
            return await fetch(url, option).then(response => response.json());
        }else{
            return await fetch(url, option).then(response => response.text());
        }
    
    }
    
    class Form {
    
        constructor(id, url=''){
    
            this.option = {
                'header':new Headers(), 
                'method':'POST', 
                body: new FormData(document.getElementById(id))
            };
            this.url = url;
            this.type = 'text';
        }
    
        text(value='text'){
            this.type = value;
            return this;
        }
    
        append(key, value){
            this.option.body.append(key, value);
            return this;
        }
    
        header(value = null){
            if(value) this.option.header = new Headers(value);
            return this;
        }
    
        method(value = 'POST'){
            if(value) this.option.method = value;
            return this;
        }
      
        data(value = null){
            if(value){
                for(let key in value) {
                    this.append(key, value[key]);
                }
            }
            return this;
        }
    
        async send(method, data){
            this.data(data);
            this.method(method);
            if(this.type == 'json'){
                return await fetch(this.url, this.option).then(response => response.json());
            }else{
                return await fetch(this.url, this.option).then(response => response.text());
            }
        }
    
        post(data = null){
            return this.send('POST', data);
        }
        
    }
    
    var buttons = document.querySelectorAll(".button");
    buttons.forEach(function(item){
        item.onclick = function(){
    
            localStorage.setItem('action', item.getAttribute('value'));
            el('run').innerHTML = el('code').innerHTML = '';
    
            new Form('form').post({'action': item.getAttribute('value')}).then(data => {
    
                if(el('data').value == ''){
                    el('data').value = data; 
                }else{
                    el('run').innerHTML = data; 
                }
                
            }).catch(e => console.error( e.message));
    
        }
    });
    
    
    el('seecode').onclick = function(){
        post('', {'action': 'look', 'data': localStorage.getItem('action') }).then(data => { el('code').innerHTML = data; }).catch(e => console.error( e.message));
    }
    
    </script>
    
    <?php
    
    class Tool{
    
        public $file = '';
        public $output =  null;
        public $data =  '';
        public $command = '';
    
        public $template = array(
    
        'go' => ['
    package main
    import "fmt"
    func main(){
        fmt.Println("Hello, World!")
    }'],
    
        'java' => ['
    import static java.lang.System.out;
    import java.util.*;
    public class Main {
        public static void main(String[] args) throws Exception{
    
        }
    }', 'javac -encoding UTF8 {file} 2>&1 && java -Dfile.encoding=UTF8 {file}'],
    
        'c' => ['
    #include <stdio.h>
    #include <math.h>
    int main(){
        printf("Hello, World 
    ");
        
    }', 'echo "root" | sudo -S gcc -o {file}.out {file} 2>&1 && {file}.out'],
    );
    
        public function __construct($data){
    
            $this->file = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'test' . DIRECTORY_SEPARATOR . 'Main';
            $this->data = preg_replace('/(
    |
    |
    )+/', PHP_EOL, trim($data));
        }
    
        public function __call($method, $args){
    
            list($cmd, $ext) = $this->resolve($method);
            if (empty($this->data)){
                if(isset($this->template[$ext])){
                    $this->output = trim($this->template[$ext][0]);
                }
            } else {
                if ($ext == 'php')  $this->data = "<?php
    
    " . $this->data;
                if ($ext == 'java'){
                    preg_match('/publics+classs+(w+)/', $this->data, $subject);
                    if(!empty($subject)) $this->file = dirname($this->file) . DIRECTORY_SEPARATOR .$subject[1];
                } 
                
                $this->file .= ".$ext";
                $this->save();
                $this->command = empty($this->template[$ext][1]) ? implode(' ', $cmd) . " $this->file" : str_replace('{file}', $this->file, $this->template[$ext][1]);
           
            }
        }
    
        public function __destruct(){
    
            if ($this->command) {
                $this->output = shell_exec($this->command . ' 2>&1');
                $this->output = preg_replace('/[sudo].*:s+/', '', $this->output);
                self::p($this->command, htmlspecialchars($this->output, ENT_NOQUOTES));
           
            } else if(empty($this->data)) {
                echo self::format(htmlspecialchars($this->output, ENT_NOQUOTES));
            } else{
                self::p(htmlspecialchars($this->output, ENT_NOQUOTES));
            }
           
        }
    
        public function look(){
            $this->output = file_get_contents($this->file . '.' . $this->resolve($this->data)[1]);
        }
    
        public function save(){
            file_put_contents($this->file, $this->data, LOCK_EX);
        }
    
        public function resolve($value){
    
            $cmd = explode('_', $value);
            count($cmd) == 1 && array_push($cmd, $value);
            $ext = array_pop($cmd);
            return [$cmd, $ext];
    
        }
    
        /**
         * 格式化数据
         * @param $data
         * @return string
         */
        public static function format($data){
    
            if (in_array($data, array('TRUE', 'true', 'false', 'FALSE', 'null', 'NULL'), true)) $data = ""$data"";
            if (is_bool($data)) $data = $data ? 'true' : 'false';
            if (is_null($data)) $data = 'null';
            if ($data === '') $data = '""';
    
            $output = array();
            if (is_string($data) && function_exists($data)) {
                $object = new ReflectionFunction($data);
                $output = array('Function' => ['Name' => $data, 'Namespace' => $object->getNamespaceName(),  'File' => $object->getFilename()]);
            }
    
            if (is_object($data) || (is_string($data) && class_exists($data, false))) {
    
                $message = '';
                if (is_object($data)) {
    
                    if ($data instanceof Exception) {
    
                        $file = $data->getFile() . ' (' . $data->getLine() . ')';
                        $message =  $data->getMessage() . ' (' . $data->getCode() . ')';
                    }
    
                    $name = get_class($data);
                    $fields = get_object_vars($data);
                } else {
                    $name = $data;
                    $fields = get_class_vars($data);
                }
    
                $methods = get_class_methods($data);
    
                $object = new ReflectionClass($data);
                if (!isset($file)) $file = $object->getFilename();
    
                $output += array('Class' => ['Name' => $name, 'Namespace' => $object->getNamespaceName(), 'Exception' => $message, 'File' => $file, 'Attribute ' => $fields, 'Method' => $methods]);
            }
    
            return empty($output)? $data : $output;
        }
    
        public static function p(){
    
            $args = func_get_args();
            $count = func_num_args();
            if ($count == 0) $args = array();
    
            $cli = PHP_SAPI == 'cli' ? true : false;
            $output = $cli ? '' : '<pre style="background:#f3f3f4;padding:5px;border:1px solid #aaa;">';
            foreach ($args as $key => $data) {
                $data = self::format($data);
                $output .= print_r($data, true);
    
                if ($key < $count - 1) $output .= $cli ? PHP_EOL . "--------------------------------------------------------" . PHP_EOL : '<hr/>';
            }
    
            $output .= $cli ? PHP_EOL : '</pre>';
            echo $output;
        }
    
    
    
    }
    
    ?>
    • 添加到短语集
       
      • 没有此单词集: → 中文(简体)...
         
      • 创建新的单词集...
    • 拷贝
    • 添加到短语集
       
      • 没有此单词集: → 中文(简体)...
         
      • 创建新的单词集...
    • 拷贝
    • 添加到短语集
       
      • 没有此单词集: → 中文(简体)...
         
      • 创建新的单词集...
    • 拷贝
    • 添加到短语集
       
      • 没有此单词集: → 中文(简体)...
         
      • 创建新的单词集...
    • 拷贝
  • 相关阅读:
    Dubbo监控中心
    Dubbo 提供者配置&测试
    IDEA中pom.xml依赖另一个项目
    MBG
    查询优化技术之多级缓存
    分布式扩展流程
    Redis取值时取出的是HashMap
    linux执行sql
    Git的使用
    405
  • 原文地址:https://www.cnblogs.com/zbseoag/p/14224686.html
Copyright © 2011-2022 走看看