entrylabs / entryjs

entryjs is visual programming editor for education
https://playentry.org
Apache License 2.0
123 stars 456 forks source link

entryjs

entryjs는 엔트리에서 개발한 HTML5 기반의 블록코딩 라이브러리 입니다. 엔트리 사이트에 접속하시면 entryjs를 사용한 블록코딩 환경을 확인해 볼 수 있습니다.

시작하기

entryjs는 HTML Canvas와 오디오, 벡터 이미지등을 다루기 위해 몇가지 오픈소스 라이브러리들을 사용합니다. 이 라이브러리들이 웹프로젝트에 먼저 로딩된 후에 entryjs를 로딩하여야 합니다.

써드파티 라이브러리

자바스크립트 라이브러리

<!-- 써드파티 라이브러리들 -->
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/PreloadJS/lib/preloadjs-0.6.0.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/EaselJS/lib/easeljs-0.8.0.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/SoundJS/lib/soundjs-0.6.0.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/SoundJS/lib/flashaudioplugin-0.6.0.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/lodash/dist/lodash.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/jquery/jquery.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/jquery-ui/ui/minified/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/velocity/velocity.min.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/codemirror/lib/codemirror.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/codemirror/addon/hint/show-hint.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/codemirror/addon/lint/lint.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/codemirror/addon/selection/active-line.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/codemirror/mode/javascript/javascript.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/codemirror/addon/hint/javascript-hint.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/fuzzy/lib/fuzzy.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/socket.io-client/socket.io.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/react/react.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/react/react-dom.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entry-lms/dist/assets/app.js"></script>
<script
    type="text/javascript"
    src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/literallycanvas-mobile/lib/js/literallycanvas.js"
></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entry-tool/dist/entry-tool.js"></script>

<!-- playentry 서버에 포함된 코드 -->
<script type="text/javascript" src="https://playentry.org/js/jshint.js"></script>
<script type="text/javascript" src="https://playentry.org/js/textmode/python/python.js"></script>

<!-- entryjs 및 entryjs 에 포함된 라이브러리들 -->
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/util/filbert.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/util/CanvasInput.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/util/ndgmr.Collision.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/util/handle.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/util/bignumber.min.js"></script>

<!-- entryjs core / 언어 및 글로벌 설정이 포함되어있습니다. -->
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/lang/ko.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/extern/util/static.js"></script>
<script type="text/javascript" src="https://github.com/entrylabs/entryjs/raw/develop/${LIBDIR}/entryjs/dist/entry.min.js"></script>

entryjs 스타일시트

블록 디자인과 관련된 기본적인 스타일들이 정의되어 있습니다.

<link rel="stylesheet" href="https://github.com/entrylabs/entryjs/blob/develop/${LIBDIR}/entryjs/dist/entry.css" />

엔트리 초기화 (Inject Options)

필요한 라이브러리와 entryjs를 로딩하였으면 현재 DOM의 특정 위치에 Javascript를 이용해 entryjs workspace를 주입할 수 있습니다.

initOptions

Workspace 타입과 폰트정보를 제외한 모든 옵션은 선택사항이며 Boolean 타입입니다.

Entry.playground.setBlockMenu();

블록메뉴 초기화

Entry.loadProject(project);

프로젝트 불러오기. project 인자를 생략할 경우 기본 프로젝트를 리턴합니다.

이벤트. (Event description)

Entry.addEventListener(eventName, function);
Entry.dispatchEvent(eventName, params);

Entry.Toast

블록 모양 정의와 실행 스크립트.

${entryjs}/src/blocks/**/*

블록 모양 정의

EntryDocs - 블록 명세 작성 을 참고해주세요.

프로젝트 (Project Schema)

저장

: 아래의 Entry 함수를 이용해 필수정보들을 JSON형태로 저장할 수 있습니다. 저장된 프로젝트는 Entry.loadProject(project) 를 이용해 다시 로드할 수 있습니다.

var project = Entry.exportProject();

상세 스키마

/**
 * MongoDB 스키마 예제.
 */
