diff --git a/extern/face-landmarker.worker.js b/extern/face-landmarker.worker.js
index 2106a35d32..dfb06453e4 100644
--- a/extern/face-landmarker.worker.js
+++ b/extern/face-landmarker.worker.js
@@ -166,6 +166,7 @@ const contextFlip = (context, axis) => {
}
};
+let lastDetect;
const predictFaceLandmarker = async (imageBitmap) => {
try {
if (!workerContext || !human) {
@@ -177,7 +178,9 @@ const predictFaceLandmarker = async (imageBitmap) => {
if (!isRun || !isFirstIdle) {
return;
}
- const results = await human.detect(imageBitmap);
+ lastDetect = human.detect(imageBitmap);
+ const results = await lastDetect;
+
workerContext.save();
workerContext.clearRect(0, 0, 640, 360);
@@ -225,11 +228,13 @@ const predictFaceLandmarker = async (imageBitmap) => {
}
};
-const clearPredictFaceLandmarker = () => {
- console.log('clearPredictFaceLandmarker');
+const clearPredictFaceLandmarker = async () => {
isRun = false;
- self.postMessage({ action: 'run_stop_face_landmarker' });
- isPrevFaceLandmarker = false;
- countDetectedFace = 0;
- workerContext.clearRect(0, 0, 640, 360);
+ await lastDetect;
+ requestAnimationFrame(() => {
+ self.postMessage({ action: 'run_stop_face_landmarker' });
+ isPrevFaceLandmarker = false;
+ countDetectedFace = 0;
+ workerContext.clearRect(0, 0, 640, 360);
+ });
};
diff --git a/extern/lang/en.js b/extern/lang/en.js
index 467e41db8f..9e3380c112 100644
--- a/extern/lang/en.js
+++ b/extern/lang/en.js
@@ -9,140 +9,135 @@ Lang.en = 'English';
Lang.jp = '日本語';
Lang.vn = 'tiếng Việt';
Lang.Command = {
- '1': '장면 추가하기',
- '2': '장면 삭제하기',
- '3': '장면 이름 수정',
- '4': '장면 순서 변경',
- '5': '장면 선택',
- '101': '블록 쓰레드 추가하기',
- '102': '블록 쓰레드 삭제하기',
- '103': '블록 삭제하기',
- '104': '블록 복구하기',
- '105': '블록 끼워넣기',
- '106': '블록 분리하기',
- '107': '블록 이동하기',
- '108': '블록 복제하기',
- '109': '블록 복제 취소하기',
- '110': '스크롤',
- '111': '블록 필드값 수정',
- '117': '블록 쓰레드 추가하기',
- '118': '블록 끼워넣기',
- '119': '블록 이동하기',
- '120': '블록 분리하기',
- '121': '블록 이동하기',
- '122': '블록 끼워넣기',
- '123': '블록 끼워넣기',
- '201': '오브젝트 선택하기',
- '202': '오브젝트 수정 버튼 클릭',
- '203': '오브젝트 그림 추가',
- '204': '오브젝트 그림 삭제',
- '205': '오브젝트 소리 추가',
- '206': '오브젝트 소리 삭제',
- '207': '오브젝트 이름 수정',
- '208': '오브젝트 추가',
- '209': '오브젝트 삭제',
- '210': '오브젝트 추가 버튼 클릭',
- '211': '오브젝트 x 수정',
- '212': '오브젝트 y 수정',
- '213': '오브젝트 size 수정',
- '214': '오브젝트 방향 수정',
- '215': '오브젝트 이동 방향 수정',
- '216': '오브젝트 회전방식 수정',
- '217': '엔터티 모델 동기화',
- '301': 'do',
- '302': 'undo',
- '303': 'redo',
- '401': '그림 수정하기',
- '402': '그림 수정 취소하기',
- '403': '그림 수정하기',
- '404': '그림 수정 취소하기',
- '405': '글상자 수정',
- '501': '시작하기',
- '502': '정지하기',
- '601': '컨테이너 오브젝트 선택하기',
- '701': '모드 바꾸기',
- '702': '모양 추가 버튼 클릭',
- '703': '소리 추가 버튼 클릭',
- '801': '속성 필터 선택하기',
- '802': '변수 추가하기 버튼 클릭',
- '803': '변수 추가하기',
- '804': '변수 삭제하기',
- '805': '변수 이름 설정',
- '806': '신호 이름 설정',
- '807': '신호 추가',
- '808': '신호 삭제',
- '809': '변수 스코프 정하기',
- '810': '변수 글로벌 체크',
- '811': '변수 보이기 체크',
- '812': '변수 기본값 설정',
- '813': '변수 슬라이드로 체크',
- '814': '변수 최솟값 정하기',
- '815': '변수 최댓값 정하기',
- '816': '리스트 추가 버튼 클릭',
- '817': '리스트 추가',
- '818': '리스트 삭제',
- '819': '리스트 이름 정하기',
- '820': '리스트 스코프 정하기',
- '821': '리스트 글로벌 체크',
- '822': '리스트 보이기 체크',
- '823': '리스트 길이 변경',
- '824': '리스트 기본값 설정',
- '825': '메세지 수정 enable',
- '826': '변수 수정 enable',
- '827': '리스트 수정 enable',
- '828': '변수 이름 정하기',
- '829': '리스트 이름 정하기',
- '900': '모달 닫기',
- '1001': '함수 생성 시작',
- '1002': '함수 수정 시작',
- '1003': '함수 수정 취소',
- '1004': '함수 생성',
- '1005': '함수 업데이트',
+ 1: '장면 추가하기',
+ 2: '장면 삭제하기',
+ 3: '장면 이름 수정',
+ 4: '장면 순서 변경',
+ 5: '장면 선택',
+ 101: '블록 쓰레드 추가하기',
+ 102: '블록 쓰레드 삭제하기',
+ 103: '블록 삭제하기',
+ 104: '블록 복구하기',
+ 105: '블록 끼워넣기',
+ 106: '블록 분리하기',
+ 107: '블록 이동하기',
+ 108: '블록 복제하기',
+ 109: '블록 복제 취소하기',
+ 110: '스크롤',
+ 111: '블록 필드값 수정',
+ 117: '블록 쓰레드 추가하기',
+ 118: '블록 끼워넣기',
+ 119: '블록 이동하기',
+ 120: '블록 분리하기',
+ 121: '블록 이동하기',
+ 122: '블록 끼워넣기',
+ 123: '블록 끼워넣기',
+ 201: '오브젝트 선택하기',
+ 202: '오브젝트 수정 버튼 클릭',
+ 203: '오브젝트 그림 추가',
+ 204: '오브젝트 그림 삭제',
+ 205: '오브젝트 소리 추가',
+ 206: '오브젝트 소리 삭제',
+ 207: '오브젝트 이름 수정',
+ 208: '오브젝트 추가',
+ 209: '오브젝트 삭제',
+ 210: '오브젝트 추가 버튼 클릭',
+ 211: '오브젝트 x 수정',
+ 212: '오브젝트 y 수정',
+ 213: '오브젝트 size 수정',
+ 214: '오브젝트 방향 수정',
+ 215: '오브젝트 이동 방향 수정',
+ 216: '오브젝트 회전방식 수정',
+ 217: '엔터티 모델 동기화',
+ 301: 'do',
+ 302: 'undo',
+ 303: 'redo',
+ 401: '그림 수정하기',
+ 402: '그림 수정 취소하기',
+ 403: '그림 수정하기',
+ 404: '그림 수정 취소하기',
+ 405: '글상자 수정',
+ 501: '시작하기',
+ 502: '정지하기',
+ 601: '컨테이너 오브젝트 선택하기',
+ 701: '모드 바꾸기',
+ 702: '모양 추가 버튼 클릭',
+ 703: '소리 추가 버튼 클릭',
+ 801: '속성 필터 선택하기',
+ 802: '변수 추가하기 버튼 클릭',
+ 803: '변수 추가하기',
+ 804: '변수 삭제하기',
+ 805: '변수 이름 설정',
+ 806: '신호 이름 설정',
+ 807: '신호 추가',
+ 808: '신호 삭제',
+ 809: '변수 스코프 정하기',
+ 810: '변수 글로벌 체크',
+ 811: '변수 보이기 체크',
+ 812: '변수 기본값 설정',
+ 813: '변수 슬라이드로 체크',
+ 814: '변수 최솟값 정하기',
+ 815: '변수 최댓값 정하기',
+ 816: '리스트 추가 버튼 클릭',
+ 817: '리스트 추가',
+ 818: '리스트 삭제',
+ 819: '리스트 이름 정하기',
+ 820: '리스트 스코프 정하기',
+ 821: '리스트 글로벌 체크',
+ 822: '리스트 보이기 체크',
+ 823: '리스트 길이 변경',
+ 824: '리스트 기본값 설정',
+ 825: '메세지 수정 enable',
+ 826: '변수 수정 enable',
+ 827: '리스트 수정 enable',
+ 828: '변수 이름 정하기',
+ 829: '리스트 이름 정하기',
+ 900: '모달 닫기',
+ 1001: '함수 생성 시작',
+ 1002: '함수 수정 시작',
+ 1003: '함수 수정 취소',
+ 1004: '함수 생성',
+ 1005: '함수 업데이트',
};
Lang.CommandTooltip = {
- '101': '블록 쓰레드 추가하기',
- '102': '블록 쓰레드 삭제하기',
- '103': '블록 삭제하기',
- '104': '블록 복구하기',
- '105':
- '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '106': '블록 분리하기',
- '107': '블록 이동하기',
- '108': '블록 복제하기',
- '109': '블록 복제 취소하기',
- '110': '스크롤',
- '111':
- '블록 필드값 수정@@값을 입력하기 위해 이곳을 클릭합니다.$$선택지를 클릭합니다.$$선택지를 클릭합니다.$$&value&을 입력합니다.$$&value&를 선택합니다.$$키보드 &value&를 누릅니다.',
- '117': '블록 쓰레드 추가하기',
- '118': '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '119': '블록 가져오기@@빈 곳에 블록을 끌어다 놓습니다.',
- '120':
- '블록 분리하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
- '121':
- '블록 이동하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
- '122': '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '123':
- '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '201': '오브젝트 선택하기',
- '301': 'do',
- '302': 'undo',
- '303': 'redo',
- '401': '그림 수정하기',
- '402': '그림 수정 취소하기',
- '403': '그림 수정하기',
- '404': '그림 수정 취소하기',
- '501': '실행하기@@[시작하기]를 누릅니다.',
- '502': '정지하기@@[정지하기]를 누릅니다.',
- '601': '컨테이너 오브젝트 선택하기',
- '701': '모드 바꾸기',
- '702': '모양 추가하기@@모양추가를 클릭합니다.',
- '703': '소리 추가하기@@소리추가를 클릭합니다.',
- '801': '변수 속성창 필터 선택하기',
- '802': '변수 추가하기@@[변수 추가]를 클릭합니다.',
- '803': '변수 추가하기@@[확인]을 클릭합니다.',
- '804': '변수 삭제하기@@이 버튼을 눌러 변수를 삭제합니다.',
- '805': '변수 이름 설정',
- '1101': '확장 블록 추가하기@@확장 블록 블러오기를 클릭합니다.',
+ 101: '블록 쓰레드 추가하기',
+ 102: '블록 쓰레드 삭제하기',
+ 103: '블록 삭제하기',
+ 104: '블록 복구하기',
+ 105: '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 106: '블록 분리하기',
+ 107: '블록 이동하기',
+ 108: '블록 복제하기',
+ 109: '블록 복제 취소하기',
+ 110: '스크롤',
+ 111: '블록 필드값 수정@@값을 입력하기 위해 이곳을 클릭합니다.$$선택지를 클릭합니다.$$선택지를 클릭합니다.$$&value&을 입력합니다.$$&value&를 선택합니다.$$키보드 &value&를 누릅니다.',
+ 117: '블록 쓰레드 추가하기',
+ 118: '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 119: '블록 가져오기@@빈 곳에 블록을 끌어다 놓습니다.',
+ 120: '블록 분리하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
+ 121: '블록 이동하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
+ 122: '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 123: '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 201: '오브젝트 선택하기',
+ 301: 'do',
+ 302: 'undo',
+ 303: 'redo',
+ 401: '그림 수정하기',
+ 402: '그림 수정 취소하기',
+ 403: '그림 수정하기',
+ 404: '그림 수정 취소하기',
+ 501: '실행하기@@[시작하기]를 누릅니다.',
+ 502: '정지하기@@[정지하기]를 누릅니다.',
+ 601: '컨테이너 오브젝트 선택하기',
+ 701: '모드 바꾸기',
+ 702: '모양 추가하기@@모양추가를 클릭합니다.',
+ 703: '소리 추가하기@@소리추가를 클릭합니다.',
+ 801: '변수 속성창 필터 선택하기',
+ 802: '변수 추가하기@@[변수 추가]를 클릭합니다.',
+ 803: '변수 추가하기@@[확인]을 클릭합니다.',
+ 804: '변수 삭제하기@@이 버튼을 눌러 변수를 삭제합니다.',
+ 805: '변수 이름 설정',
+ 1101: '확장 블록 추가하기@@확장 블록 블러오기를 클릭합니다.',
};
Lang.Blocks = {
START_when_object_click: 'When object clicked',
@@ -917,7 +912,6 @@ Lang.Blocks = {
CALC_picture_index: 'index of picture',
CALC_picture_name: 'name of picture',
CALC_get_sound_volume: 'Volume',
- CALC_quotient_and_mod_1: '',
CALC_quotient_and_mod_2: 'of',
CALC_quotient_and_mod_3: '/',
CALC_quotient_and_mod_sub_1: 'Quotient',
@@ -941,7 +935,6 @@ Lang.Blocks = {
CALC_calc_operation_factorial: 'factorial value',
CALC_calc_operation_abs: 'absolute value',
CALC_get_timer_value: 'Timer value',
- CALC_choose_project_timer_action_1: '',
CALC_choose_project_timer_action_sub_1: 'Start',
CALC_choose_project_timer_action_sub_2: 'Stop',
CALC_choose_project_timer_action_sub_3: 'Reset',
@@ -960,33 +953,24 @@ Lang.Blocks = {
CALC_get_sound_duration_1: 'Length of',
CALC_get_sound_duration_2: 'sound',
CALC_length_of_string_1: 'length of',
- CALC_length_of_string_2: '',
CALC_reverse_of_string_1: 'Reverse',
- CALC_reverse_of_string_2: '',
VARIABLE_combine_something_1: 'join',
- VARIABLE_combine_something_2: '',
- VARIABLE_combine_something_3: '',
CALC_char_at_1: 'letter',
CALC_char_at_2: 'of',
- CALC_char_at_3: '',
hi_entry: 'Hello Entry!',
hi_entry_en: 'Hello Entry!',
CALC_substring_1: 'substring of',
CALC_substring_2: 'from',
CALC_substring_3: 'to',
- CALC_substring_4: '',
CALC_count_match_string_1: 'count of',
CALC_count_match_string_2: 'in',
CALC_index_of_string_1: 'index of',
CALC_index_of_string_2: 'in',
- CALC_index_of_string_3: '',
CALC_replace_string_1: 'replace',
CALC_replace_string_2: 'in',
CALC_replace_string_3: 'with',
- CALC_replace_string_4: '',
hello: 'Hello',
nice: 'nice to meet you',
- CALC_change_string_case_1: '',
CALC_change_string_case_2: 'of',
CALC_change_string_case_sub_1: 'uppercase',
CALC_change_string_case_sub_2: 'lowercase',
@@ -994,13 +978,10 @@ Lang.Blocks = {
VARIABLE_get_canvas_input_value: 'response',
VARIABLE_get_variable_1: 'Value of',
VARIABLE_value_of_index_from_list_1: 'value of',
- VARIABLE_value_of_index_from_list_2: '',
VARIABLE_value_of_index_from_list_3: 'th element',
VARIABLE_length_of_list_1: 'length of',
- VARIABLE_length_of_list_2: '',
VARIABLE_is_included_in_list_1: 'is included in',
VARIABLE_is_included_in_list_2: 'value',
- VARIABLE_is_included_in_list_3: '',
table_row: 'row',
table_col: 'column',
table_sum: 'sum',
@@ -1667,33 +1648,17 @@ Lang.Blocks = {
VARIABLE_set_variable: 'Set variable',
VARIABLE_show_variable: 'Show variable',
VARIABLE_hide_variable: 'Hide variable',
- VARIABLE_value_of_index_from_list: '',
- VARIABLE_add_value_to_list: '',
VARIABLE_add_value_to_list_1: 'add',
VARIABLE_add_value_to_list_2: 'to the list',
- VARIABLE_add_value_to_list_3: '',
- VARIABLE_remove_value_from_list: '',
VARIABLE_remove_value_from_list_1: 'remove',
VARIABLE_remove_value_from_list_2: 'th element from',
- VARIABLE_remove_value_from_list_3: '',
- VARIABLE_insert_value_to_list: '',
VARIABLE_insert_value_to_list_1: 'insert',
VARIABLE_insert_value_to_list_2: 'to',
- VARIABLE_insert_value_to_list_3: '',
VARIABLE_insert_value_to_list_4: 'th position',
- VARIABLE_change_value_list_index: '',
VARIABLE_change_value_list_index_1: 'change',
VARIABLE_change_value_list_index_3: 'th element to',
- VARIABLE_change_value_list_index_2: '',
- VARIABLE_change_value_list_index_4: '',
- VARIABLE_length_of_list: '',
- VARIABLE_is_included_in_list: '',
- VARIABLE_show_list: '',
VARIABLE_show_list_1: 'Show list',
- VARIABLE_show_list_2: '',
- VARIABLE_hide_list: '',
VARIABLE_hide_list_1: 'Hide list',
- VARIABLE_hide_list_2: '',
START_when_message_cast: 'When message received',
START_when_message_cast_1: 'When',
START_when_message_cast_2: 'message received',
@@ -1728,17 +1693,19 @@ Lang.Blocks = {
object_detector_title_text: 'Object Detection',
hand_detection_title_text: 'Hand Detection',
unknown: 'Unknown',
+ is_type_en: 'alphabet',
+ is_type_ko: 'hangeul',
};
Lang.video_body_coord_params = {
- left_eye: 'Left Eye',
- right_eye: 'Right Eye',
- nose: 'Nose',
+ left_eye: 'left eye',
+ right_eye: 'right eye',
+ nose: 'nose',
left_mouth: 'left corner of lips',
right_mouth: 'right corner of lips',
- upper_lip: 'Upper Lip',
- lower_lip: 'Lower Lip',
+ upper_lip: 'upper lip',
+ lower_lip: 'lower lip',
face: 'face',
- neck: 'face',
+ neck: 'neck',
left_ear: 'left ear',
right_ear: 'right ear',
left_shoulder: 'left shoulder',
@@ -1863,13 +1830,13 @@ Lang.Buttons = {
get_started: 'Get Started',
next_lesson: 'Next lesson',
course_submit: 'Submit',
- course_done: 'Done',
+ course_done: 'OK',
mission: 'Introduction ',
basic_guide: 'User Guide',
apply: 'Apply',
add: 'Add',
cancel: 'Cancel',
- save: 'OK',
+ save: 'Save',
start: 'Start',
confirm: 'OK',
delete: 'Delete',
@@ -1891,7 +1858,7 @@ Lang.Buttons = {
duplication: 'Copy',
export_to_excel: 'Download',
single_line: 'Single line',
- multi_line: 'Multiline',
+ multi_line: 'Multi line',
lecture_finish_popup_reset_lecture: 'Do it again',
lecture_finish_popup_show_output: 'See the exercised',
lecture_view_hints: 'View hints',
@@ -1901,16 +1868,24 @@ Lang.Buttons = {
sound_menu_adjust: 'Adjust',
sound_button_reset: 'Reset',
sound_button_save: 'Save',
+ back: 'Go back',
+ add2: 'Add',
+ load: 'Load',
+ move: 'Move',
+ create_new_table: 'Create',
+ add_variable: 'Add variable',
+ add_list: 'Add list',
+ add_message: 'Add Message',
};
Lang.Menus = {
nothing_to_import: 'There is no content to upload.',
nothing_to_export: 'There is no content to download.',
content_copied: 'The data is copied.',
list_import_title: 'Import',
- list_import_placeholder: 'Example)\nData1\nData2\nData3\nData4\nData5\nData6\nData7\nData8',
+ list_import_placeholder: 'Example)\nData1\nData2\nData3',
verifying_email: 'Verifying email',
- list_import_notice_1: 'You can upload the data in the list.',
- list_import_notice_2: 'The original data will be changed into the newly uploaded data.',
+ list_import_notice_1: 'You can enter items and default values in a list at once.',
+ list_import_notice_2: 'The items and default values entered here are saved as a list.',
list_export_title: 'Export',
list_export_notice: 'You can copy or download the data in the list.',
robotis_opencm70: 'Robotis Open CM70',
@@ -1969,7 +1944,7 @@ Lang.Menus = {
"Hello. This is EntryLabs. We are very grateful to you who are using 'Entry'. Recently we have agreed to transfer the ownership of Entry web site, which has been operated for public interest purposes, to the 'Connect Foundation'. Connect Foundation is a non-profit foundation founded by Naver. 'Entry' will be continuously operated under public interest purpose by 'Connect Foundation'. Therefore, All of “Entry” users will be guaranteed to use the entry exactly as same as before. Since the website provider has changed from the 'EntryLabs' to the 'Connect Foundation', there is a transfer of personal information as below. However, this doesn’t mean that your information will be physically moved. ",
textcoding_numberError_f:
"You can't convert into the text mode if there is function names start with a number.",
- textcoding_bookedError_1f: "You can't convert into the text mode if there is function named",
+ textcoding_bookedError_1f: "You can't convert into the text mode if there is function named ",
textcoding_bookedError_2f: '.',
textcoding_specialCharError_f:
"You can't convert into the text mode if there is function names include special character except for underscore.",
@@ -2282,7 +2257,7 @@ Lang.Menus = {
see_other_missions: 'See other missions',
project: 'Project',
marked: 'favorite',
- group: 'group',
+ group: 'Group',
lecture: 'Lessons',
Lecture: 'Lessons',
curriculum: 'Courseware',
@@ -2295,21 +2270,21 @@ Lang.Menus = {
apply_original_image: 'Save original image',
draw_new_ques: "Are you sure you want to go to \n'Draw new object' page?",
draw_new_ques_1: 'You can draw an object and save it.',
- draw_new_ques_2: 'do you want to move to draw?',
+ draw_new_ques_2: 'Do you want to move to draw?',
draw_new_go: 'Move',
draw_new_stay: 'No, Stay',
file_upload_warn_title_image:
'The following pictures are subject to the Terms of Use and related laws.',
file_upload_warn_desc_image:
- 'Violent and brutal picture Sacred body exposure picture Offensive or disgusting picture Picture of copyright prohibited from unauthorized use',
+ 'Violent and brutal picture, Sacred body exposure picture, Offensive or disgusting picture, Picture of copyright prohibited from unauthorized use',
file_upload_warn_title_sound:
'The following sounds are subject to the Terms of Use and related laws.',
file_upload_warn_desc_sound:
- 'Violent and cruel sound Suggestive sound Offensive or disgusting sound Sound of copyright prohibited from unauthorized use',
+ 'Violent and cruel sound, Suggestive sound, Offensive or disgusting sound, Sound of copyright prohibited from unauthorized use',
file_upload_warn_title_table:
'The following datas are subject to the Terms of Use and related laws.',
file_upload_warn_desc_table:
- 'Violent and brutal data Sacred body exposure data Offensive or disgusting data Data of copyright prohibited from unauthorized use',
+ 'Violent and brutal data, Sacred body exposure data, Offensive or disgusting data, Data of copyright prohibited from unauthorized use',
file_upload_warn_link: 'Learn about copyright',
file_upload_desc_1: "Make sure you don't upload",
file_upload_desc_2: 'Violent and brutal picture',
@@ -2321,12 +2296,12 @@ Lang.Menus = {
sprite_upload_warn_old:
'You can only upload images in jpg, png, bmp format or objects in eo format that are less than 10MB.',
picture_upload_warn_1:
- 'You can only upload jpg, png, bmp, svg files that are less than 10MB.\nThe jpg, png, and bmp images are edited in bitmap mode and the svg image is in vector mode.',
+ 'You can only upload jpg, png, bmp, svg files that are less than 5MB.\nThe jpg, png, and bmp images are edited in bitmap mode and the svg image is in vector mode.',
table_upload_warn_1: 'You can only upload csv, xls(x) files that are less than 10MB.',
sprite_upload_warn:
- 'You can only upload images in jpg, png, bmp, svg format or objects in eo format that are less than 10MB.',
+ 'You can only upload images in jpg, png, bmp, svg format or objects in eo format that are less than 5MB.',
sound_upload_warn_1: 'You can only upload mp3 files that are less than 10MB.',
- sound_edit_warn: "Please wait! We're working on the Sound Editing function.",
+ sound_edit_warn: "Please wait!\nWe're working on the Sound Editing function.",
file_upload_loading: 'Loading',
lesson_by_teacher: 'Teacher created lesson',
delete_group_art: 'from the list?',
@@ -2415,7 +2390,7 @@ Lang.Menus = {
lecture_help_5: 'Select blocks needed to create project. Unselected blocks will be hidden.',
lecture_help_6:
'choose between block Coding and Entry Python to organize your learning environment.',
- lecture_finish_popup_title: 're-learn',
+ lecture_finish_popup_title: 'Re-learn',
lecture_finish_popup_content_1:
'Practice Completion Do you want to practice one step from the beginning?',
lecture_finish_popup_content_2: '* The practice completion status is maintained',
@@ -2620,7 +2595,7 @@ Lang.Menus = {
repeat: 'repeat',
choice: 'selection',
repeat_advanced: 'repeat(sequence+condition)',
- function: 'function',
+ function: 'Function',
compare_operation: 'comparison',
arithmetic: '산술연산',
entry_recommended_mission: 'Entry Recommended Mission',
@@ -2715,7 +2690,7 @@ Lang.Menus = {
basicproject: 'basic',
hw: 'hardware',
object: 'object',
- console: 'console',
+ console: 'Console',
download_info: 'Click on the title to download resource',
entry_materials_all: 'Entry Educational Materials',
entry_material: 'Learning Entry',
@@ -2815,7 +2790,7 @@ Lang.Menus = {
driving_elec_car: 'Driving Electric Car',
age_13: 'Age 13+',
travel_space: 'Traveling Space',
- people: 'People',
+ people: 'Person',
all: 'All',
life: 'Life',
nature: 'Nature',
@@ -3024,7 +2999,7 @@ Lang.Menus = {
korean: 'Korean',
english: 'English',
viet: 'Vietnamese',
- japan: 'japan',
+ japan: 'Japanese',
russia: 'russia',
korean_s: 'korean',
english_s: 'english',
@@ -3138,8 +3113,7 @@ Lang.Menus = {
teacher_grade_6: '교원 (초등학교 6학년)',
ct_text_6_content:
'실생활의 문제를 해결하자는 테마로 준비된 총 8개의 학습콘텐츠가 담긴 교사용 지도안입니다. 각 콘텐츠는 개정된 교육과정을 반영한 타교과와의 연계를 통해 다양한 문제를 만나고 해결해볼 수 있도록 설계되었습니다. 아이들이 컴퓨팅 사고력을 갖춘 융합형 인재가 될 수 있도록 지금 적용해보세요!',
- sw_use:
- 'All textbooks are for non-commercial use only, and can be used freely so long as the author is credited. ',
+ sw_use: 'All textbooks are for non-commercial use only, and can be used freely so long as the author is credited. ',
title: 'Title',
writer: 'By',
view: 'View',
@@ -3219,7 +3193,7 @@ Lang.Menus = {
basic_image: 'Basic Image',
profile_condition: 'Enter something about yourself. (in 50 characters)',
profile_back: 'Go back',
- make_project: 'Create Project',
+ make_project: 'Create project',
exhibit_project: 'Exhibit Project',
art_list_shared: 'Shared',
art_list_group_shared: 'Group',
@@ -3433,7 +3407,7 @@ Lang.Menus = {
close_project: 'Close',
category_media_art: 'Media Art',
go_further: 'Go further',
- marked_project: 'Favorite Project',
+ marked_project: 'Bookmark Project',
marked_group_project: 'Favorite group project',
basic: 'Basic',
application: 'Application',
@@ -3989,7 +3963,7 @@ Lang.Menus = {
email_correnctly_please: 'Please enter a valid email',
remove_project: 'Are you sure to remove this project?',
study_lesson: 'Class Lessons',
- open_project: 'Open Project',
+ open_project: 'Open projects',
make_group: 'Create Class',
project_share: 'Project share',
group_project_share: 'Class Share',
@@ -4788,10 +4762,26 @@ Lang.Menus = {
data_table_modifidate: 'modify',
draw_new_table_ques_1: 'You can enter data and save to table.',
draw_new_table_ques_2: 'Do you want to move to enter data?',
+ file_upload: 'Upload file',
+ no_marked_project: 'There are no projects to show.',
+ temp_save_project_study: 'Temporary save',
+ in_progress2: 'Studying',
+ file_upload_table_title: 'Add new table',
+ file_upload_table_sub_title: 'You can create a table by entering data directly.',
+ file_upload_warn_desc_table_1:
+ 'Violent and brutal data, Sacred body exposure data, Offensive or disgusting data,',
+ file_upload_warn_desc_table_2: 'Data of copyright prohibited from unauthorized use',
+ table_drag_upload_title: 'Drag-and-drop or click to upload a file',
+ table_drag_upload_desc: 'You can drag and drop CSV, XLS(X) files here or click to upload them.',
+ upload_select_file: 'Select file',
+ file_upload_add: 'Add',
+ file_upload_max_size_image: 'You can only upload less than 5MB in file size.',
+ realtime: 'Realtime',
+ cloud: 'Cloud',
};
Lang.Msgs = {
microbit_led_erase_all: 'Reset',
- loading_plz_wait: 'Now Loading. Please Wait',
+ loading_plz_wait: 'Now Loading. Please Wait.',
ai_utilize_audio_listening: 'Listening',
ai_utilize_audio_progress: 'Recognizing',
upload_error_title: 'File rejected',
@@ -4931,9 +4921,9 @@ Lang.Msgs = {
hardware_need_update_content:
"Please update to the latest version,\nif you are using below version.\nEntry website only supported v1.9.51 or later.\nPlease remove the web browser cache,\nif any block doesn't appear after updating.",
ai_utilize_audio_description:
- 'It is a collection of blocks related to speech to text functionalities.',
+ 'It is a collection of blocks that recognize speech using microphone.',
ai_utilize_video_description:
- 'It is a collection of blocks that can recognize movement, direction and object to be shot by using camera.',
+ 'It is a collection of blocks that can recognize movement, direction and object to be shot by using camera. (IE / iOS Not Supported)',
cannot_delete_function:
'Function already in use.\nTo change the return value setting,\nthere must be no object with a function block.',
local_variable_deletion_warning:
@@ -4955,6 +4945,11 @@ Lang.Msgs = {
sound_empty5:
"You can cut only the parts you need in the 'Trim' mode, or adjust the volume, speed and pitch in the 'Adjust' mode.",
sound_loading: 'Loading sound',
+ parameter_can_not_space: "Value can't be blank.",
+ ai_utilize_train_pop_error: 'The model applied to the project has been deactivated or deleted.',
+ video_model_load_success: 'Load Success',
+ video_model_load_completed: 'Video sensing enabled',
+ ai_utilize_video_loading: 'video sensing block is now loading. It takes up to 1 minute',
};
Lang.Users = {
auth_failed: 'Authentication failed',
@@ -5062,10 +5057,11 @@ Lang.Workspace = {
cannot_add_picture: 'Cannot add picture while running a project.',
cannot_add_sound: 'Cannot add sound while running a project.',
cannot_add_expansion_block: 'Cannot add expansion block while running a project.',
- add_object_before_edit: 'Add object firstly, to edit the shape.',
+ add_object_before_edit: 'Add object firstly,\nto edit the shape.',
add_table_before_edit: 'Add table.',
- cannot_edit_click_to_stop: 'Can not modify a project. Click to stop',
- cannot_open_private_project: 'Can not load private project. Move to home.',
+ cannot_edit_click_to_stop: 'Can not modify a project.\nClick to stop',
+ cannot_open_private_project:
+ "You cannot view the code of the unshared projects. Click 'OK' to move to the previous page.",
cannot_save_running_project: 'Can not save while running a project.',
character_gen: 'Make an avarta',
check_runtime_error: 'Please check the block marked with red.',
@@ -5078,7 +5074,7 @@ Lang.Workspace = {
context_rename: 'Rename',
coordinate: 'Coord',
create_function: 'Create Function',
- direction: 'Direction(°)',
+ direction: 'Direction',
drawing: 'Paint',
enter_list_name: '',
enter_name: 'Enter a new name',
@@ -5108,15 +5104,15 @@ Lang.Workspace = {
list_add_ok_msg: '',
list_create: 'Add list',
list_create_placeholder: 'Input the name of the list.',
- list_dup: '',
+ list_dup: 'The name has been changed automatically.',
list_newname: 'New name',
list_export: 'Export',
list_import: 'Import',
list_remove: 'Remove list',
list_rename: 'Rename list',
- list_rename_failed: '',
- list_rename_ok: '',
- list_too_long: '',
+ list_rename_failed: 'Rename list failed',
+ list_rename_ok: 'The name has been changed successfully.',
+ list_too_long: 'The name cannot exceed 10 characters.',
message: 'Signal',
message_add_cancel: 'Canceled',
message_add_cancel_msg: 'Add a message was canceled.',
@@ -5125,6 +5121,7 @@ Lang.Workspace = {
message_add_ok: 'Message added',
message_add_ok_msg: 'was successfully added.',
message_create: 'Add Signal',
+ message_add: 'Add Signal',
message_create_placeholder: 'Input the name of the signal',
message_dup: 'Message name conflicted.',
message_remove: 'Remove a message',
@@ -5132,9 +5129,8 @@ Lang.Workspace = {
message_rename: 'Rename a message',
message_rename_failed: 'Rename message failed',
message_rename_ok: 'Successfully rename message.',
- message_too_long: 'Message name too long.',
no_message_to_remove: 'There is no message to remove.',
- no_use: 'No use',
+ no_use: 'Not assembled on object.',
no_variable_to_remove: '',
no_variable_to_rename: 'There is no varibale to remove',
object_not_found: 'No object is specified in the block.',
@@ -5151,12 +5147,12 @@ Lang.Workspace = {
remove_object_msg: 'remove was successfully completed.',
removed_msg: 'was successfully removed',
rotate_method: 'Rotate',
- rotation: 'Rotation(°)',
+ rotation: 'Rotation',
run: 'Run',
saved: 'Saved',
saved_msg: 'was successfully saved.',
save_failed: 'Problem occurred while saving a project. Please try again.',
- select_library: 'Select Object',
+ select_library: 'Select object',
select_sprite: 'Please select at least one sprite to apply.',
shape_remove_fail: 'Remove a shape was failed.',
shape_remove_fail_msg: 'At least one or more shapes required.',
@@ -5167,9 +5163,9 @@ Lang.Workspace = {
load_ai_utilize_train_block: 'Train Model',
select_expansion_block: 'Select block',
deselect_expansion_block_warning:
- 'The selected block cannot be deleted. \nThe specified block is currently in use.',
+ "The extension block can't be deselected because it is assembled to the project.",
deselect_ai_utilize_block_warning:
- 'The selected block cannot be deleted. \nThe specified block is currently in use.',
+ "The AI block can't be deselected because it is assembled to the project.",
sound_add: 'Add Sound',
sound_remove_fail: 'Remove a sound was failed.',
sound_remove_ok: 'Sound Removed',
@@ -5213,12 +5209,12 @@ Lang.Workspace = {
variable_rename_ok: 'Rename variabled was successfully completed.',
variable_select: 'Select a variable',
variable_too_long: 'Variable name too long.',
- open_analizy_data_import: 'Open Data Import',
+ open_analizy_data_import: 'Load Data Table',
vehicle: 'Vehicles',
- add_object_alert_msg: 'Add object firstly',
+ add_object_alert_msg: 'Object does not exist. Please add object and try again.',
add_object_alert: 'Alert',
create_variable_block: 'Create variable',
- create_list_block: 'Create list',
+ create_list_block: 'Add list',
Variable_Timer: 'timer',
Variable_placeholder_name: 'variable name',
Message_placeholder_name: 'Signal name',
@@ -5236,11 +5232,11 @@ Lang.Workspace = {
draw_new_ebs: 'Draw new',
painter_file: 'File ▼',
painter_file_save: 'Save',
- painter_file_saveas: 'Save as a new picture',
- new_picture: 'New Picture',
+ painter_file_saveas: 'Save as a new shape',
+ new_picture: 'New shape',
painter_edit: 'Edit ▼',
get_file: 'get',
- copy_file: 'copy',
+ copy_file: 'Copy',
cut_picture: 'cut',
paste_picture: 'paste',
remove_all: 'remove all',
@@ -5253,7 +5249,7 @@ Lang.Workspace = {
font_cancel: 'cancel',
font_color: 'font color',
font_fill: 'Fill',
- font_family: 'font',
+ font_family: 'Font',
align_left: 'left align ',
align_center: 'center align',
align_right: 'right align',
@@ -5264,7 +5260,7 @@ Lang.Workspace = {
select_table: 'Select Table',
select_sound: 'Select sound',
Size: 'Size',
- show_variable: ' show variable',
+ show_variable: ' Show variable',
default_value: 'default',
slide: 'slide',
min_value: 'min',
@@ -5284,7 +5280,7 @@ Lang.Workspace = {
'Deleting scene can not be restored.\nAre you sure you want to delete scene?',
will_you_delete_function:
'Deleting function can not be restored.\nAre you sure you want to delete function?',
- duplicate_scene: 'duplicate',
+ duplicate_scene: 'Duplicate',
block_explain: 'Block description ',
block_intro: 'Clicking on the block comes the description of the block . ',
blocks_reference: 'Blocks Reference',
@@ -5299,7 +5295,7 @@ Lang.Workspace = {
confirm_load_temporary: 'You have unsaved project. Do you want to open it?',
login_to_save: 'Try to save after login.',
cannot_save_in_edit_func: 'Can not save while editing function.',
- new_object: 'New Object',
+ new_object: 'New object',
arduino_connect: '',
arduino_connect_success: '',
confirm_load_header: 'Project Recovery',
@@ -5367,7 +5363,7 @@ Lang.Workspace = {
container_object_drop: 'Add the object in my storage\nto object list',
my_storage_block_drop: 'Add\nthe blocks\nto my storage',
my_storage_object_drop: 'Add\nthe object\nto my storage',
- my_storage: 'my storage',
+ my_storage: 'My storage',
my_block: 'My Block',
red: 'Red',
green: 'Green',
@@ -5383,8 +5379,29 @@ Lang.Workspace = {
'If the center point is far from the object and goes out of the canvas, it returns to its original position.',
blocks_comming_soon: "I'm working hard.\nPlease wait a little longer!",
data_table: 'table',
- select_all: '모두',
+ select_all: 'Select all',
now_loading_msg: 'Now Loading.\nPlease Wait.',
+ font_textblock_strikethrough: 'Strikethrough',
+ font_textblock_underline: 'Underline',
+ font_textblock_italic: 'Italic',
+ font_textblock_bold: 'Bold',
+ function_attribute: 'Attribute',
+ variable_default_value: 'Default value',
+ list_default_value: 'Default value',
+ func_property: 'Attribute of the function',
+ bring_forward: 'Bring Forward',
+ send_backward: 'Send Backward',
+ upload_error_msg: 'Unable to upload as image is suspected of violating usage policy.',
+ confirm_firmware_hwlite_block_title: 'Verify firmware Installation',
+ confirm_firmware_hwlite_block_msg:
+ 'The firmware must be installed\n to connect the %1\n to the Entry wirelessly.',
+ confirm_firmware_hwlite_block_pass: 'Already installed',
+ confirm_firmware_hwlite_block_download: 'Install firmware',
+ select_flash_firmware_hwlite_title: 'Select firmware to install',
+ select_flash_firmware_hwlite_content:
+ 'Please select the version of\n the Microbit you want to connect to.\n When the installation is complete,\n a message is displayed.',
+ flash_firmware_success: 'Firmware installation is complete.',
+ flash_firmware_failed: 'Firmware installation failed. Please try again.',
};
Lang.code = 'view code';
Lang.EntryStatic = {
@@ -5398,7 +5415,7 @@ Lang.EntryStatic = {
privateCurriculum: 'only owner',
publicCurriculum: 'curriculum share',
publicProject: 'project share',
- group: 'open group',
+ group: 'share to group',
groupCurriculum: 'open group',
private: 'only owner',
public: 'open lessons',
@@ -5515,7 +5532,7 @@ Lang.EntryStatic = {
free: 'Discussions',
report: 'Suggestions',
art_category_all: 'All projects',
- art_category_game: 'Game',
+ art_category_game: 'Games',
art_category_animation: 'Animation',
art_category_physical: 'Physical',
art_category_etc: 'etc',
@@ -5541,6 +5558,12 @@ Lang.EntryStatic = {
discuss_period_week: 'Recent week',
discuss_period_month: 'Recent month',
discuss_period_three_month: 'Recent three month',
+ art_category_living: 'Living Supplies',
+ art_category_storytelling: 'Storytelling',
+ art_category_arts: 'Arts',
+ art_category_knowledge: 'Knowledges',
+ art_period_today: 'Today',
+ art_period_quarter: 'Recent 3 months',
};
Lang.Helper = {
when_run_button_click: 'When the Start button is clicked, the connected blocks below will run.',
@@ -5561,7 +5584,8 @@ Lang.Helper = {
repeat_basic: 'Repeats the blocks inside for the entered number of times.',
repeat_inf: 'Repeats the blocks inside infinitely.',
repeat_while_true: 'Repeats the blocks inside until/while the condition is True/False. ',
- stop_repeat: 'Stops repeat of the closest block that encloses this block.',
+ stop_repeat:
+ "Stops the closest block that encloses this block.\n It works with various C-shaped blocks like 'repeat' block.",
_if: 'If the condition is True/False, run the blocks inside.',
if_else:
"If the condition is True/False, run the blocks inside the 'if' section.\nIf not, run the blocks inside the 'else' section.",
@@ -5599,7 +5623,7 @@ Lang.Helper = {
dialog_time:
'Runs the next block after the object speaks the input content for the input seconds.',
dialog: 'Runs the next block after the object speaks the input content.',
- remove_dialog: 'Removes the dialog box spoken by the object.',
+ remove_dialog: 'Removes the speech bubble spoken and thought by the object.',
change_to_some_shape: 'Changes the object into the selected shape.',
change_to_next_shape: 'Changes the object into the next shape.',
set_effect_volume: 'Applies the selected effect to the object by the input value.',
@@ -5651,10 +5675,10 @@ Lang.Helper = {
is_press_some_key: 'Checks whether an selected key is pressed.',
reach_something: 'Checks whether the object reaches the selected point.',
is_type:
- 'Checks whether the input text is a number. If the input text is a number, it is judged as ’True’.',
+ 'Checks whether the input text consists of the selected characters. If the input text consists of the selected characters, it is judged as `True`.',
is_included_in_list: 'Checks whether selected list contains the input value.',
boolean_basic_operator:
- 'Checks whether the value on the left is the same as the value on the right.',
+ "Compare the two values entered.\n= : If the value on the left and the value on the right are the same, it is judged as 'true'.\n!= : If the value on the left and the value on the right are not the same, it is judged as 'true'.\n> : If the value on the left is more than the value on the right, it is judged as 'true'.\n< : If the value on the left is less than the value on the right, it is judged as 'true'.\n≥ : If the value on the left is more than or equal to the value on the right, it is judged as 'true'\n.≤ : If the value on the left is less than or equal to the value on the right, it is judged as 'true'.",
function_create:
'Define a function by placing frequently used sets of blocks under this block. Place [name] next to [Define function] to give function a name. Pass on number of text values by placing [numeric/text value] block. Pass on boolean value of true or false by placing the [boolean value] block.',
function_field_label: 'Place inside the [Define function] block and gives function a name.',
@@ -5684,11 +5708,11 @@ Lang.Helper = {
calc_operation:
'Reports calculated values of a variety of equations relating to input numbers.',
get_date:
- 'Reports the values regarding the current year, month, day, day of the week and time.',
+ 'Reports the values regarding the current year, month, day, day of the week and time.\n- Year: Returns the current year.\n- Month: Returns the current month.\n- Day: Returns the current day.\n- Day of the week: Returns the current day of the week as a number.\nReturns Sunday, Monday, Tuesdays, Wednesdays, Thursdays, Fridays, Saturdays as 0, 1, 2, 3, 4, 5, 6 in turn.\n- Time: Returns the current time in hours, minutes, and seconds, respectively.',
distance_something: 'Reports the distance between the object and the selected object.',
get_sound_duration: 'Reports the time length of the selected sound.',
- get_user_name: 'Reports the username who runs the project.',
- get_nickname: 'a value of the user nickname running the project.',
+ get_user_name: 'Reports the user ID who runs the project.\nThe value is masked for privacy.',
+ get_nickname: 'Reports the user nickname who runs the project.',
get_project_timer_value: 'Reports how many seconds have passed since the project started.',
choose_project_timer_action:
'Start : The timer starts.\nStop : The timer stops.\nReset : The timer resets to 0.\n(If this block is on workspace, the project will show the timer window when it runs.)',
@@ -6034,16 +6058,16 @@ Lang.Helper = {
chocopi_touch_value:
"The value will be smaller if the capacitance of the obeject is larger. If many people hold each other's hand and touch, the value will be smaller 'Capacitance' means how many electric particles the object can hold.
Port number(P1~P8) is automatically selected internally It is needed only when multiple modules with the same kind are used",
boolean_and_or:
- 'AND : Checks whether both conditions are true. OR : Checks whether at least one of the two conditions is true.',
+ 'AND : Checks whether both conditions are true.\nOR : Checks whether at least one of the two conditions is true.',
check_weather:
- ' Checks whether the weather information of the selected date and region matches the actual weather conditions.',
+ '\nChecks whether the weather information of the selected date and region matches the actual weather conditions.',
check_finedust:
- ' Checks whether the current fine dust information of the selected region matches the actual fine dust grade.',
+ '\nChecks whether the current fine dust information of the selected region matches the actual fine dust grade.',
get_weather_data:
- ' Reports various weather information values (the lowest temperature, the highest temperature, humidity, precipitation, precipitation probability, wind speed) of the selected date and region.',
+ '\nReports various weather information values (the lowest temperature, the highest temperature, humidity, precipitation, precipitation probability, wind speed) of the selected date and region.',
get_current_weather_data:
- ' Reports the current weather information (temperature, fine dust grade) of the selected region.',
- get_today_temperature: ' Reports the today temperature of selected area and time zone.',
+ '\nReports the current weather information (temperature, fine dust grade) of the selected region.',
+ get_today_temperature: '\nReports the today temperature of selected area and time zone.',
check_city_weather:
'Checks whether the weather information of the selected date and region matches the actual weather conditions.',
check_city_finedust:
@@ -6060,16 +6084,16 @@ Lang.Helper = {
check_language:
'Reports the information(Title, area, start date, end date, address, overview, homepage) about events held on the selected date and region.',
count_disaster_behavior:
- " The number of behavior-guideline's when selected natural disaster occurs.",
+ "\nThe number of behavior-guideline's when selected natural disaster occurs.",
get_disaster_behavior:
- ' Reports the information about behavior-guidelines when selected natural disaster occurs.',
+ '\nReports the information about behavior-guidelines when selected natural disaster occurs.',
count_lifeSafety_behavior:
- " The number of behavior-guideline's when selected life problem occurs.",
+ "\nThe number of behavior-guideline's when selected life problem occurs.",
get_lifeSafety_behavior:
- ' Reports the information about behavior-guidelines when selected life problem occurs.',
+ '\nReports the information about behavior-guidelines when selected life problem occurs.',
read_text: 'Read the entered text in setted voice.',
set_tts_property:
- 'Set the selected voice to selected speed and selected pitch. The selected voice will be set up to selected speed and selected pitch.',
+ 'Set the selected voice to selected speed and selected pitch. \n The selected voice will be set up to selected speed and selected pitch.',
read_text_wait_with_block:
'Read the entered text in setted voice then the next block runs after the reading finished.',
check_microphone: "If the microphone is connected to the computer, it is judged as 'True'.",
@@ -6080,23 +6104,26 @@ Lang.Helper = {
speech_to_text_get_value:
"Reports the value of the person's speech to text. If no speech is input or an error occurs during recognition, it will report null values.",
get_microphone_volume: 'Reports the volume of sound input through microphone.',
- video_draw_webcam: 'Show or hide the video screen.',
- video_check_webcam: 'Check whether video is connected with the computer.',
+ video_draw_webcam: 'Show or hide the video screen. (IE / iOS Not Supported)',
+ video_check_webcam:
+ 'Check whether video is connected with the computer. (IE / iOS Not Supported)',
video_set_camera_option: 'Set the selected effect to the video screen by the input value.',
- video_flip_camera: 'Flips the video screen horizontally or vertically.',
+ video_flip_camera:
+ 'Flips the video screen horizontally or vertically. (IE / iOS Not Supported)',
video_toggle_model:
- "Start or stop the selected recognition model. Face Recognition: Recognizes a person's face to know where the eyes, nose, mouth, and ear are located, or the expected gender, age, and emotion. Human Recognition: Recognizes a person's body to know where each part is located Object Recognition: Shows the recognized object type. (Person or thing)",
+ "Start or stop the selected recognition model. Face Recognition: Recognizes a person's face to know where the eyes, nose, mouth, and ear are located, or the expected gender, age, and emotion. Human Recognition: Recognizes a person's body to know where each part is located Object Recognition: Shows the recognized object type. (Person or thing) (IE / iOS Not Supported)",
video_toggle_ind:
- 'Show location and index of the detected humans / faces / objects on the screen.',
- video_number_detect: 'Reports number of people / faces /objects detected on the video screen.',
+ 'Show location and index of the detected humans/faces/objects on the screen. (IE / iOS Not Supported)',
+ video_number_detect:
+ 'Reports number of humans/faces/objects detected on the video screen. (IE / iOS Not Supported)',
video_detected_face_info:
- 'Reports the estimated value of the selected face area among the faces in the input order. If it is not recognized, it is outputted as 0 unconditionally. (Gender, Age, Emotion)',
+ 'Reports the estimated value of the selected face area among the faces in the input order. If it is not recognized, it is outputted as 0 unconditionally. (Gender, Age, Emotion) (IE / iOS Not Supported)',
video_motion_value:
- 'Reports the motion or direction value detected on the selected object or screen.',
+ 'Reports the motion or direction value detected on the selected object or screen. (IE / iOS Not Supported)',
video_face_part_coord:
- 'Reports the position value of the selected face area among the faces in the input order. If it is not recognized, it is outputted as 0 unconditionally. (Left eye, Right eye, Nose, Left mouse, Right mouse, Upper Lip, Lower Lip)',
+ 'Reports the position value of the selected face area among the faces in the input order. If it is not recognized, it is outputted as 0 unconditionally. (Left eye, Right eye, Nose, Left mouse, Right mouse, Top Lip, Bottom Lip) (IE / iOS Not Supported)',
video_body_part_coord:
- 'Reports number of human detected on the video screen. (Face, Right shoulder, Right elbow, Right wrist, Left shoulder, Left elbow, Left wrist, Right hip, Right knee, Right ankle, Left hip, Left knee, Left ankle)',
+ 'Reports number of human detected on the video screen. (Face, Right shoulder, Right elbow, Right wrist, Left shoulder, Left elbow, Left wrist, Right hip, Right knee, Right ankle, Left hip, Left knee, Left ankle) (IE / iOS Not Supported)',
append_row_to_table: 'Adds a row(col) to the end location of the selected table.',
insert_row_to_table:
'Inserts a row(col) to the location of the input value on the selected table.',
@@ -6179,6 +6206,111 @@ Lang.Helper = {
is_which_gesture:
"If the hand in the order you entered is the gesture you selected, it is judged as 'True'.",
get_which_gesture: 'Reports the gesture of the hand in the order you entered.',
+ text_change_effect: 'Applies the selected text effect in the text box.',
+ text_change_font: 'Changes the text of the box to the selected font.',
+ text_change_font_color: 'Changes the text in the box to the selected color.',
+ text_change_bg_color: 'Changes the text box to the selected background color.',
+ get_value_from_last_row:
+ 'The selected attribute value of the last row in the selected table. Instead of an attribute value block, you can also combine a value block (meaning a row).',
+ insert_data_for_test: 'Enter data and recognize it as a trained model.',
+ video_capture_for_image_test:
+ 'Classifies or stops image data taken through the camera to the model you learned.',
+ insert_text_block_for_test: 'Enter data and recognize it as a trained model.',
+ test_result:
+ 'The value of the result that the model recognizes the data entered. The value is expressed by the class name (text) of the model.',
+ accuracy_of_result:
+ 'The reliability value for the selected class of the data entered. The value is expressed as a probability (number).',
+ is_group:
+ "Determine 'True' if the recognition result of the data entered is the selected class.",
+ model_is_trained:
+ "If the model has trained, it is determined as 'True'. If the model is being trained or hasn't trained, it is determined as 'False'.",
+ set_train_visible: 'Shows or hides the window displaying the state of the model on the screen.',
+ set_train_chart:
+ 'Opens or closes a chart window showing the entered data and clusters of learned models in a two-dimensional coordinate plane.',
+ set_regression_option:
+ "Change the learning conditions of the model. The changed learning conditions take effect when the model is re-learned with the 'Re-learn Model' block.",
+ get_regression_predict_1:
+ 'Returns the value predicted by the model with the key properties entered.',
+ get_regression_predict_2:
+ 'Returns the value predicted by the model with the key properties entered.',
+ get_regression_predict_3:
+ 'Returns the value predicted by the model with the key properties entered.',
+ get_regression_predict_4:
+ 'Returns the value predicted by the model with the key properties entered.',
+ get_regression_predict_5:
+ 'Returns the value predicted by the model with the key properties entered.',
+ get_regression_predict_6:
+ 'Returns the value predicted by the model with the key properties entered.',
+ get_regression_accuracy: "Returns the model's coefficient of determination as a value.",
+ set_cluster_option_k:
+ "Sets the number of clusters to the entered value. The number of clusters changed will take effect when the model is re-learned with the 'Re-learn Model' block.",
+ set_cluster_option_centroids:
+ "Replace the cluster's initial center point criteria with the selected criteria. The center point criteria that you changed will take effect when you re-learn the model with the 'Re-learn Model' block.",
+ get_cluster_centriod_count: 'Returns the number of clusters in the model as values.',
+ get_cluster_centriod_value:
+ 'Returns the core properties for the center point of the specified cluster. If you have multiple core properties, you can select them from the list box.',
+ get_cluster_centriod_index_1:
+ 'Returns which cluster the model belongs to, if any, to, the core property entered. Values are represented by text (cluster name).',
+ get_cluster_centriod_index_2:
+ 'Returns which cluster the model belongs to, if any, to, the core property entered. Values are represented by text (cluster name).',
+ get_cluster_centriod_index_3:
+ 'Returns which cluster the model belongs to, if any, to, the core property entered. Values are represented by text (cluster name).',
+ get_cluster_centriod_index_4:
+ 'Returns which cluster the model belongs to, if any, to, the core property entered. Values are represented by text (cluster name).',
+ get_cluster_centriod_index_5:
+ 'Returns which cluster the model belongs to, if any, to, the core property entered. Values are represented by text (cluster name).',
+ get_cluster_centriod_index_6:
+ 'Returns which cluster the model belongs to, if any, to, the core property entered. Values are represented by text (cluster name).',
+ set_number_learning_option_k:
+ "Sets the number of neighbors to the entered value. The number of neighbors changed will take effect when the model is re-learned with the 'Re-learn Model' block.",
+ get_number_learning_predict_1:
+ 'The value that classifies the entered data in the model. The value is represented by the class name (text) of the model.',
+ get_number_learning_predict_2:
+ 'The value that classifies the entered data in the model. The value is represented by the class name (text) of the model.',
+ get_number_learning_predict_3:
+ 'The value that classifies the entered data in the model. The value is represented by the class name (text) of the model.',
+ get_number_learning_predict_4:
+ 'The value that classifies the entered data in the model. The value is represented by the class name (text) of the model.',
+ get_number_learning_predict_5:
+ 'The value that classifies the entered data in the model. The value is represented by the class name (text) of the model.',
+ get_number_learning_predict_6:
+ 'The value that classifies the entered data in the model. The value is represented by the class name (text) of the model.',
+ get_number_learning_predict_param_1:
+ 'The classification confidence value for the selected class of data entered. Values are expressed numerically.',
+ get_number_learning_predict_param_2:
+ 'The classification confidence value for the selected class of data entered. Values are expressed numerically.',
+ get_number_learning_predict_param_3:
+ 'The classification confidence value for the selected class of data entered. Values are expressed numerically.',
+ get_number_learning_predict_param_4:
+ 'The classification confidence value for the selected class of data entered. Values are expressed numerically.',
+ get_number_learning_predict_param_5:
+ 'The classification confidence value for the selected class of data entered. Values are expressed numerically.',
+ get_number_learning_predict_param_6:
+ 'The classification confidence value for the selected class of data entered. Values are expressed numerically.',
+ is_number_learning_group_1:
+ 'If the classification result of the entered data is a class of your choice, determine True.',
+ is_number_learning_group_2:
+ 'If the classification result of the entered data is a class of your choice, determine True.',
+ is_number_learning_group_3:
+ 'If the classification result of the entered data is a class of your choice, determine True.',
+ is_number_learning_group_4:
+ 'If the classification result of the entered data is a class of your choice, determine True.',
+ is_number_learning_group_5:
+ 'If the classification result of the entered data is a class of your choice, determine True.',
+ is_number_learning_group_6:
+ 'If the classification result of the entered data is a class of your choice, determine True.',
+ video_change_cam: 'Change the camera you are filming.',
+ video_set_camera_opacity_option:
+ 'Set the transparency effect to the video screen by the input value.(IE / iOS Not Supported)',
+ video_is_model_loaded: 'Check whether human/face/object is detected. (IE / iOS Not Supported)',
+ video_object_detected: 'Check whether selected object is recognized. (IE / iOS Not Supported)',
+ target_project: 'Target project',
+ study_goal: 'Learning objectives',
+ show_hint: 'Hints',
+ save_current_table:
+ 'Keep the table as it is. Even if you stop the project, your changes in the table are maintained.',
+ open_table: 'Open the window of the selected table.',
+ open_table_wait: 'Open the window of the selected table for the seconds entered.',
};
Lang.AiLearning = {
equation: 'Equation',
@@ -6279,7 +6411,7 @@ Lang.Device = {
smartBoard: 'smartBoard',
chocopi: 'ChocoPi',
rokoboard: 'rokoboard',
- altino: '알티노',
+ altino: 'altino',
mechatro: 'mechatro',
};
Lang.General = {
@@ -6318,17 +6450,19 @@ Lang.General = {
recent_download2: 'Download the latest version',
latest_version: 'You are running the latest version.',
dont_show_again: 'Do not show this again',
+ apply: 'Apply',
+ clear: 'Clear',
};
Lang.Fonts = {
- jeju_hallasan: 'Jeju Hallasan',
- gothic_coding: 'Gothic Coding',
+ jeju_hallasan: 'Hallasan',
+ gothic_coding: 'GothicCoding',
batang: 'Batang',
- gothic: 'Nanum Gothic',
- myeongjo: 'Nanum Myeongjo',
- pen_script: 'Nanum Pen Script',
- square_round: 'Nanum SquareRound',
- jalnan: 'jalnan',
- designhouse: 'designhouse',
+ gothic: 'NanumGothic',
+ myeongjo: 'NanumMyeongjo',
+ pen_script: 'NanumPenScript',
+ square_round: 'NanumSquareRound',
+ jalnan: 'Jalnan',
+ designhouse: 'Designhouse',
malssami815: 'Malssami815',
dunggeunmo: 'DungGeunMo',
hs_bombaram: 'HS Bombaram',
@@ -6336,13 +6470,17 @@ Lang.Fonts = {
goyang: 'Goyang',
flower_road: 'SangSangFlowerRoad',
uhbeemysen: 'UhBeemysen',
- sd_comic_stencil: 'Sandoll Comicstencil',
- sd_childfundkorea: 'Sandoll Childfundkorea',
- sd_cinema_theater: 'Sandoll Cinema Theater',
- sd_mapssi: 'Sandoll Mapssi',
- sd_shabang: 'Sandoll Shabang',
- sd_woodcarving: 'Sandoll Woodcarving',
- sd_yongbi: 'Sandoll Yongbi',
+ sd_comic_stencil: 'SD Comicstencil',
+ sd_childfundkorea: 'SD Childfundkorea',
+ sd_cinema_theater: 'SD CinemaTheater',
+ sd_mapssi: 'SD Mapssi',
+ sd_shabang: 'SD Shabang',
+ sd_woodcarving: 'SD Woodcarving',
+ sd_yongbi: 'SD Yongbi',
+ maruburi: 'MaruBuri',
+ nanumbarunpen: 'NanumBarunpen.',
+ notosans: 'NotoSans',
+ d2coding: 'D2Coding',
};
Lang.Hw = {
note: 'note',
@@ -6654,17 +6792,17 @@ Lang.template = {
read_text: 'read %1 %2',
set_tts_property: 'set in a %1 voice at %2 speed and %3 pitch %4',
read_text_wait_with_block: 'read %1 and wait %2',
- load_expansion_block: 'add',
+ load_expansion_block: 'Add extention',
load_ai_utilize_block: 'Load AI Block',
- load_ai_utilize_train_block: 'Train Model',
+ load_ai_utilize_train_block: 'Training Model',
expansion_block_descriptions:
'The expansion block works normally when the Internet is connected.',
aiUtilize_block_descriptions:
'The A.I. Utilization block works normally when the Internet is connected.',
- weather_title_text: 'weather',
- translate_title_text: 'translate',
- festival_title_text: 'festival',
- audio_title_text: 'Audio Sensing',
+ weather_title_text: 'Weather',
+ translate_title_text: 'Translate',
+ festival_title_text: 'Festival',
+ audio_title_text: 'Audio sensing',
voice_title_text: 'Speech recognition',
check_microphone: 'connected to microphone?',
get_microphone_volume: 'microphone volume value',
@@ -6673,21 +6811,21 @@ Lang.template = {
timed_speech_to_text_convert: 'For %1 secs recognize %2 speech %3',
set_visible_speech_to_text: '%1 recognized speech %2',
speech_to_text_get_value: 'speech-to-text value',
- video_title_text: 'Video Detection',
- video_draw_webcam: '%1 the video screen',
+ video_title_text: 'Video detection',
+ video_draw_webcam: '%1 the camera screen',
video_check_webcam: 'connected with video?',
video_set_camera_opacity_option: 'Set video transparency effect to %1 %2',
- video_flip_camera: 'Flip video screen %1 %2',
+ video_flip_camera: 'Flip camera screen %1 %2',
video_toggle_model: '%1 recognition %2 %3',
video_toggle_ind: '%2 detected %1 %3',
video_number_detect: 'Number of detected %1',
video_detected_face_info: '%2 of %1 th face',
- video_motion_value: 'Video %2 value on %1',
+ video_motion_value: 'Camera %2 value on %1',
video_face_part_coord: '%3 coordinate of %2 in %1 th face',
video_body_part_coord: "%3 coordinate of %1 th human's %2",
- behaviorConductDisaster_title_text: 'desaster',
- behaviorConductLifeSafety_title_text: 'lifeSafety',
- tts_title_text: 'read',
+ behaviorConductDisaster_title_text: 'Disaster',
+ behaviorConductLifeSafety_title_text: 'LifeSafety',
+ tts_title_text: 'Read',
hamster_hand_found: 'hand found?',
hamster_value: '%1',
hamster_move_forward_once: 'move forward once on board %1',
@@ -6836,7 +6974,7 @@ Lang.template = {
hide: 'hide %1',
dialog_time: 'Say %1 for %2 secs %3 %4',
dialog: 'Say %1 %2 %3',
- remove_dialog: 'Remove speech %1',
+ remove_dialog: 'Remove speech bubble %1',
change_to_nth_shape: 'Change shape to %1 %2',
change_to_next_shape: 'Change to %1 shape %2',
set_effect_volume: 'Change %1 effect by %2 %3',
@@ -6855,7 +6993,7 @@ Lang.template = {
change_effect_amount: 'Set %1 effect to %2 %3',
set_effect_amount: 'Change %1 effect by %2 %3',
set_entity_effect: 'Set %1 effect to %2 %3',
- change_object_index: 'bring to %1 %2',
+ change_object_index: 'Bring to %1 %2',
move_direction: 'Move %1 forward %2',
move_x: 'Change X by %1 %2',
move_y: 'Change Y by %1 %2',
@@ -6963,6 +7101,7 @@ Lang.template = {
sound_something_second_wait_with_block: 'Play %1 sound for %2 secs and wait %3',
sound_from_to: 'Play %1 sound from %2 to %3 secs %4',
sound_from_to_and_wait: 'Play %1 sound from %2 to %3 secs and wait %4',
+ messageAddButton: '%1',
when_run_button_click: '%1 When run',
press_some_key: '%1 When key %2 pressed %3',
when_some_key_pressed: '%1 When key %2 pressed',
@@ -7091,7 +7230,7 @@ Lang.template = {
maze_cony_flower_throw: 'Throw flower %1',
maze_brown_punch: 'Punch %1',
maze_iron_switch: 'Control obstacles %1',
- maze_james_heart: 'Send hearts %1',
+ maze_james_heart: 'Toss cakes %1',
maze_step_if_5: 'If there is no road in front %2',
maze_step_if_6: "If %1 isn't in front %2",
maze_step_if_7: 'If %1 is in front %2',
@@ -7342,9 +7481,6 @@ Lang.template = {
locate_time_to_pose: 'For %1 secs go to %3 of %2 th human %4',
axis_detected_pose: "%3 coordinate of %1 th human's %2",
face_landmarker_title: '%1',
- locate_to_pose: 'Go to %2 of %1 human %3',
- locate_time_to_pose: 'For %1 secs go to %3 of %2 human %4',
- axis_detected_pose: '%3 coordinate of %1 th human`s %2',
when_face_landmarker: '%1 When face detected',
face_landmarker: '%1 face detection %2',
draw_detected_face: '%1 detected face %2',
@@ -7377,6 +7513,81 @@ Lang.template = {
is_which_gesture: 'Is the gesture of %1 th hand %2 ?',
get_which_hand: '%1 th hand',
get_which_gesture: 'The gesture of %1 th hand',
+ function_create_value: 'Define function %1 %2 %3 Return %4',
+ learning_title_image_str: 'Trained image classification model',
+ learning_title_speech_str: 'Trained speech classification model',
+ learning_title_text_str: 'Trained text classification model',
+ learning_title_number_str: 'Trained number classification model',
+ learning_title_regression_str: 'Trained regression model',
+ learning_title_cluster_str: 'Trained clustering model',
+ text_change_effect: '%2 %1 effect to text box %3',
+ text_change_font: 'Change font to %1 %2',
+ text_change_font_color: 'Change text color to %1 %2',
+ text_change_bg_color: 'Change background color to %1 %2',
+ save_current_table: 'Keep the table %1 as it is %2',
+ get_value_from_last_row: 'value of the %2 in last row of the %1',
+ open_table: 'Open table %1 window %2',
+ open_table_wait: 'Open table %1 window for %2 second(s) %3',
+ learning_title_image: '%1',
+ learning_title_speech: '%1',
+ learning_title_text: '%1',
+ learning_title_number: '%1',
+ learning_title_regression: '%1',
+ learning_title_cluster: '%1',
+ insert_data_for_test: 'Classify with the trained model %1',
+ video_capture_for_image_test: '%1 classifying camera screen with the trained model ',
+ insert_text_block_for_test: 'Classify %1 with trained model %2',
+ test_result: 'Classification result',
+ accuracy_of_result: 'Reliability of %1',
+ is_group: 'Is the classification result %1?',
+ retrain_model: 'Retrain model %1',
+ model_is_trained: 'Has the model trained?',
+ set_train_visible: '%1 model %2',
+ set_train_chart: '%1 model chart window %2',
+ set_regression_option: 'Change %1 training condition to %2 %3',
+ get_regression_predict_1: 'Predicted value of %1 %2',
+ get_regression_predict_2: 'Predicted value of %1 %2 %3 %4',
+ get_regression_predict_3: 'Predicted value of %1 %2 %3 %4 %5 %6',
+ get_regression_predict_4: 'Predicted value of %1 %2 %3 %4 %5 %6 %7 %8',
+ get_regression_predict_5: 'Predicted value of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10',
+ get_regression_predict_6: 'Predicted value of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12',
+ get_regression_accuracy: 'Coefficient of determination',
+ set_cluster_option_k: 'Change the number of clusters to %1 %2',
+ set_cluster_option_centroids: 'Change centroid standard to %1 %2',
+ get_cluster_centriod_count: 'Number of clusters',
+ get_cluster_centriod_value: 'Value of %2 of cluster %1 centroid',
+ get_cluster_centriod_index_1: 'Cluster of %1 %2',
+ get_cluster_centriod_index_2: 'Cluster of %1 %2 %3 %4',
+ get_cluster_centriod_index_3: 'Cluster of %1 %2 %3 %4 %5 %6',
+ get_cluster_centriod_index_4: 'Cluster of %1 %2 %3 %4 %5 %6 %7 %8',
+ get_cluster_centriod_index_5: 'Cluster of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10',
+ get_cluster_centriod_index_6: 'Cluster of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12',
+ set_number_learning_option_k: 'Change the number of neighbors to %1 %2',
+ get_number_learning_predict_1: 'Classification result of %1 %2',
+ get_number_learning_predict_2: 'Classification result of %1 %2 %3 %4',
+ get_number_learning_predict_3: 'Classification result of %1 %2 %3 %4 %5 %6',
+ get_number_learning_predict_4: 'Classification result of %1 %2 %3 %4 %5 %6 %7 %8',
+ get_number_learning_predict_5: 'Classification result of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10',
+ get_number_learning_predict_6:
+ 'Classification result of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12',
+ get_number_learning_predict_param_1: '%4 for %3 of %1 %2',
+ get_number_learning_predict_param_2: '%6 for %5 of %1 %2 %3 %4',
+ get_number_learning_predict_param_3: '%8 for %5 of %1 %2 %3 %4 %5 %6',
+ get_number_learning_predict_param_4: '%8 for %5 of %1 %2 %3 %4 %5 %6 %7 %8',
+ get_number_learning_predict_param_5: '%8 for %5 of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10',
+ get_number_learning_predict_param_6: '%8 for %5 of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12',
+ is_number_learning_group_1: 'Is the classification result of %1 %2 %3?',
+ is_number_learning_group_2: 'Is the classification result of %1 %2 %3 %4 %5?',
+ is_number_learning_group_3: 'Is the classification result of %1 %2 %3 %4 %5 %6 %7?',
+ is_number_learning_group_4: 'Is the classification result of %1 %2 %3 %4 %5 %6 %7 %8 %9?',
+ is_number_learning_group_5:
+ 'Is the classification result of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11?',
+ is_number_learning_group_6:
+ 'Is the classification result of %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13?',
+ video_change_cam: 'Switch to %1 camera %2',
+ video_is_model_loaded: 'detected %1?',
+ video_object_detected: 'Is %1 recognized among objects?',
+ function_value: 'Function',
};
Lang.TextCoding = {
block_name: 'Block Name',
@@ -7451,64 +7662,64 @@ Lang.TextCoding = {
};
Lang.PythonHelper = {
when_run_button_click_desc:
- '[시작하기]버튼을 클릭하면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '[시작하기]버튼을 클릭하면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_run_button_click_exampleCode: 'def when_start():\n Entry.print("안녕!")',
when_run_button_click_exampleDesc: '[시작하기]버튼을 클릭하면 오브젝트가 "안녕!"이라 말합니다.',
when_some_key_pressed_desc:
- 'A키를 누르면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A키를 누르면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_some_key_pressed_elements:
- 'A-- 아래 선택지 중 하나 ① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능) ② 숫자 : 1, 2, 3, 4 ~ 9, 0 ③ 특수키 : "space", "enter" ④ 방향키 : "up", "down", "right", "left"',
+ 'A-- 아래 선택지 중 하나\n① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능)\n② 숫자 : 1, 2, 3, 4 ~ 9, 0\n③ 특수키 : "space", "enter"\n④ 방향키 : "up", "down", "right", "left"',
when_some_key_pressed_exampleCode:
'def when_press_key("W"):\n Entry.move_to_direction(10)\n\ndef when_press_key(1):\n Entry.add_size(10)',
when_some_key_pressed_exampleDesc:
'W키를 누르면 오브젝트가 이동방향으로 10만큼 이동하고, 1키를 누르면 오브젝트의 크기가 10만큼 커집니다.',
mouse_clicked_desc:
- '마우스를 클릭했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '마우스를 클릭했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
mouse_clicked_exampleCode:
'def when_click_mouse_on():\n Entry.add_size(10)\n Entry.move_to_direction(10)',
mouse_clicked_exampleDesc:
'마우스를 클릭하면 오브젝트의 크기가 10만큼 커지면서 이동방향으로 10만큼 이동합니다.',
mouse_click_cancled_desc:
- '마우스 클릭을 해제했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '마우스 클릭을 해제했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
mouse_click_cancled_exampleCode:
'def when_click_mouse_off():\n Entry.move_to_direction(-10)\n\ndef when_click_mouse_on():\n Entry.move_to_direction(10)',
mouse_click_cancled_exampleDesc:
'마우스를 클릭하면 오브젝트가 이동방향으로 10만큼 이동하고, 마우스 클릭을 해제하면 오브젝트가 이동방향으로 -10만큼 이동합니다.',
when_object_click_desc:
- '해당 오브젝트를 클릭했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '해당 오브젝트를 클릭했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_object_click_exampleCode:
'def when_click_object_on():\n Entry.print_for_sec("회전!", 0.5)\n Entry.add_rotation(90)',
when_object_click_exampleDesc:
'오브젝트를 클릭하면 오브젝트가 "회전!"이라 말하고, 90도 만큼 회전합니다.',
when_object_click_canceled_desc:
- '해당 오브젝트 클릭을 해제했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '해당 오브젝트 클릭을 해제했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_object_click_canceled_exampleCode:
'def when_click_object_on():\n Entry.add_rotation(90)\n\ndef when_click_object_off():\n Entry.add_rotation(-90)',
when_object_click_canceled_exampleDesc:
'오브젝트를 클릭하면 오브젝트가 90도 만큼 회전하고, 오브젝트 클릭을 해제하면 오브젝트가 -90도 만큼 회전합니다.',
when_message_cast_desc:
- 'A 신호를 받으면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다. 만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
+ 'A 신호를 받으면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.\n만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
when_message_cast_elements: 'A-- "신호 이름"',
when_message_cast_exampleCode:
'def when_click_mouse_on():\n Entry.send_signal("신호")\n\ndef when_get_signal("신호"):\n Entry.print_for_sec("안녕! 반가워", 0.5)',
when_message_cast_exampleDesc:
'마우스를 클릭하면 "신호"를 보내고, "신호"를 받았을때 "안녕! 반가워"라고 0.5초간 말합니다.',
message_cast_desc:
- 'A에 입력된 신호를 보냅니다. 만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
+ 'A에 입력된 신호를 보냅니다.\n만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
message_cast_elements: 'A-- "신호 이름"',
message_cast_exampleCode:
'#"오브젝트1"의 파이선 코드\ndef when_start():\n Entry.print_for_sec("안녕! 넌 몇살이니?", 2)\n Entry.send_signal("신호")\n\n#"오브젝트2"의 파이선 코드\ndef when_get_signal("신호"):\n Entry.print_for_sec("안녕? 난 세 살이야.", 2)',
message_cast_exampleDesc:
'[시작하기]버튼을 클릭하면 "오브젝트1"이 "안녕! 넌 몇살이니?"라고 2초간 말하고 "신호를 보냅니다., "오브젝트2"가 "신호"를 받았을때 "안녕? 난 세 살이야."라고 2초간 말합니다.',
message_cast_wait_desc:
- 'A에 입력된 신호를 보내고, 해당 신호를 받는 명령어들의 실행이 끝날 때까지 기다립니다. 만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
+ 'A에 입력된 신호를 보내고, 해당 신호를 받는 명령어들의 실행이 끝날 때까지 기다립니다.\n만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
message_cast_wait_elements: 'A-- "신호 이름"',
message_cast_wait_exampleCode:
'#"오브젝트1"의 파이선 코드\ndef when_start():\n Entry.print_for_sec("숨바꼭질하자!", 2)\n Entry.send_signal_wait("신호")\n Entry.hide()\n\n#"오브젝트2"의 파이선 코드\ndef when_get_signal("신호"):\n Entry.print_for_sec("그래!", 2)',
message_cast_wait_exampleDesc:
'[시작하기]버튼을 클릭하면 "오브젝트1"이 "숨바꼭질하자!"라고 2초 동안 말하고 "신호"를 보낸 후 기다립니다. "오브젝트2"가 "신호"를 받으면 "그래!"를 2초 동안 말합니다. "오브젝트1"이 그 후에 모양을 숨깁니다.',
when_scene_start_desc:
- '장면이 시작되면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '장면이 시작되면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_scene_start_exampleCode:
'#"장면 1"의 파이선 코드\ndef when_start():\n Entry.print_for_sec("다른 곳으로 가볼까?", 2)\n Entry.start_scene("장면 2")\n\n#"장면 2"의 파이선 코드\ndef when_start_scene():\n Entry.print("여기가 어디지?")',
when_scene_start_exampleDesc:
@@ -7520,7 +7731,7 @@ Lang.PythonHelper = {
start_scene_exampleDesc: '"장면 1"에서 해당 오브젝트를 클릭하면 "장면 2"가 시작됩니다.',
start_neighbor_scene_desc: 'A에 입력한 다음 또는 이전 장면을 시작합니다.',
start_neighbor_scene_elements:
- 'A-- 아래 선택지 중 하나 ① 다음 장면: "next" 또는 "다음" ② 이전 장면: "prev" 또는 "이전"',
+ 'A-- 아래 선택지 중 하나\n① 다음 장면: "next" 또는 "다음"\n② 이전 장면: "prev" 또는 "이전"',
start_neighbor_scene_exampleCode:
'#"장면 1"의 파이선 코드\ndef when_press_key("right"):\n Entry.start_scene_of("next")\n\n#"장면 2"의 파이선 코드\ndef when_press_key("left"):\n Entry.start_scene_of("prev")',
start_neighbor_scene_exampleDesc:
@@ -7532,59 +7743,60 @@ Lang.PythonHelper = {
wait_second_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트에 색깔효과를 10만큼 주고, 2초동안 기다린 다음 크기를 10만큼 커지게 합니다.',
repeat_basic_desc:
- '아래 명령어들을 A번 반복하여 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '아래 명령어들을 A번 반복하여 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
repeat_basic_elements: 'A-- 반복할 횟수 입력',
repeat_basic_exampleCode:
'def when_start():\n for i in range(10):\n Entry.move_to_direction(10)\n Entry.stamp()',
repeat_basic_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 이동방향으로 10만큼 이동하고, 도장찍는 행동을 10번 반복합니다.',
repeat_inf_desc:
- 'A 판단이 True인 동안 아래 명령어들을 반복 실행합니다. A에 True를 입력하면 계속 반복됩니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 판단이 True인 동안 아래 명령어들을 반복 실행합니다. A에 True를 입력하면 계속 반복됩니다. \n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
repeat_inf_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
repeat_inf_exampleCode:
'def when_start():\n while True:\n Entry.move_to_direction(10)\n Entry.bounce_on_edge()',
repeat_inf_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 계속해서 이동방향으로 10만큼 이동하고, 벽에 닿으면 튕깁니다.',
repeat_while_true_desc:
- 'A 판단이 True가 될 때까지 아래 명령어들을 반복 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 판단이 True가 될 때까지 아래 명령어들을 반복 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
repeat_while_true_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
repeat_while_true_exampleCode:
'def when_start():\n while not Entry.is_key_pressed("space"):\n Entry.add_rotation(90)',
repeat_while_true_exampleDesc:
'[시작하기]버튼을 클릭하면 스페이스키를 누를때까지 오브젝트가 90도 만큼 회전합니다.',
- stop_repeat_desc: '이 명령어와 가장 가까운 반복 명령어의 반복을 중단합니다.',
+ stop_repeat_desc:
+ "Stops the closest block that encloses this block.\n It works with various C-shaped blocks like 'repeat' block.",
stop_repeat_exampleCode:
'def when_start():\n while True:\n Entry.move_to_direction(10)\n if Entry.is_key_pressed("enter"):\n break',
stop_repeat_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 이동방향으로 10만큼 계속 이동합니다. 엔터키를 누르면 반복이 중단됩니다.',
_if_desc:
- 'A 부분의 판단이 True이면 if A:아래 명령어들을 실행하고, False이면 실행하지 않습니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 부분의 판단이 True이면 if A:아래 명령어들을 실행하고, False이면 실행하지 않습니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
_if_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
_if_exampleCode:
'def when_click_mouse_on():\n if (Entry.value_of_mouse_pointer("x") > 0):\n Entry.print_for_sec("오른쪽!", 0.5)',
_if_exampleDesc:
'마우스를 클릭했을 때 마우스 x좌표가 0보다 크면 오브젝트가 "오른쪽!"이라고 0.5초 동안 말합니다.',
if_else_desc:
- 'A 부분의 판단이 True이면 if A: 아래 명령어들을 실행하고, False이면 else: 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 부분의 판단이 True이면 if A: 아래 명령어들을 실행하고, False이면 else: 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
if_else_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
if_else_exampleCode:
'def when_click_mouse_on():\n if Entry.is_touched("mouse_pointer"):\n Entry.print("닿았다!")\n else:\n Entry.print("안 닿았다!")',
if_else_exampleDesc:
'마우스를 클릭했을 때 마우스포인터가 오브젝트에 닿았으면 "닿았다!"를 그렇지 않으면 "안 닿았다!"를 말합니다.',
wait_until_true_desc: 'A 부분의 판단이 True가 될 때까지 코드의 실행을 멈추고 기다립니다.',
wait_until_true_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
wait_until_true_exampleCode:
'def when_start():\n Entry.print("엔터를 눌러봐!")\n Entry.wait_until(Entry.is_key_pressed("enter"))\n Entry.print("잘했어!")',
wait_until_true_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "엔터를 눌러봐!"라 말하고, 엔터키를 누를 때까지 기다립니다. 엔터키를 누르면 "잘했어!"라 말합니다.',
stop_object_desc: 'A코드의 실행을 중지합니다.',
stop_object_elements:
- 'A-- 아래 선택지 중 하나 ① "all": 모든 오브젝트의 모든 코드 ② "self" : 해당 오브젝트의 모든 코드 ③ "this": 이 명령어가 포함된 코드 ④ "others" : 해당 오브젝트의 코드 중 이 명령어가 포함된 코드를 제외한 모든 코드 ⑤ "ohter_objects" : 이 오브젝트를 제외한 다른 모든 오브젝트의 코드',
+ 'A-- 아래 선택지 중 하나\n① "all": 모든 오브젝트의 모든 코드\n② "self" : 해당 오브젝트의 모든 코드\n③ "this": 이 명령어가 포함된 코드\n④ "others" : 해당 오브젝트의 코드 중 이 명령어가 포함된 코드를 제외한 모든 코드\n⑤ "ohter_objects" : 이 오브젝트를 제외한 다른 모든 오브젝트의 코드',
stop_object_exampleCode:
'def when_start():\n while True:\n Entry.move_to("mouse_pointer")\n\ndef when_press_key("space"):\n Entry.stop_code("all")\n',
stop_object_exampleDesc:
@@ -7595,13 +7807,13 @@ Lang.PythonHelper = {
restart_project_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 오브젝트의 크기가 커집니다. 엔터키를 누르면 작품을 처음부터 다시 실행합니다.',
when_clone_start_desc:
- '해당 오브젝트의 복제본이 새로 생성되었을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '해당 오브젝트의 복제본이 새로 생성되었을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_clone_start_exampleCode:
'def when_start():\n for i in range(5):\n Entry.make_clone_of("self")\n\ndef when_make_clone():\n Entry.set_x(random.randint(-200, 200))',
when_clone_start_exampleDesc:
'[시작하기]버튼을 클릭하면 자신의 복제본 5개를 만듭니다. 복제본이 새로 생성되었을때 복제본의 x좌표를 -200에서 200사이의 무작위수로 정합니다.',
create_clone_desc: 'A 오브젝트의 복제본을 생성합니다.',
- create_clone_elements: 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "self" 또는 "자신"',
+ create_clone_elements: 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "self" 또는 "자신"',
create_clone_exampleCode:
'def when_start():\n for i in range(5):\n Entry.make_clone_of("self")\n\ndef when_make_clone():\n Entry.set_x(random.randint(-200, 200))',
create_clone_exampleDesc:
@@ -7628,21 +7840,21 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 계속해서 이동방향으로 10만큼 이동하고, 벽에 닿으면 튕깁니다.',
move_x_desc: '오브젝트의 x좌표를 A만큼 바꿉니다.',
move_x_elements:
- 'A-- x좌표의 변화 값 ① 양수: 오브젝트가 오른쪽으로 이동합니다. ② 음수: 오브젝트가 왼쪽으로 이동합니다.',
+ 'A-- x좌표의 변화 값\n① 양수: 오브젝트가 오른쪽으로 이동합니다.\n② 음수: 오브젝트가 왼쪽으로 이동합니다.',
move_x_exampleCode:
'def when_start():\n Entry.add_x(10)\n Entry.wait_for_sec(2)\n Entry.add_x(-10)',
move_x_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 오른쪽으로 10만큼 이동하고 2초 동안 기다린 후 왼쪽으로 10만큼 이동합니다.',
move_y_desc: '오브젝트의 y좌표를 A만큼 바꿉니다.',
move_y_elements:
- 'A-- y좌표의 변화 값 ① 양수: 오브젝트가 위쪽으로 이동합니다. ② 음수: 오브젝트가 아래쪽으로 이동합니다.',
+ 'A-- y좌표의 변화 값\n① 양수: 오브젝트가 위쪽으로 이동합니다.\n② 음수: 오브젝트가 아래쪽으로 이동합니다.',
move_y_exampleCode:
'def when_start():\n Entry.add_y(10)\n Entry.wait_for_sec(2)\n Entry.add_y(-10)',
move_y_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 위쪽으로 10만큼 이동하고 2초 동안 기다린 후 아래쪽으로 10만큼 이동합니다.',
move_xy_time_desc: '오브젝트가 x와 y좌표를 각각 A와 B만큼 C초에 걸쳐 서서히 바꿉니다.',
move_xy_time_elements:
- 'A-- x좌표의 변화 값 ① 양수: 오브젝트가 오른쪽으로 이동합니다. ② 음수: 오브젝트가 왼쪽으로 이동합니다.%nextB-- y좌표의 변화 값 ① 양수: 오브젝트가 위쪽으로 이동합니다. ② 음수: 오브젝트가 아래쪽으로 이동합니다.%nextC-- 이동하는 시간(초)',
+ 'A-- x좌표의 변화 값\n① 양수: 오브젝트가 오른쪽으로 이동합니다.\n② 음수: 오브젝트가 왼쪽으로 이동합니다.%nextB-- y좌표의 변화 값\n① 양수: 오브젝트가 위쪽으로 이동합니다.\n② 음수: 오브젝트가 아래쪽으로 이동합니다.%nextC-- 이동하는 시간(초)',
move_xy_time_exampleCode:
'def when_start():\n Entry.add_xy_for_sec(100, 100, 2)\n Entry.add_xy_for_sec(-100, -100, 2)',
move_xy_time_exampleDesc:
@@ -7674,15 +7886,15 @@ Lang.PythonHelper = {
'오른쪽화살표키를 누르면 오브젝트의 x좌표를 10만큼 바꾸고, 위쪽화살표키를 누르면 오브젝트의 y좌표를 10만큼 바꿉니다. 마우스를 클릭하면 2초 동안 오브젝트를 x,y 좌표 0으로 이동시킵니다.',
locate_desc: '오브젝트가 A의 위치로 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
locate_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"',
locate_exampleCode:
'def when_click_mouse_on():\n Entry.move_to("mouse_pointer")\n\ndef when_press_key("space"):\n Entry.move_to("오브젝트")',
locate_exampleDesc:
- '마우스를 클릭하면 오브젝트가 마우스포인터 위치로 이동합니다. 스페이스키를 누르면 오브젝트가 "오브젝트" 위치로 이동합니다.',
+ '마우스를 클릭하면 오브젝트가 마우스포인터 위치로 이동합니다.\n스페이스키를 누르면 오브젝트가 "오브젝트" 위치로 이동합니다.',
locate_object_time_desc:
'오브젝트가 A의 위치로 B초에 걸쳐 서서히 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
locate_object_time_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터" %nextB-- 이동하는 시간(초)',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터" %nextB-- 이동하는 시간(초)',
locate_object_time_exampleCode:
'def when_click_mouse_on():\n Entry.move_to_for_sec("mouse_pointer", 2)',
locate_object_time_exampleDesc:
@@ -7729,7 +7941,7 @@ Lang.PythonHelper = {
see_angle_object_desc:
'오브젝트가 A쪽을 바라봅니다. (이동방향이 A를 향하도록 오브젝트의 방향을 회전해줍니다.)',
see_angle_object_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"',
see_angle_object_exampleCode:
'def when_click_mouse_on():\n Entry.look_at("mouse_pointer")\n\ndef when_press_key("space"):\n Entry.look_at("오브젝트")',
see_angle_object_exampleDesc:
@@ -7754,13 +7966,13 @@ Lang.PythonHelper = {
dialog_time_desc:
'오브젝트가 A를 B초 동안 말풍선으로 말한 후 다음 명령어가 실행됩니다. 콘솔창에서도 실행 결과를 볼 수 있습니다.',
dialog_time_elements:
- 'A-- 말할 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등%nextB-- 말하는 시간(초)',
+ 'A-- 말할 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등%nextB-- 말하는 시간(초)',
dialog_time_exampleCode:
'def when_start():\n Entry.print_for_sec("안녕! 나는", 2)\n Entry.print_for_sec(16, 2)\n Entry.print_for_sec("살이야", 2)',
dialog_time_exampleDesc:
'[시작하기]버튼을 클릭하면 "안녕! 나는", 16, "살이야"를 각각 2초 동안 차례대로 말합니다.',
dialog_desc: '오브젝트가 A를 말풍선으로 말합니다. 콘솔창에서도 실행 결과를 볼 수 있습니다.',
- dialog_elements: 'A-- 말할 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ dialog_elements: 'A-- 말할 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
dialog_exampleCode:
'def when_start():\n Entry.print("키보드로 숫자 1,2 를 누르면 숫자를 말해볼게")\n\ndef when_press_key(1):\n Entry.print(1)\n\ndef when_press_key(2):\n Entry.print(2)\n',
dialog_exampleDesc:
@@ -7772,28 +7984,28 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 "말풍선을 지우려면 엔터를 눌러!"라 말하고, 엔터키를 누르면 말풍선이 사라집니다.',
change_to_some_shape_desc: '오브젝트를 A 모양으로 바꿉니다.',
change_to_some_shape_elements:
- 'A-- 아래 선택지 중 하나 ① 모양 이름 : [속성] 탭의 "모양 이름"을 적음 ② 모양 번호 : [속성] 탭의 모양 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 모양 이름 : [속성] 탭의 "모양 이름"을 적음\n② 모양 번호 : [속성] 탭의 모양 번호를 적음',
change_to_some_shape_exampleCode:
'def when_start():\n Entry.wait_for_sec(0.3)\n Entry.change_shape("오브젝트모양")\n Entry.wait_for_sec(0.3)\n Entry.change_shape("오브젝트모양")',
change_to_some_shape_exampleDesc:
'[시작하기]버튼을 클릭하면 0.3초간 기다린 다음 "오브젝트모양"으로 모양을 바꾸고 0.3초간 기다린 다음 "오브젝트모양"모양으로 모양을 바꿉니다.',
change_to_next_shape_desc: '오브젝트의 모양을 다음 또는 이전 모양으로 바꿉니다.',
change_to_next_shape_elements:
- 'A-- 아래 선택지 중 하나 ① 다음 모양 : "next" 또는 "다음" ② 이전 모양 : "pre" 또는 "이전"',
+ 'A-- 아래 선택지 중 하나\n① 다음 모양 : "next" 또는 "다음" \n② 이전 모양 : "pre" 또는 "이전"',
change_to_next_shape_exampleCode:
'def when_start():\n Entry.wait_for_sec(0.3)\n Entry.change_shape_to("next")\n Entry.wait_for_sec(0.3)\n Entry.change_shape_to("pre")',
change_to_next_shape_exampleDesc:
'[시작하기]버튼을 클릭하면 0.3초간 기다린 다음 모양으로 오브젝트 모양을 바꾸고 0.3초간 기다린 다음 이전 모양으로 오브젝트 모양을 바꿉니다.',
add_effect_amount_desc: '오브젝트에 A 효과를 B만큼 줍니다.',
add_effect_amount_elements:
- 'A -- 아래 선택지 중 하나 ① “color” 또는 “색깔“ ② “brightness” 또는 “밝기” ③ “transparency” 또는 “투명도”%nextB-- 효과의 변화 정도',
+ 'A -- 아래 선택지 중 하나\n① “color” 또는 “색깔“ \n② “brightness” 또는 “밝기” \n③ “transparency” 또는 “투명도”%nextB-- 효과의 변화 정도',
add_effect_amount_exampleCode:
'def when_click_mouse_on():\n Entry.add_effect("color", 50)\n Entry.wait_for_sec(1)\n Entry.add_effect("brightness", -50)\n Entry.wait_for_sec(1)\n Entry.add_effect("transparency", 50)',
add_effect_amount_exampleDesc:
'마우스를 클릭하면 오브젝트에 색깔 효과를 50만큼 주고 1초간 기다리고, 밝기 효과를 -50만큼 주고 1초간 기다립니다. 그 후 투명도 효과를 50만큼 줍니다.',
change_effect_amount_desc: '오브젝트의 A 효과를 B로 정합니다.',
change_effect_amount_elements:
- 'A-- 아래 선택지 중 하나 ① “color” 또는 “색깔“ ② “brightness” 또는 “밝기” ③ “transparency” 또는 “투명도”%nextB-- 효과의 값 ① color: 0~100 범위의 수, 100을 주기로 반복됨 ② brightness: -100~100 사이 범위의 수, -100이하는 -100 으로 100 이상은 100 으로 처리 됨 ③ transparency: 0~100 사이 범위의 수, 0 이하는 0으로, 100이상은 100으로 처리 됨',
+ 'A-- 아래 선택지 중 하나\n① “color” 또는 “색깔“ \n② “brightness” 또는 “밝기” \n③ “transparency” 또는 “투명도”%nextB-- 효과의 값\n① color: 0~100 범위의 수, 100을 주기로 반복됨\n② brightness: -100~100 사이 범위의 수, -100이하는 -100 으로 100 이상은 100 으로 처리 됨\n③ transparency: 0~100 사이 범위의 수, 0 이하는 0으로, 100이상은 100으로 처리 됨',
change_effect_amount_exampleCode:
'def when_click_mouse_on():\n Entry.set_effect("color", 50)\n Entry.set_effect("brightness", 50)\n Entry.set_effect("transparency", 50)\n\ndef when_click_mouse_off():\n Entry.set_effect("color", 0)\n Entry.set_effect("brightness", 0)\n Entry.set_effect("transparency", 0)',
change_effect_amount_exampleDesc:
@@ -7827,7 +8039,7 @@ Lang.PythonHelper = {
'위쪽화살표키를 누르면 오브젝트의 상하 모양을 뒤집고, 오른쪽화살표키를 누르면 오브젝트의 좌우 모양을 뒤집습니다.',
change_object_index_desc: '오브젝트의 레이어를 A로 가져옵니다.',
change_object_index_elements:
- 'A-- 아래 선택지 중 하나 ① “front" 또는 “맨 앞“ ② “forward” 또는 “앞” ③ “backward” 또는 “뒤” ④ “back” 또는 “맨 뒤”',
+ 'A-- 아래 선택지 중 하나\n① “front" 또는 “맨 앞“ \n② “forward” 또는 “앞” \n③ “backward” 또는 “뒤”\n④ “back” 또는 “맨 뒤”',
change_object_index_exampleCode:
'def when_start():\n Entry.send_layer_to("front")\n Entry.wait_for_sec(2)\n Entry.send_layer_to("backward")',
change_object_index_exampleDesc:
@@ -7850,7 +8062,7 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 그리기가 시작되고 계속해서 오브젝트가 이동방향으로 10만큼 이동합니다. 마우스를 클릭하면 그리는것을 멈춥니다.',
set_color_desc: '오브젝트가 그리는 선의 색을 A로 정합니다.',
set_color_elements:
- 'A-- 아래 선택지 중 하나 ① 색상 코드 : "#FF0000", "#FFCC00", "#3333FF", "#000000" 등 ② 색깔명 : "red", "orange", "yellow", "green", "blue", "navy", "purple", "black", "white", "brown"',
+ 'A-- 아래 선택지 중 하나\n① 색상 코드 : "#FF0000", "#FFCC00", "#3333FF", "#000000" 등\n② 색깔명 : "red", "orange", "yellow", "green", "blue", "navy", "purple", "black", "white", "brown"',
set_color_exampleCode:
'def when_start():\n Entry.start_drawing()\n Entry.set_brush_color_to("#000099")\n while True:\n Entry.move_to_direction(1)',
set_color_exampleDesc:
@@ -7890,25 +8102,24 @@ Lang.PythonHelper = {
brush_erase_all_exampleDesc:
'[시작하기]버튼을 클릭하면 그리기가 시작됩니다. 오브젝트는 계속해서 이동방향으로 10만큼 움직이고, 오브젝트의 이동경로를 따라 선이 그려집니다. 마우스를 클릭하면 오브젝트가 그린 선을 모두 지웁니다.',
text_read_desc:
- '글상자 A의 내용입니다. (내용 안에 개행이 있는 경우, 띄어쓰기하여 반환됩니다.)',
- text_read_elements: 'A-- 아래 선택지 중 하나 ① "오브젝트(글상자) 이름" ② 자기 자신',
+ '글상자 A의 내용입니다.\n(내용 안에 개행이 있는 경우, 띄어쓰기하여 반환됩니다.)',
+ text_read_elements: 'A-- 아래 선택지 중 하나\n① "오브젝트(글상자) 이름" \n② 자기 자신',
text_read_exampleCode: 'def when_start():\n Entry.print(Entry.contents_of_textbox("A"))',
text_read_exampleDesc: '[시작하기]버튼을 클릭하면 오브젝트가 글상자 "A"의 내용을 말합니다.',
text_write_desc: '글상자의 내용을 A로 고쳐씁니다.',
- text_write_elements:
- 'A-- 글상자의 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ text_write_elements: 'A-- 글상자의 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
text_write_exampleCode: 'def when_start():\n Entry.write_text("엔트리")',
text_write_exampleDesc: '[시작하기]버튼을 클릭하면 글상자의 내용을 "엔트리"로 바꿉니다.',
text_append_desc: '글상자의 내용 뒤에 A를 추가합니다.',
text_append_elements:
- 'A-- 글상자의 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 글상자의 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
text_append_exampleCode:
'def when_start():\n Entry.write_text("안녕?")\n Entry.wait_for_sec(1)\n Entry.append_text("엔트리!")',
text_append_exampleDesc:
'[시작하기]버튼을 클릭하면 글상자의 내용이 "안녕?"이 되었다가 1초 뒤에 "엔트리!"가 추가되어 "안녕?엔트리!"가 됩니다.',
text_prepend_desc: '글상자의 내용 앞에 A를 추가합니다.',
text_prepend_elements:
- 'A-- 글상자의 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 글상자의 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
text_prepend_exampleCode:
'def when_start():\n Entry.write_text("반가워!")\n Entry.wait_for_sec(1)\n Entry.prepend_text("엔트리!")',
text_prepend_exampleDesc:
@@ -7920,21 +8131,21 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 글상자의 내용이 "엔트리"가 되었다가 1초 뒤에 모든 내용이 사라집니다.',
sound_something_with_block_desc: '오브젝트가 A 소리를 재생합니다.',
sound_something_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_with_block_exampleCode:
'def when_start():\n Entry.play_sound("소리")\n Entry.add_size(50)',
sound_something_with_block_exampleDesc:
'[시작하기]버튼을 클릭하면 "소리"를 재생하면서 오브젝트의 크기가 50만큼 커집니다.',
sound_something_second_with_block_desc: '오브젝트가 A소리를 B초 만큼 재생합니다.',
sound_something_second_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_second_with_block_exampleCode:
'def when_start():\n Entry.play_sound_for_sec("소리", 1)\n Entry.add_size(50)',
sound_something_second_with_block_exampleDesc:
'[시작하기]버튼을 클릭하면 "소리"를 1초 동안 재생하면서, 오브젝트의 크기가 50만큼 커집니다.',
sound_from_to_desc: '오브젝트가 A소리를 B초부터 C초까지 재생합니다.',
sound_from_to_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_from_to_exampleCode:
'def when_start():\n Entry.play_sound_from_to("소리", 0.5, 1)\n Entry.add_size(50)',
sound_from_to_exampleDesc:
@@ -7942,7 +8153,7 @@ Lang.PythonHelper = {
sound_something_wait_with_block_desc:
'오브젝트가 A 소리를 재생하고, 재생이 끝나면 다음 명령을 실행합니다.',
sound_something_wait_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_wait_with_block_exampleCode:
'def when_start():\n Entry.play_sound_and_wait("소리")\n Entry.add_size(50)',
sound_something_wait_with_block_exampleDesc:
@@ -7950,7 +8161,7 @@ Lang.PythonHelper = {
sound_something_second_wait_with_block_desc:
'오브젝트가 A소리를 B초 만큼 재생하고, 재생이 끝나면 다음 명령을 실행합니다.',
sound_something_second_wait_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_second_wait_with_block_exampleCode:
'def when_start():\n Entry.play_sound_for_sec_and_wait("소리", 1)\n Entry.add_size(50)',
sound_something_second_wait_with_block_exampleDesc:
@@ -7958,7 +8169,7 @@ Lang.PythonHelper = {
sound_from_to_and_wait_desc:
'오브젝트가 A소리를 B초부터 C초까지 재생하고, 재생이 끝나면 다음 명령을 실행합니다.',
sound_from_to_and_wait_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_from_to_and_wait_exampleCode:
'def when_start():\n Entry.play_sound_from_to_and_wait("소리", 0.5, 1)\n Entry.add_size(50)',
sound_from_to_and_wait_exampleDesc:
@@ -7987,49 +8198,49 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 계속해서 마우스를 클릭했는지 확인합니다. 만약 마우스를 클릭하면 오브젝트가 "반가워!"라고 0.5초간 말합니다.',
is_press_some_key_desc: 'A 키가 눌려져 있는 경우 True로 판단합니다.',
is_press_some_key_elements:
- 'A-- 아래 선택지 중 하나 ① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능) ② 숫자: 1, 2, 3, 4 ~ 9, 0 ③ 특수키: "space", "enter" ④ 방향키 : "up", "down", "right", "left"',
+ 'A-- 아래 선택지 중 하나\n① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능)\n② 숫자: 1, 2, 3, 4 ~ 9, 0\n③ 특수키: "space", "enter"\n④ 방향키 : "up", "down", "right", "left"',
is_press_some_key_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("space"):\n Entry.move_to_direction(10)',
is_press_some_key_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 선택한 키를 눌렀는지 확인합니다. 만약 스페이스 키를 누르면 오브젝트가 이동방향으로 10만큼 이동합니다.',
reach_something_desc: '오브젝트가 A와 닿은 경우 True으로 판단합니다.',
reach_something_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터" ③ "edge", "edge_up", "edge_down", "edge_right", "edge_left"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"\n③ "edge", "edge_up", "edge_down", "edge_right", "edge_left"',
reach_something_exampleCode:
'def when_start():\n while True:\n Entry.move_to_direction(10)\n if Entry.is_touched("edge"):\n Entry.add_rotation(150)',
reach_something_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 오브젝트가 이동방향으로 10만큼 이동합니다. 만약 오브젝트가 벽에 닿으면 150만큼 회전하게 됩니다.',
boolean_basic_operator_desc: 'A와 B를 비교하여 True 또는 False로 판단합니다.',
boolean_basic_operator_elements:
- 'A, B-- 비교하고자 하는 숫자값 ① == : A와 B의 값이 같으면 True, 아니면 False ② > : A의 값이 B의 값보다 크면 true, 아니면 False ③ < : A의 값이 B의 값보다 작으면 true, 아니면 False ④ >= : A의 값이 B의 값보다 크거나 같으면 true, 아니면 False ⑤ <= : A의 값이 B의 값보다 작거나 같으면 true, 아니면 False',
+ 'A, B 비교하고자 하는 숫자값\n① == : A와 B의 값이 같으면 True, 아니면 False\n② != : A와 B의 값이 다르면 True, 아니면 False\n③ > : A의 값이 B의 값보다 크면 true, 아니면 False\n④ < : A의 값이 B의 값보다 작으면 true, 아니면 False\n⑤ >= : A의 값이 B의 값보다 크거나 같으면 true, 아니면 False\n⑥ <= : A의 값이 B의 값보다 작거나 같으면 true, 아니면 False',
boolean_basic_operator_exampleCode:
'def when_start():\n while True:\n Entry.add_x(10)\n if Entry.value_of_object("오브젝트", "x") > 240:\n Entry.set_x(0)',
boolean_basic_operator_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 오브젝트 x좌표를 10만큼 바꿉니다. 만약 오브젝트 x좌표가 240보다 크면 오브젝트 x좌표를 0으로 정합니다.',
boolean_and_desc: 'A와 B의 판단이 모두 True인 경우 True, 아닌 경우 False로 판단합니다.',
boolean_and_elements:
- 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
boolean_and_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("a") and Entry.is_key_pressed("s"):\n Entry.add_effect("color", 10)',
boolean_and_exampleDesc:
'[시작하기]버튼을 클릭하고 키보드의 "a" 와 "s"키를 동시에 눌렀을 때, 색깔 효과를 10만큼 줍니다.',
boolean_or_desc: 'A와 B의 판단 중 하나라도 True인 경우 True, 아닌 경우 False로 판단합니다.',
boolean_or_elements:
- 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
boolean_or_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("a") or Entry.is_key_pressed("s"):\n Entry.add_effect("color", 10)',
boolean_or_exampleDesc:
'[시작하기]버튼을 클릭하면 키보드의 "a"나 "s"키 중 무엇이든 하나를 누르면 오브젝트에 색깔 효과를 10만큼 줍니다.',
boolean_not_desc: 'A 판단이 True이면 False, False이면 True로 판단합니다.',
boolean_not_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
boolean_not_exampleCode:
'def when_start():\n while True:\n if not Entry.is_mouse_clicked():\n Entry.add_size(1)',
boolean_not_exampleDesc:
'[시작하기]버튼을 클릭하면 마우스를 클릭하지 않은 동안 크기가 1씩 커집니다.',
calc_basic_desc: 'A와 B의 연산값입니다.',
calc_basic_elements:
- 'A, B-- 연산하고자 하는 숫자값 ① + : A와 B를 더한 값 ② - : A와 B를 뺀 값 ③ x : A와 B를 곱한 값 ④ / : A와 B를 나눈 값',
+ 'A, B-- 연산하고자 하는 숫자값\n① + : A와 B를 더한 값\n② - : A와 B를 뺀 값\n③ x : A와 B를 곱한 값\n④ / : A와 B를 나눈 값',
calc_basic_exampleCode:
'def when_start():\n Entry.print_for_sec(10 + 10, 2)\n Entry.print_for_sec(10 - 10, 2)\n Entry.print_for_sec(10 * 10, 2)\n Entry.print_for_sec(10 / 10, 2)',
calc_basic_exampleDesc:
@@ -8037,20 +8248,20 @@ Lang.PythonHelper = {
calc_rand_desc:
'A와 B 사이에서 선택된 무작위 수의 값입니다. (두 수 모두 정수를 입력한 경우 정수로,두 수 중 하나라도 소수를 입력한 경우 소수로 무작위 수가 선택됩니다.)',
calc_rand_elements:
- 'A, B-- 무작위 수를 추출할 범위 ① random.randint(A, B) : A, B를 정수로 입력하면 정수 범위에서 무작위 수를 추출 ② random.uniform(A, B) : A, B를 실수로 입력하면 실수 범위에서 무작위 수를 추출',
+ 'A, B-- 무작위 수를 추출할 범위\n① random.randint(A, B) : A, B를 정수로 입력하면 정수 범위에서 무작위 수를 추출\n② random.uniform(A, B) : A, B를 실수로 입력하면 실수 범위에서 무작위 수를 추출',
calc_rand_exampleCode:
'def when_start():\n Entry.print_for_sec(random.randint(1, 10), 2)\n Entry.print_for_sec(random.uniform(0.1, 2), 2)',
calc_rand_exampleDesc:
'[시작하기]버튼을 클릭하면 1부터 10사이의 정수중 무작위 수를 뽑아 2초간 말합니다. 그 후 0.1부터 2사이의 실수중 무작위 수를 뽑아 2초간 말합니다.',
coordinate_mouse_desc: '마우스 포인터의 A 좌표 값을 의미합니다.',
- coordinate_mouse_elements: 'A-- 아래 선택지 중 하나 ① "x" 또는 "X" ② "y" 또는 "Y"',
+ coordinate_mouse_elements: 'A-- 아래 선택지 중 하나\n① "x" 또는 "X"\n② "y" 또는 "Y"',
coordinate_mouse_exampleCode:
'def when_start():\n while True:\n Entry.print(Entry.value_of_mouse_pointer("x"))',
coordinate_mouse_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 마우스 포인터의 x좌표를 계속해서 말합니다.',
coordinate_object_desc: 'A에 대한 B정보값입니다.',
coordinate_object_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "self" 또는 "자신"%nextB-- 아래 선택지 중 하나 ① "x" 또는 "X" ② "y" 또는 "Y" ③ "rotation" 또는 "방향" ④ "direction" 또는 "이동 방향" ⑤ "size" 또는 "크기" ⑥ "shape_number" 또는 "모양 번호" ⑦ "shape_name" 또는 "모양 이름"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "self" 또는 "자신"%nextB-- 아래 선택지 중 하나\n① "x" 또는 "X"\n② "y" 또는 "Y"\n③ "rotation" 또는 "방향"\n④ "direction" 또는 "이동 방향"\n⑤ "size" 또는 "크기"\n⑥ "shape_number" 또는 "모양 번호"\n⑦ "shape_name" 또는 "모양 이름"',
coordinate_object_exampleCode:
'def when_start():\n while True:\n Entry.add_x(1)\n Entry.print(Entry.value_of_object("오브젝트", "x"))\n',
coordinate_object_exampleDesc:
@@ -8062,14 +8273,14 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 소리의 크기값을 계속해서 말합니다.',
quotient_and_mod_desc: 'A와 B의 연산값입니다.',
quotient_and_mod_elements:
- 'A, B-- 연산하고자 하는 숫자값 ① // : A / B의 몫에 해당하는 값 ② % : A / B의 나머지에 해당하는 값',
+ 'A, B-- 연산하고자 하는 숫자값\n① // : A / B의 몫에 해당하는 값\n② % : A / B의 나머지에 해당하는 값',
quotient_and_mod_exampleCode:
'def when_start():\n Entry.print_for_sec(10 // 3, 2)\n Entry.print_for_sec(10 % 3, 2)',
quotient_and_mod_exampleDesc:
'[시작하기]버튼을 클릭하면 10 / 3의 몫인 3을 2초 동안 말하고, 나머지인 1을 2초 동안 말합니다.',
calc_operation_desc: 'A의 연산값입니다.',
calc_operation_elements:
- 'A, B-- 연산하고자 하는 숫자값 ① A ** 2 : A를 제곱한 값 ② math.sqrt(A): A의 루트값 ③ math.sin(A): A의 사인값 ④ math.cos(A): A의 코사인 값 ⑤ math.tan(A): A의 탄젠트값 ⑥ math.asin(A): A의 아크사인값 ⑦ math.acos(A): A의 아크코사인값 ⑧ math.atan(): A의 아크탄젠트값 ⑨ math.log10(A): A의 로그값 ⑩ math.log(A): A의 자연로그값 ⑪ A - math.floor(A): A의 소수점 부분 ⑫ math.floor(A): A의 소수점 버림값 ⑬ math.ceil(A): A의 소수점 올림값 ⑭ math.round(A): A의 소수점 반올림값 ⑮ math.factorial(A): A의 팩토리얼 값 ⑯ math.fabs(A): A의 절댓값',
+ 'A, B-- 연산하고자 하는 숫자값\n① A ** 2 : A를 제곱한 값\n② math.sqrt(A): A의 루트값\n③ math.sin(A): A의 사인값\n④ math.cos(A): A의 코사인 값\n⑤ math.tan(A): A의 탄젠트값 \n⑥ math.asin(A): A의 아크사인값\n⑦ math.acos(A): A의 아크코사인값\n⑧ math.atan(): A의 아크탄젠트값\n⑨ math.log10(A): A의 로그값\n⑩ math.log(A): A의 자연로그값\n⑪ A - math.floor(A): A의 소수점 부분\n⑫ math.floor(A): A의 소수점 버림값\n⑬ math.ceil(A): A의 소수점 올림값\n⑭ math.round(A): A의 소수점 반올림값\n⑮ math.factorial(A): A의 팩토리얼 값\n⑯ math.fabs(A): A의 절댓값',
calc_operation_exampleCode:
'def when_start():\n Entry.print_for_sec(10 ** 2, 2)\n Entry.print_for_sec(math.sqrt(9), 2)\n Entry.print_for_sec(math.sin(90), 2)\n Entry.print_for_sec(math.fabs(-10), 2)',
calc_operation_exampleDesc:
@@ -8080,29 +8291,29 @@ Lang.PythonHelper = {
get_project_timer_value_exampleDesc:
'[시작하기]버튼을 클릭하면 초시계를 시작합니다. 3초 뒤에는 초시계를 정지하고 초시계창을 숨깁니다. 그 후 초시계값을 말합니다.',
choose_project_timer_action_desc:
- '초시계의 동작을 A로 정합니다. (이 명령어를 사용하면 실행화면에 ‘초시계 창’이 생성됩니다.)',
+ '초시계의 동작을 A로 정합니다.\n(이 명령어를 사용하면 실행화면에 ‘초시계 창’이 생성됩니다.)',
choose_project_timer_action_elements:
- 'A-- 아래 선택지 중 하나 ① "start" : 초시계를 시작 ② "stop" : 초시계를 정지 ③ "reset" : 초시계를 초기화',
+ 'A-- 아래 선택지 중 하나\n① "start" : 초시계를 시작\n② "stop" : 초시계를 정지\n③ "reset" : 초시계를 초기화',
choose_project_timer_action_exampleCode:
'def when_start():\n Entry.timer("start")\n Entry.wait_for_sec(3)\n Entry.timer("stop")\n Entry.timer_view("hide")\n Entry.print(Entry.value_of_timer())',
choose_project_timer_action_exampleDesc:
'[시작하기]버튼을 클릭하면 초시계를 시작합니다. 3초 뒤에는 초시계를 정지하고 초시계창을 숨깁니다. 그 후 초시계값을 말합니다.',
set_visible_project_timer_desc: '실행화면의 초시계 창을 A로 설정합니다.',
set_visible_project_timer_elements:
- 'A-- 아래 선택지 중 하나 ① "hide" : 초시계창을 숨김 ② "show" : 초시계창을 보임',
+ 'A-- 아래 선택지 중 하나\n① "hide" : 초시계창을 숨김\n② "show" : 초시계창을 보임',
set_visible_project_timer_exampleCode:
'def when_start():\n Entry.timer("start")\n Entry.wait_for_sec(3)\n Entry.timer("stop")\n Entry.timer_view("hide")\n Entry.print(Entry.value_of_timer())',
set_visible_project_timer_exampleDesc:
'[시작하기]버튼을 클릭하면 초시계를 시작합니다. 3초 뒤에는 초시계를 정지하고 초시계창을 숨깁니다. 그 후 초시계값을 말합니다.',
get_date_desc: '현재 A에 대한 값입니다.',
get_date_elements:
- 'A-- 아래 선택지 중 하나 ① "year" : 현재 연도 값 ② "month" : 현재 월 값 ③ "day" : 현재 일 값 ④ "hour" : 현재 시간 값 ⑤ "minute" : 현재 분 값 ⑥ "second" : 현재 초 값',
+ 'A-- 아래 선택지 중 하나\n① "year" : 현재 연도 값\n② "month" : 현재 월 값\n③ "day" : 현재 일 값\n④ "hour" : 현재 시간 값\n⑤ "minute" : 현재 분 값\n⑥ "second" : 현재 초 값',
get_date_exampleCode:
'def when_start():\n Entry.print(Entry.value_of_current_time("year") + "년" + Entry.value_of_current_time("month") + "월")',
get_date_exampleDesc: '[시작하기]버튼을 클릭하면 오브젝트가 현재년도와 월을 말합니다.',
distance_something_desc: '자신과 A까지의 거리 값입니다.',
distance_something_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"',
distance_something_exampleCode:
'def when_start():\n while True:\n Entry.print(Entry.value_of_distance_to("mouse_pointer"))',
distance_something_exampleDesc:
@@ -8113,10 +8324,11 @@ Lang.PythonHelper = {
'def when_start():\n Entry.print(Entry.value_of_sound_length_of("소리"))',
get_sound_duration_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "소리"의 길이를 말합니다.',
- get_user_name_desc: '작품을 실행하고 있는 사용자의 아이디 값입니다.',
+ get_user_name_desc:
+ 'Reports the user ID who runs the project.\nThe value is masked for privacy.',
get_user_name_exampleCode: 'def when_start():\n Entry.print(Entry.value_of_username())',
get_user_name_exampleDesc:
- '[시작하기]버튼을 클릭하면 작품을 실행하고 있는 사용자의 아이디 값을 말합니다.',
+ '[시작하기]버튼을 클릭하면 작품을 실행하고 있는 사용자의 이름 값을 말합니다.',
get_nickname_desc: '작품을 실행하고 있는 사용자의 닉네임 값입니다.',
get_nickname_exampleCode: 'def when_start():\n Entry.print(Entry.value_of_nickname())',
get_nickname_exampleDesc:
@@ -8141,7 +8353,7 @@ Lang.PythonHelper = {
substring_desc:
'A 문자열의 B위치부터 C-1위치까지의 값입니다. (첫 번째 글자의 위치는 0부터 시작합니다.)',
substring_elements:
- 'A-- "문자열"%nextB-- 포함할 문자열의 시작 위치 첫 번째 글자는 0부터 시작%nextC-- 문자열을 포함하지 않는 위치',
+ 'A-- "문자열"%nextB-- 포함할 문자열의 시작 위치\n첫 번째 글자는 0부터 시작%nextC-- 문자열을 포함하지 않는 위치',
substring_exampleCode: 'def when_start():\n Entry.print("안녕 엔트리!"[1:5])',
substring_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "안녕 엔트리!"의 1에서 4번째 글자인 "녕 엔트"를 말합니다.',
@@ -8153,7 +8365,7 @@ Lang.PythonHelper = {
index_of_string_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "안녕 엔트리!"에서 "엔트리"가 처음으로 등장하는 위치인 3을 말합니다.',
replace_string_desc:
- 'A 문자열에서 B문자열을 모두 찾아 C문자열로 바꾼 값입니다. (영문 입력시 대소문자를 구분합니다.)',
+ 'A 문자열에서 B문자열을 모두 찾아 C문자열로 바꾼 값입니다.\n(영문 입력시 대소문자를 구분합니다.)',
replace_string_elements: 'A, B, C-- "문자열"',
replace_string_exampleCode:
'def when_start():\n Entry.print("안녕 엔트리!".replace( "안녕", "반가워"))',
@@ -8161,13 +8373,13 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 "안녕 엔트리!"에서 "안녕"을 "반가워"로 바꾼 "반가워 엔트리!"를 말합니다.',
change_string_case_desc: 'A의 모든 알파벳을 대문자 또는 소문자로 바꾼 문자값입니다.',
change_string_case_elements:
- 'A-- "문자열" ① A.upper(): A의 모든 알파벳을 대문자로 바꾼 값 ② A.lower() : A의 모든 알파벳을 소문자로 바꾼 값',
+ 'A-- "문자열"\n① A.upper(): A의 모든 알파벳을 대문자로 바꾼 값\n② A.lower() : A의 모든 알파벳을 소문자로 바꾼 값',
change_string_case_exampleCode:
'def when_start():\n Entry.print_for_sec("Hello Entry!".upper(), 2)\n Entry.print_for_sec("Hello Entry!".lower(), 2)',
change_string_case_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "Hello Entry!"를 모두 대문자로 바꾼 "HELLO ENTRY!"를 2초간 말한 다음 모두 소문자로 바꾼 "hello entry!"를 2초간 말합니다.',
ask_and_wait_desc:
- "오브젝트가 A 내용을 말풍선으로 묻고, 대답을 입력받습니다. 대답은 실행화면 또는 콘솔창에서 입력할 수 있으며 입력된 값은 'Entry.answer()'에 저장됩니다. (이 명령어를 사용하면 실행화면에 ‘대답 창’이 생성됩니다.)",
+ "오브젝트가 A 내용을 말풍선으로 묻고, 대답을 입력받습니다. 대답은 실행화면 또는 콘솔창에서 입력할 수 있으며 입력된 값은 'Entry.answer()'에 저장됩니다. \n(이 명령어를 사용하면 실행화면에 ‘대답 창’이 생성됩니다.)",
ask_and_wait_elements: 'A-- "문자열"',
ask_and_wait_exampleCode:
'def when_start():\n Entry.input("이름을 입력해보세요.")\n Entry.print(Entry.answer() + " 반가워!")',
@@ -8181,20 +8393,20 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 "이름을 입력해보세요."라고 말풍선으로 묻습니다. 이름을 입력하면 "(입력한 이름) 반가워!"라 말합니다.',
set_visible_answer_desc: '실행화면의 대답 창을 A로 설정합니다.',
set_visible_answer_elements:
- 'A-- 아래 선택지 중 하나 ① "hide" : 대답 창을 숨김 ② "show" : 대답 창을 보임',
+ 'A-- 아래 선택지 중 하나\n① "hide" : 대답 창을 숨김\n② "show" : 대답 창을 보임',
set_visible_answer_exampleCode:
'def when_start():\n Entry.answer_view("hide")\n Entry.input("나이를 입력하세요.")\n Entry.print(Entry.answer())',
set_visible_answer_exampleDesc:
'[시작하기]버튼을 클릭하면 대답창이 숨겨지고, 오브젝트가 "나이를 입력하세요."라고 말풍선으로 묻습니다. 나이를 입력하면 오브젝트가 입력한 나이를 말합니다.',
get_variable_desc: 'A 변수에 저장된 값입니다.',
get_variable_elements:
- 'A-- 변수명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A',
+ 'A-- 변수명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A',
get_variable_exampleCode: 'age = 16\n\ndef when_start():\n Entry.print(age)',
get_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 오브젝트가 age 변수에 들어 가 있는 값인 "16"을 말합니다.',
change_variable_desc: 'A 변수에 B만큼 더합니다.',
change_variable_elements:
- 'A-- 변수명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 숫자값',
+ 'A-- 변수명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 숫자값',
change_variable_exampleCode:
'age = 16\n\ndef when_start():\n Entry.print_for_sec(age, 2)\n age += 2\n Entry.print_for_sec(age, 2)',
change_variable_exampleDesc:
@@ -8202,87 +8414,87 @@ Lang.PythonHelper = {
set_variable_desc:
'A 변수의 값을 B로 정합니다. 만약 A 변수가 없으면 [속성] 탭에 A 변수가 자동 생성됩니다.',
set_variable_elements:
- 'A-- 변수명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 변수에 넣을 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 변수명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 변수에 넣을 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
set_variable_exampleCode: 'age = 16\n\ndef when_start():\n Entry.print(age)',
set_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 오브젝트가 age 변수에 들어 가 있는 값인 "16"을 말합니다.',
show_variable_desc: 'A 변수 창을 실행화면에 보이게 합니다.',
show_variable_elements:
- 'A-- "변수명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "변수명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
show_variable_exampleCode:
'age = 16\n\ndef when_start():\n Entry.hide_variable("age")\n Entry.wait_for_sec(2)\n age = 20\n Entry.show_variable("age")',
show_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 age변수창을 실행화면에서 숨깁니다. 2초 후 변수값을 17로 바꾸고 age변수창을 실행화면에 보이게 합니다.',
hide_variable_desc: 'A 변수 창을 실행화면에서 숨깁니다.',
hide_variable_elements:
- 'A-- "변수명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "변수명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
hide_variable_exampleCode:
'age = 16\n\ndef when_start():\n Entry.hide_variable("age")\n Entry.print_for_sec(age, 2)',
hide_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 age변수창을 실행화면에서 숨기고, 오브젝트가 age 변수에 들어 가 있는 값인 "16"을 2초 동안 말합니다.',
value_of_index_from_list_desc:
- 'A 리스트에서 B위치의 항목 값을 의미합니다. (첫 번째 항목의 위치는 0부터 시작합니다.)',
+ 'A 리스트에서 B위치의 항목 값을 의미합니다. \n(첫 번째 항목의 위치는 0부터 시작합니다.)',
value_of_index_from_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치',
value_of_index_from_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.print(basket[1])\n',
value_of_index_from_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 오브젝트가 basket 리스트의 1번째 항목인 orange를 말합니다.',
add_value_to_list_desc: 'A 리스트의 마지막 항목으로 B값이 추가됩니다.',
add_value_to_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트에 넣을 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트에 넣을 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
add_value_to_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n basket.append("juice")\n Entry.print(basket[4])',
add_value_to_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 "juice"를 basket의 마지막 항목으로 추가합니다. 오브젝트는 basket의 4번째 항목인 "juice"를 말합니다.',
remove_value_from_list_desc:
- 'A 리스트의 B위치에 있는 항목을 삭제합니다. (첫 번째 항목의 위치는 0부터 시작합니다.)',
+ 'A 리스트의 B위치에 있는 항목을 삭제합니다.\n(첫 번째 항목의 위치는 0부터 시작합니다.)',
remove_value_from_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치값',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치값',
remove_value_from_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\ndef when_start():\n basket.pop(0)\n Entry.print(basket[0])',
remove_value_from_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket의 0번째 항목인 apple을 삭제합니다. 오브젝트는 새롭게 basket의 0번째 항목이 된 "orange"를 말합니다.',
insert_value_to_list_desc:
- 'A 리스트의 B위치에 C항목을 끼워 넣습니다. (첫 번째 항목의 위치는 0부터 시작합니다. B위치보다 뒤에 있는 항목들은 순서가 하나씩 밀려납니다.)',
+ 'A 리스트의 B위치에 C항목을 끼워 넣습니다. \n(첫 번째 항목의 위치는 0부터 시작합니다. B위치보다 뒤에 있는 항목들은 순서가 하나씩 밀려납니다.)',
insert_value_to_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
insert_value_to_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n basket.insert(1, "juice")\n Entry.print(basket[2])',
insert_value_to_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket의 1번째 위치에 항목 "juice"를 끼워 넣습니다. 오브젝트는 새롭게 basket의 2번째 항목이 된 "orange"를 말합니다.',
change_value_list_index_desc:
- 'A 리스트에서 B위치에 있는 항목의 값을 C 값으로 바꿉니다. (첫 번째 항목의 위치는 0부터 시작합니다.)',
+ 'A 리스트에서 B위치에 있는 항목의 값을 C 값으로 바꿉니다.\n(첫 번째 항목의 위치는 0부터 시작합니다.)',
change_value_list_index_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
change_value_list_index_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n basket[0] = "juice"\n Entry.print(basket[0])',
change_value_list_index_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket의 0번째 위치의 항목 "apple"을 "juice"로 바꿉니다. 오브젝트는 바뀐 basket의 0번째 항목 "juice"를 말합니다.',
length_of_list_desc: 'A 리스트가 보유한 항목 개수 값입니다.',
length_of_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A',
length_of_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.print(len(basket))',
length_of_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 오브젝트는 basket의 항목 개수인 4를 말합니다.',
is_included_in_list_desc: 'A값을 가진 항목이 B리스트에 포함되어 있는지 확인합니다.',
is_included_in_list_elements:
- 'A-- 리스트의 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등%nextB-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A',
+ 'A-- 리스트의 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등%nextB-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A',
is_included_in_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n if "apple" in basket:\n Entry.print("사과가 있어!")',
is_included_in_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket 리스트에 "apple"항목이 있는지 확인합니다. "apple"항목이 있기 때문에 오브젝트는 "사과가 있어!"라 말합니다.',
show_list_desc: '선택한 리스트 창을 실행화면에 보이게 합니다.',
show_list_elements:
- 'A-- "리스트명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "리스트명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
show_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.hide_list("basket")\n Entry.wait_for_sec(2)\n Entry.show_list("basket")',
show_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket 리스트를 2초간 숨긴 다음 보여줍니다.',
hide_list_desc: '선택한 리스트 창을 실행화면에서 숨깁니다.',
hide_list_elements:
- 'A-- "리스트명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "리스트명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
hide_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.hide_list("basket")\n Entry.wait_for_sec(2)\n Entry.show_list("basket")',
hide_list_exampleDesc:
@@ -8293,80 +8505,80 @@ Lang.PythonHelper = {
'def when_start():\n while True:\n if Entry.is_key_pressed("a") and Entry.is_key_pressed("s"):\n Entry.add_effect("color", 10)',
boolean_and_or_exampleDesc:
'[시작하기]버튼을 클릭하고 키보드의 "a" 와 "s"키를 동시에 눌렀을 때, 색깔 효과를 10만큼 줍니다.',
- check_weather_desc: 'B날짜에 C지역의 날씨가 A인 경우 True로 판단합니다.',
+ check_weather_desc: 'B날짜에 C지역의 날씨가 A인 경우 True로 판단합니다.',
check_weather_elements:
- 'A-- 아래 선택지 중 하나 ① "sunny" : 맑음 ② "partly cloudy" : 구름조금 ③ "mostly cloudy" : 구름많음 ④ "cloudy" : 흐림 ⑤ "rainy" : 비 ⑥ "sleet" : 진눈깨비 ⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "sunny" : 맑음\n② "partly cloudy" : 구름조금\n③ "mostly cloudy" : 구름많음\n④ "cloudy" : 흐림\n⑤ "rainy" : 비\n⑥ "sleet" : 진눈깨비\n⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_weather_exampleCode:
- 'def when_start():\n if Weather.is_condition_sunny("today", "Seoul"):\n Entry.print("오늘 서울의 날씨는 맑습니다.")',
+ 'def when_start():\n if Weather.is_condition_sunny("today", "Seoul"):\n Entry.print("오늘 서울의 날씨는 맑습니다.")',
check_weather_exampleDesc:
- '[시작하기]버튼을 클릭하면 오늘 서울의 날씨가 맑은지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 "오늘 서울의 날씨는 맑습니다."라고 말합니다.',
+ '[시작하기]버튼을 클릭하면 오늘 서울의 날씨가 맑은지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 "오늘 서울의 날씨는 맑습니다."라고 말합니다.',
check_finedust_desc:
- '선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.',
+ '선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.',
check_finedust_elements:
- 'A-- 아래 선택지 중 하나 ① "good" : 좋음 ② "normal" : 보통 ③ "bad" : 나쁨 ④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "good" : 좋음\n② "normal" : 보통\n③ "bad" : 나쁨\n④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_finedust_exampleCode:
- 'def when_start():\n if Weather.is_current_finedust_grade_good("Seoul"):\n Entry.print("현재 서울의 미세먼지 등급은 좋음입니다.")',
+ 'def when_start():\n if Weather.is_current_finedust_grade_good("Seoul"):\n Entry.print("현재 서울의 미세먼지 등급은 좋음입니다.")',
check_finedust_exampleDesc:
- '[시작하기]버튼을 클릭하면 현재 서울의 미세먼지 등급이 좋음인지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 “오늘 서울의 미세먼지 등급은 좋음입니다.”라고 말합니다.',
+ '[시작하기]버튼을 클릭하면 현재 서울의 미세먼지 등급이 좋음인지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 “오늘 서울의 미세먼지 등급은 좋음입니다.”라고 말합니다.',
get_weather_data_desc:
'선택한 날짜와 지역의 각종 날씨 정보값(최저기온, 최고기온, 습도, 강수량, 강수확률, 풍속)입니다.',
get_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "the lowest temperature" : 최저기온 ② "the highest temperature" : 최고기온 ③ "humidity" : 습도 ④ "precipitation" : 강수량 ⑤ "precipitation probability" : 강수확률 ⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "the lowest temperature" : 최저기온\n② "the highest temperature" : 최고기온\n③ "humidity" : 습도\n④ "precipitation" : 강수량\n⑤ "precipitation probability" : 강수확률\n⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
get_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_lowest_temperature("today", "Seoul"))',
get_weather_data_exampleDesc:
- '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 최저기온을 말합니다.',
- get_current_weather_data_desc: '현재 B지역의 A 날씨 정보값을 의미합니다.',
+ '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 최저기온을 말합니다.',
+ get_current_weather_data_desc: '현재 B지역의 A 날씨 정보값을 의미합니다.',
get_current_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "temperature" : 기온 ② "concentration of fine dust" : 미세먼지농도',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "temperature" : 기온\n② "concentration of fine dust" : 미세먼지농도',
get_current_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_current_temperature("Seoul"))',
get_current_weather_data_exampleDesc:
- '[시작하기]버튼을 클릭하면 오브젝트가 현재 서울의 기온을 말합니다.',
- get_today_temperature_desc: '오늘 A지역의 B 시간대 기온 정보값을 의미합니다.',
+ '[시작하기]버튼을 클릭하면 오브젝트가 현재 서울의 기온을 말합니다.',
+ get_today_temperature_desc: '오늘 A지역의 B 시간대 기온 정보값을 의미합니다.',
get_today_temperature_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "00" : 당일 00시 측정된 기온값 ② "03" : 당일 03시 측정된 기온값 ③ "06" : 당일 06시 측정된 기온값 ④ "09" : 당일 09시 측정된 기온값 ⑤ "12" : 당일 12시 측정된 기온값 ⑥ "15" : 당일 15시 측정된 기온값 ⑦ "18" : 당일 18시 측정된 기온값 ⑧ "21" : 당일 21시 측정된 기온값',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "00" : 당일 00시 측정된 기온값\n② "03" : 당일 03시 측정된 기온값\n③ "06" : 당일 06시 측정된 기온값\n④ "09" : 당일 09시 측정된 기온값\n⑤ "12" : 당일 12시 측정된 기온값\n⑥ "15" : 당일 15시 측정된 기온값\n⑦ "18" : 당일 18시 측정된 기온값\n⑧ "21" : 당일 21시 측정된 기온값',
get_today_temperature_exampleCode:
'def when_start():\n Entry.print(Weather.get_today_temperature("Seoul", 00))',
get_today_temperature_exampleDesc:
- '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 00시 기온을 말합니다.',
- check_city_weather_desc: 'B날짜에 C지역의 날씨가 A인 경우 True로 판단합니다.',
+ '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 00시 기온을 말합니다.',
+ check_city_weather_desc: 'B날짜에 C지역의 날씨가 A인 경우 True로 판단합니다.',
check_city_weather_elements:
- 'A-- 아래 선택지 중 하나 ① "sunny" : 맑음 ② "partly cloudy" : 구름조금 ③ "mostly cloudy" : 구름많음 ④ "cloudy" : 흐림 ⑤ "rainy" : 비 ⑥ "sleet" : 진눈깨비 ⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "sunny" : 맑음\n② "partly cloudy" : 구름조금\n③ "mostly cloudy" : 구름많음\n④ "cloudy" : 흐림\n⑤ "rainy" : 비\n⑥ "sleet" : 진눈깨비\n⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_city_weather_exampleCode:
- 'def when_start():\n if Weather.is_condition_sunny("today", "Seoul"):\n Entry.print("오늘 서울의 날씨는 맑습니다.")',
+ 'def when_start():\n if Weather.is_condition_sunny("today", "Seoul"):\n Entry.print("오늘 서울의 날씨는 맑습니다.")',
check_city_weather_exampleDesc:
- '[시작하기]버튼을 클릭하면 오늘 서울의 날씨가 맑은지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 "오늘 서울의 날씨는 맑습니다."라고 말합니다.',
+ '[시작하기]버튼을 클릭하면 오늘 서울의 날씨가 맑은지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 "오늘 서울의 날씨는 맑습니다."라고 말합니다.',
check_city_finedust_desc:
- '선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.',
+ '선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.',
check_city_finedust_elements:
- 'A-- 아래 선택지 중 하나 ① "good" : 좋음 ② "normal" : 보통 ③ "bad" : 나쁨 ④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "good" : 좋음\n② "normal" : 보통\n③ "bad" : 나쁨\n④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_city_finedust_exampleCode:
- 'def when_start():\n if Weather.is_current_finedust_grade_good("Seoul"):\n Entry.print("현재 서울의 미세먼지 등급은 좋음입니다.")',
+ 'def when_start():\n if Weather.is_current_finedust_grade_good("Seoul"):\n Entry.print("현재 서울의 미세먼지 등급은 좋음입니다.")',
check_city_finedust_exampleDesc:
- '[시작하기]버튼을 클릭하면 현재 서울의 미세먼지 등급이 좋음인지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 “오늘 서울의 미세먼지 등급은 좋음입니다.”라고 말합니다.',
+ '[시작하기]버튼을 클릭하면 현재 서울의 미세먼지 등급이 좋음인지 확인합니다. 만약 서울의 날씨가 맑다면 오브젝트가 “오늘 서울의 미세먼지 등급은 좋음입니다.”라고 말합니다.',
get_city_weather_data_desc:
'선택한 날짜와 지역의 각종 날씨 정보값(최저기온, 최고기온, 습도, 강수량, 강수확률, 풍속)입니다.',
get_city_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "the lowest temperature" : 최저기온 ② "the highest temperature" : 최고기온 ③ "humidity" : 습도 ④ "precipitation" : 강수량 ⑤ "precipitation probability" : 강수확률 ⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "the lowest temperature" : 최저기온\n② "the highest temperature" : 최고기온\n③ "humidity" : 습도\n④ "precipitation" : 강수량\n⑤ "precipitation probability" : 강수확률\n⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
get_city_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_lowest_temperature("today", "Seoul"))',
get_city_weather_data_exampleDesc:
- '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 최저기온을 말합니다.',
- get_current_city_weather_data_desc: '현재 B지역의 A 날씨 정보값을 의미합니다.',
+ '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 최저기온을 말합니다.',
+ get_current_city_weather_data_desc: '현재 B지역의 A 날씨 정보값을 의미합니다.',
get_current_city_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "temperature" : 기온 ② "concentration of fine dust" : 미세먼지농도',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "temperature" : 기온\n② "concentration of fine dust" : 미세먼지농도',
get_current_city_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_current_temperature("Seoul"))',
get_current_city_weather_data_exampleDesc:
- '[시작하기]버튼을 클릭하면 오브젝트가 현재 서울의 기온을 말합니다.',
- get_today_city_temperature_desc: '오늘 A지역의 B 시간대 기온 정보값을 의미합니다.',
+ '[시작하기]버튼을 클릭하면 오브젝트가 현재 서울의 기온을 말합니다.',
+ get_today_city_temperature_desc: '오늘 A지역의 B 시간대 기온 정보값을 의미합니다.',
get_today_city_temperature_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "00" : 당일 00시 측정된 기온값 ② "03" : 당일 03시 측정된 기온값 ③ "06" : 당일 06시 측정된 기온값 ④ "09" : 당일 09시 측정된 기온값 ⑤ "12" : 당일 12시 측정된 기온값 ⑥ "15" : 당일 15시 측정된 기온값 ⑦ "18" : 당일 18시 측정된 기온값 ⑧ "21" : 당일 21시 측정된 기온값',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "00" : 당일 00시 측정된 기온값\n② "03" : 당일 03시 측정된 기온값\n③ "06" : 당일 06시 측정된 기온값\n④ "09" : 당일 09시 측정된 기온값\n⑤ "12" : 당일 12시 측정된 기온값\n⑥ "15" : 당일 15시 측정된 기온값\n⑦ "18" : 당일 18시 측정된 기온값\n⑧ "21" : 당일 21시 측정된 기온값',
get_today_city_temperature_exampleCode:
'def when_start():\n Entry.print(Weather.get_today_city_temperature("Seoul", 00))',
get_today_city_temperature_exampleDesc:
- '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 00시 기온을 말합니다.',
+ '[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 00시 기온을 말합니다.',
};
Lang.Painter = {
select_cut: 'You can cut with a square dotted line.',
@@ -8381,8 +8593,8 @@ Lang.Painter = {
font_family: 'Font family',
fullscreen: 'Full screen',
exit_fullscreen: 'Exit full screen',
- picture_import: 'Import a picture',
- edit_way: 'Edit way',
+ picture_import: 'Import a shape',
+ edit_way: 'Convert',
line: 'Line',
vertex: 'Vertex',
bitmap: 'Bitmap',
@@ -8398,14 +8610,14 @@ Lang.Painter = {
cut_picture: 'cut',
paste_picture: 'paste',
remove_all: 'clear',
- new_picture: 'New Picture',
+ new_picture: 'New shape',
edit: 'Edit',
picture_size: 'Size',
picture_rotation: 'Rotation',
thickness: 'thickness',
font_fill: 'Fill',
painter_file_save: 'Save',
- painter_file_saveas: 'Save as a new picture',
+ painter_file_saveas: 'Save as a new shape',
file: 'File',
Pencil: 'Pen',
Line: 'Line',
@@ -8414,7 +8626,7 @@ Lang.Painter = {
Select: 'Select',
Rectangle: 'Rectangle',
Ellipse: 'Ellipse',
- Text: 'Text Box',
+ Text: 'Text box',
Fill: 'Fill',
Eraser: 'Eraser',
get_file: 'get',
@@ -8465,15 +8677,15 @@ Lang.DataAnalytics = {
chart_title: 'Chart title',
remove_chart: 'Delete chart',
add_chart_first: 'No chart in table. \nAdd table.',
- bar: 'bar',
- line: 'line',
- pie: 'pie',
- scatter: 'scatter',
- select_x_axis: 'Select the horizontal axis.',
- x_axis: 'Horiz. axis',
- y_axis: 'Ver. axis',
- select_y_axis: 'Select the vertical axis.',
- select_y_axis_or_legend: 'Select the vertical axis or legends.',
+ bar: 'Bar',
+ line: 'Line',
+ pie: 'Pie',
+ scatter: 'Scatter',
+ select_x_axis: 'Select the x-axis.',
+ x_axis: 'x-axis',
+ y_axis: 'y-axis',
+ select_y_axis: 'Select the y-axis.',
+ select_y_axis_or_legend: 'Select the y-axis or legends.',
select_legend: 'Select the legends.',
cell: 'Cell',
unable_to_express_chart: 'This cannot be expressed in charts.',
@@ -8532,9 +8744,16 @@ Lang.DataAnalytics = {
provider: 'Source',
description: 'Description',
field_info: 'Field Info',
- show_all_points: 'show_all_points',
+ show_all_points: 'Show All Points',
coefficient: 'Coefficient',
scatter_matrix: 'Scatter Matrix',
+ show_table: 'Show Table',
+ value: 'Value',
+ summary: 'Summary',
+ column_name: 'Column Name',
+ total: 'Total',
+ histogram: 'Histogram',
+ select_legend2: 'Select at least 2 legends.',
};
Lang.SharePolicy = {
diff --git a/extern/lang/ko.js b/extern/lang/ko.js
index 40ce280f65..644f821a2f 100644
--- a/extern/lang/ko.js
+++ b/extern/lang/ko.js
@@ -9,140 +9,135 @@ Lang.en = 'English';
Lang.jp = '日本語';
Lang.vn = 'tiếng Việt';
Lang.Command = {
- '1': '장면 추가하기',
- '2': '장면 삭제하기',
- '3': '장면 이름 수정',
- '4': '장면 순서 변경',
- '5': '장면 선택',
- '101': '블록 쓰레드 추가하기',
- '102': '블록 쓰레드 삭제하기',
- '103': '블록 삭제하기',
- '104': '블록 복구하기',
- '105': '블록 끼워넣기',
- '106': '블록 분리하기',
- '107': '블록 이동하기',
- '108': '블록 복제하기',
- '109': '블록 복제 취소하기',
- '110': '스크롤',
- '111': '블록 필드값 수정',
- '117': '블록 쓰레드 추가하기',
- '118': '블록 끼워넣기',
- '119': '블록 이동하기',
- '120': '블록 분리하기',
- '121': '블록 이동하기',
- '122': '블록 끼워넣기',
- '123': '블록 끼워넣기',
- '201': '오브젝트 선택하기',
- '202': '오브젝트 수정 버튼 클릭',
- '203': '오브젝트 그림 추가',
- '204': '오브젝트 그림 삭제',
- '205': '오브젝트 소리 추가',
- '206': '오브젝트 소리 삭제',
- '207': '오브젝트 이름 수정',
- '208': '오브젝트 추가',
- '209': '오브젝트 삭제',
- '210': '오브젝트 추가 버튼 클릭',
- '211': '오브젝트 x 수정',
- '212': '오브젝트 y 수정',
- '213': '오브젝트 size 수정',
- '214': '오브젝트 방향 수정',
- '215': '오브젝트 이동 방향 수정',
- '216': '오브젝트 회전방식 수정',
- '217': '엔터티 모델 동기화',
- '301': 'do',
- '302': 'undo',
- '303': 'redo',
- '401': '그림 수정하기',
- '402': '그림 수정 취소하기',
- '403': '그림 수정하기',
- '404': '그림 수정 취소하기',
- '405': '글상자 수정',
- '501': '시작하기',
- '502': '정지하기',
- '601': '컨테이너 오브젝트 선택하기',
- '701': '모드 바꾸기',
- '702': '모양 추가 버튼 클릭',
- '703': '소리 추가 버튼 클릭',
- '801': '속성 필터 선택하기',
- '802': '변수 추가하기 버튼 클릭',
- '803': '변수 추가하기',
- '804': '변수 삭제하기',
- '805': '변수 이름 설정',
- '806': '신호 이름 설정',
- '807': '신호 추가',
- '808': '신호 삭제',
- '809': '변수 스코프 정하기',
- '810': '변수 글로벌 체크',
- '811': '변수 보이기 체크',
- '812': '변수 기본값 설정',
- '813': '변수 슬라이드로 체크',
- '814': '변수 최솟값 정하기',
- '815': '변수 최댓값 정하기',
- '816': '리스트 추가 버튼 클릭',
- '817': '리스트 추가',
- '818': '리스트 삭제',
- '819': '리스트 이름 정하기',
- '820': '리스트 스코프 정하기',
- '821': '리스트 글로벌 체크',
- '822': '리스트 보이기 체크',
- '823': '리스트 길이 변경',
- '824': '리스트 기본값 설정',
- '825': '메세지 수정 enable',
- '826': '변수 수정 enable',
- '827': '리스트 수정 enable',
- '828': '변수 이름 정하기',
- '829': '리스트 이름 정하기',
- '900': '모달 닫기',
- '1001': '함수 생성 시작',
- '1002': '함수 수정 시작',
- '1003': '함수 수정 취소',
- '1004': '함수 생성',
- '1005': '함수 업데이트',
+ 1: '장면 추가하기',
+ 2: '장면 삭제하기',
+ 3: '장면 이름 수정',
+ 4: '장면 순서 변경',
+ 5: '장면 선택',
+ 101: '블록 쓰레드 추가하기',
+ 102: '블록 쓰레드 삭제하기',
+ 103: '블록 삭제하기',
+ 104: '블록 복구하기',
+ 105: '블록 끼워넣기',
+ 106: '블록 분리하기',
+ 107: '블록 이동하기',
+ 108: '블록 복제하기',
+ 109: '블록 복제 취소하기',
+ 110: '스크롤',
+ 111: '블록 필드값 수정',
+ 117: '블록 쓰레드 추가하기',
+ 118: '블록 끼워넣기',
+ 119: '블록 이동하기',
+ 120: '블록 분리하기',
+ 121: '블록 이동하기',
+ 122: '블록 끼워넣기',
+ 123: '블록 끼워넣기',
+ 201: '오브젝트 선택하기',
+ 202: '오브젝트 수정 버튼 클릭',
+ 203: '오브젝트 그림 추가',
+ 204: '오브젝트 그림 삭제',
+ 205: '오브젝트 소리 추가',
+ 206: '오브젝트 소리 삭제',
+ 207: '오브젝트 이름 수정',
+ 208: '오브젝트 추가',
+ 209: '오브젝트 삭제',
+ 210: '오브젝트 추가 버튼 클릭',
+ 211: '오브젝트 x 수정',
+ 212: '오브젝트 y 수정',
+ 213: '오브젝트 size 수정',
+ 214: '오브젝트 방향 수정',
+ 215: '오브젝트 이동 방향 수정',
+ 216: '오브젝트 회전방식 수정',
+ 217: '엔터티 모델 동기화',
+ 301: 'do',
+ 302: 'undo',
+ 303: 'redo',
+ 401: '그림 수정하기',
+ 402: '그림 수정 취소하기',
+ 403: '그림 수정하기',
+ 404: '그림 수정 취소하기',
+ 405: '글상자 수정',
+ 501: '시작하기',
+ 502: '정지하기',
+ 601: '컨테이너 오브젝트 선택하기',
+ 701: '모드 바꾸기',
+ 702: '모양 추가 버튼 클릭',
+ 703: '소리 추가 버튼 클릭',
+ 801: '속성 필터 선택하기',
+ 802: '변수 추가하기 버튼 클릭',
+ 803: '변수 추가하기',
+ 804: '변수 삭제하기',
+ 805: '변수 이름 설정',
+ 806: '신호 이름 설정',
+ 807: '신호 추가',
+ 808: '신호 삭제',
+ 809: '변수 스코프 정하기',
+ 810: '변수 글로벌 체크',
+ 811: '변수 보이기 체크',
+ 812: '변수 기본값 설정',
+ 813: '변수 슬라이드로 체크',
+ 814: '변수 최솟값 정하기',
+ 815: '변수 최댓값 정하기',
+ 816: '리스트 추가 버튼 클릭',
+ 817: '리스트 추가',
+ 818: '리스트 삭제',
+ 819: '리스트 이름 정하기',
+ 820: '리스트 스코프 정하기',
+ 821: '리스트 글로벌 체크',
+ 822: '리스트 보이기 체크',
+ 823: '리스트 길이 변경',
+ 824: '리스트 기본값 설정',
+ 825: '메세지 수정 enable',
+ 826: '변수 수정 enable',
+ 827: '리스트 수정 enable',
+ 828: '변수 이름 정하기',
+ 829: '리스트 이름 정하기',
+ 900: '모달 닫기',
+ 1001: '함수 생성 시작',
+ 1002: '함수 수정 시작',
+ 1003: '함수 수정 취소',
+ 1004: '함수 생성',
+ 1005: '함수 업데이트',
};
Lang.CommandTooltip = {
- '101': '블록 쓰레드 추가하기',
- '102': '블록 쓰레드 삭제하기',
- '103': '블록 삭제하기',
- '104': '블록 복구하기',
- '105':
- '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '106': '블록 분리하기',
- '107': '블록 이동하기',
- '108': '블록 복제하기',
- '109': '블록 복제 취소하기',
- '110': '스크롤',
- '111':
- '블록 필드값 수정@@값을 입력하기 위해 이곳을 클릭합니다.$$선택지를 클릭합니다.$$선택지를 클릭합니다.$$&value&을 입력합니다.$$&value&를 선택합니다.$$키보드 &value&를 누릅니다.',
- '117': '블록 쓰레드 추가하기',
- '118': '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '119': '블록 가져오기@@빈 곳에 블록을 끌어다 놓습니다.',
- '120':
- '블록 분리하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
- '121':
- '블록 이동하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
- '122': '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '123':
- '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
- '201': '오브젝트 선택하기',
- '301': 'do',
- '302': 'undo',
- '303': 'redo',
- '401': '그림 수정하기',
- '402': '그림 수정 취소하기',
- '403': '그림 수정하기',
- '404': '그림 수정 취소하기',
- '501': '실행하기@@[시작하기]를 누릅니다.',
- '502': '정지하기@@[정지하기]를 누릅니다.',
- '601': '컨테이너 오브젝트 선택하기',
- '701': '모드 바꾸기',
- '702': '모양 추가하기@@모양추가를 클릭합니다.',
- '703': '소리 추가하기@@소리추가를 클릭합니다.',
- '801': '변수 속성창 필터 선택하기',
- '802': '변수 추가하기@@[변수 추가]를 클릭합니다.',
- '803': '변수 추가하기@@[확인]을 클릭합니다.',
- '804': '변수 삭제하기@@이 버튼을 눌러 변수를 삭제합니다.',
- '805': '변수 이름 설정',
- '1101': '확장 블록 추가하기@@확장 블록 블러오기를 클릭합니다.',
+ 101: '블록 쓰레드 추가하기',
+ 102: '블록 쓰레드 삭제하기',
+ 103: '블록 삭제하기',
+ 104: '블록 복구하기',
+ 105: '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 106: '블록 분리하기',
+ 107: '블록 이동하기',
+ 108: '블록 복제하기',
+ 109: '블록 복제 취소하기',
+ 110: '스크롤',
+ 111: '블록 필드값 수정@@값을 입력하기 위해 이곳을 클릭합니다.$$선택지를 클릭합니다.$$선택지를 클릭합니다.$$&value&을 입력합니다.$$&value&를 선택합니다.$$키보드 &value&를 누릅니다.',
+ 117: '블록 쓰레드 추가하기',
+ 118: '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 119: '블록 가져오기@@빈 곳에 블록을 끌어다 놓습니다.',
+ 120: '블록 분리하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
+ 121: '블록 이동하기$$블록 삭제하기@@필요 없는 코드를 휴지통으로 끌어옵니다.$$이 곳에 코드를 버립니다.',
+ 122: '블록 연결하기@@이 곳에 블록을 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 123: '코드 분리하기$$코드 연결하기@@이 코드의 가장 위에 있는 블록을 잡고 분리하여 끌어옵니다.$$이 곳에 코드를 연결합니다.$$이 곳에 블록의 왼쪽 끝을 끼워 넣습니다.',
+ 201: '오브젝트 선택하기',
+ 301: 'do',
+ 302: 'undo',
+ 303: 'redo',
+ 401: '그림 수정하기',
+ 402: '그림 수정 취소하기',
+ 403: '그림 수정하기',
+ 404: '그림 수정 취소하기',
+ 501: '실행하기@@[시작하기]를 누릅니다.',
+ 502: '정지하기@@[정지하기]를 누릅니다.',
+ 601: '컨테이너 오브젝트 선택하기',
+ 701: '모드 바꾸기',
+ 702: '모양 추가하기@@모양추가를 클릭합니다.',
+ 703: '소리 추가하기@@소리추가를 클릭합니다.',
+ 801: '변수 속성창 필터 선택하기',
+ 802: '변수 추가하기@@[변수 추가]를 클릭합니다.',
+ 803: '변수 추가하기@@[확인]을 클릭합니다.',
+ 804: '변수 삭제하기@@이 버튼을 눌러 변수를 삭제합니다.',
+ 805: '변수 이름 설정',
+ 1101: '확장 블록 추가하기@@확장 블록 블러오기를 클릭합니다.',
};
Lang.Blocks = {
download_guide: '• 연결 안내 다운로드',
@@ -454,7 +449,7 @@ Lang.Blocks = {
hindi: '힌디어',
japan: '일본어',
thai: '태국어',
- vietnamese: '베트남어',
+ vietnamese: '베트남',
indonesian: '인도네시아어',
chinese_simplified: '중국어간체',
chinese_traditional: '중국어번체',
@@ -498,7 +493,7 @@ Lang.Blocks = {
behaviorConduct01004001: '강풍이 오기 전',
behaviorConduct01004002: '강풍 발생 시',
behaviorConduct01005002: '대설이 오기 전',
- behaviorConduct01005003: '대설 내일 때',
+ behaviorConduct01005003: '대설 내릴 때',
behaviorConduct01005004: '눈이 그친 후',
behaviorConduct01006001: '한파가 오기 전',
behaviorConduct01006002: '한파 왔을 때',
@@ -1560,7 +1555,7 @@ Lang.Blocks = {
CALC_replace_string_1: '',
CALC_replace_string_2: '의',
CALC_replace_string_3: '을(를)',
- CALC_replace_string_4: '로 바꾼 값',
+ CALC_replace_string_4: '(으)로 바꾼 값',
CALC_change_string_case_1: '',
CALC_change_string_case_2: '의',
CALC_change_string_case_3: ' ',
@@ -1958,6 +1953,37 @@ Lang.Blocks = {
object_detector_title_text: '사물 인식',
hand_detection_title_text: '손 인식',
unknown: '알 수 없음',
+ CALC_timer_visible_2: '',
+ SCENE_start_scene_1: '',
+ SCENE_start_neighbor_scene_1: '',
+ yell: '외치기',
+ JUDGEMENT_reach_something_1: '',
+ JUDGEMENT_boolean_not_1: '',
+ is_type_en: '영문',
+ is_type_ko: '한글',
+ CALC_calc_rand_1: '',
+ CALC_coordinate_object_1: '',
+ CALC_quotient_and_mod_1: '',
+ CALC_calc_operation_of_1: '',
+ CALC_choose_project_timer_action_2: '',
+ CALC_get_date_2: '',
+ CALC_distance_something_1: '',
+ CALC_get_sound_duration_1: '',
+ CALC_length_of_string_1: '',
+ CALC_reverse_of_string_1: '',
+ VARIABLE_combine_something_1: '',
+ CALC_char_at_1: '',
+ CALC_substring_1: '',
+ CALC_index_of_string_1: '',
+ CALC_replace_string_1: '',
+ CALC_change_string_case_1: '',
+ VARIABLE_value_of_index_from_list_1: '',
+ VARIABLE_length_of_list_1: '',
+ VARIABLE_is_included_in_list_1: '',
+ tts_sabina: '마녀',
+ tts_mammon: '악마',
+ tts_kitty: '야옹이',
+ tts_doggy: '멍멍이',
};
Lang.video_body_coord_params = {
left_eye: '왼쪽 눈',
@@ -2097,9 +2123,9 @@ Lang.Buttons = {
mission: '미션 확인하기',
basic_guide: '기본 사용 방법',
apply: '적용하기',
- add: '추가하기',
+ add: '추가',
cancel: '취소',
- save: '확인',
+ save: '저장',
start: '시작',
confirm: '확인',
delete: '삭제',
@@ -2131,6 +2157,14 @@ Lang.Buttons = {
sound_menu_adjust: '조정하기',
sound_button_reset: '원래대로',
sound_button_save: '저장하기',
+ back: '뒤로가기',
+ add2: '추가하기',
+ load: '불러오기',
+ move: '이동하기',
+ create_new_table: '테이블 새로 만들기',
+ add_variable: '변수 추가',
+ add_list: '리스트 추가',
+ add_message: '신호 추가',
};
Lang.Menus = {
ask_captcha: '아래 이미지를 보이는 대로 입력해주세요.',
@@ -2141,10 +2175,10 @@ Lang.Menus = {
nothing_to_export: '내려받기 할 항목이 없습니다.',
content_copied: '내용이 복사되었습니다.',
list_import_title: '리스트 불러오기',
- list_import_placeholder: '예)\n내용1\n내용2\n내용3\n내용4\n내용5\n내용6\n내용7\n내용8',
+ list_import_placeholder: '예)\r\n항목1\r\n항목2\r\n항목3',
verifying_email: '인증 메일 발송하기',
- list_import_notice_1: '리스트 항목의 내용을 올릴 수 있습니다.',
- list_import_notice_2: '기존 내용은 새로 저장한 내용으로 변경됩니다.',
+ list_import_notice_1: '리스트의 항목과 내용(기본값)을 한꺼번에 작성할 수 있습니다.',
+ list_import_notice_2: '기존 내용은 사라지고 여기서 작성한 내용만 저장됩니다.',
list_export_title: '리스트 내보내기',
list_export_notice: '리스트 항목의 내용을 복사하거나, 엑셀로 내려받을 수 있습니다.',
robotis_opencm70: '로보티즈 IoT',
@@ -2200,19 +2234,19 @@ Lang.Menus = {
'안녕하세요. 엔트리교육연구소입니다. “엔트리”를 이용하고 계신 회원 여러분께 깊은 감사의 말씀을 드립니다. 엔트리교육연구소는 그동안 공익 목적으로 운영해오던 “엔트리” 웹사이트의 운영을 네이버가 설립한 비영리 재단인 커넥트재단에 양도하기로 합의하였습니다. 앞으로 엔트리는 커넥트재단에서 공익 목적 하에 지속적으로 운영될 수 있도록 할 것이며, 회원 여러분께서는 기존과 동일하게 엔트리를 이용하실 수 있습니다. 웹사이트 제공 주체가 엔트리교육연구소에서 커넥트재단으로 변경됨에 따라 아래와 같이 회원 개인 정보에 대한 이전이 있으며, 본 합의에 의해 실제 개인 정보의 위치가 물리적으로 이동한 것은 아님을 알려드립니다. ',
textcoding_numberError_f:
'등록된 함수 중에 이름의 첫 글자가 숫자인 함수가 있으면 모드 변환을 할 수 없습니다.',
- textcoding_bookedError_1f: '등록된 함수 중에 이름이',
+ textcoding_bookedError_1f: '등록된 함수 중에 이름이 ',
textcoding_bookedError_2f: '인 함수가 있으면 모드 변환을 할 수 없습니다.',
textcoding_specialCharError_f:
"등록된 함수 중 이름에 '_' 를 제외한 특수 문자가 있으면 모드 변환을 할 수 없습니다.",
textcoding_numberError_v:
'등록된 변수 중에 이름의 첫 글자가 숫자인 변수가 있으면 모드 변환을 할 수 없습니다.',
textcoding_bookedError_1v: '등록된 변수 중에 변수 이름이 ',
- textcoding_bookedError_2v: ' 인 변수가 있으면 모드 변환을 할 수 없습니다.',
+ textcoding_bookedError_2v: '인 변수가 있으면 모드 변환을 할 수 없습니다.',
textcoding_specialCharError_v:
"등록된 변수 중 이름에 '_' 를 제외한 특수 문자가 있으면 모드 변환을 할 수 없습니다.",
textcoding_numberError_l:
'등록된 리스트 중에 이름의 첫 글자가 숫자인 리스트가 있으면 모드 변환을 할 수 없습니다.',
- textcoding_bookedError_1l: '등록된 리스트 중에 리스트 이름이',
+ textcoding_bookedError_1l: '등록된 리스트 중에 리스트 이름이 ',
textcoding_bookedError_2l: '인 리스트가 있으면 모드 변환을 할 수 없습니다.',
textcoding_specialCharError_l:
"등록된 리스트 중 이름에 '_' 를 제외한 특수 문자가 있으면 모드 변환을 할 수 없습니다.",
@@ -2510,7 +2544,7 @@ Lang.Menus = {
find_out_now: '지금 바로 확인하세요!',
offline_hw_program: '오프라인 & 하드웨어 연결 프로그램',
read_more: '자세히 보기',
- sample_project: '예시 작품',
+ sample_project: '예시 작품 확인하기',
not_supported_function: '이 기기에서는 지원하지 않는 기능입니다.',
offline_download_confirm:
'엔트리 오프라인 버전은 PC에서만 이용가능합니다. 다운로드 하시겠습니까?',
@@ -2550,22 +2584,22 @@ Lang.Menus = {
cannot_invite_you: '자기 자신을 초대할 수 없습니다.',
apply_original_image: '원본 이미지 그대로 적용하기',
draw_new_ques: '새로 그리기 페이지로\n이동하시겠습니까?',
- draw_new_ques_1: '그림을 그려 오브젝트로 저장할 수 있습니다.',
- draw_new_ques_2: '그리기 화면으로 이동하시겠습니까?',
- draw_new_go: '이동하기',
+ draw_new_ques_1: '그림을 직접 그려서 추가할 수 있습니다.',
+ draw_new_ques_2: '그리기 화면으로 이동할까요?',
+ draw_new_go: '이동',
draw_new_stay: '이동하지 않기',
file_upload_warn_title_image:
'아래와 같은 그림은 이용약관 및 관련 법률에 의해 제재를 받으실 수 있습니다.',
file_upload_warn_desc_image:
- '폭력적이고 잔인한 그림 선정적인 신체노출 그림 불쾌감을 주거나 혐오감을 일으키는 그림 무단 사용이 금지된 저작권의 그림',
+ '폭력적이고 잔인한 그림, 선정적인 신체노출 그림, 불쾌감을 주거나 혐오감을 일으키는 그림, 무단 사용이 금지된 저작권의 그림',
file_upload_warn_title_sound:
'아래와 같은 소리는 이용약관 및 관련 법률에 의해 제재를 받을 수 있습니다.',
file_upload_warn_desc_sound:
- '폭력적이고 잔인한 소리 선정적인 내용의 소리 불쾌감을 주거나 혐오감을 일으키는 소리 무단 사용이 금지된 저작권의 소리',
+ '폭력적이고 잔인한 소리, 선정적인 내용의 소리, 불쾌감을 주거나 혐오감을 일으키는 소리, 무단 사용이 금지된 저작권의 소리',
file_upload_warn_title_table:
- '아래와 같은 데이터는 이용약관 및 관련 법률에 의해 제재를 받으실 수 있습니다.',
+ '아래와 같은 데이터는 이용약관 및 관련 법률에 의해 제재를 받을 수 있습니다.',
file_upload_warn_desc_table:
- '폭력적이고 잔인한 내용의 데이터 선정적인 내용의 데이터 불쾌감을 주거나 혐오단어가 포함된 데이터 무단 사용이 금지된 저작권의 데이터',
+ '폭력적이고 잔인한 데이터, 선정적인 내용의 데이터, 불쾌감을 주거나 혐오단어가 포함된 데이터, 본인 또는 타인의 개인정보를 침해할 수 있는 내용의 데이터, 무단 사용이 금지된 저작권의 데이터',
file_upload_warn_link: '저작권에 대해 알아보기',
file_upload_desc_1: '이런 그림은 \n 안돼요!',
file_upload_desc_2: '폭력적이고 잔인한 그림',
@@ -2577,13 +2611,13 @@ Lang.Menus = {
sprite_upload_warn_old:
'10MB 이하의 jpg, png, bmp 이미지 또는 eo 형식의 오브젝트를 추가할 수 있습니다.',
picture_upload_warn_1:
- '10MB 이하의 jpg, png, bmp, svg 형식의 파일을 추가할 수 있습니다.\njpg, png, bmp 형식은 비트맵 모드, svg 형식은 벡터 모드로 편집됩니다.',
+ '5MB 이하의 jpg, png, bmp, svg 형식의 파일을 추가할 수 있습니다.\njpg, png, bmp 형식은 비트맵 모드, svg 형식은 벡터 모드로 편집됩니다.',
table_upload_warn_1:
- '10MB 이하의 csv, xls(x) 형식의 파일을 추가할 수 있습니다. xls(x) 형식의 경우, 함수 문장이 그대로 출력됩니다.',
+ '10MB 이하의 CSV, XLS(X) 형식의 파일을 추가할 수 있습니다. 엑셀 파일의 경우, 함수 문장이 그대로 출력됩니다.',
sprite_upload_warn:
- '10MB 이하의 jpg, png, bmp, svg 이미지 또는 eo 형식의 오브젝트를 추가할 수 있습니다.',
+ '5MB 이하의 jpg, png, bmp, svg 이미지 또는 eo 형식의 오브젝트를 추가할 수 있습니다.',
sound_upload_warn_1: '10MB 이하의 mp3 형식의 파일을 추가할 수 있습니다.',
- sound_edit_warn: '기다려 주세요! 새로운 소리 편집 기능을 연구 중입니다.',
+ sound_edit_warn: '기다려 주세요!\n새로운 소리 편집 기능을 연구 중입니다.',
file_upload_loading: '로딩중',
lesson_by_teacher: '선생님들이 직접 만드는 강의입니다.',
delete_group_art: '학급 공유하기 목록에서 삭제 하시겠습니까?',
@@ -3707,7 +3741,7 @@ Lang.Menus = {
close_project: '비공개',
category_media_art: '미디어 아트',
go_further: '더 나아가기',
- marked_project: '관심 작품',
+ marked_project: '북마크 작품',
marked_group_project: '학급 관심 작품',
basic: '기본',
application: '응용',
@@ -5090,12 +5124,30 @@ Lang.Menus = {
choseok_mission_statement_top5: '미션 5 : 자유롭게 만들어보기',
advisory_title: '엔트리 자문단',
advisory_sub_title: '엔트리를 함께 만들어가는 선생님 학생 자문단입니다.',
- data_table_column: '열',
+ data_table_column: '속성',
data_table_row: '행',
data_table_provider: '출처',
data_table_modifidate: '수정일',
draw_new_table_ques_1: '데이터를 직접 입력하여 테이블로 저장할 수 있습니다.',
draw_new_table_ques_2: '테이블 화면으로 이동하시겠습니까?',
+ file_upload: '파일 올리기',
+ no_marked_project1: '북마크한 작품이 없습니다.',
+ no_marked_project2: '친구들의 작품을 북마크로 저장해 보세요!',
+ temp_save_project_study: '임시 저장',
+ file_upload_table_title: '테이블 새로 만들기',
+ file_upload_table_sub_title: '데이터를 직접 입력해 나만의 테이블을 만들 수 있어요.',
+ file_upload_warn_desc_table_1:
+ '폭력적이고 잔인한 데이터, 선정적인 내용의 데이터, 불쾌감을 주거나 혐오단어가 포함된 데이터,',
+ file_upload_warn_desc_table_2:
+ '본인 또는 타인의 개인정보를 침해할 수 있는 내용의 데이터, 무단 사용이 금지된 저작권의 데이터 ',
+ table_drag_upload_title: '파일을 끌어다 놓거나 클릭해서 업로드',
+ table_drag_upload_desc: 'CSV, XLS(X) 파일을 여기에 끌어다 놓거나 클릭해서 업로드 할 수 있어요.',
+ upload_select_file: '파일 선택',
+ file_upload_add: '추가',
+ file_upload_max_size_image: '5MB 이하만 업로드가 가능합니다.',
+ lecture_quiz_popup_title: '확인 문제 정답 확인',
+ realtime: '실시간',
+ cloud: '공유',
};
Lang.Msgs = {
video_model_load_success: '로딩 완료',
@@ -5241,7 +5293,7 @@ Lang.Msgs = {
expansion_behaviorConductLifeSafety_description:
'생활 속 안전을 위해 국민이 지켜야 하는 행동요령에 대한 블록 모음입니다. [국민안전처 제공]',
ai_utilize_tts_description:
- 'nVoice 음성합성 기술로 다양한 목소리로 문장을 읽는 블록모음 입니다. ',
+ 'nVoice 음성합성 기술로 다양한 목소리로 문장을 읽는 블록모음 입니다. (한국어 엔진 지원)',
hardware_need_update_title: '업데이트 안내',
hardware_need_update_content:
'보안 업데이트로 인해 하드웨어 연결 프로그램은\n1.9.51 버전 이상만 사용할 수 있습니다.\n더 낮은 버전이라면 최신 버전을 다운로드 받아 주세요.',
@@ -5328,7 +5380,7 @@ Lang.Workspace = {
SaveWithPicture: '저장되지 않은 그림이 있습니다. 저장하시겠습니까?',
RecursiveCallWarningTitle: '함수 호출 제한',
RecursiveCallWarningContent:
- '한 번에 너무 많은 함수가 호출되었습니다. 함수의 호출 횟수를 줄여주세요.',
+ '함수를 한 번에 너무 많이 호출합니다. 함수의 호출 횟수를 줄여 주세요.',
SelectShape: '이동',
SelectCut: '자르기',
Pencil: '펜',
@@ -5353,21 +5405,21 @@ Lang.Workspace = {
cannot_add_picture: '실행중에는 모양을 추가할 수 없습니다.',
cannot_add_sound: '실행중에는 소리를 추가할 수 없습니다.',
cannot_add_expansion_block: '실행중에는 확장 블럭을 추가할 수 없습니다.',
- add_object_before_edit: '모양 편집을 위해 오브젝트를 추가해주세요.',
+ add_object_before_edit: '모양 편집을 위해\n오브젝트를 추가해주세요.',
add_table_before_edit: '테이블을 추가해주세요.',
- cannot_edit_click_to_stop: '실행 중에는 수정할 수 없습니다. 클릭하여 정지하기.',
- cannot_open_private_project: '비공개 작품은 불러올 수 없습니다. 홈으로 이동합니다.',
+ cannot_edit_click_to_stop: '실행 중에는 수정할 수 없습니다.\n클릭하여 정지하기.',
+ cannot_open_private_project:
+ "비공개 작품은 코드를 볼 수 없습니다. '확인'을 누르면 이전 화면으로 이동합니다.",
cannot_save_running_project: '실행 중에는 저장할 수 없습니다.',
character_gen: '캐릭터 만들기',
check_runtime_error: '빨간색으로 표시된 블록을 확인해 주세요.',
- check_browser_error:
- '현재 브라우저(IE / Safari) 또는 운영체제(iOS)에서 지원하지 않는 블록입니다.',
+ check_browser_error: '현재 브라우저에서 지원하지 않는 동작입니다.',
check_browser_error_video: '현재 브라우저(IE) 또는 운영체제(iOS)에서 지원하지 않는 블록입니다.',
- check_microphone_error: '컴퓨터에 마이크가 연결되어있지 않습니다',
+ check_microphone_error: '마이크가 연결되어 있는지 확인해주세요',
check_webcam_error: '컴퓨터에 카메라가 연결되어있지 않습니다',
context_download: 'PC에 저장',
- context_duplicate: '복제',
- context_remove: '삭제',
+ context_duplicate: '복제하기',
+ context_remove: '삭제하기',
context_rename: '이름 수정',
coordinate: '좌표',
create_function: '함수 만들기',
@@ -5417,7 +5469,8 @@ Lang.Workspace = {
message_add_fail_msg: '같은 이름의 신호가 이미 존재합니다.',
message_add_ok: '신호 추가 완료',
message_add_ok_msg: '을(를) 추가하였습니다.',
- message_create: '신호 추가하기',
+ message_create: '신호 만들기',
+ message_add: '신호 추가하기',
message_create_placeholder: '신호의 이름을 입력해주세요.',
message_dup: '같은 이름의 신호가 이미 존재합니다.',
message_remove: '신호 삭제',
@@ -5428,7 +5481,7 @@ Lang.Workspace = {
message_too_long: '신호의 이름을 10자 이내로 작성해 주세요.',
message_too_long_to_change: '신호의 이름을 10자 이내로 변경해 주세요.',
no_message_to_remove: '삭제할 신호가 없습니다',
- no_use: '사용되지 않음',
+ no_use: '아직 오브젝트에 조립되지 않았어요.',
no_variable_to_remove: '삭제할 변수가 없습니다.',
no_variable_to_rename: '변경할 변수가 없습니다.',
object_not_found: '블록에서 지정한 오브젝트가 존재하지 않습니다.',
@@ -5461,12 +5514,14 @@ Lang.Workspace = {
load_hardware_lite_block: '연결할 하드웨어 선택하기',
load_ai_utilize_train_block: '인공지능 모델 학습하기',
select_expansion_block: '확장블록 선택',
- deselect_expansion_block_warning: '확장블록이 사용중이므로 삭제할 수 없습니다.',
- deselect_ai_utilize_block_warning: 'AI블록이 사용중이므로 삭제할 수 없습니다.',
+ deselect_expansion_block_warning:
+ '확장 블록이 작품에 조립되어 있어 불러오기를 해제할 수 없습니다.',
+ deselect_ai_utilize_block_warning:
+ '인공지능 블록이 작품에 조립되어 있어 불러오기를 해제할 수 없습니다.',
confirm_firmware_hwlite_block_msg:
- '%1를 엔트리에 연결하려면 먼저 하드웨어 펌웨어를 설치해야 합니다.',
- confirm_firmware_hwlite_block_title: '펌웨어 설치 필요',
- confirm_firmware_hwlite_block_download: '펌웨어 다운로드',
+ '%1 을(를)\n 엔트리에서 사용하려면\n 먼저 펌웨어를 설치해야 합니다.',
+ confirm_firmware_hwlite_block_title: '펌웨어 설치 확인',
+ confirm_firmware_hwlite_block_download: '펌웨어 설치',
confirm_firmware_hwlite_block_pass: '이미 설치함',
select_hwlite_block_duplicated: '1개의 하드웨어만 선택해 주세요.',
select_hwlite_block_none: '연결할 하드웨어를 선택해 주세요.',
@@ -5518,9 +5573,9 @@ Lang.Workspace = {
variable_rename_ok: '변수의 이름이 성공적으로 변경되었습니다.',
variable_select: '변수를 선택하세요',
variable_too_long: '변수의 이름은 10자를 넘을 수 없습니다.',
- open_analizy_data_import: '데이터 화면 열기',
+ open_analizy_data_import: '테이블 불러오기',
vehicle: '탈것',
- add_object_alert_msg: '오브젝트를 추가해주세요',
+ add_object_alert_msg: '오브젝트가 하나도 없습니다. 오브젝트를 추가하고 시도해 주세요.',
add_object_alert: '경고',
create_variable_block: '변수 만들기',
create_list_block: '리스트 만들기',
@@ -5541,7 +5596,7 @@ Lang.Workspace = {
draw_new_ebs: '직접 그리기',
painter_file: '파일 ▼',
painter_file_save: '저장하기',
- painter_file_saveas: '새 모양으로 저장',
+ painter_file_saveas: '새 모양으로 저장하기',
new_picture: '새그림',
painter_edit: '편집 ▼',
get_file: '가져오기',
@@ -5590,8 +5645,7 @@ Lang.Workspace = {
Scene_add_error: '장면은 최대 20개까지 추가 가능합니다.',
replica_of_object: '의 복제본',
will_you_delete_scene: '장면은 한번 삭제하면 취소가 불가능 합니다. \n정말 삭제 하시겠습니까?',
- will_you_delete_function:
- '함수는 한번 삭제하면 취소가 불가능 합니다. \n정말 삭제 하시겠습니까?',
+ will_you_delete_function: '함수는 한번 삭제하면 취소가 불가능 합니다.\n정말 삭제 하시겠습니까?',
duplicate_scene: '복제하기',
block_explain: '블록 설명 ',
block_intro: '블록을 클릭하면 블록에 대한 설명이 나타납니다.',
@@ -5616,9 +5670,9 @@ Lang.Workspace = {
confirm_load_header: '작품 복구',
uploading_msg: '업로드 중입니다',
file_size_exceeded: ' 변수 또는 리스트의 값이 너무 많아 작품을 불러올 수 없어요.',
- upload_fail_msg: '업로드에 실패하였습니다.다시 한번 시도해주세요.',
+ upload_fail_msg: '업로드에 실패하였습니다. \n 다시 한번 시도해주세요.',
upload_not_supported_msg: '지원하지 않는 형식입니다.',
- upload_not_supported_file_msg: '지원하지 않는 형식의 파일입니다.',
+ upload_not_supported_file_msg: '업로드 할 수 없는 파일 형식입니다.',
file_converting_msg: '파일 변환 중입니다.',
file_converting_fail_msg: '파일 변환에 실패하였습니다.',
fail_contact_msg: '문제가 계속된다면entry@connect.or.kr 로 문의해주세요.',
@@ -5657,7 +5711,7 @@ Lang.Workspace = {
practical_course_tooltip: '모든 기능을 이용하기 위해서는 기본형을 선택해 주세요.',
name_already_exists: '이름이 중복 되었습니다.',
enter_the_name: '이름을 입력하여 주세요.',
- object_not_exist_error: '오브젝트가 존재하지 않습니다. 오브젝트를 추가한 후 시도해주세요.',
+ object_not_exist_error: '오브젝트가 하나도 없습니다. 오브젝트를 추가하고 시도해 주세요.',
project_length_error: '작품/강의명은 띄어쓰기 포함 45자까지 입력할 수 있습니다.',
workspace_tutorial_popup_desc:
"작품 만들기는 창의적인 작품을 만들 수 있도록 다양한 블록과 기능을 제공합니다.",
@@ -5726,6 +5780,22 @@ Lang.Workspace = {
sound_volume: '크기',
sound_speed: '빠르기',
sound_pitch: '음높이',
+ function_attribute: '함수 속성 보기',
+ variable_default_value: '변수 기본값',
+ list_default_value: '리스트 기본값',
+ func_property: '함수 속성',
+ bring_forward: '위로 옮기기',
+ send_backward: '아래로 옮기기',
+ upload_error_msg:
+ "이용 정책을 위반하는 이미지로 의심되어\n업로드 할 수 없습니다.\n문제가 없다고 생각하시는 경우\n'문의하기'를 통해 이미지를 전달해 주세요.",
+ upload_error_msg_contain_image:
+ '이용 정책을 위반하는 것으로 의심되는\n이미지가 포함되어 업로드 할 수 없습니다.',
+ upload_error_msg_exclude_image: '위 이미지를 제외하고 다시 시도해 주세요.',
+ select_flash_firmware_hwlite_title: '설치할 펌웨어 선택',
+ select_flash_firmware_hwlite_content:
+ '연결하려는 마이크로비트의\n 버전을 선택해 주세요.\n 펌웨어 설치가 완료되면 메시지가 표시됩니다.',
+ flash_firmware_success: '펌웨어 설치가 완료되었습니다.',
+ flash_firmware_failed: '펌웨어 설치에 실패했습니다. 다시 시도해 주세요.',
};
Lang.code = '코드보기';
Lang.EntryStatic = {
@@ -5882,6 +5952,12 @@ Lang.EntryStatic = {
discuss_period_week: '최근 1주일',
discuss_period_month: '최근 1개월',
discuss_period_three_month: '최근 3개월',
+ art_category_living: '생활과 도구',
+ art_category_storytelling: '스토리텔링',
+ art_category_arts: '예술',
+ art_category_knowledge: '지식 공유',
+ art_period_today: '오늘',
+ art_period_quarter: '최근 3개월',
};
Lang.Helper = {
when_run_button_click: '시작하기 버튼을 클릭하면 아래에 연결된 블록들을 실행합니다.',
@@ -5902,7 +5978,8 @@ Lang.Helper = {
repeat_inf: '감싸고 있는 블록들을 계속해서 반복 실행합니다.',
repeat_while_true:
'판단값에 따라 블록의 반복여부를 결정합니다.\n이 될 때까지: 판단이 참이 될 때까지 감싸고 있는 블록들을 반복 실행합니다.\n인 동안: 판단이 참인 동안 감싸고 있는 블록들을 반복 실행합니다.',
- stop_repeat: '이 블록을 감싸는 가장 가까운 반복 블록의 반복을 중단합니다.',
+ stop_repeat:
+ "이 블록을 감싸는 가장 가까운 블록을 멈춥니다.\n'반복하기'블록과 같이 ㄷ자 모양으로 다른 블록을 감싼 블록에 조립해 사용할 수 있습니다.",
_if: '만일 판단이 참이라면, 감싸고 있는 블록들을 실행합니다.',
if_else:
'만일 판단이 참이라면 첫 번째 감싸고 있는 블록들을 실행하고, 거짓이면 두 번째 감싸고 있는 블록들을 실행합니다.',
@@ -5927,8 +6004,7 @@ Lang.Helper = {
locate_xy: '오브젝트가 입력한 x와 y 좌표로 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
locate_xy_time:
'오브젝트가 입력한 시간에 걸쳐 입력한 x와 y 좌표로 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
- locate:
- '오브젝트가 선택한 오브젝트 또는 마우스 포인터의 위치로 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
+ locate: '오브젝트가 선택한 오브젝트 또는 마우스 포인터의 위치로 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
rotate_absolute: '오브젝트의 방향을 입력한 각도로 정합니다.',
rotate_by_time:
'오브젝트의 방향이 입력한 시간에 걸쳐 입력한 각도만큼 시계방향으로 회전합니다. (오브젝트의 중심점을 기준으로 회전합니다.)',
@@ -5947,7 +6023,7 @@ Lang.Helper = {
dialog_time:
'오브젝트가 입력한 내용을 입력한 시간 동안 말풍선으로 말한 후 다음 블록을 실행합니다.',
dialog: '오브젝트가 입력한 내용을 말풍선으로 말하는 동시에 다음 블록을 실행합니다.',
- remove_dialog: '오브젝트가 말하고 있는 말풍선을 지웁니다.',
+ remove_dialog: '오브젝트가 말하고 생각하고 있는 말풍선을 지웁니다.',
change_to_some_shape:
'오브젝트를 선택한 모양으로 바꿉니다. (내부 블록을 분리하고 모양의 번호를 입력하여 모양을 바꿀 수 있습니다.)',
change_to_next_shape: '오브젝트의 모양을 이전 또는 다음 모양으로 바꿉니다.',
@@ -5994,7 +6070,7 @@ Lang.Helper = {
'오브젝트가 선택한 소리를 입력한 시간 만큼 재생하는 동시에 다음 블록을 실행합니다.',
sound_something_wait_with_block: '오브젝트가 선택한 소리를 재생한 후 다음 블록을 실행합니다.',
sound_something_second_wait_with_block:
- '오브젝트가 선택한 소리를 입력한 시간 만큼 재생한 후 다음 블록을 실행합니다.',
+ '오브젝트가 선택한 소리를 입력한 시간만큼 재생한 후 다음 블록을 실행합니다.',
sound_volume_change: '작품에서 재생하는 모든 소리의 크기를 입력한 값만큼 바꿉니다.',
sound_volume_set: '작품에서 재생하는 모든 소리의 크기를 입력한 값(%)으로 정합니다.',
get_sound_speed: '작품에 설정된 소리의 빠르기 값입니다.',
@@ -6007,7 +6083,7 @@ Lang.Helper = {
is_object_clicked: '오브젝트를 클릭한 경우 ‘참’으로 판단합니다.',
is_press_some_key: '선택한 키가 눌려져 있는 경우 ‘참’으로 판단합니다.',
reach_something: '해당 오브젝트가 선택한 항목과 닿은 경우 ‘참’으로 판단합니다.',
- is_type: '입력한 값이 숫자라면 ‘참’으로 판단합니다.',
+ is_type: '입력한 값이 선택한 문자로 이루어져 있다면 ‘참’으로 판단합니다.',
is_included_in_list:
"선택한 리스트가 입력한 값을 가진 항목을 포함하는 경우 '참'으로 판단합니다.",
boolean_basic_operator:
@@ -6040,10 +6116,12 @@ Lang.Helper = {
calc_mod: '앞 수에서 뒤 수를 나누어 생긴 나머지를 의미합니다.',
calc_operation:
'입력한 수에 대한 다양한 수학식의 계산값입니다. (제곱, 루트, 사인값, 코사인값, 탄젠트값, 아크사인값, 아크코사인값, 아크탄젠트값, 로그값, 자연로그값, 소수점 부분, 소수점 버림값, 소수점 올림값, 소수점 반올림값, 펙토리얼값, 절대값)',
- get_date: '현재 연도, 월, 일, 요일, 시각과 같이 시간에 대한 값입니다.',
+ get_date:
+ '현재 날짜와 시각에 대한 값입니다.\n- 연도: 현재 연도를 반환합니다.\n- 월: 현재 월을 반환합니다.\n- 일: 현재 일을 반환합니다.\n- 요일: 현재 요일을 숫자로 반환합니다.\n일, 월, 화, 수, 목, 금, 토요일을 차례대로 0, 1, 2, 3, 4, 5, 6으로 반환합니다.\n- 시각: 현재 시각을 각각 시, 분, 초로 반환합니다.',
distance_something: '해당 오브젝트와 선택한 오브젝트 또는 마우스 포인터 간의 거릿값입니다.',
get_sound_duration: '선택한 소리의 길이(초) 값입니다.',
- get_user_name: '작품을 실행하고 있는 사용자의 아이디 값입니다.',
+ get_user_name:
+ '작품을 실행하고 있는 사용자의 아이디 값입니다.\n값은 개인정보 보호를 위해 마스킹 처리되어 있습니다.',
get_nickname: '작품을 실행하고 있는 사용자의 닉네임 값입니다.',
get_project_timer_value: '이 블록이 실행되는 순간 초시계에 저장된 값입니다.',
choose_project_timer_action:
@@ -6133,11 +6211,11 @@ Lang.Helper = {
direction_relative_duration:
'오브젝트의 이동 방향이 입력한 시간에 걸쳐 입력한 각도만큼 시계방향으로 회전합니다. (오브젝트의 중심점을 기준으로 회전합니다.)',
get_sound_volume: '작품에 설정된 소리의 크기 값입니다.',
- sound_from_to: '오브젝트가 선택한 소리를 입력한 구간을 재생하는 동시에 다음 블록을 실행합니다.',
+ sound_from_to: '오브젝트가 선택한 소리의 입력한 구간을 재생하는 동시에 다음 블록을 실행합니다.',
sound_from_to_and_wait:
- '오브젝트가 선택한 소리를 입력한 구간을 재생한 후 다음 블록을 실행합니다.',
+ '오브젝트가 선택한 소리의 입력한 구간을 재생한 후 다음 블록을 실행합니다.',
Block_info: '블록 설명',
- Block_click_msg: '블록을 클릭하면 블록에 대한 설명이 나타납니다.',
+ Block_click_msg: '블록을 클릭하면\n블록에 대한 설명이 나타납니다.',
hamster_beep: '버저 소리를 짧게 냅니다.',
hamster_change_both_wheels_by:
'왼쪽과 오른쪽 바퀴의 현재 속도 값(%)에 입력한 값을 각각 더합니다. 더한 결과가 양수 값이면 바퀴가 앞으로 회전하고, 음수 값이면 뒤로 회전합니다.',
@@ -6380,17 +6458,17 @@ Lang.Helper = {
chocopi_touch_value:
'터치패드에 연결된 물체의 전기용량이 커지면 값이 작아집니다. 여러 명이 손잡고 만지면 더 작은 값이 됩니다. 전기용량이란 물체에 전기를 띈 입자를 얼마나 가지고 있을 수 있는 지를 말합니다.
포트번호는 맞추지 않아도 됩니다. 단, 같은 종류의 모듈을 여러 개 연결하는 경우에만 포트를 지정하면 됩니다.',
boolean_and_or:
- '그리고 : 두 판단이 모두 참인 경우 ‘참’으로 판단합니다. 또는 : 두 판단 중 하나라도 참이 있는 경우 ‘참’으로 판단합니다.',
+ '그리고 : 두 판단이 모두 참인 경우 ‘참’으로 판단합니다.\n또는 : 두 판단 중 하나라도 참이 있는 경우 ‘참’으로 판단합니다.',
check_weather:
- ' 선택한 날짜와 지역의 날씨 정보를 실제 날씨 상태와 비교하여 일치하는 경우 ‘참’으로 판단합니다. * 옵션 날짜: 어제, 오늘, 내일, 모레, 3일 후, 4일 후, 5일 후, 6일 후 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북 날씨: 맑음, 구름조금, 구름많음, 흐림, 비, 진눈깨비, 눈',
+ '\n선택한 날짜와 지역의 날씨 정보를 실제 날씨 상태와 비교하여 일치하는 경우 ‘참’으로 판단합니다.\n * 옵션\n 날짜: 어제, 오늘, 내일, 모레, 3일 후, 4일 후, 5일 후, 6일 후\n 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북\n 날씨: 맑음, 구름조금, 구름많음, 흐림, 비, 진눈깨비, 눈',
check_finedust:
- ' 선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다. * 옵션 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북 미세먼지 등급: 좋음, 보통, 나쁨, 매우나쁨',
+ '\n선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.\n * 옵션\n 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북\n 미세먼지 등급: 좋음, 보통, 나쁨, 매우나쁨',
get_weather_data:
- ' 선택한 날짜와 지역의 각종 날씨 정보값(최저기온, 최고기온, 습도, 강수량, 강수확률, 풍속)입니다. * 옵션 날짜: 어제, 오늘, 내일, 모레, 3일 후, 4일 후, 5일 후, 6일 후 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북 정보: 최저기온(℃), 최고기온(℃), 습도(%), 강수량(mm), 강수확률(%), 풍속(m/s)',
+ '\n선택한 날짜와 지역의 각종 날씨 정보값(최저기온, 최고기온, 습도, 강수량, 강수확률, 풍속)입니다.\n * 옵션\n 날짜: 어제, 오늘, 내일, 모레, 3일 후, 4일 후, 5일 후, 6일 후\n 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북\n 정보: 최저기온(℃), 최고기온(℃), 습도(%), 강수량(mm), 강수확률(%), 풍속(m/s)',
get_current_weather_data:
- ' 현재 선택한 지역의 날씨 정보값(기온, 미세먼지농도)입니다. * 옵션 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북 정보: (기온(℃)), 미세먼지농도(㎍)',
+ '\n현재 선택한 지역의 날씨 정보값(기온, 미세먼지농도)입니다.\n * 옵션\n 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북\n 정보: (기온(℃)), 미세먼지농도(㎍)',
get_today_temperature:
- ' 오늘 선택한 지역과 시간대의 기온을 의미합니다. * 옵션 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북 시간대: 00, 03, 06, 09, 12, 15, 18, 21',
+ '\n오늘 선택한 지역과 시간대의 기온을 의미합니다.\n * 옵션\n 지역: 서울, 강원, 경기, 경남, 경북, 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북\n 시간대: 00, 03, 06, 09, 12, 15, 18, 21',
check_city_weather:
'선택한 날짜와 지역의 날씨 정보를 실제 날씨 상태와 비교하여 일치하는 경우 ‘참’으로 판단합니다.\n* 옵션\n날짜: 어제, 오늘, 내일, 모레, 3일 후, 4일 후, 5일 후, 6일 후\n시도: 서울, 강원, 경기, 경남, 경북 광주, 대구, 대전, 부산, 세종, 울산, 인천, 전남, 전북, 제주, 충남, 충북 \n시군구: 시도별로 다름\n날씨: 맑음, 구름조금, 구름많음, 흐림, 비, 진눈깨비, 눈',
check_city_finedust:
@@ -6409,15 +6487,15 @@ Lang.Helper = {
'입력한 문자값을 선택한 언어로 번역합니다. 입력은 3000자까지 가능합니다.\n*번역 가능한 언어 \n - 한국어 → 영어, 중국어 간체, 중국어 번체, 베트남어, 스페인어, 인도네시아어, 태국어, 프랑스어\n - 영어 → 일본어, 프랑스어, 한국어\n - 중국어 간체, 중국어 번체, 베트남어, 스페인어, 인도네시아어, 태국어, 프랑스어 → 한국어\n - 일본어 →영어 \n - 프랑스어 → 영어',
check_language: '입력된 문자값의 언어를 감지합니다. 입력은 문장 형태로 3000자까지 가능합니다.',
count_disaster_behavior:
- '선택한 자연재해가 발생했을 때 해야할 행동요령의 수입니다. *옵션 자연재해: 태풍, 홍수, 호우, 강풍, 대설, 한파, 풍랑, 황사, 폭염, 가뭄, 지진, 해일, 산사태 상황: 자연재해에 따라 다름 ',
+ '선택한 자연재해가 발생했을 때 해야할 행동요령의 수입니다.\n *옵션\n 자연재해: 태풍, 홍수, 호우, 강풍, 대설, 한파, 풍랑, 황사, 폭염, 가뭄, 지진, 해일, 산사태\n 상황: 자연재해에 따라 다름 ',
get_disaster_behavior:
- '선택한 자연재해가 발생했을 때 해야하는 행동요령에 대한 정보입니다. *옵션 자연재해: 태풍, 홍수, 호우, 강풍, 대설, 한파, 풍랑, 황사, 폭염, 가뭄, 지진, 해일, 산사태 상황: 자연재해에 따라 다름',
+ '선택한 자연재해가 발생했을 때 해야하는 행동요령에 대한 정보입니다.\n *옵션\n 자연재해: 태풍, 홍수, 호우, 강풍, 대설, 한파, 풍랑, 황사, 폭염, 가뭄, 지진, 해일, 산사태\n 상황: 자연재해에 따라 다름',
count_lifeSafety_behavior:
- '선택한 생활 속 문제가 발생했을 때 해야할 행동요령의 수입니다. *옵션 생활 속 문제: 응급처치, 심폐소생술, 소화기·소화전 사용법, 식중독, 산행안전, 실종유괴, 성폭력, 학교폭력, 가정 폭력, 억류 및 납치, 교통사고, 승강기 안전사고, 미세먼지 상황: 생활 속 문제에 따라 다름 ',
+ '선택한 생활 속 문제가 발생했을 때 해야할 행동요령의 수입니다.\n *옵션\n 생활 속 문제: 응급처치, 심폐소생술, 소화기·소화전 사용법, 식중독, 산행안전, 실종유괴, 성폭력, 학교폭력, 가정 폭력, 억류 및 납치, 교통사고, 승강기 안전사고, 미세먼지\n 상황: 생활 속 문제에 따라 다름 ',
get_lifeSafety_behavior:
- '선택한 생활 속 문제가 발생했을 때 해야할 행동요령에 대한 정보입니다. *옵션 생활 속 문제: 응급처치, 심폐소생술, 소화기·소화전 사용법, 식중독, 산행안전, 실종유괴, 성폭력, 학교폭력, 가정 폭력, 억류 및 납치, 교통사고, 승강기 안전사고, 미세먼지 상황: 생활 속 문제에 따라 다름 ',
+ '선택한 생활 속 문제가 발생했을 때 해야할 행동요령에 대한 정보입니다.\n *옵션\n 생활 속 문제: 응급처치, 심폐소생술, 소화기·소화전 사용법, 식중독, 산행안전, 실종유괴, 성폭력, 학교폭력, 가정 폭력, 억류 및 납치, 교통사고, 승강기 안전사고, 미세먼지\n 상황: 생활 속 문제에 따라 다름 ',
read_text:
- '입력한 문자값을 설정된 목소리로 읽습니다. 입력은 2500자까지 가능합니다. 인터넷에 연결되어 있지 않거나 인터넷 환경이 불안할 경우, 해당 블록이 실행되지 않고 다음 블록으로 넘어갈 수 있습니다.',
+ '입력한 문자값을 설정된 목소리로 읽습니다.\n입력은 2500자까지 가능합니다.\n인터넷에 연결되어 있지 않거나 인터넷 환경이 불안할 경우, 해당 블록이 실행되지 않고 다음 블록으로 넘어갈 수 있습니다.',
set_tts_property: '선택한 목소리가 선택한 속도와 선택한 음높이로 설정됩니다.',
read_text_wait_with_block: '입력한 문자값을 읽어준 후 다음 블록을 실행합니다.',
check_microphone: "컴퓨터에 마이크가 연결되어 있는 경우 '참'으로 판단합니다.",
@@ -6485,12 +6563,12 @@ Lang.Helper = {
'입력한 데이터와 학습한 모델의 군집을 2차원 좌표평면에 나타낸 차트 창을 열거나 닫습니다. ',
set_regression_option:
"모델의 학습 조건을 변경합니다. 변경한 학습 조건은 '모델 다시 학습하기' 블록으로 모델을 다시 학습할 때부터 적용됩니다.",
- get_regression_predict_1: '입력한 특성값으로 모델이 예측한 값을 반환합니다.',
- get_regression_predict_2: '입력한 특성값으로 모델이 예측한 값을 반환합니다.',
- get_regression_predict_3: '입력한 특성값으로 모델이 예측한 값을 반환합니다.',
- get_regression_predict_4: '입력한 특성값으로 모델이 예측한 값을 반환합니다.',
- get_regression_predict_5: '입력한 특성값으로 모델이 예측한 값을 반환합니다.',
- get_regression_predict_6: '입력한 특성값으로 모델이 예측한 값을 반환합니다.',
+ get_regression_predict_1: '입력한 핵심 속성으로 모델이 예측한 값을 반환합니다.',
+ get_regression_predict_2: '입력한 핵심 속성으로 모델이 예측한 값을 반환합니다.',
+ get_regression_predict_3: '입력한 핵심 속성으로 모델이 예측한 값을 반환합니다.',
+ get_regression_predict_4: '입력한 핵심 속성으로 모델이 예측한 값을 반환합니다.',
+ get_regression_predict_5: '입력한 핵심 속성으로 모델이 예측한 값을 반환합니다.',
+ get_regression_predict_6: '입력한 핵심 속성으로 모델이 예측한 값을 반환합니다.',
get_regression_accuracy: '모델의 결정계수를 값으로 반환합니다.',
set_logistic_regression_option:
"모델의 학습 조건을 변경합니다. 변경한 학습 조건은 '모델 다시 학습하기' 블록으로 모델을 다시 학습할 때부터 적용됩니다.",
@@ -6542,19 +6620,19 @@ Lang.Helper = {
"군집의 최초 중심점 기준을 선택한 기준으로 바꿉니다. 변경한 중심점 기준은 '모델 다시 학습하기' 블록으로 모델을 다시 학습할 때부터 적용됩니다.",
get_cluster_centriod_count: '모델의 군집 개수를 값으로 반환합니다. ',
get_cluster_centriod_value:
- '지정한 군집의 중심점에 대한 특성값을 반환합니다. 특성이 여러 개인 경우, 목록 상자에서 특성을 선택할 수 있습니다.',
+ '지정한 군집의 중심점에 대한 핵심 속성을 반환합니다. 핵심 속성이 여러 개인 경우, 목록 상자에서 핵심 속성을 선택할 수 있습니다.',
get_cluster_centriod_index_1:
- '입력한 특성값이 모델이 묶은 군집 중에서 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
+ '입력한 핵심 속성이 모델이 묶은 군집 중에 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
get_cluster_centriod_index_2:
- '입력한 특성값이 모델이 묶은 군집 중에서 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
+ '입력한 핵심 속성이 모델이 묶은 군집 중에 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
get_cluster_centriod_index_3:
- '입력한 특성값이 모델이 묶은 군집 중에서 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
+ '입력한 핵심 속성이 모델이 묶은 군집 중에 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
get_cluster_centriod_index_4:
- '입력한 특성값이 모델이 묶은 군집 중에서 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
+ '입력한 핵심 속성이 모델이 묶은 군집 중에 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
get_cluster_centriod_index_5:
- '입력한 특성값이 모델이 묶은 군집 중에서 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
+ '입력한 핵심 속성이 모델이 묶은 군집 중에 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
get_cluster_centriod_index_6:
- '입력한 특성값이 모델이 묶은 군집 중에서 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
+ '입력한 핵심 속성이 모델이 묶은 군집 중에 어느 군집에 속하는지를 반환합니다. 값은 텍스트(군집 이름)로 표현됩니다.',
set_number_learning_option_k:
"이웃 개수를 입력한 값으로 바꾸어 설정합니다. 변경한 이웃 개수는 '모델 다시 학습하기' 블록으로 모델을 다시 학습할 때부터 적용됩니다.",
get_number_learning_predict_1:
@@ -6570,17 +6648,17 @@ Lang.Helper = {
get_number_learning_predict_6:
'입력한 데이터를 모델에서 분류한 값입니다. 값은 모델의 클래스 이름(텍스트)으로 표현됩니다.',
get_number_learning_predict_param_1:
- '입력한 데이터의 선택한 클래스에 대한 분류 정확도 값입니다. 값은 숫자로 표현됩니다.',
+ '입력한 데이터의 선택한 클래스에 대한 분류 신뢰도 값입니다. 값은 숫자로 표현됩니다.',
get_number_learning_predict_param_2:
- '입력한 데이터의 선택한 클래스에 대한 분류 정확도 값입니다. 값은 숫자로 표현됩니다.',
+ '입력한 데이터의 선택한 클래스에 대한 분류 신뢰도 값입니다. 값은 숫자로 표현됩니다.',
get_number_learning_predict_param_3:
- '입력한 데이터의 선택한 클래스에 대한 분류 정확도 값입니다. 값은 숫자로 표현됩니다.',
+ '입력한 데이터의 선택한 클래스에 대한 분류 신뢰도 값입니다. 값은 숫자로 표현됩니다.',
get_number_learning_predict_param_4:
- '입력한 데이터의 선택한 클래스에 대한 분류 정확도 값입니다. 값은 숫자로 표현됩니다.',
+ '입력한 데이터의 선택한 클래스에 대한 분류 신뢰도 값입니다. 값은 숫자로 표현됩니다.',
get_number_learning_predict_param_5:
- '입력한 데이터의 선택한 클래스에 대한 분류 정확도 값입니다. 값은 숫자로 표현됩니다.',
+ '입력한 데이터의 선택한 클래스에 대한 분류 신뢰도 값입니다. 값은 숫자로 표현됩니다.',
get_number_learning_predict_param_6:
- '입력한 데이터의 선택한 클래스에 대한 분류 정확도 값입니다. 값은 숫자로 표현됩니다.',
+ '입력한 데이터의 선택한 클래스에 대한 분류 신뢰도 값입니다. 값은 숫자로 표현됩니다.',
is_number_learning_group_1:
"입력한 데이터의 분류 결과가 선택한 클래스인 경우 '참'으로 판단합니다.",
is_number_learning_group_2:
@@ -6740,6 +6818,19 @@ Lang.Helper = {
get_which_hand: '입력한 순서의 손이 오른손인지, 왼손인지를 반환합니다.',
is_which_gesture: "입력한 순서의 손이 선택한 모양이라면 '참'으로 판단합니다.",
get_which_gesture: '입력한 순서의 손이 어떤 모양인지를 반환합니다.',
+ video_capture_for_image_test:
+ '카메라를 통해 촬영된 이미지 데이터를 학습한 모델로 분류하거나 중지합니다.',
+ train_param_kernel_polynomial: '',
+ train_param_kernel_rbf: '',
+ train_param_degree: '',
+ train_param_gamma: '',
+ target_project: '목표 작품 확인하기',
+ study_goal: '학습 목표 확인하기',
+ show_hint: '힌트보기',
+ save_current_table:
+ '테이블을 현재 상태로 남깁니다. 작품을 정지해도 테이블에서 변경된 내용이 유지됩니다.',
+ open_table: '선택한 테이블의 테이블 창을 엽니다.',
+ open_table_wait: '입력한 시간 동안 선택한 테이블의 테이블 창을 엽니다.',
};
Lang.Category = {
entrybot_friends: '엔트리봇 친구들',
@@ -6858,10 +6949,10 @@ Lang.Fonts = {
jeju_hallasan: '한라산체',
gothic_coding: '코딩고딕체',
batang: '바탕체',
- gothic: '나눔고딕체',
+ gothic: '나눔고딕',
myeongjo: '나눔명조',
pen_script: '나눔손글씨',
- square_round: '나눔스퀘어라운드체',
+ square_round: '나눔스퀘어라운드',
jalnan: '잘난체',
designhouse: '디자인하우스체',
malssami815: '말싸미815체',
@@ -6878,6 +6969,10 @@ Lang.Fonts = {
sd_shabang: '산돌 별이샤방샤방',
sd_woodcarving: '산돌 목각',
sd_yongbi: '산돌 용비어천가',
+ maruburi: '마루 부리',
+ nanumbarunpen: '나눔바른펜',
+ notosans: '본고딕',
+ d2coding: 'D2 Coding',
};
Lang.Hw = {
note: '음표',
@@ -6920,6 +7015,11 @@ Lang.Hw = {
port: '포트',
potentiometer: '포텐시오미터',
servo: '서보',
+ port_en: '',
+ right_en: '',
+ left_en: '',
+ up_en: '',
+ down_en: '',
};
Lang.template = {
albert_hand_found: '손 찾음?',
@@ -7141,7 +7241,7 @@ Lang.template = {
if_else: '만일 %1 (이)라면 %2 %3 아니면',
create_clone: '%1 의 복제본 만들기 %2',
delete_clone: '이 복제본 삭제하기 %1',
- when_clone_start: '%1 복제본이 처음 생성되었을때',
+ when_clone_start: '%1 복제본이 처음 생성되었을 때',
stop_run: '프로그램 끝내기 %1',
repeat_while_true: '%1 %2 반복하기 %3',
stop_object: '%1 코드 멈추기 %2',
@@ -7174,7 +7274,7 @@ Lang.template = {
get_current_city_weather_data: '현재 %1 %2 의 %3',
get_today_city_temperature: '오늘 %1 %2의 %3시 기온',
translate_title: '%1',
- get_translated_string: '%1 %2 을(를) %3로 번역한 값',
+ get_translated_string: '%1 %2 을(를) %3(으)로 번역한 값',
check_language: '%1의 언어',
festival_title: '%1',
count_festival: '%1 %2 행사의 수',
@@ -7193,11 +7293,11 @@ Lang.template = {
read_text_wait_with_block: '%1 읽어주고 기다리기 %2',
load_expansion_block: '확장 블록 불러오기',
load_ai_utilize_block: '인공지능 블록 불러오기',
- load_ai_utilize_train_block: '인공지능 모델 학습하기',
+ load_ai_utilize_train_block: '모델 학습',
expansion_block_descriptions: '확장 블록은 인터넷이 연결되어 있어야 정상적으로 동작합니다.',
aiUtilize_block_descriptions: '불러올 인공지능 블록을 선택해 주세요.',
hardware_lite_descriptions:
- '하드웨어 연결/작동 시 예기치 못한 문제가 발생할 수 있습니다. \r\n하드웨어 웹 연결 중 문제 발생 시 엔트리 고객센터 또는 해당 하드웨어 업체의 고객센터에 연락해 주세요.',
+ '하드웨어 연결/작동 시 예기치 못한 문제가 발생할 수 있습니다.\r\n 하드웨어 웹 연결 중 문제 발생 시 엔트리 고객센터 또는 해당 하드웨어 업체의 고객센터에 연락해 주세요.',
weather_title_text: '날씨',
translate_title_text: '번역',
festival_title_text: '행사',
@@ -7210,22 +7310,22 @@ Lang.template = {
learning_title_cluster: '%1',
learning_title_decisiontree: '%1',
learning_title_svm: '%1',
- insert_data_for_test: '학습한 모델로 인식하기 %1',
- insert_text_block_for_test: '%1 을(를) 학습한 모델로 인식하기 %2',
- test_result: '인식 결과',
- accuracy_of_result: '%1의 신뢰도',
- is_group: '인식 결과가 %1 인가?',
+ insert_data_for_test: '학습한 모델로 분류하기 %1',
+ insert_text_block_for_test: '%1 을(를) 학습한 모델로 분류하기 %2',
+ test_result: '분류 결과',
+ accuracy_of_result: '%1에 대한 신뢰도',
+ is_group: '분류 결과가 %1 인가?',
retrain_model: '모델 다시 학습하기 %1',
model_is_trained: '모델이 학습되었는가?',
set_train_visible: '모델 %1 %2',
set_train_chart: '모델 차트 창 %1 %2',
set_regression_option: '학습 조건 %1 을 %2 으로 바꾸기 %3',
- get_regression_predict_1: '%1 %2 의 예측값',
- get_regression_predict_2: '%1 %2 %3 %4 의 예측값',
- get_regression_predict_3: '%1 %2 %3 %4 %5 %6 의 예측값',
- get_regression_predict_4: '%1 %2 %3 %4 %5 %6 %7 %8 의 예측값',
- get_regression_predict_5: '%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 의 예측값',
- get_regression_predict_6: '%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 의 예측값',
+ get_regression_predict_1: '%1 %2 의 예측 값',
+ get_regression_predict_2: '%1 %2 %3 %4 의 예측 값',
+ get_regression_predict_3: '%1 %2 %3 %4 %5 %6 의 예측 값',
+ get_regression_predict_4: '%1 %2 %3 %4 %5 %6 %7 %8 의 예측 값',
+ get_regression_predict_5: '%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 의 예측 값',
+ get_regression_predict_6: '%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 의 예측 값',
get_regression_accuracy: '결정계수',
set_logistic_regression_option: '학습 조건 %1 을(를) %2 (으)로 바꾸기 %3',
set_logistic_regression_optimizer: '최적화 알고리즘을 %1 (으)로 바꾸기 %2',
@@ -7465,7 +7565,7 @@ Lang.template = {
hide: '모양 숨기기 %1',
dialog_time: '%1 을(를) %2 초 동안 %3 %4',
dialog: '%1 을(를) %2 %3',
- remove_dialog: '말하기 지우기 %1',
+ remove_dialog: '말풍선 지우기 %1',
change_to_nth_shape: '%1 모양으로 바꾸기 %2',
change_to_next_shape: '%1 모양으로 바꾸기 %2',
set_effect_volume: '%1 효과를 %2 만큼 주기 %3',
@@ -7589,6 +7689,7 @@ Lang.template = {
sound_something_second_wait_with_block: '소리 %1 %2 초 재생하고 기다리기 %3',
sound_from_to: '소리 %1 %2 초 부터 %3 초까지 재생하기 %4',
sound_from_to_and_wait: '소리 %1 %2 초 부터 %3 초까지 재생하고 기다리기 %4',
+ messageAddButton: '%1',
when_run_button_click: '%1 시작하기 버튼을 클릭했을 때',
press_some_key: '%1 %2 키를 눌렀을 때 %3',
when_some_key_pressed: '%1 %2 키를 눌렀을 때',
@@ -7602,20 +7703,20 @@ Lang.template = {
message_cast_wait: '%1 신호 보내고 기다리기 %2',
text: '%1',
text_read: '글상자 %1의 내용',
- text_write: '%1 라고 글쓰기 %2',
- text_append: '%1 라고 뒤에 이어쓰기 %2',
- text_prepend: '%1 라고 앞에 추가하기 %2',
+ text_write: '%1 (이)라고 글쓰기 %2',
+ text_append: '%1 을(를) 뒤에 추가하기 %2',
+ text_prepend: '%1 을(를) 앞에 추가하기 %2',
text_change_effect: '텍스트에 %1 효과 %2 %3',
- text_change_font: '글씨체를 %1 로 변경 %2',
- text_change_font_color: '글씨색을 %1 로 변경 %2',
- text_change_bg_color: '배경색을 %1 로 변경 %2',
+ text_change_font: '글씨체를 %1 (으)로 바꾸기 %2',
+ text_change_font_color: '글씨색을 %1 (으)로 바꾸기 %2',
+ text_change_bg_color: '배경색을 %1 (으)로 바꾸기 %2',
text_flush: '텍스트 모두 지우기 %1',
analizyDataAddButton: '%1',
append_row_to_table: '테이블 %1에 %2 추가하기 %3',
- insert_row_to_table: '테이블 %1 %2번째에 %3 추가하기 %4',
+ insert_row_to_table: '테이블 %1 %2 번째에 %3 추가하기 %4',
delete_row_from_table: '테이블 %1 %2번째 %3 삭제하기 %4',
set_value_from_table: '테이블 %1 %2번째 행의 %3을(를) %4(으)로 바꾸기 %5',
- get_table_count: '테이블 %1의 %2개수',
+ get_table_count: '테이블 %1의 %2 개수',
get_value_from_table: '테이블 %1 %2번째 행의 %3 값',
get_value_from_last_row: '테이블 %1 마지막 행의 %2 값',
calc_values_from_table: '테이블 %1 %2의 %3',
@@ -7715,14 +7816,14 @@ Lang.template = {
maze_repeat_until_4: '%1에 도착할 때까지 반복하기%2',
maze_repeat_until_5: '%1에 도착할 때까지 반복하기%2',
maze_repeat_until_6: '%1에 도착할 때까지 반복하기%2',
- maze_repeat_until_7: '%1에 도착할 때까지 반복하기%2',
+ maze_repeat_until_7: '목적지에 도착할 때까지 반복하기%2',
maze_repeat_until_goal: '목적지에 도착할 때까지 반복하기%1',
maze_repeat_until_beat_monster: '모든 몬스터를 혼내줄 때까지 반복하기%1',
maze_radar_check: '%1에 %2이 있다',
- maze_cony_flower_throw: '꽃 던지기%1',
+ maze_cony_flower_throw: '부채질하기%1',
maze_brown_punch: '주먹 날리기%1',
maze_iron_switch: '장애물 조종하기%1',
- maze_james_heart: '하트 날리기%1',
+ maze_james_heart: '케이크 던지기%1',
maze_step_if_5: '만약 앞에 길이 없다면%2',
maze_step_if_6: '만약 앞에 %1이 없다면%2',
maze_step_if_7: '만약 앞에 %1이 있다면%2',
@@ -7957,9 +8058,9 @@ Lang.template = {
funboard_what_button_pressed: '%1 버튼 눌림',
funboard_what_touch_button_pressed: '%1 터치됨',
learning_title_image_str: '분류: 이미지 모델',
- learning_title_speech_str: '분류: 음성 모델',
+ learning_title_speech_str: '분류: 소리 모델',
learning_title_text_str: '분류: 텍스트 모델',
- learning_title_number_str: '분류: 숫자 모델',
+ learning_title_number_str: '분류: 숫자 (kNN) 모델',
learning_title_regression_str: '예측: 숫자 모델',
learning_title_cluster_str: '군집: 숫자 모델',
learning_title_logistic_regression_str: '분류: 숫자 (로지스틱 회귀) 모델',
@@ -8014,6 +8115,13 @@ Lang.template = {
is_which_gesture: '%1 번째 손의 모양이 %2 인가?',
get_which_hand: '%1 번째 손',
get_which_gesture: '%1 번째 손의 모양',
+ function_create_value: '함수 정의하기 %1 %2 %3 결괏값을 %4 (으)로 정하기',
+ run: '',
+ reverse_of_string: '%1 %2 %3',
+ save_current_table: '테이블 %1 을(를) 현재 상태로 남기기 %2',
+ open_table: '테이블 %1 창 열기 %2',
+ open_table_wait: '테이블 %1 창을 %2 초 동안 열기 %3',
+ video_capture_for_image_test: '비디오 화면을 학습한 모델로 분류 %1 %2',
};
Lang.TextCoding = {
block_name: '블록명',
@@ -8086,64 +8194,64 @@ Lang.TextCoding = {
};
Lang.PythonHelper = {
when_run_button_click_desc:
- '[시작하기]버튼을 클릭하면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '[시작하기]버튼을 클릭하면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_run_button_click_exampleCode: 'def when_start():\n Entry.print("안녕!")',
when_run_button_click_exampleDesc: '[시작하기]버튼을 클릭하면 오브젝트가 "안녕!"이라 말합니다.',
when_some_key_pressed_desc:
- 'A키를 누르면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A키를 누르면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_some_key_pressed_elements:
- 'A-- 아래 선택지 중 하나 ① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능) ② 숫자 : 1, 2, 3, 4 ~ 9, 0 ③ 특수키 : "space", "enter" ④ 방향키 : "up", "down", "right", "left"',
+ 'A-- 아래 선택지 중 하나\n① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능)\n② 숫자 : 1, 2, 3, 4 ~ 9, 0\n③ 특수키 : "space", "enter"\n④ 방향키 : "up", "down", "right", "left"',
when_some_key_pressed_exampleCode:
'def when_press_key("W"):\n Entry.move_to_direction(10)\n\ndef when_press_key(1):\n Entry.add_size(10)',
when_some_key_pressed_exampleDesc:
'W키를 누르면 오브젝트가 이동방향으로 10만큼 이동하고, 1키를 누르면 오브젝트의 크기가 10만큼 커집니다.',
mouse_clicked_desc:
- '마우스를 클릭했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '마우스를 클릭했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
mouse_clicked_exampleCode:
'def when_click_mouse_on():\n Entry.add_size(10)\n Entry.move_to_direction(10)',
mouse_clicked_exampleDesc:
'마우스를 클릭하면 오브젝트의 크기가 10만큼 커지면서 이동방향으로 10만큼 이동합니다.',
mouse_click_cancled_desc:
- '마우스 클릭을 해제했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '마우스 클릭을 해제했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
mouse_click_cancled_exampleCode:
'def when_click_mouse_off():\n Entry.move_to_direction(-10)\n\ndef when_click_mouse_on():\n Entry.move_to_direction(10)',
mouse_click_cancled_exampleDesc:
'마우스를 클릭하면 오브젝트가 이동방향으로 10만큼 이동하고, 마우스 클릭을 해제하면 오브젝트가 이동방향으로 -10만큼 이동합니다.',
when_object_click_desc:
- '해당 오브젝트를 클릭했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '해당 오브젝트를 클릭했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_object_click_exampleCode:
'def when_click_object_on():\n Entry.print_for_sec("회전!", 0.5)\n Entry.add_rotation(90)',
when_object_click_exampleDesc:
'오브젝트를 클릭하면 오브젝트가 "회전!"이라 말하고, 90도 만큼 회전합니다.',
when_object_click_canceled_desc:
- '해당 오브젝트 클릭을 해제했을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '해당 오브젝트 클릭을 해제했을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_object_click_canceled_exampleCode:
'def when_click_object_on():\n Entry.add_rotation(90)\n\ndef when_click_object_off():\n Entry.add_rotation(-90)',
when_object_click_canceled_exampleDesc:
'오브젝트를 클릭하면 오브젝트가 90도 만큼 회전하고, 오브젝트 클릭을 해제하면 오브젝트가 -90도 만큼 회전합니다.',
when_message_cast_desc:
- 'A 신호를 받으면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다. 만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
+ 'A 신호를 받으면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.\n만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
when_message_cast_elements: 'A-- "신호 이름"',
when_message_cast_exampleCode:
'def when_click_mouse_on():\n Entry.send_signal("신호")\n\ndef when_get_signal("신호"):\n Entry.print_for_sec("안녕! 반가워", 0.5)',
when_message_cast_exampleDesc:
'마우스를 클릭하면 "신호"를 보내고, "신호"를 받았을때 "안녕! 반가워"라고 0.5초간 말합니다.',
message_cast_desc:
- 'A에 입력된 신호를 보냅니다. 만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
+ 'A에 입력된 신호를 보냅니다.\n만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
message_cast_elements: 'A-- "신호 이름"',
message_cast_exampleCode:
'#"오브젝트1"의 파이선 코드\ndef when_start():\n Entry.print_for_sec("안녕! 넌 몇살이니?", 2)\n Entry.send_signal("신호")\n\n#"오브젝트2"의 파이선 코드\ndef when_get_signal("신호"):\n Entry.print_for_sec("안녕? 난 세 살이야.", 2)',
message_cast_exampleDesc:
'[시작하기]버튼을 클릭하면 "오브젝트1"이 "안녕! 넌 몇살이니?"라고 2초간 말하고 "신호를 보냅니다., "오브젝트2"가 "신호"를 받았을때 "안녕? 난 세 살이야."라고 2초간 말합니다.',
message_cast_wait_desc:
- 'A에 입력된 신호를 보내고, 해당 신호를 받는 명령어들의 실행이 끝날 때까지 기다립니다. 만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
+ 'A에 입력된 신호를 보내고, 해당 신호를 받는 명령어들의 실행이 끝날 때까지 기다립니다.\n만약 A 신호가 없으면 [속성] 탭에 A 신호가 자동 생성됩니다.',
message_cast_wait_elements: 'A-- "신호 이름"',
message_cast_wait_exampleCode:
'#"오브젝트1"의 파이선 코드\ndef when_start():\n Entry.print_for_sec("숨바꼭질하자!", 2)\n Entry.send_signal_wait("신호")\n Entry.hide()\n\n#"오브젝트2"의 파이선 코드\ndef when_get_signal("신호"):\n Entry.print_for_sec("그래!", 2)',
message_cast_wait_exampleDesc:
'[시작하기]버튼을 클릭하면 "오브젝트1"이 "숨바꼭질하자!"라고 2초 동안 말하고 "신호"를 보낸 후 기다립니다. "오브젝트2"가 "신호"를 받으면 "그래!"를 2초 동안 말합니다. "오브젝트1"이 그 후에 모양을 숨깁니다.',
when_scene_start_desc:
- '장면이 시작되면 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '장면이 시작되면 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_scene_start_exampleCode:
'#"장면 1"의 파이선 코드\ndef when_start():\n Entry.print_for_sec("다른 곳으로 가볼까?", 2)\n Entry.start_scene("장면 2")\n\n#"장면 2"의 파이선 코드\ndef when_start_scene():\n Entry.print("여기가 어디지?")',
when_scene_start_exampleDesc:
@@ -8155,7 +8263,7 @@ Lang.PythonHelper = {
start_scene_exampleDesc: '"장면 1"에서 해당 오브젝트를 클릭하면 "장면 2"가 시작됩니다.',
start_neighbor_scene_desc: 'A에 입력한 다음 또는 이전 장면을 시작합니다.',
start_neighbor_scene_elements:
- 'A-- 아래 선택지 중 하나 ① 다음 장면: "next" 또는 "다음" ② 이전 장면: "prev" 또는 "이전"',
+ 'A-- 아래 선택지 중 하나\n① 다음 장면: "next" 또는 "다음"\n② 이전 장면: "prev" 또는 "이전"',
start_neighbor_scene_exampleCode:
'#"장면 1"의 파이선 코드\ndef when_press_key("right"):\n Entry.start_scene_of("next")\n\n#"장면 2"의 파이선 코드\ndef when_press_key("left"):\n Entry.start_scene_of("prev")',
start_neighbor_scene_exampleDesc:
@@ -8167,59 +8275,60 @@ Lang.PythonHelper = {
wait_second_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트에 색깔효과를 10만큼 주고, 2초동안 기다린 다음 크기를 10만큼 커지게 합니다.',
repeat_basic_desc:
- '아래 명령어들을 A번 반복하여 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '아래 명령어들을 A번 반복하여 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
repeat_basic_elements: 'A-- 반복할 횟수 입력',
repeat_basic_exampleCode:
'def when_start():\n for i in range(10):\n Entry.move_to_direction(10)\n Entry.stamp()',
repeat_basic_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 이동방향으로 10만큼 이동하고, 도장찍는 행동을 10번 반복합니다.',
repeat_inf_desc:
- 'A 판단이 True인 동안 아래 명령어들을 반복 실행합니다. A에 True를 입력하면 계속 반복됩니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 판단이 True인 동안 아래 명령어들을 반복 실행합니다. A에 True를 입력하면 계속 반복됩니다. \n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
repeat_inf_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
repeat_inf_exampleCode:
'def when_start():\n while True:\n Entry.move_to_direction(10)\n Entry.bounce_on_edge()',
repeat_inf_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 계속해서 이동방향으로 10만큼 이동하고, 벽에 닿으면 튕깁니다.',
repeat_while_true_desc:
- 'A 판단이 True가 될 때까지 아래 명령어들을 반복 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 판단이 True가 될 때까지 아래 명령어들을 반복 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
repeat_while_true_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
repeat_while_true_exampleCode:
'def when_start():\n while not Entry.is_key_pressed("space"):\n Entry.add_rotation(90)',
repeat_while_true_exampleDesc:
'[시작하기]버튼을 클릭하면 스페이스키를 누를때까지 오브젝트가 90도 만큼 회전합니다.',
- stop_repeat_desc: '이 명령어와 가장 가까운 반복 명령어의 반복을 중단합니다.',
+ stop_repeat_desc:
+ "이 블록을 감싸는 가장 가까운 블록을 멈춥니다.\n '반복하기'블록과 같이 ㄷ자 모양으로 다른 블록을 감싼 블록에 조립해 사용할 수 있습니다.",
stop_repeat_exampleCode:
'def when_start():\n while True:\n Entry.move_to_direction(10)\n if Entry.is_key_pressed("enter"):\n break',
stop_repeat_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 이동방향으로 10만큼 계속 이동합니다. 엔터키를 누르면 반복이 중단됩니다.',
_if_desc:
- 'A 부분의 판단이 True이면 if A:아래 명령어들을 실행하고, False이면 실행하지 않습니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 부분의 판단이 True이면 if A:아래 명령어들을 실행하고, False이면 실행하지 않습니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
_if_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
_if_exampleCode:
'def when_click_mouse_on():\n if (Entry.value_of_mouse_pointer("x") > 0):\n Entry.print_for_sec("오른쪽!", 0.5)',
_if_exampleDesc:
'마우스를 클릭했을 때 마우스 x좌표가 0보다 크면 오브젝트가 "오른쪽!"이라고 0.5초 동안 말합니다.',
if_else_desc:
- 'A 부분의 판단이 True이면 if A: 아래 명령어들을 실행하고, False이면 else: 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ 'A 부분의 판단이 True이면 if A: 아래 명령어들을 실행하고, False이면 else: 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
if_else_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
if_else_exampleCode:
'def when_click_mouse_on():\n if Entry.is_touched("mouse_pointer"):\n Entry.print("닿았다!")\n else:\n Entry.print("안 닿았다!")',
if_else_exampleDesc:
'마우스를 클릭했을 때 마우스포인터가 오브젝트에 닿았으면 "닿았다!"를 그렇지 않으면 "안 닿았다!"를 말합니다.',
wait_until_true_desc: 'A 부분의 판단이 True가 될 때까지 코드의 실행을 멈추고 기다립니다.',
wait_until_true_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
wait_until_true_exampleCode:
'def when_start():\n Entry.print("엔터를 눌러봐!")\n Entry.wait_until(Entry.is_key_pressed("enter"))\n Entry.print("잘했어!")',
wait_until_true_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "엔터를 눌러봐!"라 말하고, 엔터키를 누를 때까지 기다립니다. 엔터키를 누르면 "잘했어!"라 말합니다.',
stop_object_desc: 'A코드의 실행을 중지합니다.',
stop_object_elements:
- 'A-- 아래 선택지 중 하나 ① "all": 모든 오브젝트의 모든 코드 ② "self" : 해당 오브젝트의 모든 코드 ③ "this": 이 명령어가 포함된 코드 ④ "others" : 해당 오브젝트의 코드 중 이 명령어가 포함된 코드를 제외한 모든 코드 ⑤ "ohter_objects" : 이 오브젝트를 제외한 다른 모든 오브젝트의 코드',
+ 'A-- 아래 선택지 중 하나\n① "all": 모든 오브젝트의 모든 코드\n② "self" : 해당 오브젝트의 모든 코드\n③ "this": 이 명령어가 포함된 코드\n④ "others" : 해당 오브젝트의 코드 중 이 명령어가 포함된 코드를 제외한 모든 코드\n⑤ "ohter_objects" : 이 오브젝트를 제외한 다른 모든 오브젝트의 코드',
stop_object_exampleCode:
'def when_start():\n while True:\n Entry.move_to("mouse_pointer")\n\ndef when_press_key("space"):\n Entry.stop_code("all")\n',
stop_object_exampleDesc:
@@ -8230,13 +8339,13 @@ Lang.PythonHelper = {
restart_project_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 오브젝트의 크기가 커집니다. 엔터키를 누르면 작품을 처음부터 다시 실행합니다.',
when_clone_start_desc:
- '해당 오브젝트의 복제본이 새로 생성되었을 때 아래 명령어들을 실행합니다. 아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
+ '해당 오브젝트의 복제본이 새로 생성되었을 때 아래 명령어들을 실행합니다.\n아래 명령어는 [Tab]키를 통해 들여쓰기합니다.',
when_clone_start_exampleCode:
'def when_start():\n for i in range(5):\n Entry.make_clone_of("self")\n\ndef when_make_clone():\n Entry.set_x(random.randint(-200, 200))',
when_clone_start_exampleDesc:
'[시작하기]버튼을 클릭하면 자신의 복제본 5개를 만듭니다. 복제본이 새로 생성되었을때 복제본의 x좌표를 -200에서 200사이의 무작위수로 정합니다.',
create_clone_desc: 'A 오브젝트의 복제본을 생성합니다.',
- create_clone_elements: 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "self" 또는 "자신"',
+ create_clone_elements: 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "self" 또는 "자신"',
create_clone_exampleCode:
'def when_start():\n for i in range(5):\n Entry.make_clone_of("self")\n\ndef when_make_clone():\n Entry.set_x(random.randint(-200, 200))',
create_clone_exampleDesc:
@@ -8263,21 +8372,21 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 계속해서 이동방향으로 10만큼 이동하고, 벽에 닿으면 튕깁니다.',
move_x_desc: '오브젝트의 x좌표를 A만큼 바꿉니다.',
move_x_elements:
- 'A-- x좌표의 변화 값 ① 양수: 오브젝트가 오른쪽으로 이동합니다. ② 음수: 오브젝트가 왼쪽으로 이동합니다.',
+ 'A-- x좌표의 변화 값\n① 양수: 오브젝트가 오른쪽으로 이동합니다.\n② 음수: 오브젝트가 왼쪽으로 이동합니다.',
move_x_exampleCode:
'def when_start():\n Entry.add_x(10)\n Entry.wait_for_sec(2)\n Entry.add_x(-10)',
move_x_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 오른쪽으로 10만큼 이동하고 2초 동안 기다린 후 왼쪽으로 10만큼 이동합니다.',
move_y_desc: '오브젝트의 y좌표를 A만큼 바꿉니다.',
move_y_elements:
- 'A-- y좌표의 변화 값 ① 양수: 오브젝트가 위쪽으로 이동합니다. ② 음수: 오브젝트가 아래쪽으로 이동합니다.',
+ 'A-- y좌표의 변화 값\n① 양수: 오브젝트가 위쪽으로 이동합니다.\n② 음수: 오브젝트가 아래쪽으로 이동합니다.',
move_y_exampleCode:
'def when_start():\n Entry.add_y(10)\n Entry.wait_for_sec(2)\n Entry.add_y(-10)',
move_y_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 위쪽으로 10만큼 이동하고 2초 동안 기다린 후 아래쪽으로 10만큼 이동합니다.',
move_xy_time_desc: '오브젝트가 x와 y좌표를 각각 A와 B만큼 C초에 걸쳐 서서히 바꿉니다.',
move_xy_time_elements:
- 'A-- x좌표의 변화 값 ① 양수: 오브젝트가 오른쪽으로 이동합니다. ② 음수: 오브젝트가 왼쪽으로 이동합니다.%nextB-- y좌표의 변화 값 ① 양수: 오브젝트가 위쪽으로 이동합니다. ② 음수: 오브젝트가 아래쪽으로 이동합니다.%nextC-- 이동하는 시간(초)',
+ 'A-- x좌표의 변화 값\n① 양수: 오브젝트가 오른쪽으로 이동합니다.\n② 음수: 오브젝트가 왼쪽으로 이동합니다.%nextB-- y좌표의 변화 값\n① 양수: 오브젝트가 위쪽으로 이동합니다.\n② 음수: 오브젝트가 아래쪽으로 이동합니다.%nextC-- 이동하는 시간(초)',
move_xy_time_exampleCode:
'def when_start():\n Entry.add_xy_for_sec(100, 100, 2)\n Entry.add_xy_for_sec(-100, -100, 2)',
move_xy_time_exampleDesc:
@@ -8309,15 +8418,15 @@ Lang.PythonHelper = {
'오른쪽화살표키를 누르면 오브젝트의 x좌표를 10만큼 바꾸고, 위쪽화살표키를 누르면 오브젝트의 y좌표를 10만큼 바꿉니다. 마우스를 클릭하면 2초 동안 오브젝트를 x,y 좌표 0으로 이동시킵니다.',
locate_desc: '오브젝트가 A의 위치로 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
locate_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"',
locate_exampleCode:
'def when_click_mouse_on():\n Entry.move_to("mouse_pointer")\n\ndef when_press_key("space"):\n Entry.move_to("오브젝트")',
locate_exampleDesc:
- '마우스를 클릭하면 오브젝트가 마우스포인터 위치로 이동합니다. 스페이스키를 누르면 오브젝트가 "오브젝트" 위치로 이동합니다.',
+ '마우스를 클릭하면 오브젝트가 마우스포인터 위치로 이동합니다.\n스페이스키를 누르면 오브젝트가 "오브젝트" 위치로 이동합니다.',
locate_object_time_desc:
'오브젝트가 A의 위치로 B초에 걸쳐 서서히 이동합니다. (오브젝트의 중심점이 기준이 됩니다.)',
locate_object_time_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터" %nextB-- 이동하는 시간(초)',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터" %nextB-- 이동하는 시간(초)',
locate_object_time_exampleCode:
'def when_click_mouse_on():\n Entry.move_to_for_sec("mouse_pointer", 2)',
locate_object_time_exampleDesc:
@@ -8364,7 +8473,7 @@ Lang.PythonHelper = {
see_angle_object_desc:
'오브젝트가 A쪽을 바라봅니다. (이동방향이 A를 향하도록 오브젝트의 방향을 회전해줍니다.)',
see_angle_object_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"',
see_angle_object_exampleCode:
'def when_click_mouse_on():\n Entry.look_at("mouse_pointer")\n\ndef when_press_key("space"):\n Entry.look_at("오브젝트")',
see_angle_object_exampleDesc:
@@ -8389,13 +8498,13 @@ Lang.PythonHelper = {
dialog_time_desc:
'오브젝트가 A를 B초 동안 말풍선으로 말한 후 다음 명령어가 실행됩니다. 콘솔창에서도 실행 결과를 볼 수 있습니다.',
dialog_time_elements:
- 'A-- 말할 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등%nextB-- 말하는 시간(초)',
+ 'A-- 말할 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등%nextB-- 말하는 시간(초)',
dialog_time_exampleCode:
'def when_start():\n Entry.print_for_sec("안녕! 나는", 2)\n Entry.print_for_sec(16, 2)\n Entry.print_for_sec("살이야", 2)',
dialog_time_exampleDesc:
'[시작하기]버튼을 클릭하면 "안녕! 나는", 16, "살이야"를 각각 2초 동안 차례대로 말합니다.',
dialog_desc: '오브젝트가 A를 말풍선으로 말합니다. 콘솔창에서도 실행 결과를 볼 수 있습니다.',
- dialog_elements: 'A-- 말할 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ dialog_elements: 'A-- 말할 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
dialog_exampleCode:
'def when_start():\n Entry.print("키보드로 숫자 1,2 를 누르면 숫자를 말해볼게")\n\ndef when_press_key(1):\n Entry.print(1)\n\ndef when_press_key(2):\n Entry.print(2)\n',
dialog_exampleDesc:
@@ -8407,28 +8516,28 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 "말풍선을 지우려면 엔터를 눌러!"라 말하고, 엔터키를 누르면 말풍선이 사라집니다.',
change_to_some_shape_desc: '오브젝트를 A 모양으로 바꿉니다.',
change_to_some_shape_elements:
- 'A-- 아래 선택지 중 하나 ① 모양 이름 : [속성] 탭의 "모양 이름"을 적음 ② 모양 번호 : [속성] 탭의 모양 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 모양 이름 : [속성] 탭의 "모양 이름"을 적음\n② 모양 번호 : [속성] 탭의 모양 번호를 적음',
change_to_some_shape_exampleCode:
'def when_start():\n Entry.wait_for_sec(0.3)\n Entry.change_shape("오브젝트모양")\n Entry.wait_for_sec(0.3)\n Entry.change_shape("오브젝트모양")',
change_to_some_shape_exampleDesc:
'[시작하기]버튼을 클릭하면 0.3초간 기다린 다음 "오브젝트모양"으로 모양을 바꾸고 0.3초간 기다린 다음 "오브젝트모양"모양으로 모양을 바꿉니다.',
change_to_next_shape_desc: '오브젝트의 모양을 다음 또는 이전 모양으로 바꿉니다.',
change_to_next_shape_elements:
- 'A-- 아래 선택지 중 하나 ① 다음 모양 : "next" 또는 "다음" ② 이전 모양 : "pre" 또는 "이전"',
+ 'A-- 아래 선택지 중 하나\n① 다음 모양 : "next" 또는 "다음" \n② 이전 모양 : "pre" 또는 "이전"',
change_to_next_shape_exampleCode:
'def when_start():\n Entry.wait_for_sec(0.3)\n Entry.change_shape_to("next")\n Entry.wait_for_sec(0.3)\n Entry.change_shape_to("pre")',
change_to_next_shape_exampleDesc:
'[시작하기]버튼을 클릭하면 0.3초간 기다린 다음 모양으로 오브젝트 모양을 바꾸고 0.3초간 기다린 다음 이전 모양으로 오브젝트 모양을 바꿉니다.',
add_effect_amount_desc: '오브젝트에 A 효과를 B만큼 줍니다.',
add_effect_amount_elements:
- 'A -- 아래 선택지 중 하나 ① “color” 또는 “색깔“ ② “brightness” 또는 “밝기” ③ “transparency” 또는 “투명도”%nextB-- 효과의 변화 정도',
+ 'A -- 아래 선택지 중 하나\n① “color” 또는 “색깔“ \n② “brightness” 또는 “밝기” \n③ “transparency” 또는 “투명도”%nextB-- 효과의 변화 정도',
add_effect_amount_exampleCode:
'def when_click_mouse_on():\n Entry.add_effect("color", 50)\n Entry.wait_for_sec(1)\n Entry.add_effect("brightness", -50)\n Entry.wait_for_sec(1)\n Entry.add_effect("transparency", 50)',
add_effect_amount_exampleDesc:
'마우스를 클릭하면 오브젝트에 색깔 효과를 50만큼 주고 1초간 기다리고, 밝기 효과를 -50만큼 주고 1초간 기다립니다. 그 후 투명도 효과를 50만큼 줍니다.',
change_effect_amount_desc: '오브젝트의 A 효과를 B로 정합니다.',
change_effect_amount_elements:
- 'A-- 아래 선택지 중 하나 ① “color” 또는 “색깔“ ② “brightness” 또는 “밝기” ③ “transparency” 또는 “투명도”%nextB-- 효과의 값 ① color: 0~100 범위의 수, 100을 주기로 반복됨 ② brightness: -100~100 사이 범위의 수, -100이하는 -100 으로 100 이상은 100 으로 처리 됨 ③ transparency: 0~100 사이 범위의 수, 0 이하는 0으로, 100이상은 100으로 처리 됨',
+ 'A-- 아래 선택지 중 하나\n① “color” 또는 “색깔“ \n② “brightness” 또는 “밝기” \n③ “transparency” 또는 “투명도”%nextB-- 효과의 값\n① color: 0~100 범위의 수, 100을 주기로 반복됨\n② brightness: -100~100 사이 범위의 수, -100이하는 -100 으로 100 이상은 100 으로 처리 됨\n③ transparency: 0~100 사이 범위의 수, 0 이하는 0으로, 100이상은 100으로 처리 됨',
change_effect_amount_exampleCode:
'def when_click_mouse_on():\n Entry.set_effect("color", 50)\n Entry.set_effect("brightness", 50)\n Entry.set_effect("transparency", 50)\n\ndef when_click_mouse_off():\n Entry.set_effect("color", 0)\n Entry.set_effect("brightness", 0)\n Entry.set_effect("transparency", 0)',
change_effect_amount_exampleDesc:
@@ -8462,7 +8571,7 @@ Lang.PythonHelper = {
'위쪽화살표키를 누르면 오브젝트의 상하 모양을 뒤집고, 오른쪽화살표키를 누르면 오브젝트의 좌우 모양을 뒤집습니다.',
change_object_index_desc: '오브젝트의 레이어를 A로 가져옵니다.',
change_object_index_elements:
- 'A-- 아래 선택지 중 하나 ① “front" 또는 “맨 앞“ ② “forward” 또는 “앞” ③ “backward” 또는 “뒤” ④ “back” 또는 “맨 뒤”',
+ 'A-- 아래 선택지 중 하나\n① “front" 또는 “맨 앞“ \n② “forward” 또는 “앞” \n③ “backward” 또는 “뒤”\n④ “back” 또는 “맨 뒤”',
change_object_index_exampleCode:
'def when_start():\n Entry.send_layer_to("front")\n Entry.wait_for_sec(2)\n Entry.send_layer_to("backward")',
change_object_index_exampleDesc:
@@ -8485,7 +8594,7 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 그리기가 시작되고 계속해서 오브젝트가 이동방향으로 10만큼 이동합니다. 마우스를 클릭하면 그리는것을 멈춥니다.',
set_color_desc: '오브젝트가 그리는 선의 색을 A로 정합니다.',
set_color_elements:
- 'A-- 아래 선택지 중 하나 ① 색상 코드 : "#FF0000", "#FFCC00", "#3333FF", "#000000" 등 ② 색깔명 : "red", "orange", "yellow", "green", "blue", "navy", "purple", "black", "white", "brown"',
+ 'A-- 아래 선택지 중 하나\n① 색상 코드 : "#FF0000", "#FFCC00", "#3333FF", "#000000" 등\n② 색깔명 : "red", "orange", "yellow", "green", "blue", "navy", "purple", "black", "white", "brown"',
set_color_exampleCode:
'def when_start():\n Entry.start_drawing()\n Entry.set_brush_color_to("#000099")\n while True:\n Entry.move_to_direction(1)',
set_color_exampleDesc:
@@ -8525,25 +8634,24 @@ Lang.PythonHelper = {
brush_erase_all_exampleDesc:
'[시작하기]버튼을 클릭하면 그리기가 시작됩니다. 오브젝트는 계속해서 이동방향으로 10만큼 움직이고, 오브젝트의 이동경로를 따라 선이 그려집니다. 마우스를 클릭하면 오브젝트가 그린 선을 모두 지웁니다.',
text_read_desc:
- '글상자 A의 내용입니다. (내용 안에 개행이 있는 경우, 띄어쓰기하여 반환됩니다.)',
- text_read_elements: 'A-- 아래 선택지 중 하나 ① "오브젝트(글상자) 이름" ② 자기 자신',
+ '글상자 A의 내용입니다.\n(내용 안에 개행이 있는 경우, 띄어쓰기하여 반환됩니다.)',
+ text_read_elements: 'A-- 아래 선택지 중 하나\n① "오브젝트(글상자) 이름" \n② 자기 자신',
text_read_exampleCode: 'def when_start():\n Entry.print(Entry.contents_of_textbox("A"))',
text_read_exampleDesc: '[시작하기]버튼을 클릭하면 오브젝트가 글상자 "A"의 내용을 말합니다.',
text_write_desc: '글상자의 내용을 A로 고쳐씁니다.',
- text_write_elements:
- 'A-- 글상자의 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ text_write_elements: 'A-- 글상자의 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
text_write_exampleCode: 'def when_start():\n Entry.write_text("엔트리")',
text_write_exampleDesc: '[시작하기]버튼을 클릭하면 글상자의 내용을 "엔트리"로 바꿉니다.',
text_append_desc: '글상자의 내용 뒤에 A를 추가합니다.',
text_append_elements:
- 'A-- 글상자의 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 글상자의 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
text_append_exampleCode:
'def when_start():\n Entry.write_text("안녕?")\n Entry.wait_for_sec(1)\n Entry.append_text("엔트리!")',
text_append_exampleDesc:
'[시작하기]버튼을 클릭하면 글상자의 내용이 "안녕?"이 되었다가 1초 뒤에 "엔트리!"가 추가되어 "안녕?엔트리!"가 됩니다.',
text_prepend_desc: '글상자의 내용 앞에 A를 추가합니다.',
text_prepend_elements:
- 'A-- 글상자의 내용 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 글상자의 내용\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
text_prepend_exampleCode:
'def when_start():\n Entry.write_text("반가워!")\n Entry.wait_for_sec(1)\n Entry.prepend_text("엔트리!")',
text_prepend_exampleDesc:
@@ -8555,21 +8663,21 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 글상자의 내용이 "엔트리"가 되었다가 1초 뒤에 모든 내용이 사라집니다.',
sound_something_with_block_desc: '오브젝트가 A 소리를 재생합니다.',
sound_something_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_with_block_exampleCode:
'def when_start():\n Entry.play_sound("소리")\n Entry.add_size(50)',
sound_something_with_block_exampleDesc:
'[시작하기]버튼을 클릭하면 "소리"를 재생하면서 오브젝트의 크기가 50만큼 커집니다.',
sound_something_second_with_block_desc: '오브젝트가 A소리를 B초 만큼 재생합니다.',
sound_something_second_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_second_with_block_exampleCode:
'def when_start():\n Entry.play_sound_for_sec("소리", 1)\n Entry.add_size(50)',
sound_something_second_with_block_exampleDesc:
'[시작하기]버튼을 클릭하면 "소리"를 1초 동안 재생하면서, 오브젝트의 크기가 50만큼 커집니다.',
sound_from_to_desc: '오브젝트가 A소리를 B초부터 C초까지 재생합니다.',
sound_from_to_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_from_to_exampleCode:
'def when_start():\n Entry.play_sound_from_to("소리", 0.5, 1)\n Entry.add_size(50)',
sound_from_to_exampleDesc:
@@ -8577,7 +8685,7 @@ Lang.PythonHelper = {
sound_something_wait_with_block_desc:
'오브젝트가 A 소리를 재생하고, 재생이 끝나면 다음 명령을 실행합니다.',
sound_something_wait_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_wait_with_block_exampleCode:
'def when_start():\n Entry.play_sound_and_wait("소리")\n Entry.add_size(50)',
sound_something_wait_with_block_exampleDesc:
@@ -8585,7 +8693,7 @@ Lang.PythonHelper = {
sound_something_second_wait_with_block_desc:
'오브젝트가 A소리를 B초 만큼 재생하고, 재생이 끝나면 다음 명령을 실행합니다.',
sound_something_second_wait_with_block_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_something_second_wait_with_block_exampleCode:
'def when_start():\n Entry.play_sound_for_sec_and_wait("소리", 1)\n Entry.add_size(50)',
sound_something_second_wait_with_block_exampleDesc:
@@ -8593,7 +8701,7 @@ Lang.PythonHelper = {
sound_from_to_and_wait_desc:
'오브젝트가 A소리를 B초부터 C초까지 재생하고, 재생이 끝나면 다음 명령을 실행합니다.',
sound_from_to_and_wait_elements:
- 'A-- 아래 선택지 중 하나 ① 소리 이름 : [속성] 탭의 "소리 이름"을 적음 ② 소리 번호: [속성] 탭의 소리 번호를 적음',
+ 'A-- 아래 선택지 중 하나\n① 소리 이름 : [속성] 탭의 "소리 이름"을 적음\n② 소리 번호: [속성] 탭의 소리 번호를 적음',
sound_from_to_and_wait_exampleCode:
'def when_start():\n Entry.play_sound_from_to_and_wait("소리", 0.5, 1)\n Entry.add_size(50)',
sound_from_to_and_wait_exampleDesc:
@@ -8622,49 +8730,49 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 계속해서 마우스를 클릭했는지 확인합니다. 만약 마우스를 클릭하면 오브젝트가 "반가워!"라고 0.5초간 말합니다.',
is_press_some_key_desc: 'A 키가 눌려져 있는 경우 True로 판단합니다.',
is_press_some_key_elements:
- 'A-- 아래 선택지 중 하나 ① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능) ② 숫자: 1, 2, 3, 4 ~ 9, 0 ③ 특수키: "space", "enter" ④ 방향키 : "up", "down", "right", "left"',
+ 'A-- 아래 선택지 중 하나\n① 알파벳 : "A", "B" ~ "Z" 등(소문자 가능)\n② 숫자: 1, 2, 3, 4 ~ 9, 0\n③ 특수키: "space", "enter"\n④ 방향키 : "up", "down", "right", "left"',
is_press_some_key_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("space"):\n Entry.move_to_direction(10)',
is_press_some_key_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 선택한 키를 눌렀는지 확인합니다. 만약 스페이스 키를 누르면 오브젝트가 이동방향으로 10만큼 이동합니다.',
reach_something_desc: '오브젝트가 A와 닿은 경우 True으로 판단합니다.',
reach_something_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터" ③ "edge", "edge_up", "edge_down", "edge_right", "edge_left"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"\n③ "edge", "edge_up", "edge_down", "edge_right", "edge_left"',
reach_something_exampleCode:
'def when_start():\n while True:\n Entry.move_to_direction(10)\n if Entry.is_touched("edge"):\n Entry.add_rotation(150)',
reach_something_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 오브젝트가 이동방향으로 10만큼 이동합니다. 만약 오브젝트가 벽에 닿으면 150만큼 회전하게 됩니다.',
boolean_basic_operator_desc: 'A와 B를 비교하여 True 또는 False로 판단합니다.',
boolean_basic_operator_elements:
- 'A, B 비교하고자 하는 숫자값 ① == : A와 B의 값이 같으면 True, 아니면 False ② != : A와 B의 값이 다르면 True, 아니면 False ③ > : A의 값이 B의 값보다 크면 true, 아니면 False ④ < : A의 값이 B의 값보다 작으면 true, 아니면 False ⑤ >= : A의 값이 B의 값보다 크거나 같으면 true, 아니면 False ⑥ <= : A의 값이 B의 값보다 작거나 같으면 true, 아니면 False',
+ 'A, B 비교하고자 하는 숫자값\n① == : A와 B의 값이 같으면 True, 아니면 False\n② != : A와 B의 값이 다르면 True, 아니면 False\n③ > : A의 값이 B의 값보다 크면 true, 아니면 False\n④ < : A의 값이 B의 값보다 작으면 true, 아니면 False\n⑤ >= : A의 값이 B의 값보다 크거나 같으면 true, 아니면 False\n⑥ <= : A의 값이 B의 값보다 작거나 같으면 true, 아니면 False',
boolean_basic_operator_exampleCode:
'def when_start():\n while True:\n Entry.add_x(10)\n if Entry.value_of_object("오브젝트", "x") > 240:\n Entry.set_x(0)',
boolean_basic_operator_exampleDesc:
'[시작하기]버튼을 클릭하면 계속해서 오브젝트 x좌표를 10만큼 바꿉니다. 만약 오브젝트 x좌표가 240보다 크면 오브젝트 x좌표를 0으로 정합니다.',
boolean_and_desc: 'A와 B의 판단이 모두 True인 경우 True, 아닌 경우 False로 판단합니다.',
boolean_and_elements:
- 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
boolean_and_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("a") and Entry.is_key_pressed("s"):\n Entry.add_effect("color", 10)',
boolean_and_exampleDesc:
'[시작하기]버튼을 클릭하고 키보드의 "a" 와 "s"키를 동시에 눌렀을 때, 색깔 효과를 10만큼 줍니다.',
boolean_or_desc: 'A와 B의 판단 중 하나라도 True인 경우 True, 아닌 경우 False로 판단합니다.',
boolean_or_elements:
- 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
boolean_or_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("a") or Entry.is_key_pressed("s"):\n Entry.add_effect("color", 10)',
boolean_or_exampleDesc:
'[시작하기]버튼을 클릭하면 키보드의 "a"나 "s"키 중 무엇이든 하나를 누르면 오브젝트에 색깔 효과를 10만큼 줍니다.',
boolean_not_desc: 'A 판단이 True이면 False, False이면 True로 판단합니다.',
boolean_not_elements:
- 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① True, False ② 10 == 10 , 10 > 10 , 10 <= 10 등 ③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
+ 'A-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① True, False\n② 10 == 10 , 10 > 10 , 10 <= 10 등\n③ Entry.is_mouse_clicked(), Entry.is_key_pressed("Q") 등',
boolean_not_exampleCode:
'def when_start():\n while True:\n if not Entry.is_mouse_clicked():\n Entry.add_size(1)',
boolean_not_exampleDesc:
'[시작하기]버튼을 클릭하면 마우스를 클릭하지 않은 동안 크기가 1씩 커집니다.',
calc_basic_desc: 'A와 B의 연산값입니다.',
calc_basic_elements:
- 'A, B-- 연산하고자 하는 숫자값 ① + : A와 B를 더한 값 ② - : A와 B를 뺀 값 ③ x : A와 B를 곱한 값 ④ / : A와 B를 나눈 값',
+ 'A, B-- 연산하고자 하는 숫자값\n① + : A와 B를 더한 값\n② - : A와 B를 뺀 값\n③ x : A와 B를 곱한 값\n④ / : A와 B를 나눈 값',
calc_basic_exampleCode:
'def when_start():\n Entry.print_for_sec(10 + 10, 2)\n Entry.print_for_sec(10 - 10, 2)\n Entry.print_for_sec(10 * 10, 2)\n Entry.print_for_sec(10 / 10, 2)',
calc_basic_exampleDesc:
@@ -8672,20 +8780,20 @@ Lang.PythonHelper = {
calc_rand_desc:
'A와 B 사이에서 선택된 무작위 수의 값입니다. (두 수 모두 정수를 입력한 경우 정수로,두 수 중 하나라도 소수를 입력한 경우 소수로 무작위 수가 선택됩니다.)',
calc_rand_elements:
- 'A, B-- 무작위 수를 추출할 범위 ① random.randint(A, B) : A, B를 정수로 입력하면 정수 범위에서 무작위 수를 추출 ② random.uniform(A, B) : A, B를 실수로 입력하면 실수 범위에서 무작위 수를 추출',
+ 'A, B-- 무작위 수를 추출할 범위\n① random.randint(A, B) : A, B를 정수로 입력하면 정수 범위에서 무작위 수를 추출\n② random.uniform(A, B) : A, B를 실수로 입력하면 실수 범위에서 무작위 수를 추출',
calc_rand_exampleCode:
'def when_start():\n Entry.print_for_sec(random.randint(1, 10), 2)\n Entry.print_for_sec(random.uniform(0.1, 2), 2)',
calc_rand_exampleDesc:
'[시작하기]버튼을 클릭하면 1부터 10사이의 정수중 무작위 수를 뽑아 2초간 말합니다. 그 후 0.1부터 2사이의 실수중 무작위 수를 뽑아 2초간 말합니다.',
coordinate_mouse_desc: '마우스 포인터의 A 좌표 값을 의미합니다.',
- coordinate_mouse_elements: 'A-- 아래 선택지 중 하나 ① "x" 또는 "X" ② "y" 또는 "Y"',
+ coordinate_mouse_elements: 'A-- 아래 선택지 중 하나\n① "x" 또는 "X"\n② "y" 또는 "Y"',
coordinate_mouse_exampleCode:
'def when_start():\n while True:\n Entry.print(Entry.value_of_mouse_pointer("x"))',
coordinate_mouse_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 마우스 포인터의 x좌표를 계속해서 말합니다.',
coordinate_object_desc: 'A에 대한 B정보값입니다.',
coordinate_object_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "self" 또는 "자신"%nextB-- 아래 선택지 중 하나 ① "x" 또는 "X" ② "y" 또는 "Y" ③ "rotation" 또는 "방향" ④ "direction" 또는 "이동 방향" ⑤ "size" 또는 "크기" ⑥ "shape_number" 또는 "모양 번호" ⑦ "shape_name" 또는 "모양 이름"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "self" 또는 "자신"%nextB-- 아래 선택지 중 하나\n① "x" 또는 "X"\n② "y" 또는 "Y"\n③ "rotation" 또는 "방향"\n④ "direction" 또는 "이동 방향"\n⑤ "size" 또는 "크기"\n⑥ "shape_number" 또는 "모양 번호"\n⑦ "shape_name" 또는 "모양 이름"',
coordinate_object_exampleCode:
'def when_start():\n while True:\n Entry.add_x(1)\n Entry.print(Entry.value_of_object("오브젝트", "x"))\n',
coordinate_object_exampleDesc:
@@ -8697,14 +8805,14 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 소리의 크기값을 계속해서 말합니다.',
quotient_and_mod_desc: 'A와 B의 연산값입니다.',
quotient_and_mod_elements:
- 'A, B-- 연산하고자 하는 숫자값 ① // : A / B의 몫에 해당하는 값 ② % : A / B의 나머지에 해당하는 값',
+ 'A, B-- 연산하고자 하는 숫자값\n① // : A / B의 몫에 해당하는 값\n② % : A / B의 나머지에 해당하는 값',
quotient_and_mod_exampleCode:
'def when_start():\n Entry.print_for_sec(10 // 3, 2)\n Entry.print_for_sec(10 % 3, 2)',
quotient_and_mod_exampleDesc:
'[시작하기]버튼을 클릭하면 10 / 3의 몫인 3을 2초 동안 말하고, 나머지인 1을 2초 동안 말합니다.',
calc_operation_desc: 'A의 연산값입니다.',
calc_operation_elements:
- 'A, B-- 연산하고자 하는 숫자값 ① A ** 2 : A를 제곱한 값 ② math.sqrt(A): A의 루트값 ③ math.sin(A): A의 사인값 ④ math.cos(A): A의 코사인 값 ⑤ math.tan(A): A의 탄젠트값 ⑥ math.asin(A): A의 아크사인값 ⑦ math.acos(A): A의 아크코사인값 ⑧ math.atan(): A의 아크탄젠트값 ⑨ math.log10(A): A의 로그값 ⑩ math.log(A): A의 자연로그값 ⑪ A - math.floor(A): A의 소수점 부분 ⑫ math.floor(A): A의 소수점 버림값 ⑬ math.ceil(A): A의 소수점 올림값 ⑭ math.round(A): A의 소수점 반올림값 ⑮ math.factorial(A): A의 팩토리얼 값 ⑯ math.fabs(A): A의 절댓값',
+ 'A, B-- 연산하고자 하는 숫자값\n① A ** 2 : A를 제곱한 값\n② math.sqrt(A): A의 루트값\n③ math.sin(A): A의 사인값\n④ math.cos(A): A의 코사인 값\n⑤ math.tan(A): A의 탄젠트값 \n⑥ math.asin(A): A의 아크사인값\n⑦ math.acos(A): A의 아크코사인값\n⑧ math.atan(): A의 아크탄젠트값\n⑨ math.log10(A): A의 로그값\n⑩ math.log(A): A의 자연로그값\n⑪ A - math.floor(A): A의 소수점 부분\n⑫ math.floor(A): A의 소수점 버림값\n⑬ math.ceil(A): A의 소수점 올림값\n⑭ math.round(A): A의 소수점 반올림값\n⑮ math.factorial(A): A의 팩토리얼 값\n⑯ math.fabs(A): A의 절댓값',
calc_operation_exampleCode:
'def when_start():\n Entry.print_for_sec(10 ** 2, 2)\n Entry.print_for_sec(math.sqrt(9), 2)\n Entry.print_for_sec(math.sin(90), 2)\n Entry.print_for_sec(math.fabs(-10), 2)',
calc_operation_exampleDesc:
@@ -8715,29 +8823,29 @@ Lang.PythonHelper = {
get_project_timer_value_exampleDesc:
'[시작하기]버튼을 클릭하면 초시계를 시작합니다. 3초 뒤에는 초시계를 정지하고 초시계창을 숨깁니다. 그 후 초시계값을 말합니다.',
choose_project_timer_action_desc:
- '초시계의 동작을 A로 정합니다. (이 명령어를 사용하면 실행화면에 ‘초시계 창’이 생성됩니다.)',
+ '초시계의 동작을 A로 정합니다.\n(이 명령어를 사용하면 실행화면에 ‘초시계 창’이 생성됩니다.)',
choose_project_timer_action_elements:
- 'A-- 아래 선택지 중 하나 ① "start" : 초시계를 시작 ② "stop" : 초시계를 정지 ③ "reset" : 초시계를 초기화',
+ 'A-- 아래 선택지 중 하나\n① "start" : 초시계를 시작\n② "stop" : 초시계를 정지\n③ "reset" : 초시계를 초기화',
choose_project_timer_action_exampleCode:
'def when_start():\n Entry.timer("start")\n Entry.wait_for_sec(3)\n Entry.timer("stop")\n Entry.timer_view("hide")\n Entry.print(Entry.value_of_timer())',
choose_project_timer_action_exampleDesc:
'[시작하기]버튼을 클릭하면 초시계를 시작합니다. 3초 뒤에는 초시계를 정지하고 초시계창을 숨깁니다. 그 후 초시계값을 말합니다.',
set_visible_project_timer_desc: '실행화면의 초시계 창을 A로 설정합니다.',
set_visible_project_timer_elements:
- 'A-- 아래 선택지 중 하나 ① "hide" : 초시계창을 숨김 ② "show" : 초시계창을 보임',
+ 'A-- 아래 선택지 중 하나\n① "hide" : 초시계창을 숨김\n② "show" : 초시계창을 보임',
set_visible_project_timer_exampleCode:
'def when_start():\n Entry.timer("start")\n Entry.wait_for_sec(3)\n Entry.timer("stop")\n Entry.timer_view("hide")\n Entry.print(Entry.value_of_timer())',
set_visible_project_timer_exampleDesc:
'[시작하기]버튼을 클릭하면 초시계를 시작합니다. 3초 뒤에는 초시계를 정지하고 초시계창을 숨깁니다. 그 후 초시계값을 말합니다.',
get_date_desc: '현재 A에 대한 값입니다.',
get_date_elements:
- 'A-- 아래 선택지 중 하나 ① "year" : 현재 연도 값 ② "month" : 현재 월 값 ③ "day" : 현재 일 값 ④ "hour" : 현재 시간 값 ⑤ "minute" : 현재 분 값 ⑥ "second" : 현재 초 값',
+ 'A-- 아래 선택지 중 하나\n① "year" : 현재 연도 값\n② "month" : 현재 월 값\n③ "day" : 현재 일 값\n④ "hour" : 현재 시간 값\n⑤ "minute" : 현재 분 값\n⑥ "second" : 현재 초 값',
get_date_exampleCode:
'def when_start():\n Entry.print(Entry.value_of_current_time("year") + "년" + Entry.value_of_current_time("month") + "월")',
get_date_exampleDesc: '[시작하기]버튼을 클릭하면 오브젝트가 현재년도와 월을 말합니다.',
distance_something_desc: '자신과 A까지의 거리 값입니다.',
distance_something_elements:
- 'A-- 아래 선택지 중 하나 ① "오브젝트 이름" ② "mouse_pointer" 또는 "마우스포인터"',
+ 'A-- 아래 선택지 중 하나\n① "오브젝트 이름"\n② "mouse_pointer" 또는 "마우스포인터"',
distance_something_exampleCode:
'def when_start():\n while True:\n Entry.print(Entry.value_of_distance_to("mouse_pointer"))',
distance_something_exampleDesc:
@@ -8748,7 +8856,8 @@ Lang.PythonHelper = {
'def when_start():\n Entry.print(Entry.value_of_sound_length_of("소리"))',
get_sound_duration_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "소리"의 길이를 말합니다.',
- get_user_name_desc: '작품을 실행하고 있는 사용자의 아이디 값입니다.',
+ get_user_name_desc:
+ '작품을 실행하고 있는 사용자의 아이디 값입니다.\n값은 개인정보 보호를 위해 마스킹 처리되어 있습니다.',
get_user_name_exampleCode: 'def when_start():\n Entry.print(Entry.value_of_username())',
get_user_name_exampleDesc:
'[시작하기]버튼을 클릭하면 작품을 실행하고 있는 사용자의 아이디 값을 말합니다.',
@@ -8776,7 +8885,7 @@ Lang.PythonHelper = {
substring_desc:
'A 문자열의 B위치부터 C-1위치까지의 값입니다. (첫 번째 글자의 위치는 0부터 시작합니다.)',
substring_elements:
- 'A-- "문자열"%nextB-- 포함할 문자열의 시작 위치 첫 번째 글자는 0부터 시작%nextC-- 문자열을 포함하지 않는 위치',
+ 'A-- "문자열"%nextB-- 포함할 문자열의 시작 위치\n첫 번째 글자는 0부터 시작%nextC-- 문자열을 포함하지 않는 위치',
substring_exampleCode: 'def when_start():\n Entry.print("안녕 엔트리!"[1:5])',
substring_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "안녕 엔트리!"의 1에서 4번째 글자인 "녕 엔트"를 말합니다.',
@@ -8788,7 +8897,7 @@ Lang.PythonHelper = {
index_of_string_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "안녕 엔트리!"에서 "엔트리"가 처음으로 등장하는 위치인 3을 말합니다.',
replace_string_desc:
- 'A 문자열에서 B문자열을 모두 찾아 C문자열로 바꾼 값입니다. (영문 입력시 대소문자를 구분합니다.)',
+ 'A 문자열에서 B문자열을 모두 찾아 C문자열로 바꾼 값입니다.\n(영문 입력시 대소문자를 구분합니다.)',
replace_string_elements: 'A, B, C-- "문자열"',
replace_string_exampleCode:
'def when_start():\n Entry.print("안녕 엔트리!".replace( "안녕", "반가워"))',
@@ -8796,13 +8905,13 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 "안녕 엔트리!"에서 "안녕"을 "반가워"로 바꾼 "반가워 엔트리!"를 말합니다.',
change_string_case_desc: 'A의 모든 알파벳을 대문자 또는 소문자로 바꾼 문자값입니다.',
change_string_case_elements:
- 'A-- "문자열" ① A.upper(): A의 모든 알파벳을 대문자로 바꾼 값 ② A.lower() : A의 모든 알파벳을 소문자로 바꾼 값',
+ 'A-- "문자열"\n① A.upper(): A의 모든 알파벳을 대문자로 바꾼 값\n② A.lower() : A의 모든 알파벳을 소문자로 바꾼 값',
change_string_case_exampleCode:
'def when_start():\n Entry.print_for_sec("Hello Entry!".upper(), 2)\n Entry.print_for_sec("Hello Entry!".lower(), 2)',
change_string_case_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 "Hello Entry!"를 모두 대문자로 바꾼 "HELLO ENTRY!"를 2초간 말한 다음 모두 소문자로 바꾼 "hello entry!"를 2초간 말합니다.',
ask_and_wait_desc:
- "오브젝트가 A 내용을 말풍선으로 묻고, 대답을 입력받습니다. 대답은 실행화면 또는 콘솔창에서 입력할 수 있으며 입력된 값은 'Entry.answer()'에 저장됩니다. (이 명령어를 사용하면 실행화면에 ‘대답 창’이 생성됩니다.)",
+ "오브젝트가 A 내용을 말풍선으로 묻고, 대답을 입력받습니다. 대답은 실행화면 또는 콘솔창에서 입력할 수 있으며 입력된 값은 'Entry.answer()'에 저장됩니다. \n(이 명령어를 사용하면 실행화면에 ‘대답 창’이 생성됩니다.)",
ask_and_wait_elements: 'A-- "문자열"',
ask_and_wait_exampleCode:
'def when_start():\n Entry.input("이름을 입력해보세요.")\n Entry.print(Entry.answer() + " 반가워!")',
@@ -8816,20 +8925,20 @@ Lang.PythonHelper = {
'[시작하기]버튼을 클릭하면 오브젝트가 "이름을 입력해보세요."라고 말풍선으로 묻습니다. 이름을 입력하면 "(입력한 이름) 반가워!"라 말합니다.',
set_visible_answer_desc: '실행화면의 대답 창을 A로 설정합니다.',
set_visible_answer_elements:
- 'A-- 아래 선택지 중 하나 ① "hide" : 대답 창을 숨김 ② "show" : 대답 창을 보임',
+ 'A-- 아래 선택지 중 하나\n① "hide" : 대답 창을 숨김\n② "show" : 대답 창을 보임',
set_visible_answer_exampleCode:
'def when_start():\n Entry.answer_view("hide")\n Entry.input("나이를 입력하세요.")\n Entry.print(Entry.answer())',
set_visible_answer_exampleDesc:
'[시작하기]버튼을 클릭하면 대답창이 숨겨지고, 오브젝트가 "나이를 입력하세요."라고 말풍선으로 묻습니다. 나이를 입력하면 오브젝트가 입력한 나이를 말합니다.',
get_variable_desc: 'A 변수에 저장된 값입니다.',
get_variable_elements:
- 'A-- 변수명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A',
+ 'A-- 변수명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A',
get_variable_exampleCode: 'age = 16\n\ndef when_start():\n Entry.print(age)',
get_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 오브젝트가 age 변수에 들어 가 있는 값인 "16"을 말합니다.',
change_variable_desc: 'A 변수에 B만큼 더합니다.',
change_variable_elements:
- 'A-- 변수명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 숫자값',
+ 'A-- 변수명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 숫자값',
change_variable_exampleCode:
'age = 16\n\ndef when_start():\n Entry.print_for_sec(age, 2)\n age += 2\n Entry.print_for_sec(age, 2)',
change_variable_exampleDesc:
@@ -8837,101 +8946,101 @@ Lang.PythonHelper = {
set_variable_desc:
'A 변수의 값을 B로 정합니다. 만약 A 변수가 없으면 [속성] 탭에 A 변수가 자동 생성됩니다.',
set_variable_elements:
- 'A-- 변수명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 변수에 넣을 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 변수명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 변수에 넣을 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
set_variable_exampleCode: 'age = 16\n\ndef when_start():\n Entry.print(age)',
set_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 오브젝트가 age 변수에 들어 가 있는 값인 "16"을 말합니다.',
show_variable_desc: 'A 변수 창을 실행화면에 보이게 합니다.',
show_variable_elements:
- 'A-- "변수명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "변수명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
show_variable_exampleCode:
'age = 16\n\ndef when_start():\n Entry.hide_variable("age")\n Entry.wait_for_sec(2)\n age = 20\n Entry.show_variable("age")',
show_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 age변수창을 실행화면에서 숨깁니다. 2초 후 변수값을 17로 바꾸고 age변수창을 실행화면에 보이게 합니다.',
hide_variable_desc: 'A 변수 창을 실행화면에서 숨깁니다.',
hide_variable_elements:
- 'A-- "변수명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "변수명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
hide_variable_exampleCode:
'age = 16\n\ndef when_start():\n Entry.hide_variable("age")\n Entry.print_for_sec(age, 2)',
hide_variable_exampleDesc:
'age라는 변수를 만들고 그 값을 16으로 정합니다. [시작하기]버튼을 클릭하면 age변수창을 실행화면에서 숨기고, 오브젝트가 age 변수에 들어 가 있는 값인 "16"을 2초 동안 말합니다.',
value_of_index_from_list_desc:
- 'A 리스트에서 B위치의 항목 값을 의미합니다. (첫 번째 항목의 위치는 0부터 시작합니다.)',
+ 'A 리스트에서 B위치의 항목 값을 의미합니다. \n(첫 번째 항목의 위치는 0부터 시작합니다.)',
value_of_index_from_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치',
value_of_index_from_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.print(basket[1])\n',
value_of_index_from_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 오브젝트가 basket 리스트의 1번째 항목인 orange를 말합니다.',
add_value_to_list_desc: 'A 리스트의 마지막 항목으로 B값이 추가됩니다.',
add_value_to_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트에 넣을 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트에 넣을 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
add_value_to_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n basket.append("juice")\n Entry.print(basket[4])',
add_value_to_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 "juice"를 basket의 마지막 항목으로 추가합니다. 오브젝트는 basket의 4번째 항목인 "juice"를 말합니다.',
remove_value_from_list_desc:
- 'A 리스트의 B위치에 있는 항목을 삭제합니다. (첫 번째 항목의 위치는 0부터 시작합니다.)',
+ 'A 리스트의 B위치에 있는 항목을 삭제합니다.\n(첫 번째 항목의 위치는 0부터 시작합니다.)',
remove_value_from_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치값',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치값',
remove_value_from_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\ndef when_start():\n basket.pop(0)\n Entry.print(basket[0])',
remove_value_from_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket의 0번째 항목인 apple을 삭제합니다. 오브젝트는 새롭게 basket의 0번째 항목이 된 "orange"를 말합니다.',
insert_value_to_list_desc:
- 'A 리스트의 B위치에 C항목을 끼워 넣습니다. (첫 번째 항목의 위치는 0부터 시작합니다. B위치보다 뒤에 있는 항목들은 순서가 하나씩 밀려납니다.)',
+ 'A 리스트의 B위치에 C항목을 끼워 넣습니다. \n(첫 번째 항목의 위치는 0부터 시작합니다. B위치보다 뒤에 있는 항목들은 순서가 하나씩 밀려납니다.)',
insert_value_to_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
insert_value_to_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n basket.insert(1, "juice")\n Entry.print(basket[2])',
insert_value_to_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket의 1번째 위치에 항목 "juice"를 끼워 넣습니다. 오브젝트는 새롭게 basket의 2번째 항목이 된 "orange"를 말합니다.',
change_value_list_index_desc:
- 'A 리스트에서 B위치에 있는 항목의 값을 C 값으로 바꿉니다. (첫 번째 항목의 위치는 0부터 시작합니다.)',
+ 'A 리스트에서 B위치에 있는 항목의 값을 C 값으로 바꿉니다.\n(첫 번째 항목의 위치는 0부터 시작합니다.)',
change_value_list_index_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A%nextB-- 리스트 항목의 위치%nextC-- 리스트에 넣을 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등',
change_value_list_index_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n basket[0] = "juice"\n Entry.print(basket[0])',
change_value_list_index_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket의 0번째 위치의 항목 "apple"을 "juice"로 바꿉니다. 오브젝트는 바뀐 basket의 0번째 항목 "juice"를 말합니다.',
length_of_list_desc: 'A 리스트가 보유한 항목 개수 값입니다.',
length_of_list_elements:
- 'A-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A',
+ 'A-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A',
length_of_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.print(len(basket))',
length_of_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 오브젝트는 basket의 항목 개수인 4를 말합니다.',
is_included_in_list_desc: 'A값을 가진 항목이 B리스트에 포함되어 있는지 확인합니다.',
is_included_in_list_elements:
- 'A-- 리스트의 항목 값 ① 문자 : "안녕!", "엔트리" 등 ② 숫자 : 0, 10, 35 등%nextB-- 리스트명 ① 모든 오브젝트에서 사용: A ② 이 오브젝트에서 사용: self.A',
+ 'A-- 리스트의 항목 값\n① 문자 : "안녕!", "엔트리" 등 \n② 숫자 : 0, 10, 35 등%nextB-- 리스트명\n① 모든 오브젝트에서 사용: A\n② 이 오브젝트에서 사용: self.A',
is_included_in_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n if "apple" in basket:\n Entry.print("사과가 있어!")',
is_included_in_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket 리스트에 "apple"항목이 있는지 확인합니다. "apple"항목이 있기 때문에 오브젝트는 "사과가 있어!"라 말합니다.',
show_list_desc: '선택한 리스트 창을 실행화면에 보이게 합니다.',
show_list_elements:
- 'A-- "리스트명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "리스트명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
show_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.hide_list("basket")\n Entry.wait_for_sec(2)\n Entry.show_list("basket")',
show_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket 리스트를 2초간 숨긴 다음 보여줍니다.',
hide_list_desc: '선택한 리스트 창을 실행화면에서 숨깁니다.',
hide_list_elements:
- 'A-- "리스트명" ① 모든 오브젝트에서 사용: "A" ② 이 오브젝트에서 사용: "self.A"',
+ 'A-- "리스트명"\n① 모든 오브젝트에서 사용: "A"\n② 이 오브젝트에서 사용: "self.A"',
hide_list_exampleCode:
'basket = ["apple", "orange", "pear", "grape"]\n\ndef when_start():\n Entry.hide_list("basket")\n Entry.wait_for_sec(2)\n Entry.show_list("basket")',
hide_list_exampleDesc:
'basket이라는 리스트를 만들고 4개의 항목을 넣습니다. [시작하기]버튼을 클릭하면 basket 리스트를 2초간 숨긴 다음 보여줍니다.',
boolean_and_or_desc: 'A와 B의 판단값을 확인하여 True 또는 False로 판단합니다.',
boolean_and_or_elements:
- 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어) ① and : A와 B의 판단이 모두 True인 경우 True, 아닌 경우 False ② or : A와 B의 판단 중 하나라도 True인 경우 True, 아닌 경우 False',
+ 'A, B-- True 또는 False로 판단할 수 있는 명령어 입력(판단 카테고리의 명령어)\n① and : A와 B의 판단이 모두 True인 경우 True, 아닌 경우 False\n② or : A와 B의 판단 중 하나라도 True인 경우 True, 아닌 경우 False',
boolean_and_or_exampleCode:
'def when_start():\n while True:\n if Entry.is_key_pressed("a") and Entry.is_key_pressed("s"):\n Entry.add_effect("color", 10)',
boolean_and_or_exampleDesc:
'[시작하기]버튼을 클릭하고 키보드의 "a" 와 "s"키를 동시에 눌렀을 때, 색깔 효과를 10만큼 줍니다.',
check_weather_desc: 'B날짜에 C지역의 날씨가 A인 경우 True로 판단합니다.',
check_weather_elements:
- 'A-- 아래 선택지 중 하나 ① "sunny" : 맑음 ② "partly cloudy" : 구름조금 ③ "mostly cloudy" : 구름많음 ④ "cloudy" : 흐림 ⑤ "rainy" : 비 ⑥ "sleet" : 진눈깨비 ⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "sunny" : 맑음\n② "partly cloudy" : 구름조금\n③ "mostly cloudy" : 구름많음\n④ "cloudy" : 흐림\n⑤ "rainy" : 비\n⑥ "sleet" : 진눈깨비\n⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_weather_exampleCode:
'def when_start():\n if Weather.is_condition_sunny("today", "Seoul"):\n Entry.print("오늘 서울의 날씨는 맑습니다.")',
check_weather_exampleDesc:
@@ -8939,7 +9048,7 @@ Lang.PythonHelper = {
check_finedust_desc:
'선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.',
check_finedust_elements:
- 'A-- 아래 선택지 중 하나 ① "good" : 좋음 ② "normal" : 보통 ③ "bad" : 나쁨 ④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "good" : 좋음\n② "normal" : 보통\n③ "bad" : 나쁨\n④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_finedust_exampleCode:
'def when_start():\n if Weather.is_current_finedust_grade_good("Seoul"):\n Entry.print("현재 서울의 미세먼지 등급은 좋음입니다.")',
check_finedust_exampleDesc:
@@ -8947,28 +9056,28 @@ Lang.PythonHelper = {
get_weather_data_desc:
'선택한 날짜와 지역의 각종 날씨 정보값(최저기온, 최고기온, 습도, 강수량, 강수확률, 풍속)입니다.',
get_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "the lowest temperature" : 최저기온 ② "the highest temperature" : 최고기온 ③ "humidity" : 습도 ④ "precipitation" : 강수량 ⑤ "precipitation probability" : 강수확률 ⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "the lowest temperature" : 최저기온\n② "the highest temperature" : 최고기온\n③ "humidity" : 습도\n④ "precipitation" : 강수량\n⑤ "precipitation probability" : 강수확률\n⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
get_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_lowest_temperature("today", "Seoul"))',
get_weather_data_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 최저기온을 말합니다.',
get_current_weather_data_desc: '현재 B지역의 A 날씨 정보값을 의미합니다.',
get_current_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "temperature" : 기온 ② "concentration of fine dust" : 미세먼지농도',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "temperature" : 기온\n② "concentration of fine dust" : 미세먼지농도',
get_current_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_current_temperature("Seoul"))',
get_current_weather_data_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 현재 서울의 기온을 말합니다.',
get_today_temperature_desc: '오늘 A지역의 B 시간대 기온 정보값을 의미합니다.',
get_today_temperature_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "00" : 당일 00시 측정된 기온값 ② "03" : 당일 03시 측정된 기온값 ③ "06" : 당일 06시 측정된 기온값 ④ "09" : 당일 09시 측정된 기온값 ⑤ "12" : 당일 12시 측정된 기온값 ⑥ "15" : 당일 15시 측정된 기온값 ⑦ "18" : 당일 18시 측정된 기온값 ⑧ "21" : 당일 21시 측정된 기온값',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "00" : 당일 00시 측정된 기온값\n② "03" : 당일 03시 측정된 기온값\n③ "06" : 당일 06시 측정된 기온값\n④ "09" : 당일 09시 측정된 기온값\n⑤ "12" : 당일 12시 측정된 기온값\n⑥ "15" : 당일 15시 측정된 기온값\n⑦ "18" : 당일 18시 측정된 기온값\n⑧ "21" : 당일 21시 측정된 기온값',
get_today_temperature_exampleCode:
'def when_start():\n Entry.print(Weather.get_today_temperature("Seoul", 00))',
get_today_temperature_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 00시 기온을 말합니다.',
check_city_weather_desc: 'B날짜에 C지역의 날씨가 A인 경우 True로 판단합니다.',
check_city_weather_elements:
- 'A-- 아래 선택지 중 하나 ① "sunny" : 맑음 ② "partly cloudy" : 구름조금 ③ "mostly cloudy" : 구름많음 ④ "cloudy" : 흐림 ⑤ "rainy" : 비 ⑥ "sleet" : 진눈깨비 ⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "sunny" : 맑음\n② "partly cloudy" : 구름조금\n③ "mostly cloudy" : 구름많음\n④ "cloudy" : 흐림\n⑤ "rainy" : 비\n⑥ "sleet" : 진눈깨비\n⑦ "snowy" : 눈%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_city_weather_exampleCode:
'def when_start():\n if Weather.is_condition_sunny("today", "Seoul"):\n Entry.print("오늘 서울의 날씨는 맑습니다.")',
check_city_weather_exampleDesc:
@@ -8976,7 +9085,7 @@ Lang.PythonHelper = {
check_city_finedust_desc:
'선택한 지역의 현재 미세먼지 정보를 실제 미세먼지 등급과 비교하여 일치하는 경우 ‘참’으로 판단합니다.',
check_city_finedust_elements:
- 'A-- 아래 선택지 중 하나 ① "good" : 좋음 ② "normal" : 보통 ③ "bad" : 나쁨 ④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "good" : 좋음\n② "normal" : 보통\n③ "bad" : 나쁨\n④ "very bad" : 매우나쁨%nextB-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
check_city_finedust_exampleCode:
'def when_start():\n if Weather.is_current_finedust_grade_good("Seoul"):\n Entry.print("현재 서울의 미세먼지 등급은 좋음입니다.")',
check_city_finedust_exampleDesc:
@@ -8984,21 +9093,21 @@ Lang.PythonHelper = {
get_city_weather_data_desc:
'선택한 날짜와 지역의 각종 날씨 정보값(최저기온, 최고기온, 습도, 강수량, 강수확률, 풍속)입니다.',
get_city_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "the lowest temperature" : 최저기온 ② "the highest temperature" : 최고기온 ③ "humidity" : 습도 ④ "precipitation" : 강수량 ⑤ "precipitation probability" : 강수확률 ⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나 ① "yesterday" : 어제 ② "today" : 오늘 ③ "tomorrow" : 내일 ④ "After 2 days" : 모레 ⑤ "After 3 days" : 3일 후 ⑥ "After 4 days" : 4일 후 ⑦ "After 5 days" : 5일 후 ⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북',
+ 'A-- 아래 선택지 중 하나\n① "the lowest temperature" : 최저기온\n② "the highest temperature" : 최고기온\n③ "humidity" : 습도\n④ "precipitation" : 강수량\n⑤ "precipitation probability" : 강수확률\n⑥ "wind speed" : 풍속%nextB-- 아래 선택지 중 하나\n① "yesterday" : 어제\n② "today" : 오늘\n③ "tomorrow" : 내일\n④ "After 2 days" : 모레\n⑤ "After 3 days" : 3일 후\n⑥ "After 4 days" : 4일 후\n⑦ "After 5 days" : 5일 후\n⑧ "After 6 days" : 6일 후%nextC-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북',
get_city_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_lowest_temperature("today", "Seoul"))',
get_city_weather_data_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 오늘 서울의 최저기온을 말합니다.',
get_current_city_weather_data_desc: '현재 B지역의 A 날씨 정보값을 의미합니다.',
get_current_city_weather_data_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "temperature" : 기온 ② "concentration of fine dust" : 미세먼지농도',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "temperature" : 기온\n② "concentration of fine dust" : 미세먼지농도',
get_current_city_weather_data_exampleCode:
'def when_start():\n Entry.print(Weather.get_current_temperature("Seoul"))',
get_current_city_weather_data_exampleDesc:
'[시작하기]버튼을 클릭하면 오브젝트가 현재 서울의 기온을 말합니다.',
get_today_city_temperature_desc: '오늘 A지역의 B 시간대 기온 정보값을 의미합니다.',
get_today_city_temperature_elements:
- 'A-- 아래 선택지 중 하나 ① "Seoul" : 서울 ② "Gangwon-do" : 강원 ③ "Gyeonggi-do" : 경기 ④ "Gyeongsangnam-do" : 경남 ⑤ "Gyeongsangbuk-do" : 경북 ⑥ "Gwangju" : 광주 ⑦ "Daegu" : 대구 ⑧ "Daejeon" : 대전 ⑨ "Busan" : 부산 ⑩ "Sejong" : 세종 ⑪ "Ulsan" : 울산 ⑫ "Incheon" : 인천 ⑬ "Jeollanam-do" : 전남 ⑭ "Jeollabuk-do" : 전북 ⑮ "Jeju" : 제주 Ⓐ "Chungcheongnam-do" : 충남 Ⓑ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나 ① "00" : 당일 00시 측정된 기온값 ② "03" : 당일 03시 측정된 기온값 ③ "06" : 당일 06시 측정된 기온값 ④ "09" : 당일 09시 측정된 기온값 ⑤ "12" : 당일 12시 측정된 기온값 ⑥ "15" : 당일 15시 측정된 기온값 ⑦ "18" : 당일 18시 측정된 기온값 ⑧ "21" : 당일 21시 측정된 기온값',
+ 'A-- 아래 선택지 중 하나\n① "Seoul" : 서울\n② "Gangwon-do" : 강원\n③ "Gyeonggi-do" : 경기\n④ "Gyeongsangnam-do" : 경남\n⑤ "Gyeongsangbuk-do" : 경북\n⑥ "Gwangju" : 광주\n⑦ "Daegu" : 대구\n⑧ "Daejeon" : 대전\n⑨ "Busan" : 부산\n⑩ "Sejong" : 세종\n⑪ "Ulsan" : 울산\n⑫ "Incheon" : 인천\n⑬ "Jeollanam-do" : 전남\n⑭ "Jeollabuk-do" : 전북\n⑮ "Jeju" : 제주\nⒶ "Chungcheongnam-do" : 충남\nⒷ "Chungcheongbuk-do": 충북%nextB-- 아래 선택지 중 하나\n① "00" : 당일 00시 측정된 기온값\n② "03" : 당일 03시 측정된 기온값\n③ "06" : 당일 06시 측정된 기온값\n④ "09" : 당일 09시 측정된 기온값\n⑤ "12" : 당일 12시 측정된 기온값\n⑥ "15" : 당일 15시 측정된 기온값\n⑦ "18" : 당일 18시 측정된 기온값\n⑧ "21" : 당일 21시 측정된 기온값',
get_today_city_temperature_exampleCode:
'def when_start():\n Entry.print(Weather.get_today_city_temperature("Seoul", 00))',
get_today_city_temperature_exampleDesc:
@@ -9041,7 +9150,7 @@ Lang.Painter = {
thickness: '굵기',
font_fill: '채우기 색상',
painter_file_save: '저장하기',
- painter_file_saveas: '새 모양으로 저장',
+ painter_file_saveas: '새 모양으로 저장하기',
file: '파일',
Pencil: '펜',
Line: '직선',
@@ -9067,7 +9176,7 @@ Lang.DataAnalytics = {
summary: '요약',
column_name: '열 이름',
total: '총합',
- dashboard: '요약',
+ dashboard: '정보',
table: '테이블',
chart: '차트',
attribute: '열',
@@ -9079,12 +9188,12 @@ Lang.DataAnalytics = {
median: '중앙값',
average_explain: '해당 열의 모든 값을 더한 후 열의 개수 만큼 나눈 값',
standard_deviation_explain:
- '데이터가 평균을 중심으로 얼마나 퍼져있는지 알려주는 값.\n0에 가까울 수록 값들이 평균 근처에 집중되어 있다는 것을 의미',
+ '데이터가 평균을 중심으로 얼마나 퍼져있는지 알려주는 값.\\n0에 가까울 수록 값들이 평균 근처에 집중되어 있다는 것을 의미',
maximum_minimum_explain: '해당 열의 가장 큰 값과 가장 작은 값',
- median_explain: '해당 열의 모든 값을 크기순으로 배열했을 때\n전체의 중앙에 위치하는 값',
- add_row_above: '위에 행 추가하기',
- add_row_below: '아래에 행 추가하기',
- delete_row: '행 삭제하기',
+ median_explain: '해당 열의 모든 값을 크기순으로 배열했을 때\\n전체의 중앙에 위치하는 값',
+ add_row_above: '위쪽에 행 추가하기',
+ add_row_below: '아래쪽에 행 추가하기',
+ delete_row: '행 삭제',
add_property_left: '왼쪽에 열 추가하기',
add_property_right: '오른쪽에 열 추가하기',
delete_attribute: '열 삭제',
@@ -9096,7 +9205,7 @@ Lang.DataAnalytics = {
row_count: '행',
cell_count: '개',
count: '개수',
- add_chart_alert: '추가된 차트가 없습니다.\n차트를 생성해주세요.',
+ add_chart_alert: '추가된 차트가 없습니다.\\n차트를 생성해주세요.',
enter_attribute_name: '열 이름을 입력해 주세요.(10자 이내)',
placeholder_attribute_name: '열 이름',
new_attribute: '새로운 열',
@@ -9130,11 +9239,11 @@ Lang.DataAnalytics = {
stop: '작품 정지하기',
restart: '작품 다시 시작',
pause: '작품 일시정지',
- max_row_count_error_title: '주의',
+ max_row_count_error_title: '너무 큰 테이블',
max_row_count_error:
- '테이블의 행이 5000개 이상이면 테이블을 편집하거나 차트를 추가할 때 브라우저의 멈춤 현상이 발생할 수 있습니다.\n 문제가 발생하면 테이블의 행 개수를 조절해주세요.',
+ '테이블의 셀이 30,000개 이상이면\r\n테이블을 불러올 수는 있지만, 편집할 수는 없습니다.\r\n큰 테이블의 편집은 별도 프로그램을 사용해 주세요.',
attributes_text: '%1 외 %2개의 속성',
- copy: '복제',
+ copy: '복사',
delete: '삭제',
download: 'PC에 저장',
confirm_content: '변경된 테이블과 차트를 저장할까요?',
@@ -9175,10 +9284,21 @@ Lang.DataAnalytics = {
show_all_points: '모든 점 표시',
coefficient: '상관계수',
scatter_matrix: '산점도 행렬',
+ show_table: '테이블 보기',
+ bar_sub: '바 그래프',
+ line_sub: '라인 그래프',
+ pie_sub: '파이 차트',
+ scatter_sub: '산점도',
+ histogram: '히스토그램',
+ select_legend2: '계열을 2개 이상 선택해주세요',
+ duplicate: '복사',
+ paste: '붙여넣기',
+ cut: '잘라내기',
+ download_table: '테이블을 엑셀 파일로 다운로드',
};
Lang.AiLearning = {
equation: '회귀식',
- predict: '예측',
+ predict: '예측 속성',
cluster_number: '군집',
centriod: '중심점',
class: '클래스',
@@ -9196,7 +9316,7 @@ Lang.AiLearning = {
neighbor_count: '이웃 개수',
cluster_option_centroids_kmpp: '가장 먼 거리',
cluster_option_centroids_random: '무작위',
- model_attr_str: '특성',
+ model_attr_str: '핵심 속성',
model_status_0: '상태: 준비',
model_status_1: '상태: 학습중',
model_status_2: '상태: 학습완료',
@@ -9209,6 +9329,14 @@ Lang.AiLearning = {
train_param_kernel_rbf: 'RBF',
train_param_degree: '차수',
train_param_gamma: '감마',
+ start: '시작하기',
+ stop: '중지하기',
+ train_param_maxDepth: '트리의 최대 깊이',
+ train_param_minNumSamples: '노드의 최소 데이터 수',
+ chart_title: '모델 차트 창',
+ tree_title: '학습한 트리 창',
+ trained_table_postfix: '학습완료',
+ train_param_error: '테이블 열 정보가 변경된 경우에는 재 학습이 불가능 합니다.',
};
Lang.SharePolicy = {
title: '엔트리 작품/게시물 공유 가이드',
diff --git a/extern/util/static.js b/extern/util/static.js
index 321d2149e7..2d13acf015 100644
--- a/extern/util/static.js
+++ b/extern/util/static.js
@@ -3,93 +3,11 @@
/* eslint-disable */
var EntryStatic = {
fontFamily: "NanumGothic, 'Nanum Gothic'",
- exportBlockFontFamily:
- "NanumGothic, 'Nanum Gothic', 'NanumGothic', '나눔고딕','NanumGothicWeb', '맑은 고딕', 'Malgun Gothic', Dotum",
fontOffsetY: -2.5,
heightLetter: 'M',
- objectTypes: ['sprite', 'textBox'],
messageMaxLength: 10,
};
-EntryStatic.usageList = [
- 'usage_sequence',
- 'usage_repeat',
- 'usage_condition_repeat',
- 'usage_condition',
- 'usage_parallel',
- 'usage_event',
- 'usage_signal',
- 'usage_random',
- 'usage_variable',
- 'usage_ask_answer',
- 'usage_comp_operation',
- 'usage_math_operation',
- 'usage_logical_operation',
- 'usage_list',
- 'usage_function',
- 'usage_arrow_move',
- 'usage_coordinate',
- 'usage_rotation',
- 'usage_speak',
- 'usage_picture_effect',
- 'usage_shape',
- 'usage_sound',
- 'usage_draw',
- 'usage_confirm',
- 'usage_timer',
- 'usage_textBox',
- 'usage_scene',
- 'usage_clone',
- 'usage_hw',
- 'usage_expansion',
-];
-
-EntryStatic.conceptList = [
- 'concept_resource_analytics',
- 'concept_individual',
- 'concept_abstractive',
- 'concept_procedual',
- 'concept_automation',
- 'concept_simulation',
- 'concept_parallel',
-];
-
-EntryStatic.subjectList = [
- 'subject_korean',
- 'subject_mathmatics',
- 'subject_social',
- 'subject_science',
- 'subject_english',
- 'subject_courtesy',
- 'subject_music',
- 'subject_paint',
- 'subject_athletic',
- 'subject_progmatic',
-];
-
-EntryStatic.lectureLevels = [1, 2, 3];
-
-EntryStatic.lectureGrades = [
- 'e_1',
- 'e_2',
- 'e_3',
- 'e_4',
- 'e_5',
- 'e_6',
- 'm_1',
- 'm_2',
- 'm_3',
- 'general',
-];
-
-EntryStatic.categoryList = [
- 'category_game',
- 'category_animation',
- 'category_media_art',
- 'category_physical',
- 'category_etc',
-];
-
EntryStatic.variableBlockList = [
'get_variable',
'change_variable',
@@ -109,79 +27,12 @@ EntryStatic.variableBlockList = [
EntryStatic.messageBlockList = ['when_message_cast', 'message_cast', 'message_cast_wait'];
-EntryStatic.requiredTimes = [1, 2, 3, 4, 5];
-
-EntryStatic.searchProjectOption = [
- {
- key: 'search_updated',
- lang: 'search_updated',
- value: 'updated',
- },
- {
- key: 'search_recent',
- lang: 'search_recent',
- value: 'recent',
- },
- {
- key: 'search_complexity',
- lang: 'search_complexity',
- value: 'complexity',
- },
- {
- key: 'search_staffPicked',
- lang: 'search_staffPicked',
- value: 'staffPicked',
- },
- {
- key: 'search_childCnt',
- lang: 'search_childCnt',
- value: 'childCnt',
- },
- {
- key: 'search_likeCnt',
- lang: 'search_likeCnt',
- value: 'recentLikeCnt',
- },
-];
-
-EntryStatic.categoryProjectOption = [
- {
- key: 'search_genre_all',
- lang: 'search_전체',
- value: '전체',
- },
- {
- key: 'search_genre_game',
- lang: 'search_게임',
- value: '게임',
- },
- {
- key: 'search_genre_animation',
- lang: 'search_애니메이션',
- value: '애니메이션',
- },
- {
- key: 'search_genre_media',
- lang: 'search_미디어아트',
- value: '미디어아트',
- },
- {
- key: 'search_genre_physical',
- lang: 'search_피지컬',
- value: '피지컬',
- },
- {
- key: 'search_genre_etc',
- lang: 'search_기타',
- value: '기타',
- },
-];
-
EntryStatic.getAllBlocks = function() {
return [
{
category: 'start',
blocks: [
+ 'messageAddButton',
'when_run_button_click',
'when_some_key_pressed',
'mouse_clicked',
@@ -640,195 +491,6 @@ EntryStatic.getAllBlocks = function() {
},
];
};
-EntryStatic.DynamicHardwareBlocks = [];
-EntryStatic.DynamicHardwareLiteBlocks = [];
-EntryStatic.discussCategories = [
- // 'notice',
- 'qna',
- 'tips',
- 'free',
- 'report',
- 'notice',
-];
-
-EntryStatic.artCategories = [
- {
- key: 'art_category_',
- lang: 'art_category_all',
- value: '',
- },
- {
- key: 'art_category_게임',
- lang: 'art_category_game',
- value: '게임',
- },
- {
- key: 'art_category_애니메이션',
- lang: 'art_category_animation',
- value: '애니메이션',
- },
- {
- key: 'art_category_미디어아트',
- lang: 'art_category_media',
- value: '미디어아트',
- },
- {
- key: 'art_category_피지컬',
- lang: 'art_category_physical',
- value: '피지컬',
- },
- {
- key: 'art_category_기타',
- lang: 'art_category_etc',
- value: '기타',
- },
-];
-
-EntryStatic.artSortOptions = [
- {
- key: 'art_sort_updated',
- lang: 'art_sort_updated',
- value: 'updated',
- },
- {
- key: 'art_sort_visit',
- lang: 'art_sort_visit',
- value: 'visit',
- },
- {
- key: 'art_sort_likeCnt',
- lang: 'art_sort_likeCnt',
- value: 'likeCnt',
- },
- {
- key: 'art_sort_comment',
- lang: 'art_sort_comment',
- value: 'comment',
- },
-];
-
-EntryStatic.discussSortOptions = [
- {
- lang: 'discuss_sort_created',
- value: 'created',
- },
- {
- lang: 'discuss_sort_visit',
- value: 'visit',
- },
- {
- lang: 'discuss_sort_likesLength',
- value: 'likesLength',
- },
- {
- lang: 'discuss_sort_commentsLength',
- value: 'commentsLength',
- },
-];
-EntryStatic.discussPeriodOptions = [
- {
- key: 'discuss_period_',
- lang: 'discuss_period_all',
- value: '',
- },
- {
- key: 'discuss_period_1',
- lang: 'discuss_period_day',
- value: '1',
- },
- {
- key: 'discuss_period_7',
- lang: 'discuss_period_week',
- value: '7',
- },
- {
- key: 'discuss_period_30',
- lang: 'discuss_period_month',
- value: '30',
- },
- {
- key: 'discuss_period_90',
- lang: 'discuss_period_three_month',
- value: '90',
- },
-];
-
-EntryStatic.artPeriodOptions = [
- {
- key: 'art_period_',
- lang: 'art_period_all',
- value: '',
- },
- {
- key: 'art_period_1',
- lang: 'art_period_day',
- value: '1',
- },
- {
- key: 'art_period_7',
- lang: 'art_period_week',
- value: '7',
- },
- {
- key: 'art_period_30',
- lang: 'art_period_month',
- value: '30',
- },
- {
- key: 'art_period_90',
- lang: 'art_period_three_month',
- value: '90',
- },
-];
-
-EntryStatic.getCategoryByBlock = function(blockName) {
- if (!blockName) {
- return false;
- }
- const allBlocks = EntryStatic.getAllBlocks();
- for (let i = 0, len = allBlocks.length; i < len; i++) {
- const blocks = allBlocks[i].blocks;
- if (blocks.indexOf(blockName) > -1) {
- return allBlocks[i].category;
- }
- }
- return false;
-};
-
-EntryStatic.objectMainCategories = [
- 'entrybot_friends',
- 'people',
- 'animal',
- 'plant',
- 'vehicles',
- 'architect',
- 'food',
- 'environment',
- 'stuff',
- 'fantasy',
- 'interface',
- 'background',
-];
-
-EntryStatic.objectSubCategories = {
- entrybot_friends: [],
- people: [],
- animal: ['animal_flying', 'animal_land', 'animal_water', 'animal_others'],
- plant: ['plant_flower', 'plant_grass', 'plant_tree', 'plant_others'],
- vehicles: ['vehicles_flying', 'vehicles_land', 'vehicles_water', 'vehicles_others'],
- architect: ['architect_building', 'architect_monument', 'architect_others'],
- food: ['food_vegetables', 'food_meat', 'food_drink', 'food_others'],
- environment: ['environment_nature', 'environment_space', 'environment_others'],
- stuff: ['stuff_living', 'stuff_hobby', 'stuff_others'],
- fantasy: [],
- interface: ['interface_website', 'interface_game', 'interface_others'],
- background: [
- 'background_outdoor',
- 'background_indoor',
- 'background_nature',
- 'background_others',
- ],
-};
/* eslint-disable */
Object.defineProperty(EntryStatic, 'fonts', {
@@ -1112,40 +774,6 @@ EntryStatic.colorSet = {
},
};
-EntryStatic.COMMAND_TYPES = {
- addThread: 101,
- destroyThread: 102,
- destroyBlock: 103,
- recoverBlock: 104,
- insertBlock: 105,
- separateBlock: 106,
- moveBlock: 107,
- cloneBlock: 108,
- uncloneBlock: 109,
- scrollBoard: 110,
- setFieldValue: 111,
-
- selectObject: 201,
-
- do: 301,
- undo: 302,
- redo: 303,
-};
-
-EntryStatic.getQuestionCategoryData = function() {
- return {
- category: 'dummy',
- blocks: [
- 'hidden_event',
- 'hidden_loop2',
- 'hidden_if_else2',
- 'hidden',
- 'hidden_string',
- 'hidden_boolean',
- ],
- };
-};
-
EntryStatic.getDefaultFontFamily = function() {
const localLang = Lang || {};
const type = localLang.type;
diff --git a/images/entry_scroll_02.svg b/images/entry_scroll_02.svg
new file mode 100644
index 0000000000..439ee143f6
--- /dev/null
+++ b/images/entry_scroll_02.svg
@@ -0,0 +1,6 @@
+
diff --git a/images/entry_scroll_03.svg b/images/entry_scroll_03.svg
new file mode 100644
index 0000000000..6cc296944c
--- /dev/null
+++ b/images/entry_scroll_03.svg
@@ -0,0 +1,6 @@
+
diff --git a/package.json b/package.json
index d0d6328fc1..3e978b618d 100644
--- a/package.json
+++ b/package.json
@@ -37,9 +37,9 @@
"@mediapipe/tasks-vision": "^0.10.3",
"@tensorflow-models/coco-ssd": "^2.0.1",
"@tensorflow-models/posenet": "^2.2.1",
- "@tensorflow/tfjs": "^1.5.2",
- "@tensorflow/tfjs-converter": "^1.5.2",
- "@tensorflow/tfjs-core": "^1.5.2",
+ "@tensorflow/tfjs": "^4.17.0",
+ "@tensorflow/tfjs-converter": "^4.17.0",
+ "@tensorflow/tfjs-core": "^4.17.0",
"@types/crypto-js": "^4.0.1",
"@types/hammerjs": "^2.0.41",
"@types/isomorphic-fetch": "^0.0.35",
@@ -105,9 +105,9 @@
"css-loader": "^3.2.0",
"cssnano": "^4.1.10",
"eslint": "7.32.0",
- "eslint-config-prettier": "^6.11.0",
+ "eslint-config-prettier": "^9.1.0",
"eslint-loader": "^4.0.2",
- "eslint-plugin-prettier": "^3.1.3",
+ "eslint-plugin-prettier": "^5.1.3",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^4.2.0",
"karma": "^4.2.0",
@@ -119,8 +119,8 @@
"mini-css-extract-plugin": "^2.7.6",
"mocha": "^6.2.0",
"postcss-loader": "^3.0.0",
- "prettier": "^1.18.2",
- "prettier-eslint": "^10.1.1",
+ "prettier": "^3.2.5",
+ "prettier-eslint": "^16.3.0",
"style-loader": "^0.20.2",
"terser-webpack-plugin": "^5.3.9",
"ts-loader": "^9.4.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2503401fb9..69db1b0c77 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -16,19 +16,19 @@ dependencies:
version: 0.10.8
'@tensorflow-models/coco-ssd':
specifier: ^2.0.1
- version: 2.0.1(@tensorflow/tfjs-converter@1.5.2)(@tensorflow/tfjs-core@1.5.2)
+ version: 2.0.1(@tensorflow/tfjs-converter@4.18.0)(@tensorflow/tfjs-core@4.18.0)
'@tensorflow-models/posenet':
specifier: ^2.2.1
- version: 2.2.1(@tensorflow/tfjs-converter@1.5.2)(@tensorflow/tfjs-core@1.5.2)
+ version: 2.2.1(@tensorflow/tfjs-converter@4.18.0)(@tensorflow/tfjs-core@4.18.0)
'@tensorflow/tfjs':
- specifier: ^1.5.2
- version: 1.5.2(seedrandom@2.4.4)
+ specifier: ^4.17.0
+ version: 4.18.0(seedrandom@3.0.5)
'@tensorflow/tfjs-converter':
- specifier: ^1.5.2
- version: 1.5.2(@tensorflow/tfjs-core@1.5.2)
+ specifier: ^4.17.0
+ version: 4.18.0(@tensorflow/tfjs-core@4.18.0)
'@tensorflow/tfjs-core':
- specifier: ^1.5.2
- version: 1.5.2
+ specifier: ^4.17.0
+ version: 4.18.0
'@types/crypto-js':
specifier: ^4.0.1
version: 4.0.1
@@ -221,14 +221,14 @@ devDependencies:
specifier: 7.32.0
version: 7.32.0
eslint-config-prettier:
- specifier: ^6.11.0
- version: 6.11.0(eslint@7.32.0)
+ specifier: ^9.1.0
+ version: 9.1.0(eslint@7.32.0)
eslint-loader:
specifier: ^4.0.2
version: 4.0.2(eslint@7.32.0)(webpack@5.85.0)
eslint-plugin-prettier:
- specifier: ^3.1.3
- version: 3.1.3(eslint@7.32.0)(prettier@1.18.2)
+ specifier: ^5.1.3
+ version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@7.32.0)(prettier@3.2.5)
extract-text-webpack-plugin:
specifier: ^4.0.0-beta.0
version: 4.0.0-beta.0(webpack@5.85.0)
@@ -263,11 +263,11 @@ devDependencies:
specifier: ^3.0.0
version: 3.0.0
prettier:
- specifier: ^1.18.2
- version: 1.18.2
+ specifier: ^3.2.5
+ version: 3.2.5
prettier-eslint:
- specifier: ^10.1.1
- version: 10.1.1
+ specifier: ^16.3.0
+ version: 16.3.0
style-loader:
specifier: ^0.20.2
version: 0.20.2
@@ -301,6 +301,11 @@ devDependencies:
packages:
+ /@aashutoshrathi/word-wrap@1.2.6:
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/@ampproject/remapping@2.2.1:
resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
engines: {node: '>=6.0.0'}
@@ -1403,6 +1408,21 @@ packages:
resolution: {integrity: sha512-IDC7sWnfe8GVQIEGsct9Bcsj1Nh4XikO6PG+veVuix0Zv/XH98NkFjmXiyrriJ/rjJoGFBq6sKesfmaFCCr3MA==}
dev: false
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 8.57.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@eslint-community/regexpp@4.10.0:
+ resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
/@eslint/eslintrc@0.4.3:
resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -1420,6 +1440,39 @@ packages:
- supports-color
dev: true
+ /@eslint/eslintrc@2.1.4:
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.6.1
+ globals: 13.20.0
+ ignore: 5.3.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/js@8.57.0:
+ resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@humanwhocodes/config-array@0.11.14:
+ resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@humanwhocodes/config-array@0.5.0:
resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==}
engines: {node: '>=10.10.0'}
@@ -1431,10 +1484,19 @@ packages:
- supports-color
dev: true
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
/@humanwhocodes/object-schema@1.2.1:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
+ /@humanwhocodes/object-schema@2.0.3:
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ dev: true
+
/@jest/console@24.9.0:
resolution: {integrity: sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==}
engines: {node: '>= 6'}
@@ -1536,6 +1598,13 @@ packages:
- utf-8-validate
dev: false
+ /@jest/schemas@29.6.3:
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+ dev: true
+
/@jest/source-map@24.9.0:
resolution: {integrity: sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==}
engines: {node: '>= 6'}
@@ -1642,6 +1711,27 @@ packages:
resolution: {integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==}
dev: false
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+ dev: true
+
/@pixi/accessibility@5.3.7:
resolution: {integrity: sha512-104qzGZWnA/cQUH48jTiCXKGqOCfOqZAHmVg1z0p5l5tnzVX5zUQDBJxt4AAIPguZZe1YkniealwO1WGz0yBgA==}
dependencies:
@@ -1886,32 +1976,65 @@ packages:
eventemitter3: 3.1.2
url: 0.11.0
- /@tensorflow-models/coco-ssd@2.0.1(@tensorflow/tfjs-converter@1.5.2)(@tensorflow/tfjs-core@1.5.2):
+ /@pkgr/core@0.1.1:
+ resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ dev: true
+
+ /@sinclair/typebox@0.27.8:
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ dev: true
+
+ /@tensorflow-models/coco-ssd@2.0.1(@tensorflow/tfjs-converter@4.18.0)(@tensorflow/tfjs-core@4.18.0):
resolution: {integrity: sha512-+mh5eYXSK7WnQmxVbgFoClwMoQ0Vu8Ac2gyXREaNqpsLTqc2z+ZhcltEXdtHhbL8ZC6eCM7Uq3I9MXzomNsB7w==}
peerDependencies:
'@tensorflow/tfjs-converter': ^1.2.5
'@tensorflow/tfjs-core': ^1.2.6
dependencies:
- '@tensorflow/tfjs-converter': 1.5.2(@tensorflow/tfjs-core@1.5.2)
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-converter': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ '@tensorflow/tfjs-core': 4.18.0
dev: false
- /@tensorflow-models/posenet@2.2.1(@tensorflow/tfjs-converter@1.5.2)(@tensorflow/tfjs-core@1.5.2):
+ /@tensorflow-models/posenet@2.2.1(@tensorflow/tfjs-converter@4.18.0)(@tensorflow/tfjs-core@4.18.0):
resolution: {integrity: sha512-n9/g6DfjAyrBTf/zt1haRCyWsgALxUCzg9/Ks3Y2mbYavRZVSCSTRPy/qlE5Hr4tLfyckGfDN14zmGTthNcg/g==}
peerDependencies:
'@tensorflow/tfjs-converter': ^1.3.0
'@tensorflow/tfjs-core': ^1.3.0
dependencies:
- '@tensorflow/tfjs-converter': 1.5.2(@tensorflow/tfjs-core@1.5.2)
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-converter': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ '@tensorflow/tfjs-core': 4.18.0
dev: false
- /@tensorflow/tfjs-converter@1.5.2(@tensorflow/tfjs-core@1.5.2):
- resolution: {integrity: sha512-RRrB8lZFxjLPHO6TwEJPgViVuJP5yqq0IPqA35PhWLYjsNNuC6Tx8vxEa5BZ0Le0mX21CTURak6pdmyac/Jc2w==}
+ /@tensorflow/tfjs-backend-cpu@4.18.0(@tensorflow/tfjs-core@4.18.0):
+ resolution: {integrity: sha512-zk6NyGGsv0mCDnc5xWxLB5Zi8GaHVI2gg7KC0FSw/r5wW9SfA3ZIqUHVZhbIVhNqZSWy6L/+EIJa7l6q1XCkrg==}
+ engines: {yarn: '>= 1.3.2'}
peerDependencies:
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-core': 4.18.0
dependencies:
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-core': 4.18.0
+ '@types/seedrandom': 2.4.34
+ seedrandom: 3.0.5
+ dev: false
+
+ /@tensorflow/tfjs-backend-webgl@4.18.0(@tensorflow/tfjs-core@4.18.0):
+ resolution: {integrity: sha512-ZLQ8MnWnIttMDqHepEzPL0Y4HkTePl8+AaYm9AcNnDUK7VF2jn+BXcTHCUOGfiwKu/OMwRc6osDrjxr0cCqNrA==}
+ engines: {yarn: '>= 1.3.2'}
+ peerDependencies:
+ '@tensorflow/tfjs-core': 4.18.0
+ dependencies:
+ '@tensorflow/tfjs-backend-cpu': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ '@tensorflow/tfjs-core': 4.18.0
+ '@types/offscreencanvas': 2019.3.0
+ '@types/seedrandom': 2.4.34
+ seedrandom: 3.0.5
+ dev: false
+
+ /@tensorflow/tfjs-converter@4.18.0(@tensorflow/tfjs-core@4.18.0):
+ resolution: {integrity: sha512-b7utNMvmI986OPaQvDyHoiHKiIyip7ubSjG4KzTcFOWEKTsirtHxRp/6QKY/XSuH3AJK9Switu1/B5QC7xR2Zg==}
+ peerDependencies:
+ '@tensorflow/tfjs-core': 4.18.0
+ dependencies:
+ '@tensorflow/tfjs-core': 4.18.0
dev: false
/@tensorflow/tfjs-core@1.5.2:
@@ -1926,34 +2049,61 @@ packages:
seedrandom: 2.4.3
dev: false
- /@tensorflow/tfjs-data@1.5.2(@tensorflow/tfjs-core@1.5.2)(seedrandom@2.4.4):
- resolution: {integrity: sha512-ruCsTSyH67CADWthgLQlWKh8u8YGEXD+4vsW8uOGdFNcDFLcL0ffy4jsSzIV/X6NdPIWYsvSHmiz57LtgfCFew==}
+ /@tensorflow/tfjs-core@4.18.0:
+ resolution: {integrity: sha512-wjyq+F8AZJjhtr5xUBAON4VrNBXr9Poows/LnRh1K7wS+w41sCk0EQfeo6NfgUZXbHE/jgcqU6+fZDUKt3qRrg==}
+ engines: {yarn: '>= 1.3.2'}
+ dependencies:
+ '@types/long': 4.0.2
+ '@types/offscreencanvas': 2019.7.3
+ '@types/seedrandom': 2.4.34
+ '@webgpu/types': 0.1.38
+ long: 4.0.0
+ node-fetch: 2.6.13
+ seedrandom: 3.0.5
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /@tensorflow/tfjs-data@4.18.0(@tensorflow/tfjs-core@4.18.0)(seedrandom@3.0.5):
+ resolution: {integrity: sha512-JGfEwq8a0nEXwwU04/PW7O6kZ3FdqAd6ofMboM9qwGTv47QdeO/G1657sy4N21Q/qiz5qFDbGLhim3Nq9gZm9g==}
peerDependencies:
- '@tensorflow/tfjs-core': 1.5.2
- seedrandom: ~2.4.3
+ '@tensorflow/tfjs-core': 4.18.0
+ seedrandom: ^3.0.5
dependencies:
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-core': 4.18.0
'@types/node-fetch': 2.6.4
- node-fetch: 2.1.2
- seedrandom: 2.4.4
+ node-fetch: 2.6.13
+ seedrandom: 3.0.5
+ string_decoder: 1.3.0
+ transitivePeerDependencies:
+ - encoding
dev: false
- /@tensorflow/tfjs-layers@1.5.2(@tensorflow/tfjs-core@1.5.2):
- resolution: {integrity: sha512-fn2hi5D1sOKGEgiBCuoU/hTHO87znODweGivIn6x2HMtF1EC39QWroYQBWzJyrWWMOUZZ4nOFR6coA0Fkhc+nA==}
+ /@tensorflow/tfjs-layers@4.18.0(@tensorflow/tfjs-core@4.18.0):
+ resolution: {integrity: sha512-9AyxUdvjMDbDOkNzdkMRToJZF/le5ia8X3lVfGRGxzsuyoWDBGlV9V1ICufD+Z8sODXVyu+cgE8kAMtVK4aHFA==}
peerDependencies:
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-core': 4.18.0
dependencies:
- '@tensorflow/tfjs-core': 1.5.2
+ '@tensorflow/tfjs-core': 4.18.0
dev: false
- /@tensorflow/tfjs@1.5.2(seedrandom@2.4.4):
- resolution: {integrity: sha512-BCvcbnkE/zMdORIGE7TFAiJU3zLLVUaRv/HyWucVVyHU40oU4L5mGyRXK6RwqU38KmeK3HSI5rUHop4cLNUaRQ==}
+ /@tensorflow/tfjs@4.18.0(seedrandom@3.0.5):
+ resolution: {integrity: sha512-MjA2M91wSkTkpFSuyQAuZm+DT9Y7DFu3rsTaO1BjCbf1S7o8DgJPKMmh6hk6uEn6/SBBbZVXPu+ZTQ/SyrP2Pw==}
+ hasBin: true
dependencies:
- '@tensorflow/tfjs-converter': 1.5.2(@tensorflow/tfjs-core@1.5.2)
- '@tensorflow/tfjs-core': 1.5.2
- '@tensorflow/tfjs-data': 1.5.2(@tensorflow/tfjs-core@1.5.2)(seedrandom@2.4.4)
- '@tensorflow/tfjs-layers': 1.5.2(@tensorflow/tfjs-core@1.5.2)
+ '@tensorflow/tfjs-backend-cpu': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ '@tensorflow/tfjs-backend-webgl': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ '@tensorflow/tfjs-converter': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ '@tensorflow/tfjs-core': 4.18.0
+ '@tensorflow/tfjs-data': 4.18.0(@tensorflow/tfjs-core@4.18.0)(seedrandom@3.0.5)
+ '@tensorflow/tfjs-layers': 4.18.0(@tensorflow/tfjs-core@4.18.0)
+ argparse: 1.0.10
+ chalk: 4.1.2
+ core-js: 3.29.1
+ regenerator-runtime: 0.13.11
+ yargs: 16.2.0
transitivePeerDependencies:
+ - encoding
- seedrandom
dev: false
@@ -2115,6 +2265,10 @@ packages:
resolution: {integrity: sha512-vEcX7S7aPhsBCivxMwAANQburHBtfN9RdyXFk84IJmu2Z4Hkg1tOFgaslRiEqqvoLtbCBi6ika1EMspE+NZ9Lg==}
dev: true
+ /@types/long@4.0.2:
+ resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
+ dev: false
+
/@types/mime@1.3.2:
resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==}
@@ -2135,6 +2289,10 @@ packages:
resolution: {integrity: sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==}
dev: false
+ /@types/offscreencanvas@2019.7.3:
+ resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==}
+ dev: false
+
/@types/pixi.js@5.0.0:
resolution: {integrity: sha512-yZqQBR043lRBlBZci2cx6hgmX0fvBfYIqFm6VThlnueXEjitxd3coy+BGsqsZ7+ary7O//+ks4aJRhC5MJoHqA==}
deprecated: This is a stub types definition. pixi.js provides its own type definitions, so you do not need this installed.
@@ -2165,6 +2323,10 @@ packages:
resolution: {integrity: sha512-YvMLqFak/7rt//lPBtEHv3M4sRNA+HGxrhFZ+DQs9K2IkYJbNwVIb8avtJfhDiuaUBX/AW0jnjv48FV8h3u9bQ==}
dev: false
+ /@types/seedrandom@2.4.34:
+ resolution: {integrity: sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==}
+ dev: false
+
/@types/send@0.17.1:
resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==}
dependencies:
@@ -2247,22 +2409,6 @@ packages:
'@types/yargs-parser': 21.0.0
dev: false
- /@typescript-eslint/experimental-utils@3.1.0(eslint@6.8.0)(typescript@3.9.10):
- resolution: {integrity: sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==}
- engines: {node: ^10.12.0 || >=12.0.0}
- peerDependencies:
- eslint: '*'
- dependencies:
- '@types/json-schema': 7.0.12
- '@typescript-eslint/typescript-estree': 3.1.0(typescript@3.9.10)
- eslint: 6.8.0
- eslint-scope: 5.1.1
- eslint-utils: 2.1.0
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
-
/@typescript-eslint/experimental-utils@3.1.0(eslint@7.32.0)(typescript@4.7.4):
resolution: {integrity: sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -2279,7 +2425,7 @@ packages:
- typescript
dev: true
- /@typescript-eslint/parser@3.1.0(eslint@6.8.0)(typescript@3.9.10):
+ /@typescript-eslint/parser@3.1.0(eslint@7.32.0)(typescript@4.7.4):
resolution: {integrity: sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==}
engines: {node: ^10.12.0 || >=12.0.0}
peerDependencies:
@@ -2290,36 +2436,50 @@ packages:
optional: true
dependencies:
'@types/eslint-visitor-keys': 1.0.0
- '@typescript-eslint/experimental-utils': 3.1.0(eslint@6.8.0)(typescript@3.9.10)
- '@typescript-eslint/typescript-estree': 3.1.0(typescript@3.9.10)
- eslint: 6.8.0
+ '@typescript-eslint/experimental-utils': 3.1.0(eslint@7.32.0)(typescript@4.7.4)
+ '@typescript-eslint/typescript-estree': 3.1.0(typescript@4.7.4)
+ eslint: 7.32.0
eslint-visitor-keys: 1.3.0
- typescript: 3.9.10
+ typescript: 4.7.4
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/parser@3.1.0(eslint@7.32.0)(typescript@4.7.4):
- resolution: {integrity: sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5):
+ resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
- eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
+ eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@types/eslint-visitor-keys': 1.0.0
- '@typescript-eslint/experimental-utils': 3.1.0(eslint@7.32.0)(typescript@4.7.4)
- '@typescript-eslint/typescript-estree': 3.1.0(typescript@4.7.4)
- eslint: 7.32.0
- eslint-visitor-keys: 1.3.0
- typescript: 4.7.4
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5)
+ '@typescript-eslint/visitor-keys': 6.21.0
+ debug: 4.3.4
+ eslint: 8.57.0
+ typescript: 5.4.5
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/typescript-estree@3.1.0(typescript@3.9.10):
+ /@typescript-eslint/scope-manager@6.21.0:
+ resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dependencies:
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
+ dev: true
+
+ /@typescript-eslint/types@6.21.0:
+ resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@3.1.0(typescript@4.7.4):
resolution: {integrity: sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==}
engines: {node: ^10.12.0 || >=12.0.0}
peerDependencies:
@@ -2334,33 +2494,46 @@ packages:
is-glob: 4.0.3
lodash: 4.17.21
semver: 7.5.1
- tsutils: 3.21.0(typescript@3.9.10)
- typescript: 3.9.10
+ tsutils: 3.21.0(typescript@4.7.4)
+ typescript: 4.7.4
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/typescript-estree@3.1.0(typescript@4.7.4):
- resolution: {integrity: sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5):
+ resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
+ engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
- eslint-visitor-keys: 1.3.0
- glob: 7.2.3
+ globby: 11.1.0
is-glob: 4.0.3
- lodash: 4.17.21
- semver: 7.5.1
- tsutils: 3.21.0(typescript@4.7.4)
- typescript: 4.7.4
+ minimatch: 9.0.3
+ semver: 7.6.0
+ ts-api-utils: 1.3.0(typescript@5.4.5)
+ typescript: 5.4.5
transitivePeerDependencies:
- supports-color
dev: true
+ /@typescript-eslint/visitor-keys@6.21.0:
+ resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
+ engines: {node: ^16.0.0 || >=18.0.0}
+ dependencies:
+ '@typescript-eslint/types': 6.21.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@ungap/structured-clone@1.2.0:
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ dev: true
+
/@webassemblyjs/ast@1.11.6:
resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==}
dependencies:
@@ -2452,6 +2625,10 @@ packages:
'@webassemblyjs/ast': 1.11.6
'@xtuc/long': 4.2.2
+ /@webgpu/types@0.1.38:
+ resolution: {integrity: sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==}
+ dev: false
+
/@webpack-cli/configtest@2.1.0(webpack-cli@5.1.1)(webpack@5.85.0):
resolution: {integrity: sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==}
engines: {node: '>=14.15.0'}
@@ -2526,6 +2703,14 @@ packages:
acorn: 7.4.1
dev: true
+ /acorn-jsx@5.3.2(acorn@8.11.3):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.11.3
+ dev: true
+
/acorn-walk@6.2.0:
resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==}
engines: {node: '>=0.4.0'}
@@ -2549,6 +2734,12 @@ packages:
hasBin: true
dev: true
+ /acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
/acorn@8.8.2:
resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
engines: {node: '>=0.4.0'}
@@ -2625,13 +2816,6 @@ packages:
engines: {node: '>=4'}
dev: false
- /ansi-escapes@4.3.2:
- resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
- engines: {node: '>=8'}
- dependencies:
- type-fest: 0.21.3
- dev: true
-
/ansi-html-community@0.0.8:
resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
engines: {'0': node >= 0.8.0}
@@ -2670,6 +2854,10 @@ packages:
engines: {node: '>=8'}
dependencies:
color-convert: 2.0.1
+
+ /ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
dev: true
/anymatch@2.0.0:
@@ -2692,6 +2880,9 @@ packages:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
sprintf-js: 1.0.3
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
/arr-diff@4.0.0:
@@ -2725,6 +2916,11 @@ packages:
/array-flatten@2.1.2:
resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==}
+ /array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
/array-unique@0.3.2:
resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
engines: {node: '>=0.10.0'}
@@ -2772,6 +2968,7 @@ packages:
/astral-regex@1.0.0:
resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==}
engines: {node: '>=4'}
+ dev: false
/astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
@@ -2967,25 +3164,6 @@ packages:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
dev: true
- /body-parser@1.20.1:
- resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- dependencies:
- bytes: 3.1.2
- content-type: 1.0.5
- debug: 2.6.9
- depd: 2.0.0
- destroy: 1.2.0
- http-errors: 2.0.0
- iconv-lite: 0.4.24
- on-finished: 2.4.1
- qs: 6.11.0
- raw-body: 2.5.1
- type-is: 1.6.18
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
-
/body-parser@1.20.2:
resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -3004,7 +3182,6 @@ packages:
unpipe: 1.0.0
transitivePeerDependencies:
- supports-color
- dev: true
/bonjour-service@1.1.1:
resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==}
@@ -3023,6 +3200,12 @@ packages:
balanced-match: 1.0.2
concat-map: 0.0.1
+ /brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
/braces@2.3.2:
resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
engines: {node: '>=0.10.0'}
@@ -3229,11 +3412,6 @@ packages:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- dev: true
-
- /chardet@0.7.0:
- resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
- dev: true
/chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
@@ -3280,18 +3458,6 @@ packages:
rimraf: 2.7.1
dev: true
- /cli-cursor@3.1.0:
- resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
- engines: {node: '>=8'}
- dependencies:
- restore-cursor: 3.1.0
- dev: true
-
- /cli-width@3.0.0:
- resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
- engines: {node: '>= 10'}
- dev: true
-
/cliui@4.1.0:
resolution: {integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==}
dependencies:
@@ -3308,6 +3474,14 @@ packages:
wrap-ansi: 5.1.0
dev: false
+ /cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: false
+
/clone-deep@4.0.1:
resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
engines: {node: '>=6'}
@@ -3358,14 +3532,12 @@ packages:
engines: {node: '>=7.0.0'}
dependencies:
color-name: 1.1.4
- dev: true
/color-name@1.1.3:
resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
/color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- dev: true
/color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
@@ -3493,8 +3665,8 @@ packages:
engines: {node: '>= 0.6'}
dev: true
- /cookie@0.5.0:
- resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ /cookie@0.6.0:
+ resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
/copy-descriptor@0.1.1:
@@ -3508,6 +3680,11 @@ packages:
browserslist: 4.21.7
dev: true
+ /core-js@3.29.1:
+ resolution: {integrity: sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==}
+ requiresBuild: true
+ dev: false
+
/core-js@3.6.4:
resolution: {integrity: sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==}
deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
@@ -3801,7 +3978,7 @@ packages:
supports-color:
optional: true
dependencies:
- ms: 2.1.1
+ ms: 2.1.3
supports-color: 6.0.0
dev: true
@@ -3939,6 +4116,13 @@ packages:
engines: {node: '>=0.3.1'}
dev: true
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
/dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dev: true
@@ -4059,7 +4243,6 @@ packages:
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
- dev: true
/emojis-list@3.0.0:
resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
@@ -4297,14 +4480,13 @@ packages:
source-map: 0.6.1
dev: false
- /eslint-config-prettier@6.11.0(eslint@7.32.0):
- resolution: {integrity: sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==}
+ /eslint-config-prettier@9.1.0(eslint@7.32.0):
+ resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
hasBin: true
peerDependencies:
- eslint: '>=3.14.1'
+ eslint: '>=7.0.0'
dependencies:
eslint: 7.32.0
- get-stdin: 6.0.0
dev: true
/eslint-loader@4.0.2(eslint@7.32.0)(webpack@5.85.0):
@@ -4324,16 +4506,25 @@ packages:
webpack: 5.85.0(webpack-cli@5.1.1)
dev: true
- /eslint-plugin-prettier@3.1.3(eslint@7.32.0)(prettier@1.18.2):
- resolution: {integrity: sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==}
- engines: {node: '>=6.0.0'}
+ /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@7.32.0)(prettier@3.2.5):
+ resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
- eslint: '>= 5.0.0'
- prettier: '>= 1.13.0'
+ '@types/eslint': '>=8.0.0'
+ eslint: '>=8.0.0'
+ eslint-config-prettier: '*'
+ prettier: '>=3.0.0'
+ peerDependenciesMeta:
+ '@types/eslint':
+ optional: true
+ eslint-config-prettier:
+ optional: true
dependencies:
eslint: 7.32.0
- prettier: 1.18.2
+ eslint-config-prettier: 9.1.0(eslint@7.32.0)
+ prettier: 3.2.5
prettier-linter-helpers: 1.0.0
+ synckit: 0.8.8
dev: true
/eslint-rule-composer@0.3.0:
@@ -4356,11 +4547,12 @@ packages:
esrecurse: 4.3.0
estraverse: 4.3.0
- /eslint-utils@1.4.3:
- resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==}
- engines: {node: '>=6'}
+ /eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- eslint-visitor-keys: 1.3.0
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
dev: true
/eslint-utils@2.1.0:
@@ -4380,110 +4572,107 @@ packages:
engines: {node: '>=10'}
dev: true
- /eslint@6.8.0:
- resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==}
- engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
+ /eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint@7.32.0:
+ resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==}
+ engines: {node: ^10.12.0 || >=12.0.0}
hasBin: true
dependencies:
- '@babel/code-frame': 7.21.4
+ '@babel/code-frame': 7.12.11
+ '@eslint/eslintrc': 0.4.3
+ '@humanwhocodes/config-array': 0.5.0
ajv: 6.12.6
- chalk: 2.4.2
- cross-spawn: 6.0.5
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
debug: 4.3.4
doctrine: 3.0.0
+ enquirer: 2.3.6
+ escape-string-regexp: 4.0.0
eslint-scope: 5.1.1
- eslint-utils: 1.4.3
- eslint-visitor-keys: 1.3.0
- espree: 6.2.1
+ eslint-utils: 2.1.0
+ eslint-visitor-keys: 2.1.0
+ espree: 7.3.1
esquery: 1.5.0
esutils: 2.0.3
- file-entry-cache: 5.0.1
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
functional-red-black-tree: 1.0.1
glob-parent: 5.1.2
- globals: 12.4.0
+ globals: 13.20.0
ignore: 4.0.6
import-fresh: 3.3.0
imurmurhash: 0.1.4
- inquirer: 7.3.3
is-glob: 4.0.3
js-yaml: 3.14.1
json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.3.0
- lodash: 4.17.21
+ levn: 0.4.1
+ lodash.merge: 4.6.2
minimatch: 3.1.2
- mkdirp: 0.5.6
natural-compare: 1.4.0
- optionator: 0.8.3
+ optionator: 0.9.1
progress: 2.0.3
- regexpp: 2.0.1
- semver: 6.3.0
- strip-ansi: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.5.1
+ strip-ansi: 6.0.1
strip-json-comments: 3.1.1
- table: 5.4.6
+ table: 6.8.1
text-table: 0.2.0
v8-compile-cache: 2.3.0
transitivePeerDependencies:
- supports-color
dev: true
- /eslint@7.32.0:
- resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ /eslint@8.57.0:
+ resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
- '@babel/code-frame': 7.12.11
- '@eslint/eslintrc': 0.4.3
- '@humanwhocodes/config-array': 0.5.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+ '@eslint-community/regexpp': 4.10.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.57.0
+ '@humanwhocodes/config-array': 0.11.14
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
debug: 4.3.4
doctrine: 3.0.0
- enquirer: 2.3.6
escape-string-regexp: 4.0.0
- eslint-scope: 5.1.1
- eslint-utils: 2.1.0
- eslint-visitor-keys: 2.1.0
- espree: 7.3.1
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
esquery: 1.5.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1
- functional-red-black-tree: 1.0.1
- glob-parent: 5.1.2
+ find-up: 5.0.0
+ glob-parent: 6.0.2
globals: 13.20.0
- ignore: 4.0.6
- import-fresh: 3.3.0
+ graphemer: 1.4.0
+ ignore: 5.3.1
imurmurhash: 0.1.4
is-glob: 4.0.3
- js-yaml: 3.14.1
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
- natural-compare: 1.4.0
- optionator: 0.9.1
- progress: 2.0.3
- regexpp: 3.2.0
- semver: 7.5.1
+ natural-compare: 1.4.0
+ optionator: 0.9.3
strip-ansi: 6.0.1
- strip-json-comments: 3.1.1
- table: 6.8.1
text-table: 0.2.0
- v8-compile-cache: 2.3.0
transitivePeerDependencies:
- supports-color
dev: true
- /espree@6.2.1:
- resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==}
- engines: {node: '>=6.0.0'}
- dependencies:
- acorn: 7.4.1
- acorn-jsx: 5.3.2(acorn@7.4.1)
- eslint-visitor-keys: 1.3.0
- dev: true
-
/espree@7.3.1:
resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -4493,6 +4682,15 @@ packages:
eslint-visitor-keys: 1.3.0
dev: true
+ /espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.11.3
+ acorn-jsx: 5.3.2(acorn@8.11.3)
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
/esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
@@ -4606,16 +4804,16 @@ packages:
- supports-color
dev: false
- /express@4.18.2:
- resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
+ /express@4.19.2:
+ resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
engines: {node: '>= 0.10.0'}
dependencies:
accepts: 1.3.8
array-flatten: 1.1.1
- body-parser: 1.20.1
+ body-parser: 1.20.2
content-disposition: 0.5.4
content-type: 1.0.5
- cookie: 0.5.0
+ cookie: 0.6.0
cookie-signature: 1.0.6
debug: 2.6.9
depd: 2.0.0
@@ -4662,15 +4860,6 @@ packages:
/extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- /external-editor@3.1.0:
- resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
- engines: {node: '>=4'}
- dependencies:
- chardet: 0.7.0
- iconv-lite: 0.4.24
- tmp: 0.0.33
- dev: true
-
/extglob@2.0.4:
resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
engines: {node: '>=0.10.0'}
@@ -4719,6 +4908,17 @@ packages:
resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
dev: true
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
/fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
@@ -4729,6 +4929,12 @@ packages:
resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
engines: {node: '>= 4.9.1'}
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
/faye-websocket@0.11.4:
resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
engines: {node: '>=0.8.0'}
@@ -4741,20 +4947,6 @@ packages:
bser: 2.1.1
dev: false
- /figures@3.2.0:
- resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
- engines: {node: '>=8'}
- dependencies:
- escape-string-regexp: 1.0.5
- dev: true
-
- /file-entry-cache@5.0.1:
- resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==}
- engines: {node: '>=4'}
- dependencies:
- flat-cache: 2.0.1
- dev: true
-
/file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -4859,13 +5051,12 @@ packages:
locate-path: 5.0.0
path-exists: 4.0.0
- /flat-cache@2.0.1:
- resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==}
- engines: {node: '>=4'}
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
dependencies:
- flatted: 2.0.2
- rimraf: 2.6.3
- write: 1.0.3
+ locate-path: 6.0.0
+ path-exists: 4.0.0
dev: true
/flat-cache@3.0.4:
@@ -5038,11 +5229,6 @@ packages:
has-proto: 1.0.1
has-symbols: 1.0.3
- /get-stdin@6.0.0:
- resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==}
- engines: {node: '>=4'}
- dev: true
-
/get-stream@4.1.0:
resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
engines: {node: '>=6'}
@@ -5077,6 +5263,13 @@ packages:
dependencies:
is-glob: 4.0.3
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
/glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
@@ -5105,13 +5298,6 @@ packages:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
- /globals@12.4.0:
- resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==}
- engines: {node: '>=8'}
- dependencies:
- type-fest: 0.8.1
- dev: true
-
/globals@13.20.0:
resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
engines: {node: '>=8'}
@@ -5125,6 +5311,18 @@ packages:
dependencies:
define-properties: 1.2.0
+ /globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.1
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
@@ -5133,6 +5331,10 @@ packages:
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ /graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
+
/growl@1.10.5:
resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==}
engines: {node: '>=4.x'}
@@ -5427,6 +5629,11 @@ packages:
engines: {node: '>= 4'}
dev: true
+ /ignore@5.3.1:
+ resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ engines: {node: '>= 4'}
+ dev: true
+
/image-size@0.5.5:
resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
engines: {node: '>=0.10.0'}
@@ -5510,25 +5717,6 @@ packages:
/inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- /inquirer@7.3.3:
- resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==}
- engines: {node: '>=8.0.0'}
- dependencies:
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- cli-cursor: 3.1.0
- cli-width: 3.0.0
- external-editor: 3.1.0
- figures: 3.2.0
- lodash: 4.17.21
- mute-stream: 0.0.8
- run-async: 2.4.1
- rxjs: 6.6.7
- string-width: 4.2.3
- strip-ansi: 6.0.1
- through: 2.3.8
- dev: true
-
/internal-slot@1.0.5:
resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
engines: {node: '>= 0.4'}
@@ -5728,7 +5916,6 @@ packages:
/is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
- dev: true
/is-generator-fn@2.1.0:
resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
@@ -5767,6 +5954,11 @@ packages:
engines: {node: '>=8'}
dev: true
+ /is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
/is-plain-obj@3.0.0:
resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
engines: {node: '>=10'}
@@ -6377,6 +6569,13 @@ packages:
esprima: 4.0.1
dev: true
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
/jsbn@0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
requiresBuild: true
@@ -6632,6 +6831,7 @@ packages:
dependencies:
prelude-ls: 1.1.2
type-check: 0.3.2
+ dev: false
/levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
@@ -6689,6 +6889,13 @@ packages:
dependencies:
p-locate: 4.1.0
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
dev: false
@@ -6755,6 +6962,10 @@ packages:
engines: {node: '>= 0.6.0'}
dev: true
+ /long@4.0.0:
+ resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==}
+ dev: false
+
/loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
@@ -6873,6 +7084,11 @@ packages:
/merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
/methods@1.1.2:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
@@ -6957,6 +7173,13 @@ packages:
dependencies:
brace-expansion: 1.1.11
+ /minimatch@9.0.3:
+ resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
/minimist@0.0.10:
resolution: {integrity: sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==}
dev: true
@@ -7090,10 +7313,6 @@ packages:
dns-packet: 5.6.0
thunky: 1.1.0
- /mute-stream@0.0.8:
- resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
- dev: true
-
/nan@2.17.0:
resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==}
requiresBuild: true
@@ -7158,6 +7377,18 @@ packages:
engines: {node: 4.x || >=6.0.0}
dev: false
+ /node-fetch@2.6.13:
+ resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: false
+
/node-forge@1.3.1:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
engines: {node: '>= 6.13.0'}
@@ -7386,6 +7617,7 @@ packages:
prelude-ls: 1.1.2
type-check: 0.3.2
word-wrap: 1.2.3
+ dev: false
/optionator@0.9.1:
resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
@@ -7399,6 +7631,18 @@ packages:
word-wrap: 1.2.3
dev: true
+ /optionator@0.9.3:
+ resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ '@aashutoshrathi/word-wrap': 1.2.6
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
/os-locale@3.1.0:
resolution: {integrity: sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==}
engines: {node: '>=6'}
@@ -7440,6 +7684,13 @@ packages:
dependencies:
p-try: 2.2.0
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
/p-locate@3.0.0:
resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
engines: {node: '>=6'}
@@ -7452,6 +7703,13 @@ packages:
dependencies:
p-limit: 2.3.0
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
/p-reduce@1.0.0:
resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==}
engines: {node: '>=4'}
@@ -7564,6 +7822,11 @@ packages:
pify: 3.0.0
dev: false
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
/performance-now@2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
requiresBuild: true
@@ -7986,28 +8249,37 @@ packages:
/prelude-ls@1.1.2:
resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
engines: {node: '>= 0.8.0'}
+ dev: false
/prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
dev: true
- /prettier-eslint@10.1.1:
- resolution: {integrity: sha512-TtYxuFUMVxudJTSnPScaBqHZm/48ndvX3KLFzhejJYbRzRybmM9RdBfn9YzgN0itfPrYxCesIZGJqyXXZJOR2w==}
- engines: {node: '>=8.0.0'}
+ /prettier-eslint@16.3.0:
+ resolution: {integrity: sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==}
+ engines: {node: '>=16.10.0'}
+ peerDependencies:
+ prettier-plugin-svelte: ^3.0.0
+ svelte-eslint-parser: '*'
+ peerDependenciesMeta:
+ prettier-plugin-svelte:
+ optional: true
+ svelte-eslint-parser:
+ optional: true
dependencies:
- '@typescript-eslint/parser': 3.1.0(eslint@6.8.0)(typescript@3.9.10)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
common-tags: 1.8.2
dlv: 1.1.3
- eslint: 6.8.0
+ eslint: 8.57.0
indent-string: 4.0.0
lodash.merge: 4.6.2
loglevel-colored-level-prefix: 1.0.0
- prettier: 1.18.2
- pretty-format: 23.6.0
+ prettier: 3.2.5
+ pretty-format: 29.7.0
require-relative: 0.8.7
- typescript: 3.9.10
- vue-eslint-parser: 7.1.1(eslint@6.8.0)
+ typescript: 5.4.5
+ vue-eslint-parser: 9.4.2(eslint@8.57.0)
transitivePeerDependencies:
- supports-color
dev: true
@@ -8019,9 +8291,9 @@ packages:
fast-diff: 1.3.0
dev: true
- /prettier@1.18.2:
- resolution: {integrity: sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==}
- engines: {node: '>=4'}
+ /prettier@3.2.5:
+ resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
+ engines: {node: '>=14'}
hasBin: true
dev: true
@@ -8032,13 +8304,6 @@ packages:
renderkid: 3.0.0
dev: false
- /pretty-format@23.6.0:
- resolution: {integrity: sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==}
- dependencies:
- ansi-regex: 3.0.1
- ansi-styles: 3.2.1
- dev: true
-
/pretty-format@24.9.0:
resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==}
engines: {node: '>= 6'}
@@ -8049,6 +8314,15 @@ packages:
react-is: 16.13.1
dev: false
+ /pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
/process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
@@ -8133,6 +8407,10 @@ packages:
engines: {node: '>=0.4.x'}
deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
/randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
dependencies:
@@ -8142,15 +8420,6 @@ packages:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
- /raw-body@2.5.1:
- resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
- engines: {node: '>= 0.8'}
- dependencies:
- bytes: 3.1.2
- http-errors: 2.0.0
- iconv-lite: 0.4.24
- unpipe: 1.0.0
-
/raw-body@2.5.2:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
@@ -8159,12 +8428,15 @@ packages:
http-errors: 2.0.0
iconv-lite: 0.4.24
unpipe: 1.0.0
- dev: true
/react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: false
+ /react-is@18.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ dev: true
+
/read-pkg-up@4.0.0:
resolution: {integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==}
engines: {node: '>=6'}
@@ -8233,7 +8505,6 @@ packages:
/regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
- dev: true
/regenerator-transform@0.15.1:
resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==}
@@ -8257,11 +8528,6 @@ packages:
define-properties: 1.2.0
functions-have-names: 1.2.3
- /regexpp@2.0.1:
- resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==}
- engines: {node: '>=6.5.0'}
- dev: true
-
/regexpp@3.2.0:
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
engines: {node: '>=8'}
@@ -8439,14 +8705,6 @@ packages:
mini-signals: 1.2.0
parse-uri: 1.0.7
- /restore-cursor@3.1.0:
- resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
- engines: {node: '>=8'}
- dependencies:
- onetime: 5.1.2
- signal-exit: 3.0.7
- dev: true
-
/ret@0.1.15:
resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
engines: {node: '>=0.12'}
@@ -8456,6 +8714,11 @@ packages:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'}
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
/rfdc@1.3.0:
resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
dev: true
@@ -8468,13 +8731,6 @@ packages:
resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==}
dev: true
- /rimraf@2.6.3:
- resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
- hasBin: true
- dependencies:
- glob: 7.2.3
- dev: true
-
/rimraf@2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
hasBin: true
@@ -8492,16 +8748,10 @@ packages:
engines: {node: 6.* || >= 7.*}
dev: false
- /run-async@2.4.1:
- resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
- engines: {node: '>=0.12.0'}
- dev: true
-
- /rxjs@6.6.7:
- resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
- engines: {npm: '>=2.0.0'}
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
- tslib: 1.14.1
+ queue-microtask: 1.2.3
dev: true
/safe-array-concat@1.0.0:
@@ -8612,8 +8862,8 @@ packages:
resolution: {integrity: sha512-2CkZ9Wn2dS4mMUWQaXLsOAfGD+irMlLEeSP3cMxpGbgyOOzJGFa+MWCOMTOCMyZinHRPxyOj/S/C57li/1to6Q==}
dev: false
- /seedrandom@2.4.4:
- resolution: {integrity: sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==}
+ /seedrandom@3.0.5:
+ resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==}
dev: false
/select-hose@2.0.0:
@@ -8646,6 +8896,14 @@ packages:
lru-cache: 6.0.0
dev: true
+ /semver@7.6.0:
+ resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
/send@0.18.0:
resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
engines: {node: '>= 0.8.0'}
@@ -8788,13 +9046,9 @@ packages:
engines: {node: '>=6'}
dev: false
- /slice-ansi@2.1.0:
- resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==}
- engines: {node: '>=6'}
- dependencies:
- ansi-styles: 3.2.1
- astral-regex: 1.0.0
- is-fullwidth-code-point: 2.0.0
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
dev: true
/slice-ansi@4.0.0:
@@ -9020,7 +9274,6 @@ packages:
/sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
- dev: true
/sshpk@1.17.0:
resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
@@ -9125,7 +9378,6 @@ packages:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
- dev: true
/string.prototype.trim@1.2.7:
resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
@@ -9254,7 +9506,6 @@ packages:
engines: {node: '>=8'}
dependencies:
has-flag: 4.0.0
- dev: true
/supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
@@ -9291,14 +9542,12 @@ packages:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: false
- /table@5.4.6:
- resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==}
- engines: {node: '>=6.0.0'}
+ /synckit@0.8.8:
+ resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
- ajv: 6.12.6
- lodash: 4.17.21
- slice-ansi: 2.1.0
- string-width: 3.1.0
+ '@pkgr/core': 0.1.1
+ tslib: 2.6.2
dev: true
/table@6.8.1:
@@ -9367,10 +9616,6 @@ packages:
resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==}
dev: false
- /through@2.3.8:
- resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
- dev: true
-
/thunky@1.1.0:
resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==}
@@ -9442,12 +9687,25 @@ packages:
psl: 1.9.0
punycode: 2.3.0
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ dev: false
+
/tr46@1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
dependencies:
punycode: 2.3.0
dev: false
+ /ts-api-utils@1.3.0(typescript@5.4.5):
+ resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+ dependencies:
+ typescript: 5.4.5
+ dev: true
+
/ts-loader@9.4.3(typescript@4.7.4)(webpack@5.85.0):
resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==}
engines: {node: '>=12.0.0'}
@@ -9468,17 +9726,6 @@ packages:
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
- dev: false
-
- /tsutils@3.21.0(typescript@3.9.10):
- resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
- engines: {node: '>= 6'}
- peerDependencies:
- typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
- dependencies:
- tslib: 1.14.1
- typescript: 3.9.10
- dev: true
/tsutils@3.21.0(typescript@4.7.4):
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
@@ -9505,6 +9752,7 @@ packages:
engines: {node: '>= 0.8.0'}
dependencies:
prelude-ls: 1.1.2
+ dev: false
/type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@@ -9526,16 +9774,6 @@ packages:
engines: {node: '>=10'}
dev: true
- /type-fest@0.21.3:
- resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
- engines: {node: '>=10'}
- dev: true
-
- /type-fest@0.8.1:
- resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
- engines: {node: '>=8'}
- dev: true
-
/type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
@@ -9555,15 +9793,15 @@ packages:
engines: {node: '>= 10'}
dev: false
- /typescript@3.9.10:
- resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==}
+ /typescript@4.7.4:
+ resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: true
- /typescript@4.7.4:
- resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
- engines: {node: '>=4.2.0'}
+ /typescript@5.4.5:
+ resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
+ engines: {node: '>=14.17'}
hasBin: true
dev: true
@@ -9778,19 +10016,20 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /vue-eslint-parser@7.1.1(eslint@6.8.0):
- resolution: {integrity: sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==}
- engines: {node: '>=8.10'}
+ /vue-eslint-parser@9.4.2(eslint@8.57.0):
+ resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==}
+ engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
- eslint: '>=5.0.0'
+ eslint: '>=6.0.0'
dependencies:
debug: 4.3.4
- eslint: 6.8.0
- eslint-scope: 5.1.1
- eslint-visitor-keys: 1.3.0
- espree: 6.2.1
+ eslint: 8.57.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
esquery: 1.5.0
lodash: 4.17.21
+ semver: 7.5.1
transitivePeerDependencies:
- supports-color
dev: true
@@ -9820,6 +10059,10 @@ packages:
dependencies:
minimalistic-assert: 1.0.1
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: false
+
/webidl-conversions@4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
dev: false
@@ -9897,7 +10140,7 @@ packages:
compression: 1.7.4
connect-history-api-fallback: 2.0.0
default-gateway: 6.0.3
- express: 4.18.2
+ express: 4.19.2
graceful-fs: 4.2.11
html-entities: 2.3.3
http-proxy-middleware: 2.0.6(@types/express@4.17.17)
@@ -10033,6 +10276,13 @@ packages:
resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==}
dev: false
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: false
+
/whatwg-url@6.5.0:
resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==}
dependencies:
@@ -10131,6 +10381,15 @@ packages:
strip-ansi: 5.2.0
dev: false
+ /wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: false
+
/wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
@@ -10142,13 +10401,6 @@ packages:
signal-exit: 3.0.7
dev: false
- /write@1.0.3:
- resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==}
- engines: {node: '>=4'}
- dependencies:
- mkdirp: 0.5.6
- dev: true
-
/ws@3.3.3:
resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==}
peerDependencies:
@@ -10220,6 +10472,11 @@ packages:
/y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+ /y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: false
+
/yallist@2.1.2:
resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
dev: true
@@ -10256,6 +10513,11 @@ packages:
decamelize: 1.2.0
dev: false
+ /yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+ dev: false
+
/yargs-unparser@1.5.0:
resolution: {integrity: sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==}
engines: {node: '>=6'}
@@ -10313,5 +10575,23 @@ packages:
yargs-parser: 13.1.2
dev: false
+ /yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.1.1
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.9
+ dev: false
+
/yeast@0.1.2:
resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==}
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
diff --git a/src/class/AILearning.js b/src/class/AILearning.js
index 8276cdb51b..1c3bea6660 100644
--- a/src/class/AILearning.js
+++ b/src/class/AILearning.js
@@ -2,7 +2,7 @@ import TextLearning, { classes as TextClasses } from './learning/TextLearning';
import Cluster, { classes as ClusterClasses } from './learning/Cluster';
import Regression, { classes as RegressionClasses } from './learning/Regression';
import ImageLearning, { classes as ImageClasses } from './learning/ImageLearning';
-import Classification, { classes as ClassificationClasses } from './learning/Classification';
+import SpeechClassification, { classes as SpeechClasses } from './learning/SpeechClassification';
import NumberClassification, {
classes as NumberClassificationClasses,
} from './learning/NumberClassification';
@@ -13,12 +13,33 @@ import LogisticRegression, {
import Svm, { classes as SvmClasses } from './learning/Svm';
import DataTable from './DataTable';
+import blockAiLearning from '../playground/blocks/block_ai_learning';
+import blockAiLearningKnn from '../playground/blocks/block_ai_learning_knn';
+import blockAiLearningCluster from '../playground/blocks/block_ai_learning_cluster';
+import blockAiLearningRegression from '../playground/blocks/block_ai_learning_regression';
+// eslint-disable-next-line max-len
+import blockAiLearningLogisticRegression from '../playground/blocks/block_ai_learning_logistic_regression';
+import blockAiLearningDecisiontree from '../playground/blocks/block_ai_learning_decisiontree';
+import blockAiLearningSvm from '../playground/blocks/block_ai_learning_svm';
+import blockAiUtilizeMediaPipe from '../playground/blocks/block_ai_utilize_media_pipe';
+
+const basicBlockList = [
+ blockAiLearning,
+ blockAiLearningKnn,
+ blockAiLearningCluster,
+ blockAiLearningRegression,
+ blockAiLearningLogisticRegression,
+ blockAiLearningDecisiontree,
+ blockAiLearningSvm,
+ blockAiUtilizeMediaPipe,
+];
+
const banClasses = [
...ClusterClasses,
...RegressionClasses,
...TextClasses,
...ImageClasses,
- ...ClassificationClasses,
+ ...SpeechClasses,
...NumberClassificationClasses,
...DecisionTreeClasses,
...LogisticRegressionClasses,
@@ -40,6 +61,7 @@ export default class AILearning {
#recordTime = 2000;
#module = null;
#tableData = null;
+ #dataApi = undefined;
constructor(playground, isEnable = true) {
this.#playground = playground;
@@ -50,6 +72,20 @@ export default class AILearning {
return this.#labels;
}
+ init() {
+ const blockObject = {};
+ basicBlockList.forEach((value) => {
+ if ('getBlocks' in value) {
+ Object.assign(blockObject, value.getBlocks());
+ }
+ });
+ Entry.block = Object.assign(Entry.block, blockObject);
+ }
+
+ setDataApi(api) {
+ this.#dataApi = api;
+ }
+
removeAllBlocks() {
const utilizeBlock = [];
Object.values(Entry.ALL_AI_UTILIZE_BLOCK_LIST)
@@ -89,14 +125,14 @@ export default class AILearning {
this.destroy();
}
- load(modelInfo) {
+ async load(modelInfo) {
const {
- url,
labels,
type,
classes = [],
model,
id,
+ url,
_id,
isActive = true,
name,
@@ -105,8 +141,12 @@ export default class AILearning {
tableData,
result,
} = modelInfo || {};
-
- if (!url || !this.isEnable || !isActive) {
+ if (!this.#dataApi) {
+ console.log('there is no dataApi');
+ return;
+ }
+ const modelPath = await this.#dataApi?.getModelDownloadUrl(url);
+ if (!modelPath || !this.isEnable || !isActive) {
return;
}
this.destroy();
@@ -126,19 +166,22 @@ export default class AILearning {
if (type === 'text') {
this.#module = new TextLearning({
- url,
+ url: modelPath,
labels: this.#labels,
type,
- recordTime,
+ modelId: this.#modelId,
+ loadModel: this.#dataApi?.loadModel,
});
} else if (type === 'number') {
this.#tableData = tableData || createDataTable(classes, name);
this.#module = new NumberClassification({
name,
result,
- url,
+ url: modelPath,
trainParam,
table: this.#tableData,
+ modelId: this.#modelId,
+ loadModel: this.#dataApi?.loadModel,
});
this.#labels = this.#module.getLabels();
} else if (type === 'cluster') {
@@ -154,19 +197,19 @@ export default class AILearning {
this.#module = new Regression({
name,
result,
- url,
+ url: modelPath,
trainParam,
table: this.#tableData,
});
} else if (type === 'image') {
this.#module = new ImageLearning({
- url,
+ url: modelPath,
labels: this.#labels,
type,
});
} else if (type === 'speech') {
- this.#module = new Classification({
- url,
+ this.#module = new SpeechClassification({
+ url: modelPath,
labels: this.#labels,
type,
recordTime,
@@ -176,7 +219,7 @@ export default class AILearning {
this.#module = new LogisticRegression({
name,
result,
- url,
+ url: modelPath,
trainParam,
table: this.#tableData,
});
@@ -185,18 +228,22 @@ export default class AILearning {
this.#module = new DecisionTree({
name,
result,
- url,
+ url: modelPath,
trainParam,
table: this.#tableData,
+ modelId: this.#modelId,
+ loadModel: this.#dataApi?.loadModel,
});
} else if (type === 'svm') {
this.#tableData = tableData || createDataTable(classes, name);
this.#module = new Svm({
name,
result,
- url,
+ url: modelPath,
trainParam,
table: this.#tableData,
+ modelId: this.#modelId,
+ loadModel: this.#dataApi?.loadModel,
});
}
diff --git a/src/class/AIUtilize.js b/src/class/AIUtilize.js
index 9867df5089..5da0e6d247 100644
--- a/src/class/AIUtilize.js
+++ b/src/class/AIUtilize.js
@@ -1,10 +1,34 @@
import ExtraBlockUtils from '../util/extrablockUtils';
+import '../playground/blocks/block_ai_utilize_audio';
+import '../playground/blocks/block_ai_utilize_tts';
+import '../playground/blocks/block_ai_utilize_translate';
+import '../playground/blocks/block_ai_utilize_video';
+import '../playground/blocks/block_ai_utilize_gesture_recognition';
+import '../playground/blocks/block_ai_utilize_pose_landmarker';
+import '../playground/blocks/block_ai_utilize_face_landmarker';
+import '../playground/blocks/block_ai_utilize_object_detector';
export default class AIUtilize {
constructor(playground) {
this.playground = playground;
}
+ init() {
+ const blockObject = {};
+ Object.entries(Entry.AI_UTILIZE_BLOCK).forEach(([key, value]) => {
+ if (key === 'video') {
+ Entry.AI_UTILIZE_BLOCK_LIST_DEPRECATED.video = value;
+ } else {
+ Entry.AI_UTILIZE_BLOCK_LIST[key] = value;
+ }
+ Entry.ALL_AI_UTILIZE_BLOCK_LIST[key] = value;
+ if ('getBlocks' in value) {
+ Object.assign(blockObject, value.getBlocks());
+ }
+ });
+ Entry.block = Object.assign(Entry.block, blockObject);
+ }
+
banAllAIUtilizeBlock() {
ExtraBlockUtils.banAllBlocks(this.playground, Entry.ALL_AI_UTILIZE_BLOCK_LIST);
}
diff --git a/src/class/Expansion.js b/src/class/Expansion.js
index 95daba0f0b..071f9ec419 100644
--- a/src/class/Expansion.js
+++ b/src/class/Expansion.js
@@ -1,10 +1,25 @@
import ExtraBlockUtils from '../util/extrablockUtils';
+import '../playground/blocks/block_expansion_weather';
+import '../playground/blocks/block_expansion_festival';
+import '../playground/blocks/block_expansion_behaviorconduct_disaster';
+import '../playground/blocks/block_expansion_behaviorconduct_lifesafety';
export default class Expansion {
constructor(playground) {
this.playground = playground;
}
+ async init() {
+ const blockObject = {};
+ Object.entries(Entry.EXPANSION_BLOCK).forEach(([key, value]) => {
+ Entry.EXPANSION_BLOCK_LIST[key] = value;
+ if ('getBlocks' in value) {
+ Object.assign(blockObject, value.getBlocks());
+ }
+ });
+ Entry.block = Object.assign(Entry.block, blockObject);
+ }
+
banAllExpansionBlock() {
ExtraBlockUtils.banAllBlocks(this.playground, Entry.EXPANSION_BLOCK_LIST);
}
diff --git a/src/class/container.js b/src/class/container.js
index ce31d3a6d8..21f3d15924 100644
--- a/src/class/container.js
+++ b/src/class/container.js
@@ -196,6 +196,7 @@ Entry.Container = class Container {
border: 'solid 1px #728997',
},
onDragActionChange: (isDragging, key) => {
+ Entry.ContextMenu.hide();
if (isDragging) {
this.selectedObject.setObjectFold(isDragging, true);
} else {
diff --git a/src/class/hardware/bluetoothServices/index.ts b/src/class/hardware/bluetoothServices/index.ts
index 6705f44c61..defd4f00d2 100644
--- a/src/class/hardware/bluetoothServices/index.ts
+++ b/src/class/hardware/bluetoothServices/index.ts
@@ -14,18 +14,21 @@ import { UartService } from './services/uart';
export const getServiceClassesByModuleId = (moduleId: string) => {
switch (moduleId) {
case '220302':
- return [
- DeviceInformationService,
- ButtonService,
- LedService,
- TemperatureService,
- AccelerometerService,
- MagnetometerService,
- UartService,
- EventService,
- DfuControlService,
- IoPinService,
- ];
+ {
+ // INFO : entryjs minify 과정에서 function.name 값이 uglify되는 이슈 대응
+ return [
+ DeviceInformationService,
+ ButtonService,
+ LedService,
+ TemperatureService,
+ AccelerometerService,
+ MagnetometerService,
+ UartService,
+ EventService,
+ DfuControlService,
+ IoPinService,
+ ];
+ }
break;
}
};
diff --git a/src/class/hardware/bluetoothServices/services/accelerometer.ts b/src/class/hardware/bluetoothServices/services/accelerometer.ts
index ab86a1a98e..e6007e38ea 100755
--- a/src/class/hardware/bluetoothServices/services/accelerometer.ts
+++ b/src/class/hardware/bluetoothServices/services/accelerometer.ts
@@ -81,6 +81,7 @@ export interface AccelerometerEvents {
export class AccelerometerService extends (EventDispatcher as new () => TypedDispatcher<
AccelerometerEvents
>) {
+ public static serviceName = 'AccelerometerService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/button.ts b/src/class/hardware/bluetoothServices/services/button.ts
index bad8b43f50..cfb0ada33d 100755
--- a/src/class/hardware/bluetoothServices/services/button.ts
+++ b/src/class/hardware/bluetoothServices/services/button.ts
@@ -78,6 +78,7 @@ export interface ButtonEvents {
* Button Service
*/
export class ButtonService extends (EventDispatcher as new () => TypedDispatcher) {
+ public static serviceName = 'ButtonService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/device-information.ts b/src/class/hardware/bluetoothServices/services/device-information.ts
index f5ad3cb9dd..acd8eb8f61 100755
--- a/src/class/hardware/bluetoothServices/services/device-information.ts
+++ b/src/class/hardware/bluetoothServices/services/device-information.ts
@@ -66,6 +66,7 @@ export interface DeviceInformation {
* Device Information Service
*/
export class DeviceInformationService {
+ public static serviceName = 'DeviceInformationService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/dfu-control.ts b/src/class/hardware/bluetoothServices/services/dfu-control.ts
index 5f73043d1a..3c939b5389 100755
--- a/src/class/hardware/bluetoothServices/services/dfu-control.ts
+++ b/src/class/hardware/bluetoothServices/services/dfu-control.ts
@@ -36,6 +36,7 @@ export enum DfuCharacteristic {
* @hidden
*/
export class DfuControlService {
+ public static serviceName = 'DfuControlService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/event.ts b/src/class/hardware/bluetoothServices/services/event.ts
index 584b447e77..1bf4a9fffb 100755
--- a/src/class/hardware/bluetoothServices/services/event.ts
+++ b/src/class/hardware/bluetoothServices/services/event.ts
@@ -76,6 +76,7 @@ export interface MicrobitEvents {
* Event Service
*/
export class EventService extends (EventDispatcher as new () => TypedDispatcher) {
+ public static serviceName = 'EventService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/io-pin.ts b/src/class/hardware/bluetoothServices/services/io-pin.ts
index 7d3086d965..c2891e674e 100755
--- a/src/class/hardware/bluetoothServices/services/io-pin.ts
+++ b/src/class/hardware/bluetoothServices/services/io-pin.ts
@@ -108,6 +108,7 @@ export interface IoPinEvents {
* @hidden
*/
export class IoPinService extends (EventDispatcher as new () => TypedDispatcher) {
+ public static serviceName = 'IoPinService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/led.ts b/src/class/hardware/bluetoothServices/services/led.ts
index e921c23c35..8bd2046035 100755
--- a/src/class/hardware/bluetoothServices/services/led.ts
+++ b/src/class/hardware/bluetoothServices/services/led.ts
@@ -49,6 +49,7 @@ export type LedMatrix = [
* LED Service
*/
export class LedService {
+ public static serviceName = 'LedService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/magnetometer.ts b/src/class/hardware/bluetoothServices/services/magnetometer.ts
index 85d13976ba..6ea57a39f3 100755
--- a/src/class/hardware/bluetoothServices/services/magnetometer.ts
+++ b/src/class/hardware/bluetoothServices/services/magnetometer.ts
@@ -113,6 +113,7 @@ export interface MagnetometerEvents {
export class MagnetometerService extends (EventDispatcher as new () => TypedDispatcher<
MagnetometerEvents
>) {
+ public static serviceName = 'MagnetometerService';
/**
* @hidden
*/
@@ -228,10 +229,9 @@ export class MagnetometerService extends (EventDispatcher as new () => TypedDisp
private magnetometerCalibrationChangedHandler(event: Event) {
const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;
if (view.byteLength === 1) {
- this.dispatchEvent(
- 'magnetometercalibrationchanged',
- view.getUint8(0) as MagnetometerCalibration
- );
+ this.dispatchEvent('magnetometercalibrationchanged', view.getUint8(
+ 0
+ ) as MagnetometerCalibration);
}
}
diff --git a/src/class/hardware/bluetoothServices/services/temperature.ts b/src/class/hardware/bluetoothServices/services/temperature.ts
index 73e5c3ebc7..6d19370790 100755
--- a/src/class/hardware/bluetoothServices/services/temperature.ts
+++ b/src/class/hardware/bluetoothServices/services/temperature.ts
@@ -58,6 +58,7 @@ export interface TemperatureEvents {
export class TemperatureService extends (EventDispatcher as new () => TypedDispatcher<
TemperatureEvents
>) {
+ public static serviceName = 'TemperatureService';
/**
* @hidden
*/
diff --git a/src/class/hardware/bluetoothServices/services/uart.ts b/src/class/hardware/bluetoothServices/services/uart.ts
index a45398fc97..b2ecbf0988 100755
--- a/src/class/hardware/bluetoothServices/services/uart.ts
+++ b/src/class/hardware/bluetoothServices/services/uart.ts
@@ -60,6 +60,7 @@ export interface UartEvents {
* UART Service
*/
export class UartService extends (EventDispatcher as new () => TypedDispatcher) {
+ public static serviceName = 'UartService';
/**
* @hidden
*/
diff --git a/src/class/hardware/webBluetoothConnector.ts b/src/class/hardware/webBluetoothConnector.ts
index 97bcb64005..05810d927e 100644
--- a/src/class/hardware/webBluetoothConnector.ts
+++ b/src/class/hardware/webBluetoothConnector.ts
@@ -62,7 +62,7 @@ export default class WebBluetoothConnector extends WebApiConnector {
for (const primaryService of primaryServices) {
for (const serviceClass of this.serviceClasses) {
if (primaryService.uuid === serviceClass.uuid) {
- this.services[serviceClass.name] = await serviceClass.create(primaryService);
+ this.services[serviceClass.serviceName] = await serviceClass.create(primaryService);
}
}
}
diff --git a/src/class/learning/Classification.js b/src/class/learning/Classification.js
deleted file mode 100644
index 98c7a5c2ac..0000000000
--- a/src/class/learning/Classification.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import InputPopup from './InputPopup';
-
-export const classes = ['ai_learning_speech'];
-
-class Classification {
- #type = null;
- #url = '';
- #labels = [];
- #recordTime = 2000;
- #popup = null;
-
- constructor({ url, labels, type, recordTime }) {
- this.#type = type;
- this.#url = url;
- this.#labels = labels;
- this.#recordTime = recordTime;
- }
-
- getResult(index) {
- const result = this.#popup?.result || [];
- const defaultResult = { probability: 0, className: '' };
- if (index !== undefined && index > -1) {
- return (
- result.find(({ className }) => className === this.#labels[index]) || defaultResult
- );
- }
- return result[0] || defaultResult;
- }
-
- unbanBlocks(blockMenu) {
- blockMenu.unbanClass(`ai_learning_classification`);
- if (this.#type) {
- blockMenu.unbanClass(`ai_learning_${this.#type}`);
- }
- }
-
- openInputPopup() {
- this.#popup = new InputPopup({
- url: this.#url,
- labels: this.#labels,
- type: this.#type,
- recordTime: this.#recordTime,
- });
- this.#popup.open();
- }
-}
-
-export default Classification;
diff --git a/src/class/learning/Cluster.js b/src/class/learning/Cluster.js
index e6a4e1ae15..7389bd1794 100644
--- a/src/class/learning/Cluster.js
+++ b/src/class/learning/Cluster.js
@@ -135,7 +135,10 @@ class Cluster {
}
setTrainOption(type, value) {
- this.#trainParam[type] = value;
+ this.#trainParam = {
+ ...this.#trainParam,
+ [type]: value,
+ };
}
getTrainOption() {
diff --git a/src/class/learning/DecisionTree.js b/src/class/learning/DecisionTree.js
index afdb3d2e39..8fb2fdb715 100644
--- a/src/class/learning/DecisionTree.js
+++ b/src/class/learning/DecisionTree.js
@@ -9,7 +9,6 @@ import LearningBase from './LearningBase';
import { DecisionTreeClassifier as DTClassifier } from 'ml-cart';
import Utils from './Utils';
import Chart from './Chart';
-const { callApi } = require('../../util/common');
export const classes = [
'ai_learning_train',
@@ -25,11 +24,12 @@ export const classes = [
class DecisionTree extends LearningBase {
type = 'decisiontree';
- init({ name, url, result, table, trainParam }) {
+ init({ name, url, result, table, trainParam, modelId, loadModel }) {
this.name = name;
this.trainParam = trainParam;
this.result = result;
this.table = table;
+ this.loadModel = loadModel;
this.trainCallback = (value) => {
this.view.setValue(value);
};
@@ -38,7 +38,11 @@ class DecisionTree extends LearningBase {
this.fields = table?.select?.[0]?.map((index) => table?.fields[index]);
this.predictFields = table?.select?.[1]?.map((index) => table?.fields[index]);
- this.load(`/uploads/${url}/model.json`);
+ if (this.url !== url || this.modelId !== modelId) {
+ this.load(url, modelId);
+ this.url = url;
+ this.modelId = modelId;
+ }
if (!Utils.isWebGlSupport()) {
tf.setBackend('cpu');
}
@@ -121,8 +125,11 @@ class DecisionTree extends LearningBase {
};
}
- async load(url) {
- const { data } = await callApi(url, { url });
+ async load(url, modelId) {
+ const data = await this.loadModel({ url, modelId });
+ if (!data) {
+ return;
+ }
const { model, result } = data;
this.model = DTClassifier.load(model);
this.valueMap = result?.valueMap;
diff --git a/src/class/learning/ImageLearning.js b/src/class/learning/ImageLearning.js
index e636337163..312c50470a 100644
--- a/src/class/learning/ImageLearning.js
+++ b/src/class/learning/ImageLearning.js
@@ -1,4 +1,3 @@
-import InputPopup from './InputPopup';
import * as tf from '@tensorflow/tfjs';
import VideoUtils from '../../util/videoUtils';
import MediaPipeUtils from '../../util/mediaPipeUtils';
@@ -22,7 +21,7 @@ class ImageLearning {
this.#type = type;
this.#url = url;
this.#labels = labels;
- this.load(`/uploads/${url}/model.json`);
+ this.load(url);
Entry.addEventListener('stop', () => {
this.#result = [];
this.#isPredicting = false;
@@ -32,6 +31,10 @@ class ImageLearning {
}
}
+ get labels() {
+ return this.#labels;
+ }
+
getResult(index) {
const result = this.#result.length ? this.#result : this.#popup?.result || [];
const defaultResult = { probability: 0, className: '' };
@@ -51,12 +54,17 @@ class ImageLearning {
}
openInputPopup() {
- this.#popup = new InputPopup({
+ Entry.dispatchEvent('openMLInputPopup', {
+ type: 'image',
+ predict: async (canvas) => {
+ this.#result = await this.predict(canvas);
+ },
url: this.#url,
labels: this.#labels,
- type: this.#type,
+ setResult: (result) => {
+ this.#result = result;
+ },
});
- this.#popup.open();
}
getVideo() {
@@ -88,17 +96,22 @@ class ImageLearning {
const context = this.#captureCanvas.getContext('2d');
context.drawImage(video, 0, 0, SIZE, SIZE);
- tf.engine().startScope();
- const tensor = await this.preprocess(this.#captureCanvas);
- const logits = this.model.predict(tensor);
- this.#result = await this.namePredictions(logits);
- logits.dispose();
- tf.engine().endScope();
+ this.#result = await this.predict(this.#captureCanvas);
});
return this.#result;
}
+ async predict(canvas) {
+ tf.engine().startScope();
+ const tensor = await this.preprocess(canvas);
+ const logits = this.model.predict(tensor);
+ const result = await this.namePredictions(logits);
+ logits.dispose();
+ tf.engine().endScope();
+ return result;
+ }
+
stopPredict() {
this.#result = [];
this.#isPredicting = false;
@@ -128,7 +141,31 @@ class ImageLearning {
}
async load(url) {
- this.model = await tf.loadLayersModel(url);
+ const model = await tf.loadLayersModel(url);
+ const modelData = new Promise((resolve) =>
+ model.save({
+ save: (data) => {
+ const layers = data?.modelTopology?.config?.layers;
+ if (Array.isArray(layers)) {
+ data.modelTopology.config.layers.forEach((layer) => {
+ if (layer?.config?.name) {
+ layer.config.name = `${layer.config.name}_ws`;
+ }
+ });
+ }
+ if (Array.isArray(data.weightSpecs)) {
+ data.weightSpecs.forEach((spec) => {
+ const splits = spec.name.split('/');
+ splits[0] = `${splits[0]}_ws`;
+ spec.name = splits.join('/');
+ });
+ }
+ resolve(data);
+ },
+ })
+ );
+ this.model = await tf.loadLayersModel({ load: () => modelData });
+ model.dispose();
this.isLoaded = true;
}
}
diff --git a/src/class/learning/InputPopup.js b/src/class/learning/InputPopup.js
index 943431522d..62a1d7b808 100644
--- a/src/class/learning/InputPopup.js
+++ b/src/class/learning/InputPopup.js
@@ -1,8 +1,7 @@
import PopupHelper from '../popup_helper';
-export default class InputPopup {
+Entry.MlPopup = class InputPopup {
#popupKey = 'ai_learning';
- result = [];
constructor(source) {
this.generatePopupView(source);
@@ -12,11 +11,7 @@ export default class InputPopup {
this.popupHelper.show(this.#popupKey);
}
- getResult() {
- return this.result;
- }
-
- generatePopupView({ url, labels, type, recordTime }) {
+ generatePopupView({ url, labels, type, recordTime, setResult }) {
if (!this.popupHelper) {
if (window.popupHelper) {
this.popupHelper = window.popupHelper;
@@ -36,7 +31,7 @@ export default class InputPopup {
JSON.stringify({ url, labels, type, recordTime })
);
this.isLoading = true;
- this.result = [];
+ setResult && setResult([]);
if (Entry.engine.state == 'run') {
Entry.engine.togglePause({ visible: false });
}
@@ -64,7 +59,7 @@ export default class InputPopup {
}
const { key, data } = JSON.parse(eventData);
if (key === 'predict') {
- this.result = data;
+ setResult && setResult(data);
this.popupHelper.hide();
}
if (key === 'stop') {
diff --git a/src/class/learning/LearningBase.ts b/src/class/learning/LearningBase.ts
index 87787fb6a9..906a3d87b1 100644
--- a/src/class/learning/LearningBase.ts
+++ b/src/class/learning/LearningBase.ts
@@ -4,8 +4,8 @@ import DataTable from '../DataTable';
type Table = {
id: string;
fieldsInfo: Array;
- data: Array
-}
+ data: Array;
+};
class LearningBase {
type = 'base';
attrLength = 0;
@@ -13,17 +13,17 @@ class LearningBase {
view?: LearningView = null;
trained: boolean = false;
chartEnable: boolean = false;
- fields:Array = [];
- predictFields:Array = [];
+ fields: Array = [];
+ predictFields: Array = [];
result = {};
- table:Table;
+ loadModel: () => {};
+ table: Table;
trainParam: any = null;
trainCallback: (value: any) => void;
- chart:any = null;
+ chart: any = null;
predictResult: any = null;
-
constructor(params: any = {}) {
this.view = new LearningView({ name: params.name || '', status: 0 });
// 정지시 data 초기화.
@@ -99,7 +99,10 @@ class LearningBase {
}
setTrainOption(type: string, value: any) {
- this.trainParam[type] = value;
+ this.trainParam = {
+ ...this.trainParam,
+ [type]: value,
+ };
}
getTrainOption() {
@@ -117,7 +120,7 @@ class LearningBase {
generateChart() {
throw new Error('Method not implemented.');
}
-
+
train() {
throw new Error('Method not implemented.');
}
@@ -125,10 +128,10 @@ class LearningBase {
load() {
throw new Error('Method not implemented.');
}
-
+
predict() {
throw new Error('Method not implemented.');
}
}
-export default LearningBase;
\ No newline at end of file
+export default LearningBase;
diff --git a/src/class/learning/LogisticRegression.js b/src/class/learning/LogisticRegression.js
index 69122a4811..d49ab8386c 100644
--- a/src/class/learning/LogisticRegression.js
+++ b/src/class/learning/LogisticRegression.js
@@ -36,7 +36,10 @@ class LogisticRegression extends LearningBase {
if (this.attrLength === 1) {
this.chartEnable = true;
}
- this.load(`/uploads/${url}/model.json`);
+ if (this.url !== url) {
+ this.load(url);
+ this.url = url;
+ }
this.fields = table?.select?.[0]?.map((index) => table?.fields[index]);
this.predictFields = table?.select?.[1]?.map((index) => table?.fields[index]);
@@ -47,7 +50,31 @@ class LogisticRegression extends LearningBase {
}
async load(url) {
- this.model = await tf.loadLayersModel(url);
+ const model = await tf.loadLayersModel(url);
+ const modelData = new Promise((resolve) =>
+ model.save({
+ save: (data) => {
+ const layers = data?.modelTopology?.config?.layers;
+ if (Array.isArray(layers)) {
+ data.modelTopology.config.layers.forEach((layer) => {
+ if (layer?.config?.name) {
+ layer.config.name = `${layer.config.name}_ws`;
+ }
+ });
+ }
+ if (Array.isArray(data.weightSpecs)) {
+ data.weightSpecs.forEach((spec) => {
+ const splits = spec.name.split('/');
+ splits[0] = `${splits[0]}_ws`;
+ spec.name = splits.join('/');
+ });
+ }
+ resolve(data);
+ },
+ })
+ );
+ this.model = await tf.loadLayersModel({ load: () => modelData });
+ model.dispose();
}
async train() {
@@ -145,6 +172,7 @@ function createModel(inputShape, numClasses = 1) {
const model = tf.sequential({
layers: [
tf.layers.dense({
+ name: 'log_dense_ws',
inputShape: [inputShape],
units: numClasses,
activation: numClasses === 2 ? 'sigmoid' : 'softmax',
diff --git a/src/class/learning/NumberClassification.js b/src/class/learning/NumberClassification.js
index c2d5148616..40fcbcebdf 100644
--- a/src/class/learning/NumberClassification.js
+++ b/src/class/learning/NumberClassification.js
@@ -1,6 +1,5 @@
import LearningView from './LearningView';
import Chart from './Chart';
-const { callApi } = require('../../util/common');
import _uniq from 'lodash/uniq';
import _floor from 'lodash/floor';
import _sum from 'lodash/sum';
@@ -33,7 +32,7 @@ class NumberClassification {
#name = '';
#fields = [];
#predictField = [];
-
+ #loadModel;
constructor(params = {}) {
this.#view = new LearningView({ name: params.name || '', status: 0 });
// 정지시 data 초기화.
@@ -43,7 +42,7 @@ class NumberClassification {
this.init({ ...params });
}
- init({ name, url, table, trainParam }) {
+ init({ name, url, table, trainParam, modelId, loadModel }) {
this.#name = name;
this.#trainParam = trainParam;
this.#table = table;
@@ -51,6 +50,7 @@ class NumberClassification {
this.#view.setValue(value);
};
this.#isTrained = true;
+ this.#loadModel = loadModel;
this.#attrLength = table?.select?.[0]?.length || 0;
this.#fields = table?.select?.[0]?.map((index) => table?.fields[index]);
@@ -58,7 +58,11 @@ class NumberClassification {
if (this.#attrLength === 2) {
this.#chartEnable = true;
}
- this.load(`/uploads/${url}/model.json`);
+ if (this.url !== url || this.modelId !== modelId) {
+ this.load(url, modelId);
+ this.url = url;
+ this.modelId = modelId;
+ }
}
setTable() {
@@ -129,7 +133,10 @@ class NumberClassification {
}
setTrainOption(type, value) {
- this.#trainParam[type] = value;
+ this.trainParam = {
+ ...this.trainParam,
+ [type]: value,
+ };
}
getTrainOption() {
@@ -183,18 +190,24 @@ class NumberClassification {
this.#trainCallback(100);
}
- async load(url) {
- const { data: savedData } = await callApi(url, { url });
- this.#trainParam.trainData = savedData.data;
- this.#trainParam.trainLabels = savedData.labels;
- this.#trainParam.labels = _uniq(savedData.labels).sort((a, b) =>
- String(a).localeCompare(String(b))
- );
- this.#trainParam.maxVector = savedData.maxVector;
- this.#trainParam.minVector = savedData.minVector;
- this.#trainParam.numLabels = savedData.numLabels;
- this.#trainParam.neighbors = savedData.neighbors;
- this.#trainParam.isLoaded = true;
+ async load(url, modelId) {
+ const savedData = await this.#loadModel({ url, modelId });
+ if (!savedData) {
+ return;
+ }
+ this.#trainParam = {
+ ...this.#trainParam,
+ trainData: savedData.data,
+ trainLabels: savedData.labels,
+ labels: _uniq(savedData.labels).sort((a, b) =>
+ String(a).localeCompare(String(b))
+ ),
+ maxVector: savedData.maxVector,
+ minVector: savedData.minVector,
+ numLabels: savedData.numLabels,
+ neighbors: savedData.neighbors,
+ isLoaded: true,
+ };
this.colors = this.createColor();
}
diff --git a/src/class/learning/Regression.js b/src/class/learning/Regression.js
index a3c6bc3c8a..bdd216235a 100644
--- a/src/class/learning/Regression.js
+++ b/src/class/learning/Regression.js
@@ -38,7 +38,10 @@ class Regression extends LearningBase {
if (this.attrLength === 1) {
this.chartEnable = true;
}
- this.load(`/uploads/${url}/model.json`);
+ if (this.url !== url) {
+ this.load(url);
+ this.url = url;
+ }
this.fields = table?.select?.[0]?.map((index) => table?.fields[index]);
this.predictFields = table?.select?.[1]?.map((index) => table?.fields[index]);
@@ -126,7 +129,31 @@ class Regression extends LearningBase {
}
async load(url) {
- this.model = await tf.loadLayersModel(url);
+ const model = await tf.loadLayersModel(url);
+ const modelData = new Promise((resolve) =>
+ model.save({
+ save: (data) => {
+ const layers = data?.modelTopology?.config?.layers;
+ if (Array.isArray(layers)) {
+ data.modelTopology.config.layers.forEach((layer) => {
+ if (layer?.config?.name) {
+ layer.config.name = `${layer.config.name}_ws`;
+ }
+ });
+ }
+ if (Array.isArray(data.weightSpecs)) {
+ data.weightSpecs.forEach((spec) => {
+ const splits = spec.name.split('/');
+ splits[0] = `${splits[0]}_ws`;
+ spec.name = splits.join('/');
+ });
+ }
+ resolve(data);
+ },
+ })
+ );
+ this.model = await tf.loadLayersModel({ load: () => modelData });
+ model.dispose();
}
convertNomalResult() {
@@ -274,7 +301,7 @@ function convertToTensor(inputs, outputs) {
function createModel(inputShape) {
const model = tf.sequential();
- model.add(tf.layers.dense({ inputShape: [inputShape], units: 1 }));
+ model.add(tf.layers.dense({ inputShape: [inputShape], units: 1, name: 'reg_dense_ws' }));
return model;
}
async function trainModel(model, inputs, outputs, trainParam, onBatchEnd, onEpochEnd) {
diff --git a/src/class/learning/SpeechClassification.js b/src/class/learning/SpeechClassification.js
new file mode 100644
index 0000000000..7faa6dfe93
--- /dev/null
+++ b/src/class/learning/SpeechClassification.js
@@ -0,0 +1,100 @@
+import * as tf from '@tensorflow/tfjs';
+export const classes = ['ai_learning_speech'];
+
+class Classification {
+ #type = null;
+ #url = '';
+ #labels = [];
+ #recordTime = 2000;
+ #result = [];
+
+ constructor({ url, labels, type, recordTime }) {
+ this.#type = type;
+ this.#url = url;
+ this.#labels = labels;
+ this.#recordTime = recordTime;
+ this.load(url);
+ }
+
+ get labels() {
+ return this.#labels;
+ }
+
+ getResult(index) {
+ const result = this.#result || [];
+ const defaultResult = { probability: 0, className: '' };
+ if (index !== undefined && index > -1) {
+ return (
+ result.find(({ className }) => className === this.#labels[index]) || defaultResult
+ );
+ }
+ return result[0] || defaultResult;
+ }
+
+ unbanBlocks(blockMenu) {
+ blockMenu.unbanClass(`ai_learning_classification`);
+ if (this.#type) {
+ blockMenu.unbanClass(`ai_learning_${this.#type}`);
+ }
+ }
+
+ openInputPopup() {
+ Entry.dispatchEvent('openMLInputPopup', {
+ type: this.#type,
+ recordTime: this.#recordTime,
+ predict: async (data) => {
+ this.#result = await this.predict(data);
+ },
+ url: this.#url,
+ labels: this.#labels,
+ setResult: (result) => {
+ this.#result = result;
+ },
+ });
+ }
+
+ async namePredictions(logits) {
+ const values = Array.from(await logits.data());
+ return values
+ .map((probability, index) => ({
+ className: this.#labels[index] || index,
+ probability,
+ }))
+ .sort((a, b) => a.probability > b.probability ? -1 : a.probability < b.probability ? 1 : 0);
+ }
+
+ async predict(tensor) {
+ const logits = this.model.predict(tensor);
+ return await this.namePredictions(logits);
+ }
+
+ async load(url) {
+ const model = await tf.loadLayersModel(url);
+ const modelData = new Promise((resolve) =>
+ model.save({
+ save: (data) => {
+ const layers = data?.modelTopology?.config?.layers;
+ if (Array.isArray(layers)) {
+ data.modelTopology.config.layers.forEach((layer) => {
+ if (layer?.config?.name) {
+ layer.config.name = `${layer.config.name}_ws`;
+ }
+ });
+ }
+ if (Array.isArray(data.weightSpecs)) {
+ data.weightSpecs.forEach((spec) => {
+ const splits = spec.name.split('/');
+ splits[0] = `${splits[0]}_ws`;
+ spec.name = splits.join('/');
+ });
+ }
+ resolve(data);
+ },
+ })
+ );
+ this.model = await tf.loadLayersModel({ load: () => modelData });
+ model.dispose();
+ }
+}
+
+export default Classification;
diff --git a/src/class/learning/Svm.js b/src/class/learning/Svm.js
index 9344f28217..60d76ab41a 100644
--- a/src/class/learning/Svm.js
+++ b/src/class/learning/Svm.js
@@ -41,11 +41,12 @@ export const OPTION_DEFAULT_VALUE = {
class Svm extends LearningBase {
type = 'svm';
- init({ name, url, result, table, trainParam }) {
+ init({ name, url, result, table, trainParam, modelId, loadModel }) {
this.name = name;
this.trainParam = trainParam;
this.result = result;
this.table = table;
+ this.loadModel = loadModel;
this.trainCallback = (value) => {
this.view.setValue(value);
};
@@ -56,7 +57,11 @@ class Svm extends LearningBase {
this.fields = table?.select?.[0]?.map((index) => table?.fields[index]);
this.predictFields = table?.select?.[1]?.map((index) => table?.fields[index]);
- this.load(`/uploads/${url}/model.json`);
+ if (this.url !== url || this.modelId !== modelId) {
+ this.load(url, modelId);
+ this.url = url;
+ this.modelId = modelId;
+ }
}
checkTrainOptionValidation() {
@@ -142,8 +147,11 @@ class Svm extends LearningBase {
};
}
- async load(url) {
- const { data } = await callApi(url, { url });
+ async load(url, modelId) {
+ const data = await this.loadModel({ url, modelId });
+ if (!data) {
+ return;
+ }
const { serializeModel, result } = data;
this.model = SVM.load(serializeModel);
this.valueMap = result?.valueMap;
diff --git a/src/class/learning/TextLearning.js b/src/class/learning/TextLearning.js
index 39b5a6eed5..57376efd79 100644
--- a/src/class/learning/TextLearning.js
+++ b/src/class/learning/TextLearning.js
@@ -1,5 +1,4 @@
import Bayes, { fromJson } from './bayes';
-import InputPopup from './InputPopup';
const { callApi } = require('../../util/common');
@@ -14,13 +13,19 @@ class TextNaiveBaye {
#labels = [];
#popup = null;
#result = [];
- constructor({ url, labels }) {
+ #loadModel;
+ constructor({ url, labels, modelId, loadModel }) {
this.#url = url;
this.#labels = labels;
+ this.#loadModel = loadModel;
this.classifier = new Bayes({
tokenizer: this.tokenizer,
});
- this.load(`/uploads/${url}/model.json`);
+ this.load(url, modelId);
+ }
+
+ get labels() {
+ return this.#labels;
}
unbanBlocks(blockMenu) {
@@ -37,9 +42,11 @@ class TextNaiveBaye {
getResult(index) {
const result = this.#result.length ? this.#result : this.#popup?.result || [];
- const defaultResult = {probability: 0, className: ''};
- if(index !== undefined && index > -1) {
- return result.find(({className}) => className === this.#labels[index]) || defaultResult;
+ const defaultResult = { probability: 0, className: '' };
+ if (index !== undefined && index > -1) {
+ return (
+ result.find(({ className }) => className === this.#labels[index]) || defaultResult
+ );
}
return result[0] || defaultResult;
}
@@ -50,12 +57,17 @@ class TextNaiveBaye {
return;
}
this.#result = [];
- this.#popup = new InputPopup({
- url: this.#url,
+ Entry.dispatchEvent('openMLInputPopup', {
+ type: 'text',
+ predict: async (text) => {
+ this.#result = await this.predict(text);
+ },
+ url: this.#url,
labels: this.#labels,
- type: this.#type
+ setResult: (result) => {
+ this.#result = result;
+ },
});
- this.#popup.open();
}
async tokenizer(text) {
@@ -73,8 +85,11 @@ class TextNaiveBaye {
return this.#result;
}
- async load(url) {
- const { data } = await callApi(url, { url });
+ async load(url, modelId) {
+ const data = await this.#loadModel({ url, modelId });
+ if (!data) {
+ return;
+ }
this.classifier = fromJson(JSON.stringify(data));
this.classifier.tokenizer = this.tokenizer;
this.isLoaded = true;
diff --git a/src/class/learning/Utils.ts b/src/class/learning/Utils.ts
index d13b1842ce..5492ba336c 100644
--- a/src/class/learning/Utils.ts
+++ b/src/class/learning/Utils.ts
@@ -1,9 +1,7 @@
-
-
const toFixed = (num: number) => parseFloat(num.toFixed(2));
export const CommonUtil = {
- isWebGlSupport:() => {
+ isWebGlSupport: () => {
try {
const currentCanvas = document.createElement('canvas');
return !!currentCanvas.getContext('webgl', { premultipliedalpha: false });
@@ -40,7 +38,9 @@ export const CommonUtil = {
return tempMap[i][value];
},
shuffle: (arr: Array) => {
- let j; let x; let i;
+ let j;
+ let x;
+ let i;
for (i = arr.length; i; i -= 1) {
j = Math.floor(Math.random() * i);
x = arr[i - 1];
@@ -78,10 +78,8 @@ export const CommonUtil = {
arrayToMatrix(array: Array, columns: number) {
return Array(Math.ceil(array.length / columns))
.fill('')
- .reduce((acc, cur, index) => (
- [...acc, [...array].splice(index * columns, columns)]
- ), []);
- }
+ .reduce((acc, cur, index) => [...acc, [...array].splice(index * columns, columns)], []);
+ },
};
export default CommonUtil;
diff --git a/src/class/playground.js b/src/class/playground.js
index bcd0d2f419..c46cab22d6 100644
--- a/src/class/playground.js
+++ b/src/class/playground.js
@@ -128,9 +128,11 @@ Entry.Playground = class Playground {
const resizeHandle = Entry.createElement('div')
.addClass('entryPlaygroundResizeWorkspace', 'entryRemove')
+ .bindOnClick(() => {
+ this.mainWorkspace.blockMenu.toggleBlockMenu();
+ })
.appendTo(codeView);
this.resizeHandle_ = resizeHandle;
- this.initializeResizeHandle(resizeHandle);
/** @type {!Element} */
this.codeView_ = codeView;
@@ -618,6 +620,12 @@ Entry.Playground = class Playground {
if (Entry.hwLite) {
Entry.hwLite.refreshHardwareLiteBlockMenu();
}
+ if (Entry.options.expansionDisable) {
+ Entry.playground.blockMenu.banCategory('expansion');
+ }
+ if (Entry.options.aiUtilizeDisable) {
+ Entry.playground.blockMenu.banCategory('ai_utilize');
+ }
}
/**
@@ -1480,9 +1488,9 @@ Entry.Playground = class Playground {
Entry.aiUtilize.banAIUtilizeBlocks(items.map(({ name }) => name));
}
- setAiLearningBlock(url, info) {
+ setAiLearningBlock(data) {
Entry.aiLearning.removeLearningBlocks();
- Entry.aiLearning.load({ url, ...info });
+ Entry.aiLearning.load({ ...data });
}
/**
@@ -1680,40 +1688,6 @@ Entry.Playground = class Playground {
}
}
- /**
- * Handle is resizing playground handle.
- * This add mouse move and mouse up event to document.
- * @param {!Element} handle
- */
- initializeResizeHandle(handle) {
- let listener;
- const that = this;
- $(handle).bind('mousedown touchstart', function(e) {
- e.preventDefault();
- if (Entry.disposeEvent) {
- Entry.disposeEvent.notify();
- }
- that.resizing = true;
- if (Entry.documentMousemove) {
- listener = Entry.documentMousemove.attach(this, ({ clientX }) => {
- if (that.resizing) {
- Entry.resizeElement({
- menuWidth: clientX - Entry.interfaceState.canvasWidth,
- });
- }
- });
- }
- $(document).bind('mouseup.resizeHandle touchend.resizeHandle', () => {
- $(document).unbind('.resizeHandle');
- if (listener) {
- that.resizing = false;
- listener.destroy();
- listener = undefined;
- }
- });
- });
- }
-
/**
* Reload playground
*/
@@ -1873,8 +1847,19 @@ Entry.Playground = class Playground {
'entryPlaygroundPictureThumbnail'
);
+ let mouseDownCoordinate;
+ const moveThreshold = 5;
+ thumbnailView.addEventListener('touchstart', (e) => {
+ const event = Entry.Utils.convertMouseEvent(e);
+ mouseDownCoordinate = { y: event.clientY };
+ });
+
thumbnailView.addEventListener('touchmove', (e) => {
e.preventDefault();
+ const event = Entry.Utils.convertMouseEvent(e);
+ if (Math.abs(event.clientY - mouseDownCoordinate.y) > moveThreshold) {
+ Entry.ContextMenu.hide();
+ }
});
if (picture.fileurl) {
@@ -2016,8 +2001,19 @@ Entry.Playground = class Playground {
}
});
+ let mouseDownCoordinate;
+ const moveThreshold = 5;
+ thumbnailView.addEventListener('touchstart', (e) => {
+ const event = Entry.Utils.convertMouseEvent(e);
+ mouseDownCoordinate = { y: event.clientY };
+ });
+
thumbnailView.addEventListener('touchmove', (e) => {
e.preventDefault();
+ const event = Entry.Utils.convertMouseEvent(e);
+ if (Math.abs(event.clientY - mouseDownCoordinate.y) > moveThreshold) {
+ Entry.ContextMenu.hide();
+ }
});
thumbnailView.bindOnClick(() => {
diff --git a/src/class/sound.ts b/src/class/sound.ts
index 18a9a0cb81..863e28a3af 100644
--- a/src/class/sound.ts
+++ b/src/class/sound.ts
@@ -10,6 +10,7 @@ import {
redo,
isModified,
getAudioBuffer,
+ destroy,
} from '@entrylabs/sound-editor';
import toWav from 'audiobuffer-to-wav';
@@ -202,6 +203,7 @@ class SoundEditor {
destory() {
unregistExportFunction();
+ destroy();
}
}
diff --git a/src/class/variable_container.js b/src/class/variable_container.js
index d4805e0f56..b474af77ee 100644
--- a/src/class/variable_container.js
+++ b/src/class/variable_container.js
@@ -152,7 +152,7 @@ Entry.VariableContainer = class VariableContainer {
this.variableAddButton_ = variableAddButton;
const messageAddButton = createElement('button').addClass('entryVariableAddWorkspace');
- messageAddButton.textContent = Lang.Workspace.message_create;
+ messageAddButton.textContent = Lang.Workspace.message_add;
this.messageAddButton_ = messageAddButton;
const listAddButton = createElement('button').addClass('entryVariableAddWorkspace');
diff --git a/src/css/components/block_menu.less b/src/css/components/block_menu.less
index 8e2ead37a9..0aa0d956d6 100644
--- a/src/css/components/block_menu.less
+++ b/src/css/components/block_menu.less
@@ -45,7 +45,7 @@
display: inline-block;
background-color: #ecf8ff;
list-style-type: none;
- border-radius: 0 0 6px 6px;
+ border-radius: 0 0 0 6px;
margin: 0;
padding: 0;
-ms-overflow-style: none; // IE 10+
@@ -78,7 +78,7 @@
top: 0;
bottom: 0;
border: 1px solid #d6e9f4;
- border-radius: 0 0 6px 6px;
+ border-radius: 0 0 0 6px;
content: '';
}
@@ -99,14 +99,14 @@
display: inline-block;
vertical-align: top;
width: 254px;
- margin-left:2px;
height: 100%;
background-color: #ecf8ff;
border:1px solid #d6e9f4;
- border-radius: 0 0 0 6px;
+ border-left: none;
.blockMenuWrapper {
overflow: hidden;
+ width: 100%;
height: 100%;
-webkit-transition: width ease 0.2s;
transition: width ease 0.2s;
@@ -114,6 +114,7 @@
.blockMenuTrashcan {
position: absolute;
+ width: 100%;
top: 0;
left: 0;
opacity: 0.95;
diff --git a/src/css/components/board.less b/src/css/components/board.less
index ef148411a6..b262fcebf3 100644
--- a/src/css/components/board.less
+++ b/src/css/components/board.less
@@ -68,7 +68,7 @@
.entryWorkspaceBoard {
position: absolute;
- left: 254px;
+ left: 313px;
top: 0;
bottom: 0;
right: 0px;
@@ -90,7 +90,7 @@
from {
}
to {
- left: 61px;
+ left: 59px;
}
}
diff --git a/src/css/components/object.less b/src/css/components/object.less
index f090324541..b56fc74c0f 100644
--- a/src/css/components/object.less
+++ b/src/css/components/object.less
@@ -80,6 +80,8 @@
background-size: 70%;
background-repeat: no-repeat;
background-position: center;
+ user-select: none;
+ -webkit-touch-callout: none;
&.entryObjectTextBox {
.backgroundImage('text_icon.svg');
diff --git a/src/css/components/playground.less b/src/css/components/playground.less
index f066c44d1a..9dfb70654c 100644
--- a/src/css/components/playground.less
+++ b/src/css/components/playground.less
@@ -152,17 +152,40 @@
.entryPlaygroundResizeWorkspace {
position: absolute;
top: 50%;
- height: 40px;
- width: 16px;
- left: 254px;
+ height: 62px;
+ width: 36px;
+ left: 311px;
margin-top: -20px;
- cursor: ew-resize;
+ cursor: pointer;
border-left: none;
- z-index: 1;
- .backgroundImage('entry_scroll_02.png');
- background-size: 16px auto;
+ z-index: 300;
+ .backgroundImage('entry_scroll_02.svg');
+ background-size: 36px auto;
+ &.folding {
+ .animation-duration(0.7s);
+ .animation-name(foldBlockly);
+ .animation-fill-mode(forwards);
+ .backgroundImage('entry_scroll_03.svg');
+ }
+ &.unfolding {
+ .animation-duration(0.7s);
+ .animation-name(unfoldBlockly);
+ .animation-fill-mode(forwards);
+ .backgroundImage('entry_scroll_02.svg');
+ }
}
+@keyframes unfoldBlockly {
+ from {left: 58px;}
+ to {left: 311px;}
+}
+
+@keyframes foldBlockly {
+ from {}
+ to {left: 58px;}
+}
+
+
.entryPlaygroundTabWorkspace {
position: absolute;
left: 0;
@@ -664,6 +687,8 @@
background-size: contain;
background-repeat: no-repeat;
background-position: 50% 50%;
+ user-select: none;
+ -webkit-touch-callout: none;
}
.entryPlaygroundPictureName {
@@ -1222,6 +1247,8 @@
background-size: 28px auto;
background-repeat: no-repeat;
background-position: 50% 50%;
+ user-select: none;
+ -webkit-touch-callout: none;
&.entryPlaygroundSoundPlay {
.backgroundImage('workspace_sound_play.svg');
@@ -1399,9 +1426,9 @@
.tablet {
.entryPlaygroundResizeWorkspace {
- .backgroundImage('entry_scroll_02_big_2.png');
- width: 15px;
- height: 42px;
+ .backgroundImage('entry_scroll_02.svg');
+ width: 36px;
+ height: 62px;
border-top: none;
}
}
diff --git a/src/entry.js b/src/entry.js
index 05a1d91b63..5fc13061d3 100644
--- a/src/entry.js
+++ b/src/entry.js
@@ -3,6 +3,12 @@ import showConsoleBanner from './util/functions/showConsoleBanner';
import 'simplebar/dist/simplebar.css';
const Entry = {};
+Entry.EXPANSION_BLOCK = {};
+Entry.EXPANSION_BLOCK_LIST = {};
+Entry.AI_UTILIZE_BLOCK = {};
+Entry.AI_UTILIZE_BLOCK_LIST = {};
+Entry.AI_UTILIZE_BLOCK_LIST_DEPRECATED = {};
+Entry.ALL_AI_UTILIZE_BLOCK_LIST = {};
module.exports = Entry;
global.Entry = Entry;
@@ -104,7 +110,6 @@ require('./util/htmlElementPatcher');
require('./util/eventHandler');
require('./util/utils');
require('./util/youtube');
-require('./util/weather_forecast');
require('./util/modal');
require('./command/commands/block');
require('./command/commands/comment');
diff --git a/src/playground/block_menu.ts b/src/playground/block_menu.ts
index 0e11d2bc94..2900419096 100644
--- a/src/playground/block_menu.ts
+++ b/src/playground/block_menu.ts
@@ -150,6 +150,7 @@ class BlockMenu extends ModelClass {
this._dSelectMenu = debounce(this.selectMenu, 0);
this._align = align || 'CENTER';
+ this._svgWidth = 254;
this._scroll = scroll !== undefined ? scroll : false;
this._bannedClass = [];
this._categories = [];
@@ -177,7 +178,6 @@ class BlockMenu extends ModelClass {
this._generateView(this._categoryData);
this._splitters = [];
- this.setWidth();
this.svg = Entry.SVG(this._svgId);
Entry.Utils.addFilters(this.svg, this.suffix);
@@ -573,11 +573,6 @@ class BlockMenu extends ModelClass {
});
}
- setWidth() {
- this._svgWidth = this.blockMenuContainer.width();
- this.updateSplitters();
- }
-
setMenu(doNotAlign?: boolean) {
if (!this.hasCategory()) {
return;
@@ -614,6 +609,49 @@ class BlockMenu extends ModelClass {
});
}
+ toggleBlockMenu() {
+ const board = this.workspace.board;
+ const boardView = board.view;
+ const elem = this._categoryElems[this.lastSelector];
+ const className = 'entrySelectedCategory';
+ const className2 = 'entryUnSelectedCategory';
+
+ if (!boardView.hasClass('folding')) {
+ boardView.addClass('folding');
+ Entry.playground.resizeHandle_.addClass('folding');
+ Entry.playground.resizeHandle_.removeClass('unfolding');
+ if (elem) {
+ elem.removeClass(className);
+ elem.addClass(className2);
+ }
+ Entry.playground.hideTabs();
+ this.visible = false;
+ } else {
+ if (!this.visible) {
+ boardView.addClass('foldOut');
+ Entry.playground.showTabs();
+ }
+ boardView.removeClass('folding');
+ Entry.playground.resizeHandle_.addClass('unfolding');
+ Entry.playground.resizeHandle_.removeClass('folding');
+ this.visible = true;
+ }
+ Entry.bindAnimationCallbackOnce(boardView, () => {
+ board.scroller.resizeScrollBar.call(board.scroller);
+ boardView.removeClass('foldOut');
+ Entry.windowResized.notify();
+ });
+
+ if (this.visible) {
+ if (elem) {
+ elem.removeClass(className2);
+ elem.addClass(className);
+ }
+ }
+
+ this.align();
+ }
+
selectMenu(selector: number | string, doNotFold: boolean, doNotAlign?: boolean) {
if (Entry.disposeEvent) {
Entry.disposeEvent.notify();
@@ -647,6 +685,7 @@ class BlockMenu extends ModelClass {
let animate = false;
const board = this.workspace.board;
const boardView = board.view;
+ const handle = Entry.playground.resizeHandle_;
const className = 'entrySelectedCategory';
const className2 = 'entryUnSelectedCategory';
@@ -655,8 +694,10 @@ class BlockMenu extends ModelClass {
oldView.addClass(className2);
}
- if (elem == oldView && !(doNotFold || !this.hasCategory())) {
+ if (elem === oldView && !(doNotFold || !this.hasCategory())) {
boardView.addClass('folding');
+ handle.addClass('folding');
+ handle.removeClass('unfolding');
this._selectedCategoryView = null;
if (elem) {
elem.removeClass(className);
@@ -665,13 +706,15 @@ class BlockMenu extends ModelClass {
Entry.playground.hideTabs();
animate = true;
this.visible = false;
- } else if (!oldView && this.hasCategory()) {
+ } else if (elem !== oldView && this.hasCategory() && handle.hasClass('folding')) {
if (!this.visible) {
animate = true;
boardView.addClass('foldOut');
Entry.playground.showTabs();
}
boardView.removeClass('folding');
+ handle.addClass('unfolding');
+ handle.removeClass('folding');
this.visible = true;
} else if (!name) {
this._selectedCategoryView = null;
@@ -1184,7 +1227,7 @@ class BlockMenu extends ModelClass {
const bBox = this.svgGroup.getBBox();
const adjust = this.hasCategory() ? 64 : 0;
const expandWidth = bBox.width + bBox.x + adjust + 2;
- const { menuWidth } = Entry.interfaceState;
+ const menuWidth = 319;
if (expandWidth > menuWidth) {
this.widthBackup = menuWidth - adjust - 2;
$(this.blockMenuWrapper).css('width', expandWidth - adjust);
diff --git a/src/playground/blocks/block_ai.js b/src/playground/blocks/block_ai.js
deleted file mode 100644
index cbc99ec54a..0000000000
--- a/src/playground/blocks/block_ai.js
+++ /dev/null
@@ -1,47 +0,0 @@
-module.exports = {
- getBlocks() {
- return {
- ai_noti_img: {
- skeleton: 'basic_text',
- color: EntryStatic.colorSet.common.TRANSPARENT,
- template: '%1',
- params: [
- {
- type: 'Indicator',
- img: '/block_icon/working_hard_entry.svg',
- class: 'notice',
- size: 50,
- position: {
- x: 55,
- y: 20,
- },
- align: 'center',
- },
- ],
- class: 'notice_info',
- },
- ai_noti_text: {
- skeleton: 'basic_text',
- skeletonOptions: {
- box: {
- offsetX: -18,
- offsetY: -25,
- },
- },
- color: EntryStatic.colorSet.common.TRANSPARENT,
- template: '%1',
- params: [
- {
- type: 'Text',
- text: Lang.Workspace.blocks_comming_soon,
- color: EntryStatic.colorSet.common.TEXT,
- align: 'center',
- },
- ],
- class: 'notice_info',
- isNotFor: [],
- events: {},
- },
- };
- },
-};
diff --git a/src/playground/blocks/block_brush.js b/src/playground/blocks/block_brush.js
index bb5d3f69fc..edb401fa15 100644
--- a/src/playground/blocks/block_brush.js
+++ b/src/playground/blocks/block_brush.js
@@ -257,7 +257,7 @@ module.exports = {
sprite.brush.moveTo(sprite.getX(), sprite.getY() * -1);
}
- if (!sprite.paint || !sprite.shapes.length) {
+ if (!sprite.paint || !sprite.paintShapes.length) {
Entry.setBasicPaint(sprite);
sprite.paint.stop = true;
}
@@ -310,7 +310,7 @@ module.exports = {
func(sprite, script) {
const colour = script.getStringValue('VALUE', script);
- if (!sprite.paint || !sprite.shapes.length) {
+ if (!sprite.paint || !sprite.paintShapes.length) {
Entry.setBasicPaint(sprite);
sprite.paint.stop = true;
}
@@ -507,7 +507,7 @@ module.exports = {
sprite.brush.stop = true;
}
- if (!sprite.paint || !sprite.shapes.length) {
+ if (!sprite.paint || !sprite.paintShapes.length) {
Entry.setBasicPaint(sprite);
sprite.paint.stop = true;
}
@@ -609,7 +609,7 @@ module.exports = {
sprite.brush.moveTo(sprite.getX(), sprite.getY() * -1);
}
- if (!sprite.paint || !sprite.shapes.length) {
+ if (!sprite.paint || !sprite.paintShapes.length) {
Entry.setBasicPaint(sprite);
sprite.paint.stop = true;
}
diff --git a/src/playground/blocks/block_calc.js b/src/playground/blocks/block_calc.js
index 9c3db31264..bdcb519440 100644
--- a/src/playground/blocks/block_calc.js
+++ b/src/playground/blocks/block_calc.js
@@ -16,12 +16,7 @@ module.exports = {
},
{
type: 'Dropdown',
- options: [
- ['+', 'PLUS'],
- ['-', 'MINUS'],
- ['x', 'MULTI'],
- ['/', 'DIVIDE'],
- ],
+ options: [['+', 'PLUS'], ['-', 'MINUS'], ['x', 'MULTI'], ['/', 'DIVIDE']],
value: 'PLUS',
fontSize: 10,
bgColor: EntryStatic.colorSet.block.darken.CALC,
@@ -335,10 +330,7 @@ module.exports = {
},
{
type: 'Dropdown',
- options: [
- ['x', 'x'],
- ['y', 'y'],
- ],
+ options: [['x', 'x'], ['y', 'y']],
value: 'x',
fontSize: 10,
bgColor: EntryStatic.colorSet.block.darken.CALC,
@@ -386,10 +378,7 @@ module.exports = {
},
{
type: 'Dropdown',
- options: [
- ['x', 'x'],
- ['y', 'y'],
- ],
+ options: [['x', 'x'], ['y', 'y']],
value: 'x',
fontSize: 11,
arrowColor: EntryStatic.colorSet.arrow.default.CALC,
@@ -628,7 +617,7 @@ module.exports = {
if (operator === 'QUOTIENT') {
return Math.floor(left / right);
} else {
- return left % right;
+ return left - right * Math.floor(left / right);
}
},
syntax: {
@@ -1403,9 +1392,7 @@ module.exports = {
} else if (operator === 'MINUTE') {
return dateTime.getMinutes();
} else if (operator === 'DAY_OF_WEEK') {
- const daysLang = ['일', '월', '화', '수', '목', '금', '토'];
- const dayNum = dateTime.getDay();
- return daysLang[dayNum];
+ return dateTime.getDay();
} else {
return dateTime.getSeconds();
}
@@ -2553,11 +2540,7 @@ module.exports = {
},
{
type: 'Dropdown',
- options: [
- ['R', 'r'],
- ['G', 'g'],
- ['B', 'b'],
- ],
+ options: [['R', 'r'], ['G', 'g'], ['B', 'b']],
value: 'RED',
fontSize: 10,
bgColor: EntryStatic.colorSet.block.darken.CALC,
diff --git a/src/playground/blocks/block_expansion_weather.js b/src/playground/blocks/block_expansion_weather.js
index be037baebf..27f6c3d2f6 100644
--- a/src/playground/blocks/block_expansion_weather.js
+++ b/src/playground/blocks/block_expansion_weather.js
@@ -1,7 +1,22 @@
'use strict';
-const { getStateOptions, getCityOptions } = require('../../util/location');
+const { getStateOptions, getCityOptions, locationData } = require('../../util/location');
+const { callApi } = require('../../util/common');
-Entry.Expansion_Weather = {
+function resolveData(weatherData, type, dateStr) {
+ if (type === 'now') {
+ return weatherData[Object.keys(weatherData)[0]];
+ } else if (type === 'hour') {
+ return weatherData[dateStr];
+ } else {
+ return weatherData[Entry.EXPANSION_BLOCK.weather.getDate(dateStr)];
+ }
+}
+
+Entry.EXPANSION_BLOCK.weather = {
+ isInitialized: false,
+ api: '/api/expansionBlock/weather/',
+ date: new Date(),
+ apiFail: {},
name: 'weather',
imageName: 'weather.png',
title: {
@@ -12,9 +27,482 @@ Entry.Expansion_Weather = {
titleKey: 'template.weather_title_text',
description: Lang.Msgs.expansion_weather_description,
descriptionKey: 'Msgs.expansion_weather_description',
+ init() {
+ if (this.isInitialized) {
+ return;
+ }
+ Entry.EXPANSION_BLOCK.weather.date = new Date();
+ Entry.EXPANSION_BLOCK.weather.getData('week', 'Seoul', 'today');
+ Entry.EXPANSION_BLOCK.weather.getData('hour', 'Seoul', '00');
+ Entry.EXPANSION_BLOCK.weather.getData('now', 'Seoul');
+ Entry.EXPANSION_BLOCK.weather.isInitialized = true;
+ },
+ async getData(type, location, dateStr) {
+ let cityCode = null;
+ if (typeof location === 'string') {
+ cityCode = this.locationMap[location].code;
+ } else {
+ if (location.sub == locationData.initialData[1]) {
+ cityCode = this.locationMap[location.parent].code;
+ } else {
+ cityCode = this.locationMap[location.parent].sub[location.sub];
+ }
+ }
+
+ const url = this.api + type;
+ try {
+ const response = await callApi(url, { url });
+ Entry.EXPANSION_BLOCK.weather.apiFail[type] = false;
+ return resolveData(response.data[cityCode], type, dateStr);
+ } catch (e) {
+ Entry.EXPANSION_BLOCK.weather.apiFail[type] = { error: e };
+ return Entry.EXPANSION_BLOCK.weather.defaultData;
+ }
+ },
+ checkWeather(sky_code, weather) {
+ if (Entry.EXPANSION_BLOCK.weather.apiFail.week) {
+ return true;
+ }
+
+ const skyCodeMap = {
+ '1': 'sunny', //"맑음",
+ '2': 'partly_cloudy', //"구름조금",
+ '3': 'cloudy', //"흐림",
+ '4': 'rainy', //"비",
+ '5': 'snowy', //"눈",
+ '6': 'sleet', //"눈비",
+
+ '7': 'rainy', //"소나기",
+ '8': 'snowy', //"소낙눈",
+ '9': 'cloudy', //"안개",
+ '10': 'rainy', //"뇌우",
+ '11': 'cloudy', //"차차 흐려짐",
+ '12': 'rainy', //"흐려져 뇌우",
+ '13': 'rainy', //"흐려져 비",
+ '14': 'snowy', //"흐려져 눈",
+ '15': 'sleet', //"흐려져 눈비",
+ '16': 'cloudy', //"흐린 후 갬",
+ '17': 'rainy', //"뇌우 후 갬",
+ '18': 'rainy', //"비 후 갬",
+ '19': 'snowy', //"눈 후 갬",
+ '20': 'sleet', //"눈비 후 갬",
+ '21': 'mostly_cloudy', //"구름많음",
+ '22': 'cloudy',
+ };
+
+ if (skyCodeMap[sky_code]) {
+ return skyCodeMap[sky_code] === weather;
+ } else {
+ return 'sunny' === weather;
+ }
+ },
+ checkFineDust(pm10, finedust) {
+ if (Entry.EXPANSION_BLOCK.weather.apiFail.now) {
+ return true;
+ }
+
+ const fineDustMap = {
+ good: { min: 0, max: 30 },
+ normal: { min: 31, max: 80 },
+ bad: { min: 81, max: 150 },
+ very_bad: { min: 150, max: 9999 },
+ };
+
+ for (const key in fineDustMap) {
+ if (fineDustMap[key].min <= pm10 && pm10 <= fineDustMap[key].max) {
+ return key === finedust;
+ }
+ }
+ return 'very_bad' === finedust;
+ },
+ getDate(key) {
+ Entry.EXPANSION_BLOCK.weather.date = Entry.EXPANSION_BLOCK.weather.date || new Date();
+ const date = new Date(Entry.EXPANSION_BLOCK.weather.date);
+ switch (key) {
+ case 'yesterday':
+ date.setDate(date.getDate() - 1);
+ break;
+ case 'today':
+ break;
+ case 'tomorrow':
+ date.setDate(date.getDate() + 1);
+ break;
+ case 'After_2_days':
+ date.setDate(date.getDate() + 2);
+ break;
+ case 'After_3_days':
+ date.setDate(date.getDate() + 3);
+ break;
+ case 'After_4_days':
+ date.setDate(date.getDate() + 4);
+ break;
+ case 'After_5_days':
+ date.setDate(date.getDate() + 5);
+ break;
+ case 'After_6_days':
+ date.setDate(date.getDate() + 6);
+ break;
+ default:
+ break;
+ }
+ return date
+ .toISOString()
+ .slice(0, 10)
+ .replace(/-/g, '');
+ },
+ locationMap: {
+ Seoul: {
+ code: '1100000000',
+ sub: {
+ jongno_gu: '1111000000',
+ jung_gu: '1114000000',
+ yongsan_gu: '1117000000',
+ seongdong_gu: '1120000000',
+ gwangjin_gu: '1121500000',
+ dongdaemun_gu: '1123000000',
+ jungnang_gu: '1126000000',
+ seongbuk_gu: '1129000000',
+ gangbuk_gu: '1130500000',
+ dobong_gu: '1132000000',
+ nowon_gu: '1135000000',
+ eunpyeong_gu: '1138000000',
+ seodaemun_gu: '1141000000',
+ mapo_gu: '1144000000',
+ yangcheon_gu: '1147000000',
+ gangseo_gu: '1150000000',
+ guro_gu: '1153000000',
+ geumcheon_gu: '1154500000',
+ yeongdeungpo_gu: '1156000000',
+ dongjak_gu: '1159000000',
+ gwanak_gu: '1162000000',
+ seocho_gu: '1165000000',
+ gangnam_gu: '1168000000',
+ songpa_gu: '1171000000',
+ gangdong_gu: '1174000000',
+ },
+ },
+ Busan: {
+ code: '2600000000',
+ sub: {
+ jung_gu: '2611000000',
+ seo_gu: '2614000000',
+ dong_gu: '2617000000',
+ yeongdo_gu: '2620000000',
+ busanjin_gu: '2623000000',
+ dongnae_gu: '2626000000',
+ nam_gu: '2629000000',
+ buk_gu: '2632000000',
+ haeundae_gu: '2635000000',
+ saha_gu: '2638000000',
+ geumjeong_gu: '2641000000',
+ gangseo_gu: '2644000000',
+ yeonje: '2647000000',
+ suyeong_gu: '2650000000',
+ sasang_gu: '2653000000',
+ gijang: '2671000000',
+ },
+ },
+ Daegu: {
+ code: '2700000000',
+ sub: {
+ jung_gu: '2711000000',
+ dong_gu: '2714000000',
+ seo_gu: '2717000000',
+ nam_gu: '2720000000',
+ buk_gu: '2723000000',
+ suseong_gu: '2726000000',
+ dalseo_gu: '2729000000',
+ dalseong: '2771000000',
+ },
+ },
+ Incheon: {
+ code: '2800000000',
+ sub: {
+ jung_gu: '2811000000',
+ dong_gu: '2814000000',
+ nam_gu: '2817000000',
+ yeonsu_gu: '2818500000',
+ namdong_gu: '2820000000',
+ bupyeong_gu: '2823700000',
+ gyeyang_gu: '2824500000',
+ seo_gu: '2826000000',
+ ganghwa: '2871000000',
+ ongjin_gun: '2872000000',
+ },
+ },
+ Gwangju: {
+ code: '2900000000',
+ sub: {
+ dong_gu: '2911000000',
+ seo_gu: '2914000000',
+ nam_gu: '2915500000',
+ buk_gu: '2917000000',
+ gwangsan_gu: '2920000000',
+ },
+ },
+ Daejeon: {
+ code: '3000000000',
+ sub: {
+ dong_gu: '3011000000',
+ jung_gu: '3014000000',
+ western: '3017000000',
+ yuseong_gu: '3020000000',
+ daedeok_gu: '3023000000',
+ },
+ },
+ Ulsan: {
+ code: '3100000000',
+ sub: {
+ jung_gu: '3111000000',
+ nam_gu: '3114000000',
+ dong_gu: '3117000000',
+ buk_gu: '3120000000',
+ ulju: '3171000000',
+ },
+ },
+ Sejong: {
+ code: '3600000000',
+ sub: {},
+ },
+
+ 'Gyeonggi-do': {
+ code: '4100000000',
+ sub: {
+ suwon_si: '4111000000',
+ seongnam: '4113000000',
+ uijeongbu: '4115000000',
+ anyang_si: '4117000000',
+ bucheon_si: '4119000000',
+ gwangmyeong_si: '4121000000',
+ pyeongtaek_si: '4122000000',
+ dongducheon_si: '4125000000',
+ ansan_si: '4127000000',
+ goyang_si: '4128000000',
+ gwacheon_si: '4129000000',
+ guri: '4131000000',
+ namyangju_si: '4136000000',
+ osan: '4137000000',
+ siheung: '4139000000',
+ gunpo_si: '4141000000',
+ uiwang_si: '4143000000',
+ hanam: '4145000000',
+ yongin_si: '4146000000',
+ paju: '4148000000',
+ icheon: '4150000000',
+ anseong_si: '4155000000',
+ gimpo: '4157000000',
+ hwaseong_si: '4159000000',
+ gwangju: '4161000000',
+ yangju_si: '4163000000',
+ pocheon: '4165000000',
+ yeoju: '4167000000',
+ yeoncheon_gun: '4180000000',
+ gapyeong_gun: '4182000000',
+ yangpyeong: '4183000000',
+ },
+ },
+ Gangwon: {
+ code: '4200000000',
+ sub: {
+ chuncheon: '4211000000',
+ wonju: '4213000000',
+ gangneung_si: '4215000000',
+ donghae: '4217000000',
+ taebaek_si: '4219000000',
+ 'sokcho city': '4221000000',
+ samcheok_si: '4223000000',
+ hongcheon: '4272000000',
+ hoengseong_gun: '4273000000',
+ yeongwol_gun: '4275000000',
+ pyeongchang: '4276000000',
+ jeongseon: '4277000000',
+ cheolwon: '4278000000',
+ hwacheon: '4279000000',
+ yanggu: '4280000000',
+ inje: '4281000000',
+ goseong: '4282000000',
+ yangyang: '4283000000',
+ },
+ },
+ 'Chungcheongbuk-do': {
+ code: '4300000000',
+ sub: {
+ cheongju: '4311000000',
+ chungju: '4313000000',
+ jecheon: '4315000000',
+ boeun: '4372000000',
+ okcheon: '4373000000',
+ yeongdong: '4374000000',
+ jeungpyeong: '4374500000',
+ jincheon: '4375000000',
+ goesan: '4376000000',
+ eumseong: '4377000000',
+ danyang: '4380000000',
+ },
+ },
+ 'Chungcheongnam-do': {
+ code: '4400000000',
+ sub: {
+ cheonan: '4413000000',
+ gongju: '4415000000',
+ boryeong: '4418000000',
+ asan: '4420000000',
+ seosan: '4421000000',
+ nonsan: '4423000000',
+ gyeryong: '4425000000',
+ dangjin: '4427000000',
+ geumsan: '4471000000',
+ buyeo: '4476000000',
+ seocheon: '4477000000',
+ cheongyang: '4479000000',
+ hongseong: '4480000000',
+ yesan: '4481000000',
+ taean: '4482500000',
+ },
+ },
+
+ 'Jeollabuk-do': {
+ code: '4500000000',
+ sub: {
+ jeonju: '4511000000',
+ gunsan_si: '4513000000',
+ iksan: '4514000000',
+ jeongeup: '4518000000',
+ namwon: '4519000000',
+ gimje_si: '4521000000',
+ wanju: '4571000000',
+ jinan: '4572000000',
+ muju: '4573000000',
+ jangsu: '4574000000',
+ imsil: '4575000000',
+ sunchang: '4577000000',
+ gochang: '4579000000',
+ buan: '4580000000',
+ },
+ },
+ 'Jeollanam-do': {
+ code: '4600000000',
+ sub: {
+ mokpo: '4611000000',
+ yosu: '4613000000',
+ suncheon_si: '4615000000',
+ naju: '4617000000',
+ gwangyang_si: '4623000000',
+ damyang: '4671000000',
+ gokseong: '4672000000',
+ gurye: '4673000000',
+ goheung: '4677000000',
+ boseong: '4678000000',
+ hwasun: '4679000000',
+ jangheung: '4680000000',
+ gangjin: '4681000000',
+ haenam: '4682000000',
+ yeongam: '4683000000',
+ muan: '4684000000',
+ hampyeong: '4686000000',
+ yeonggwang: '4687000000',
+ jangseong: '4688000000',
+ wando: '4689000000',
+ jindo: '4690000000',
+ sinan: '4691000000',
+ },
+ },
+ 'Gyeongsangbuk-do': {
+ code: '4700000000',
+ sub: {
+ pohang_si: '4711000000',
+ gyeongju_si: '4713000000',
+ gimcheon_si: '4715000000',
+ andong_si: '4717000000',
+ gumi_si: '4719000000',
+ yeongju_si: '4721000000',
+ yeongcheon_si: '4723000000',
+ sangju_si: '4725000000',
+ mungyeong_si: '4728000000',
+ gyeongsan_si: '4729000000',
+ gunwi: '4772000000',
+ uiseong: '4773000000',
+ cheongsong: '4775000000',
+ goryong: '4776000000',
+ yeongdeok: '4777000000',
+ cheongdo: '4782000000',
+ golyeong: '4783000000',
+ seongju: '4784000000',
+ chilgok: '4785000000',
+ yecheon: '4790000000',
+ bonghwa: '4792000000',
+ uljin: '4793000000',
+ ulleung: '4794000000',
+ },
+ },
+ 'Gyeongsangnam-do': {
+ code: '4800000000',
+ sub: {
+ changwon_si: '4811000000',
+ jinju: '4817000000',
+ tongyeong_si: '4822000000',
+ sacheon_si: '4824000000',
+ gimhae_si: '4825000000',
+ miryang_si: '4827000000',
+ geoje_si: '4831000000',
+ yangsan_si: '4833000000',
+ uiryeong: '4872000000',
+ haman: '4873000000',
+ changnyeong: '4874000000',
+ goseong: '4882000000',
+ namhae: '4884000000',
+ hadong: '4885000000',
+ sancheong: '4886000000',
+ hamyang: '4887000000',
+ geochang: '4888000000',
+ hapcheon: '4889000000',
+ },
+ },
+ Jeju: {
+ code: '5000000000',
+ sub: {
+ jeju_si: '5011000000',
+ seogwipo: '5013000000',
+ },
+ },
+ },
+ propertyMap: {
+ //날짜별
+ the_lowest_temperature: 'min_temp',
+ the_highest_temperature: 'max_temp',
+ humidity: 'humidity',
+ precipitation: 'rain',
+ precipitation_probability: 'rain_p',
+ wind_speed: 'windspd',
+ //현재
+ temperature: 'temp',
+ concentration_of_fine_dust: 'pm10',
+ },
+ defaultData: {
+ //week
+ //aplYmd: 20180905,
+ max_temp: 0,
+ min_temp: 0,
+ sky: '구름조금',
+ sky_code: '2',
+ winddir: 'W',
+ windspd: 0,
+ rain: 0,
+ rain_p: 0,
+ humidity: 0,
+ locationCode: '1100000000',
+ updated: '2018-09-05T03:27:42.804Z',
+ //hour
+ //aplYmdt: "2018090500",
+ rainAmt: 0,
+ temp: 0,
+ //now
+ pm10: 0,
+ pm10_s: '좋음',
+ },
};
-Entry.Expansion_Weather.getBlocks = function() {
+Entry.EXPANSION_BLOCK.weather.getBlocks = function() {
const params = {
getDate(isPython = false) {
const param = {
diff --git a/src/playground/blocks/block_func.js b/src/playground/blocks/block_func.js
index a66852fa46..b4523382ec 100644
--- a/src/playground/blocks/block_func.js
+++ b/src/playground/blocks/block_func.js
@@ -395,7 +395,8 @@ module.exports = {
promises
);
} else {
- return Entry.Code.funcRestExecute(this.funcCode, this.funcExecutor);
+ this.funcCode.removeExecutor(this.funcExecutor);
+ return Entry.STATIC.BREAK;
}
} else {
this.funcCode.removeExecutor(this.funcExecutor);
diff --git a/src/playground/blocks/block_start.js b/src/playground/blocks/block_start.js
index a59a5d968e..efbfb2b20e 100644
--- a/src/playground/blocks/block_start.js
+++ b/src/playground/blocks/block_start.js
@@ -3,6 +3,29 @@ import { keyInputList } from './inputs/keyboard';
module.exports = {
getBlocks() {
return {
+ messageAddButton: {
+ skeleton: 'basic_button',
+ color: EntryStatic.colorSet.common.BUTTON_BACKGROUND,
+ params: [
+ {
+ type: 'Text',
+ text: Lang.Workspace.message_create,
+ color: EntryStatic.colorSet.common.BUTTON,
+ align: 'center',
+ },
+ ],
+ def: {
+ type: 'messageAddButton',
+ },
+ events: {
+ mousedown: [
+ function() {
+ Entry.variableContainer.openVariableAddPanel('message');
+ },
+ ],
+ },
+ syntax: { js: [], py: [''] },
+ },
when_run_button_click: {
color: EntryStatic.colorSet.block.default.START,
outerLine: EntryStatic.colorSet.block.darken.START,
diff --git a/src/playground/blocks/index.js b/src/playground/blocks/index.js
index 44065f9674..3e1dd09986 100644
--- a/src/playground/blocks/index.js
+++ b/src/playground/blocks/index.js
@@ -17,65 +17,9 @@ const basicBlockList = [
require('./block_calc'),
require('./block_variable'),
require('./block_func'),
- require('./block_ai'),
require('./block_analysis'),
- require('./block_ai_learning'),
- require('./block_ai_learning_knn'),
- require('./block_ai_learning_cluster'),
- require('./block_ai_learning_regression'),
- require('./block_ai_learning_logistic_regression'),
- require('./block_ai_learning_decisiontree'),
- require('./block_ai_learning_svm'),
- require('./block_ai_utilize_media_pipe'),
];
-Entry.AI_UTILIZE_BLOCK = {};
-require('./block_ai_utilize_audio');
-require('./block_ai_utilize_tts');
-require('./block_ai_utilize_translate');
-require('./block_ai_utilize_video');
-require('./block_ai_utilize_gesture_recognition');
-require('./block_ai_utilize_pose_landmarker');
-require('./block_ai_utilize_face_landmarker');
-require('./block_ai_utilize_object_detector');
-Entry.AI_UTILIZE_BLOCK_LIST = {
- audio: Entry.AI_UTILIZE_BLOCK.audio,
- tts: Entry.AI_UTILIZE_BLOCK.tts,
- translate: Entry.AI_UTILIZE_BLOCK.translate,
- poseLandmarker: Entry.AI_UTILIZE_BLOCK.poseLandmarker,
- faceLandmarker: Entry.AI_UTILIZE_BLOCK.faceLandmarker,
- objectDetector: Entry.AI_UTILIZE_BLOCK.objectDetector,
- gestureRecognition: Entry.AI_UTILIZE_BLOCK.gestureRecognition,
-};
-
-Entry.AI_UTILIZE_BLOCK_LIST_DEPRECATED = {
- video: Entry.AI_UTILIZE_BLOCK.video,
-};
-
-Entry.ALL_AI_UTILIZE_BLOCK_LIST = {
- audio: Entry.AI_UTILIZE_BLOCK.audio,
- tts: Entry.AI_UTILIZE_BLOCK.tts,
- translate: Entry.AI_UTILIZE_BLOCK.translate,
- poseLandmarker: Entry.AI_UTILIZE_BLOCK.poseLandmarker,
- faceLandmarker: Entry.AI_UTILIZE_BLOCK.faceLandmarker,
- objectDetector: Entry.AI_UTILIZE_BLOCK.objectDetector,
- gestureRecognition: Entry.AI_UTILIZE_BLOCK.gestureRecognition,
- video: Entry.AI_UTILIZE_BLOCK.video,
-};
-
-Entry.EXPANSION_BLOCK = {};
-require('./block_expansion_weather');
-require('./block_expansion_festival');
-require('./block_expansion_behaviorconduct_disaster');
-require('./block_expansion_behaviorconduct_lifesafety');
-
-Entry.EXPANSION_BLOCK_LIST = {
- weather: Entry.Expansion_Weather,
- festival: Entry.EXPANSION_BLOCK.festival,
- behaviorConductDisaster: Entry.EXPANSION_BLOCK.behaviorConductDisaster,
- behaviorConductLifeSafety: Entry.EXPANSION_BLOCK.behaviorConductLifeSafety,
-};
-
const destroyBlockList = [];
function getBlockObject(items) {
@@ -134,7 +78,7 @@ function registerHardwareBlockToStatic(hardwareModules) {
try {
if (hardware.hasPracticalCourse && EntryStatic.isPracticalCourse) {
if (hardware.practicalBlockMenuBlocks) {
- for (let category in hardware.practicalBlockMenuBlocks) {
+ for (const category in hardware.practicalBlockMenuBlocks) {
EntryStatic.DynamicPracticalHardwareBlocks[category] = _union(
hardware.practicalBlockMenuBlocks[category],
EntryStatic.DynamicPracticalHardwareBlocks[category]
@@ -159,11 +103,7 @@ module.exports = {
const hardwareLiteModules = hardwareLite.getHardwareLiteModuleList();
registerHardwareBlockToStatic(hardwareModules);
registerHardwareBlockToStatic(hardwareLiteModules);
- const basicAndExpansionBlockObjectList = getBlockObject(
- basicBlockList
- .concat(Object.values(Entry.EXPANSION_BLOCK_LIST))
- .concat(Object.values(Entry.ALL_AI_UTILIZE_BLOCK_LIST))
- );
+ const basicAndExpansionBlockObjectList = getBlockObject(basicBlockList);
const hardwareBlockObjectList = getHardwareBlockObject(hardwareModules);
const hardwareLiteBlockObjectList = getHardwareBlockObject(hardwareLiteModules);
return Object.assign(
diff --git a/src/util/contextmenu.js b/src/util/contextmenu.js
index f2c73d9b7d..2fc71bad99 100644
--- a/src/util/contextmenu.js
+++ b/src/util/contextmenu.js
@@ -84,6 +84,9 @@ Entry.ContextMenu = {};
ctx.hide = function() {
this.visible = false;
const dom = this.dom;
+ if (!dom) {
+ return;
+ }
dom.addClass('entryRemove');
if (this._className) {
diff --git a/src/util/init.js b/src/util/init.js
index ddbd6e4803..d27af39fc9 100644
--- a/src/util/init.js
+++ b/src/util/init.js
@@ -219,6 +219,7 @@ Entry.initialize_ = function() {
if (this.options.expansionDisable === false || this.options.expansionDisable === undefined) {
this.expansion = new Expansion(this.playground);
this._destroyer.add(this.expansion);
+ this.expansion.init();
}
if (this.options.aiUtilizeDisable === false || this.options.aiUtilizeDisable === undefined) {
@@ -226,6 +227,8 @@ Entry.initialize_ = function() {
this._destroyer.add(this.aiUtilize);
this.aiLearning = new AILearning(this.playground, this.aiLearningEnable);
this._destroyer.add(this.aiLearning);
+ this.aiUtilize.init();
+ this.aiLearning.init();
}
this.intro = new Entry.Intro();
@@ -247,6 +250,8 @@ Entry.initialize_ = function() {
};
Entry.disposeContainer = function() {
+ this._destroyer = this._destroyer || new Destroyer();
+ this._destroyer.destroy();
while (this.view_.firstChild) {
this.view_.removeChild(this.view_.firstChild);
}
diff --git a/src/util/mediaPipeUtils.ts b/src/util/mediaPipeUtils.ts
index 7b2a780288..145a054cfe 100644
--- a/src/util/mediaPipeUtils.ts
+++ b/src/util/mediaPipeUtils.ts
@@ -1596,7 +1596,6 @@ class MediaPipeUtils {
destroy() {
this.isInitialized = false;
- console.log('destroy');
}
}
diff --git a/src/util/utils.js b/src/util/utils.js
index 4be95304a9..1b78c8f037 100644
--- a/src/util/utils.js
+++ b/src/util/utils.js
@@ -357,9 +357,6 @@ Entry.resizeElement = function(interfaceModel) {
if (!interfaceModel.canvasWidth && interfaceState.canvasWidth) {
interfaceModel.canvasWidth = interfaceState.canvasWidth;
}
- if (!interfaceModel.menuWidth && this.interfaceState.menuWidth) {
- interfaceModel.menuWidth = interfaceState.menuWidth;
- }
if (Entry.engine.speedPanelOn) {
Entry.engine.toggleSpeedPanel();
@@ -386,26 +383,9 @@ Entry.resizeElement = function(interfaceModel) {
toggleEngineContainer(isEngineContainerVisible);
- let menuWidth = interfaceModel.menuWidth;
- if (!menuWidth) {
- menuWidth = 258;
- } else if (menuWidth < 258) {
- menuWidth = 258;
- } else if (menuWidth > 516) {
- menuWidth = 516;
- }
- interfaceModel.menuWidth = menuWidth;
-
const blockMenu = mainWorkspace.blockMenu;
const adjust = blockMenu.hasCategory() ? -64 : 0;
- $('.blockMenuContainer').css({ width: `${menuWidth + adjust}px` });
- $('.blockMenuContainer>div').css({ width: `${menuWidth + adjust - 2}px` });
- blockMenu.setWidth();
- $('.entryWorkspaceBoard').css({ left: `${menuWidth - 4}px` });
- Entry.playground.resizeHandle_.style.left = `${menuWidth - 4}px`;
- Entry.playground.variableViewWrapper_.style.width = `${menuWidth - 4}px`;
-
this.interfaceState = interfaceModel;
}
diff --git a/src/util/weather_forecast.js b/src/util/weather_forecast.js
deleted file mode 100644
index 14cacb8c7e..0000000000
--- a/src/util/weather_forecast.js
+++ /dev/null
@@ -1,509 +0,0 @@
-'use strict';
-
-const PromiseManager = require('../core/promiseManager');
-const { callApi } = require('../util/common');
-const { locationData } = require('../util/location');
-
-Entry.EXPANSION_BLOCK.weather = {
- isInitialized: false,
- api: '/api/expansionBlock/weather/',
- date : new Date(),
- apiFail: {},
- init: function() {
- if (this.isInitialized) {
- return;
- }
- Entry.EXPANSION_BLOCK.weather.date = new Date();
- Entry.EXPANSION_BLOCK.weather.getData("week","Seoul","today");
- Entry.EXPANSION_BLOCK.weather.getData("hour","Seoul","00");
- Entry.EXPANSION_BLOCK.weather.getData("now","Seoul");
- Entry.EXPANSION_BLOCK.weather.isInitialized = true;
- },
- locationMap: {
- Seoul : {
- code : "1100000000",
- sub : {
- "jongno_gu" : "1111000000",
- "jung_gu" : "1114000000",
- "yongsan_gu" : "1117000000",
- "seongdong_gu" : "1120000000",
- "gwangjin_gu" : "1121500000",
- "dongdaemun_gu" : "1123000000",
- "jungnang_gu" : "1126000000",
- "seongbuk_gu" : "1129000000",
- "gangbuk_gu" : "1130500000",
- "dobong_gu" : "1132000000",
- "nowon_gu" : "1135000000",
- "eunpyeong_gu" : "1138000000",
- "seodaemun_gu" : "1141000000",
- "mapo_gu" : "1144000000",
- "yangcheon_gu" : "1147000000",
- "gangseo_gu" : "1150000000",
- "guro_gu" : "1153000000",
- "geumcheon_gu" : "1154500000",
- "yeongdeungpo_gu" : "1156000000",
- "dongjak_gu" : "1159000000",
- "gwanak_gu" : "1162000000",
- "seocho_gu" : "1165000000",
- "gangnam_gu" : "1168000000",
- "songpa_gu" : "1171000000",
- "gangdong_gu" : "1174000000",
- }
- },
- Busan : {
- code : "2600000000",
- sub : {
- "jung_gu" : "2611000000",
- "seo_gu" : "2614000000",
- "dong_gu" : "2617000000",
- "yeongdo_gu" : "2620000000",
- "busanjin_gu" : "2623000000",
- "dongnae_gu" : "2626000000",
- "nam_gu" : "2629000000",
- "buk_gu" : "2632000000",
- "haeundae_gu" : "2635000000",
- "saha_gu" : "2638000000",
- "geumjeong_gu" : "2641000000",
- "gangseo_gu" : "2644000000",
- "yeonje" : "2647000000",
- "suyeong_gu" : "2650000000",
- "sasang_gu" : "2653000000",
- "gijang" : "2671000000",
- }
- },
- Daegu : {
- code : "2700000000",
- sub : {
- "jung_gu" : "2711000000",
- "dong_gu" : "2714000000",
- "seo_gu" : "2717000000",
- "nam_gu" : "2720000000",
- "buk_gu" : "2723000000",
- "suseong_gu" : "2726000000",
- "dalseo_gu" : "2729000000",
- "dalseong" : "2771000000",
- }
- },
- Incheon :{
- code : "2800000000",
- sub : {
- "jung_gu" : "2811000000",
- "dong_gu" : "2814000000",
- "nam_gu" : "2817000000",
- "yeonsu_gu" : "2818500000",
- "namdong_gu" : "2820000000",
- "bupyeong_gu" : "2823700000",
- "gyeyang_gu" : "2824500000",
- "seo_gu" : "2826000000",
- "ganghwa" : "2871000000",
- "ongjin_gun" : "2872000000",
- }
- },
- Gwangju : {
- code : "2900000000",
- sub : {
- "dong_gu" : "2911000000",
- "seo_gu" : "2914000000",
- "nam_gu" : "2915500000",
- "buk_gu" : "2917000000",
- "gwangsan_gu" : "2920000000",
- }
- },
- Daejeon : {
- code : "3000000000",
- sub : {
- "dong_gu" : "3011000000",
- "jung_gu" : "3014000000",
- "western" : "3017000000",
- "yuseong_gu" : "3020000000",
- "daedeok_gu" : "3023000000",
- }
- },
- Ulsan : {
- code : "3100000000",
- sub : {
- "jung_gu" : "3111000000",
- "nam_gu" : "3114000000",
- "dong_gu" : "3117000000",
- "buk_gu" : "3120000000",
- "ulju" : "3171000000",
- }
- },
- Sejong : {
- code : "3600000000",
- sub : {
-
- }
- },
-
-
- "Gyeonggi-do" : {
- code : "4100000000",
- sub : {
- "suwon_si" : "4111000000",
- "seongnam" : "4113000000",
- "uijeongbu" : "4115000000",
- "anyang_si" : "4117000000",
- "bucheon_si" : "4119000000",
- "gwangmyeong_si" : "4121000000",
- "pyeongtaek_si" : "4122000000",
- "dongducheon_si" : "4125000000",
- "ansan_si" : "4127000000",
- "goyang_si" : "4128000000",
- "gwacheon_si" : "4129000000",
- "guri" : "4131000000",
- "namyangju_si" : "4136000000",
- "osan" : "4137000000",
- "siheung" : "4139000000",
- "gunpo_si" : "4141000000",
- "uiwang_si" : "4143000000",
- "hanam" : "4145000000",
- "yongin_si" : "4146000000",
- "paju" : "4148000000",
- "icheon" : "4150000000",
- "anseong_si" : "4155000000",
- "gimpo" : "4157000000",
- "hwaseong_si" : "4159000000",
- "gwangju" : "4161000000",
- "yangju_si" : "4163000000",
- "pocheon" : "4165000000",
- "yeoju" : "4167000000",
- "yeoncheon_gun" : "4180000000",
- "gapyeong_gun" : "4182000000",
- "yangpyeong" : "4183000000",
- }
- },
- "Gangwon" : {
- code : "4200000000",
- sub : {
- "chuncheon" : "4211000000",
- "wonju" : "4213000000",
- "gangneung_si" : "4215000000",
- "donghae" : "4217000000",
- "taebaek_si" : "4219000000",
- "sokcho city" : "4221000000",
- "samcheok_si" : "4223000000",
- "hongcheon" : "4272000000",
- "hoengseong_gun" : "4273000000",
- "yeongwol_gun" : "4275000000",
- "pyeongchang" : "4276000000",
- "jeongseon" : "4277000000",
- "cheolwon" : "4278000000",
- "hwacheon" : "4279000000",
- "yanggu" : "4280000000",
- "inje" : "4281000000",
- "goseong" : "4282000000",
- "yangyang" : "4283000000",
- }
- },
- "Chungcheongbuk-do" : {
- code : "4300000000",
- sub : {
- "cheongju" : "4311000000",
- "chungju" : "4313000000",
- "jecheon" : "4315000000",
- "boeun" : "4372000000",
- "okcheon" : "4373000000",
- "yeongdong" : "4374000000",
- "jeungpyeong" : "4374500000",
- "jincheon" : "4375000000",
- "goesan" : "4376000000",
- "eumseong" : "4377000000",
- "danyang" : "4380000000",
- }
- },
- "Chungcheongnam-do" : {
- code : "4400000000",
- sub : {
- "cheonan" : "4413000000",
- "gongju" : "4415000000",
- "boryeong" : "4418000000",
- "asan" : "4420000000",
- "seosan" : "4421000000",
- "nonsan" : "4423000000",
- "gyeryong" : "4425000000",
- "dangjin" : "4427000000",
- "geumsan" : "4471000000",
- "buyeo" : "4476000000",
- "seocheon" : "4477000000",
- "cheongyang" : "4479000000",
- "hongseong" : "4480000000",
- "yesan" : "4481000000",
- "taean" : "4482500000",
- }
- },
-
-
-
- "Jeollabuk-do" : {
- code : "4500000000",
- sub: {
- "jeonju" : "4511000000",
- "gunsan_si" : "4513000000",
- "iksan" : "4514000000",
- "jeongeup" : "4518000000",
- "namwon" : "4519000000",
- "gimje_si" : "4521000000",
- "wanju" : "4571000000",
- "jinan" : "4572000000",
- "muju" : "4573000000",
- "jangsu" : "4574000000",
- "imsil" : "4575000000",
- "sunchang" : "4577000000",
- "gochang" : "4579000000",
- "buan" : "4580000000",
- }
- },
- "Jeollanam-do" : {
- code : "4600000000",
- sub : {
- "mokpo" : "4611000000",
- "yosu" : "4613000000",
- "suncheon_si" : "4615000000",
- "naju" : "4617000000",
- "gwangyang_si" : "4623000000",
- "damyang" : "4671000000",
- "gokseong" : "4672000000",
- "gurye" : "4673000000",
- "goheung" : "4677000000",
- "boseong" : "4678000000",
- "hwasun" : "4679000000",
- "jangheung" : "4680000000",
- "gangjin" : "4681000000",
- "haenam" : "4682000000",
- "yeongam" : "4683000000",
- "muan" : "4684000000",
- "hampyeong" : "4686000000",
- "yeonggwang" : "4687000000",
- "jangseong" : "4688000000",
- "wando" : "4689000000",
- "jindo" : "4690000000",
- "sinan" : "4691000000",
- }
- },
- "Gyeongsangbuk-do" : {
- code : "4700000000",
- sub : {
- "pohang_si" : "4711000000",
- "gyeongju_si" : "4713000000",
- "gimcheon_si" : "4715000000",
- "andong_si" : "4717000000",
- "gumi_si" : "4719000000",
- "yeongju_si" : "4721000000",
- "yeongcheon_si" : "4723000000",
- "sangju_si" : "4725000000",
- "mungyeong_si" : "4728000000",
- "gyeongsan_si" : "4729000000",
- "gunwi" : "4772000000",
- "uiseong" : "4773000000",
- "cheongsong" : "4775000000",
- "goryong" : "4776000000",
- "yeongdeok" : "4777000000",
- "cheongdo" : "4782000000",
- "golyeong" : "4783000000",
- "seongju" : "4784000000",
- "chilgok" : "4785000000",
- "yecheon" : "4790000000",
- "bonghwa" : "4792000000",
- "uljin" : "4793000000",
- "ulleung" : "4794000000",
- }
- },
- "Gyeongsangnam-do" : {
- code : "4800000000",
- sub : {
- "changwon_si" : "4811000000",
- "jinju" : "4817000000",
- "tongyeong_si" : "4822000000",
- "sacheon_si" : "4824000000",
- "gimhae_si" : "4825000000",
- "miryang_si" : "4827000000",
- "geoje_si" : "4831000000",
- "yangsan_si" : "4833000000",
- "uiryeong" : "4872000000",
- "haman" : "4873000000",
- "changnyeong" : "4874000000",
- "goseong" : "4882000000",
- "namhae" : "4884000000",
- "hadong" : "4885000000",
- "sancheong" : "4886000000",
- "hamyang" : "4887000000",
- "geochang" : "4888000000",
- "hapcheon" : "4889000000",
- }
- },
- "Jeju" : {
- code : "5000000000",
- sub : {
- "jeju_si" : "5011000000",
- "seogwipo" : "5013000000"
- }
- },
- },
- propertyMap: {
- //날짜별
- 'the_lowest_temperature': 'min_temp',
- 'the_highest_temperature': 'max_temp',
- 'humidity': 'humidity',
- 'precipitation': 'rain',
- 'precipitation_probability': 'rain_p',
- 'wind_speed': 'windspd',
- //현재
- 'temperature': 'temp',
- 'concentration_of_fine_dust': 'pm10',
- },
- //api 조회 실패시 노출될 값.
- defaultData: {
- //week
- //aplYmd: 20180905,
- max_temp: 0,
- min_temp: 0,
- sky: '구름조금',
- sky_code: '2',
- winddir: 'W',
- windspd: 0,
- rain: 0,
- rain_p: 0,
- humidity: 0,
- locationCode: '1100000000',
- updated: '2018-09-05T03:27:42.804Z',
- //hour
- //aplYmdt: "2018090500",
- rainAmt: 0,
- temp: 0,
- //now
- pm10: 0,
- pm10_s: '좋음',
- },
-};
-
-function resolveData(weatherData, type, dateStr) {
- if (type === 'now') {
- return weatherData[Object.keys(weatherData)[0]];
- } else if (type === 'hour') {
- return weatherData[dateStr];
- } else {
- return weatherData[Entry.EXPANSION_BLOCK.weather.getDate(dateStr)];
- }
-}
-
-Entry.EXPANSION_BLOCK.weather.getData = function(type, location, dateStr) {
- let cityCode = null;
- if (typeof location === 'string') {
- cityCode = this.locationMap[location].code;
- } else {
- if (location.sub == locationData.initialData[1]) {
- cityCode = this.locationMap[location.parent].code;
- } else {
- cityCode = this.locationMap[location.parent].sub[location.sub];
- }
- }
-
- const url = this.api + type;
- return new PromiseManager().Promise(function(resolve) {
- callApi(url, { url })
- .then((response) => {
- Entry.EXPANSION_BLOCK.weather.apiFail[type] = false;
- resolve(resolveData(response.data[cityCode], type, dateStr));
- })
- .catch((error) => {
- Entry.EXPANSION_BLOCK.weather.apiFail[type] = { error };
- resolve(Entry.EXPANSION_BLOCK.weather.defaultData);
- });
- })
- .catch(() => Entry.EXPANSION_BLOCK.weather.defaultData);
-};
-
-Entry.EXPANSION_BLOCK.weather.getDate = function(key) {
- Entry.EXPANSION_BLOCK.weather.date = Entry.EXPANSION_BLOCK.weather.date || new Date();
- const date = new Date(Entry.EXPANSION_BLOCK.weather.date);
- switch (key) {
- case 'yesterday':
- date.setDate(date.getDate() - 1);
- break;
- case 'today':
- break;
- case 'tomorrow':
- date.setDate(date.getDate() + 1);
- break;
- case 'After_2_days':
- date.setDate(date.getDate() + 2);
- break;
- case 'After_3_days':
- date.setDate(date.getDate() + 3);
- break;
- case 'After_4_days':
- date.setDate(date.getDate() + 4);
- break;
- case 'After_5_days':
- date.setDate(date.getDate() + 5);
- break;
- case 'After_6_days':
- date.setDate(date.getDate() + 6);
- break;
- default:
- break;
- }
- return date.toISOString().slice(0, 10).replace(/-/g, '');
-};
-
-Entry.EXPANSION_BLOCK.weather.checkWeather = function(sky_code, weather) {
- if (Entry.EXPANSION_BLOCK.weather.apiFail.week) {
- return true;
- }
-
- const skyCodeMap = {
- '1': 'sunny', //"맑음",
- '2': 'partly_cloudy', //"구름조금",
- '3': 'cloudy', //"흐림",
- '4': 'rainy', //"비",
- '5': 'snowy', //"눈",
- '6': 'sleet', //"눈비",
-
- '7': 'rainy', //"소나기",
- '8': 'snowy', //"소낙눈",
- '9': 'cloudy', //"안개",
- '10': 'rainy', //"뇌우",
- '11': 'cloudy', //"차차 흐려짐",
- '12': 'rainy', //"흐려져 뇌우",
- '13': 'rainy', //"흐려져 비",
- '14': 'snowy', //"흐려져 눈",
- '15': 'sleet', //"흐려져 눈비",
- '16': 'cloudy', //"흐린 후 갬",
- '17': 'rainy', //"뇌우 후 갬",
- '18': 'rainy', //"비 후 갬",
- '19': 'snowy', //"눈 후 갬",
- '20': 'sleet', //"눈비 후 갬",
- '21': 'mostly_cloudy', //"구름많음",
- '22': 'cloudy',
- };
-
- if (skyCodeMap[sky_code]) {
- return skyCodeMap[sky_code] === weather;
- } else {
- return 'sunny' === weather;
- }
-};
-
-Entry.EXPANSION_BLOCK.weather.checkFineDust = function(pm10, finedust) {
- if (Entry.EXPANSION_BLOCK.weather.apiFail.now) {
- return true;
- }
-
- const fineDustMap = {
- 'good': { 'min': 0, 'max': 30 },
- 'normal': { 'min': 31, 'max': 80 },
- 'bad': { 'min': 81, 'max': 150 },
- 'very_bad': { 'min': 150, 'max': 9999 },
- };
-
- for (let key in fineDustMap) {
- if (fineDustMap[key].min <= pm10 && pm10 <= fineDustMap[key].max) {
- return key === finedust;
- }
- }
- return 'very_bad' === finedust;
-};
-
-
-