student.html 9.57 KB
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生端</title>
    <link href="../css/reset.css" rel="stylesheet">
    <link rel="stylesheet" href="../css/responsive/css/bootstrap.min.css">
    <link rel="stylesheet" href="../js/codemirror-5.25.0/lib/codemirror.css">
    <link rel="stylesheet" href="style/main.css">
<style>

    .teacher-live, .student-work{
        position: absolute;
        width: 50%;
        height: 100%;
    }
    .teacher-live{
        left: 0;
        border-right: 1px solid #999;
    }
    .student-work{
        right: 0;
    }
</style>
</head>
<body>
<div class="student">
    <div class="teacher-live">
        <div class="live-wrap">
            <!-- 头部信息 -->
            <div class="header">
                <h1>老师端</h1>
            </div>

            <!-- 录制区域 -->
            <div class="live-code">
                <textarea id="teacher" title="HTML"></textarea>
            </div>

            <!-- 编译操作区 -->
            <!-- 运行结果区 -->
            <div class="live-console-wrap">
                <div id="toolbar">
                    <!-- Nav tabs -->
                    <ul class="nav nav-tabs result-tabs need-compile" role="tablist" id="cmprun-tabs">
                        <li class="active"><a href="#stdin" role="tab" data-toggle="tab" class="text">标准</a></li>
                        <li><a href="#cmpinfo" role="tab" data-toggle="tab" class="text">编译</a></li>
                        <li><a href="#stderr" role="tab" data-toggle="tab" class="text">错误</a></li>
                        <li><a href="#output" role="tab" data-toggle="tab" class="text">结果</a></li>
                    </ul>
                    <div class="pull-right func">
                        <button class="btn compile-btn" id="CompileBtn">
                            <span class="ladda-label">编译运行</span>
                        </button>
                        <a id="full-screen" class="fb">
                            <img src="../img/full-screen-icon.svg" alt="">
                        </a>
                        <a id="back-screen" class="fb" style="display: none;">
                            <img src="../img/full-screen-icon.svg" alt="">
                        </a>
                    </div>
                </div>

                <!-- Tab panes -->
                <div id="resultoutput" class="tab-content need-compile">
                    <div class="tab-pane active padall15" id="stdin">
                        <div class="stdin-wrap">
                            <input class="effect-2" id="runtimeArgus" type="text" placeholder="标准输入">
                            <span class="focus-border"></span>
                        </div>
                    </div>
                    <div class="tab-pane padall15" id="cmpinfo"></div>
                    <div class="tab-pane padall15" id="stderr"></div>
                    <div class="tab-pane padall15" id="output"></div>
                </div>
                <div class="panel-body no-compile" id="ifrcontainer">
                    <iframe id="resultiframe" frameBorder="0" width="100%"></iframe>
                </div>
            </div>

            <!-- 录制控制区 -->
            <div class="live-ctrl">
                
            </div>
        </div>
    </div>
    <div class="student-work">
        <div class="live-wrap">
            <!-- 头部信息 -->
            <div class="header">
                <h1>学生端</h1>
            </div>

            <!-- 录制区域 -->
            <div class="live-code">
                <textarea id="student" title="HTML"></textarea>
            </div>

            <!-- 编译操作区 -->
            <!-- 运行结果区 -->
            <div class="live-console-wrap">
                <div id="toolbar">
                    <!-- Nav tabs -->
                    <ul class="nav nav-tabs result-tabs need-compile" role="tablist" id="cmprun-tabs">
                        <li class="active"><a href="#stdin" role="tab" data-toggle="tab" class="text">标准</a></li>
                        <li><a href="#cmpinfo" role="tab" data-toggle="tab" class="text">编译</a></li>
                        <li><a href="#stderr" role="tab" data-toggle="tab" class="text">错误</a></li>
                        <li><a href="#output" role="tab" data-toggle="tab" class="text">结果</a></li>
                    </ul>
                    <div class="pull-right func">
                        <button class="btn compile-btn" id="CompileBtn">
                            <span class="ladda-label">编译运行</span>
                        </button>
                        <a id="full-screen" class="fb">
                            <img src="../img/full-screen-icon.svg" alt="">
                        </a>
                        <a id="back-screen" class="fb" style="display: none;">
                            <img src="../img/full-screen-icon.svg" alt="">
                        </a>
                    </div>
                </div>

                <!-- Tab panes -->
                <div id="resultoutput" class="tab-content need-compile">
                    <div class="tab-pane active padall15" id="stdin">
                        <div class="stdin-wrap">
                            <input class="effect-2" id="runtimeArgus" type="text" placeholder="标准输入">
                            <span class="focus-border"></span>
                        </div>
                    </div>
                    <div class="tab-pane padall15" id="cmpinfo"></div>
                    <div class="tab-pane padall15" id="stderr"></div>
                    <div class="tab-pane padall15" id="output"></div>
                </div>
                <div class="panel-body no-compile" id="ifrcontainer">
                    <iframe id="resultiframe" frameBorder="0" width="100%"></iframe>
                </div>
            </div>

            <!-- 录制控制区 -->
            <div class="live-ctrl">
                
            </div>
        </div>
    </div>    