var ProjectSchema = new Schema({
    speed: { // 초당 실행 프레임수
        type: Number,
        default: 60
    },
    objects: [ // 오브젝트 목록
        {
            id: String, // 오브젝트 ID. Unique.
            name: String, // 오브젝트(또는 글상자 제목) 이름.
            text: String, // 글상자 내용. (objectType이 textBox일 경우)
            order: Number, // TODO
            objectType: String, // 오브젝트 유형. (sprite, textBox)
            scene: String, // 장면 ID. Unique.
            active: { // 오브젝트 활성화 여부
                type: Boolean,
                default: true
            },
            lock: { // 오브젝트 잠금 여부
                type: Boolean,
                default: false
            },
            rotateMethod: String, // 회전방식. (free, vertical, none)
            entity: { // 엔티티 정보
                rotation: Number, // 회전
                direction: Number, // 방향
                x: Number, // x 좌표
                y: Number, // y 좌표
                regX: Number, // 가로 중심점
                regY: Number, // 세로 중심점
                scaleX: Number, // 가로 배율
                scaleY: Number, // 세로 배율
                width: Number, // 넓이
                height: Number, // 높이
                imageIndex: Number, // TODO
                visible: Boolean, // 화면표시 여부
                colour: String, // 글상자 폰트색깔
                font: String, // 글상자 폰트
                bgColor: String, // 글상자 배경색깔
                textAlign: Number, // 글상자 정렬
                lineBreak: Boolean, // 글상자 줄바꿈 여부
                underLine: Boolean, // 글상자
                strike: Boolean // 글상자 밑줄
            },
            script: String, // 블록 스크립트
            sprite: { // 스프라이트 정보
                name: String, // 스프라이트 이름
                pictures: [{ // 모양 목록
                    id: String, // 모양 ID. Unique/
                    name: String, // 모양 이름
                    fileurl: String, // 모양 이미지
                    dimension: { // 모양 크기
                        width: Number,
                        height: Number,
                        scaleX: Number,
                        scaleY: Number
                    },
                    scale: { // 확대, 축소 비율(100% 기준)
                        type: Number,
                        default: 100
                    }
                }],
                sounds: [{ // 소리 목록
                    id: String, // 소리 ID. Unique.
                    name: String, // 이름
                    fileurl: String, // 사운드 파일 URL
                    duration: Number // 재생시간. (초단위)
                }]
            },
            selectedPictureId: String, // 현재 활성화된 모양의 ID
            selectedSoundId: String // 현재 활성화된 소리의 ID

        }
    ],
    variables: [ // 프로젝트 변수
        {
            name: String, // 변수명
            variableType: String, // 변수형. (일반변수: variable, 타이머: timer, 대답: answer, 슬라이드: slide, 리스트: list)
            id: String, // 변수ID. Unique.
            value: String, // 변수 값
            minValue: Number, // 최소값
            maxValue: Number, // 최대값
            visible: Boolean, // 캔버스에 표시여부
            x: Number, // 컨버스 위치 x좌표
            y: Number, // 캔버스 위치 y좌표
            width: Number, // 넓이
            height: Number, // 높이
            isCloud: { // 공유 변수 여부
                type: Boolean,
                default: false
            },
            object: { // 지역변수일 경우 참조하는 오브젝트 ID
                type: String,
                default: null
            },
            array: [{ // 변수형이 list일 경우 값 목록
                data: String // 값 데이터
            }]
        }
    ],
    messages: [ // 신호 목록
        {
            name: String, // 신호명
            id: String // 신호 ID. Unique.
        }
    ],
    functions: [ // 함수 목록
        {
            id: String, // 함수 ID. Unique.
            block: String, // 함수 블록 정보
            content: String, // 함수 실행 정보
                id: String,
                name: String
            }]
        }
    ],
    scenes: { // 장면 정보
        type: [ // 장면 목록
            {
                name: String, // 장면 이름
                id: String // 장면 ID. Unique.
            }
        ]
    },
});

Sprite, Picture, Sound schema

스프라이트

var SpriteSchema = new Schema({
    name: String, // 스프라이트 이름
    pictures: [
        {
            // 모양 목록
            name: String, // 모양 이름
            fileurl: String, // 모양 이미지
            dimension: {
                // 모양 크기
                width: Number,
                height: Number,
            },
        },
    ],
    sounds: [
        {
            // 소리 목록
            name: String, // 이름
            fileurl: String, // 사운드 파일 URL
            duration: Number, // 재생시간. (초단위)
        },
    ],
});

모양

var PictureSchema = new Schema({
    name: String, // 모양 이름
    fileurl: String, // 모양 이미지
    dimension: {
        // 모양 크기
        width: Number,
        height: Number,
    },
});

소리

var SoundSchema = new Schema({
    name: String, // 이름
    fileurl: String, // 사운드 파일 URL
    duration: Number, // 재생시간. (초단위)
});

Copyright and License

EntryJS Copyright (c) 2015 Entry Labs.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.