</div>


<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script src="../js/codemirror-5.25.0/lib/codemirror.js"></script>
<script src="../js/bootstrap.js"></script>
<script>
$(function() {
    var teacherId = document.getElementById('teacher');
    var studentId = document.getElementById('student');
    var socket = io('http://localhost:3000');

    var teacher = CodeMirror.fromTextArea(teacherId, {
      value: '输入HTML代码',
      mode:  'text/javascript',
      lineNumbers: true,
      smartIndent: false
    });

    var student = CodeMirror.fromTextArea(studentId, {
      value: '输入HTML代码',
      mode:  'text/javascript',
      lineNumbers: true,
      smartIndent: false
    });


    socket.on('teacher.programming', function(msg) {
        console.log(msg);
        var msgObj = JSON.parse(msg)
        // student.setValue(msg)
        processChangeObject(teacher, msgObj);

        $('#messages').append($('<li>').text(msg));
        window.scrollTo(0, document.body.scrollHeight);
    });

    function processChangeObject(playbackcm, obj) {

        for (var i = 0; i < obj.text.length; i++) {
            /* 设置鼠标行标示 */
            if (playbackcm.getTextArea().id === "HTMLplayer") {
                if (htmlhlLine !== null) {
                    playbackcm.clearMarker(htmlhlLine);
                }
                htmlhlLine = playbackcm.setMarker(obj.from.line + i, '<span class="text-primary glyphicon glyphicon-pencil"></span>');
            } else if (playbackcm.getTextArea().id === "CSSplayer") {
                if (csshlLine !== null) {
                    playbackcm.clearMarker(csshlLine);
                }
                csshlLine = playbackcm.setMarker(obj.from.line + i, '<span class="text-primary glyphicon glyphicon-pencil"></span>');
            } else if (playbackcm.getTextArea().id === "JSplayer") {
                if (jshlLine !== null) {
                    playbackcm.clearMarker(jshlLine);
                }
                jshlLine = playbackcm.setMarker(obj.from.line + i, '<span class="text-primary glyphicon glyphicon-pencil"></span>');
            }

            /* 设置鼠标输入指针 */
            playbackcm.setCursor({ line: obj.from.line + i, ch: obj.from.ch });

            //以下代码处理其他
            if (obj.text.length === 3 && obj.text[1] !== '' && i === 1) {
                playbackcm.setSelection({ line: obj.from.line + i, ch: 0 });
            } else if (obj.text.length === 3 && obj.text[2] !== '' && i === 2) {
                playbackcm.setSelection({ line: obj.from.line + i, ch: 0 });

                //以下代码处理文字块选择并回车的问题 
            } else if (obj.text.length === 2 && obj.text[i] === '' && i === 1) {
                playbackcm.setSelection({ line: obj.from.line + i, ch: 0 });

                //以下处理块选择并且粘贴多行问题
            } else {
                if (i == 0) {
                    playbackcm.setSelection({ line: obj.from.line + i, ch: obj.from.ch }, { line: obj.to.line + i, ch: obj.to.ch });
                } else {
                    playbackcm.setSelection({ line: obj.from.line + i, ch: 0 }, { line: obj.from.line + i, ch: 0 });
                }
            }

            if (i !== obj.text.length - 1) {
                playbackcm.replaceSelection(obj.text[i] + '\n');
            } else {
                playbackcm.replaceSelection(obj.text[i]);
            }
        }

        if (obj.next) {
            processChangeObject(playbackcm, obj.next);
        }
    }

});
</script>

</body>
</html>