| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- var ace = require('brace'),
- Mock = require('mockjs');
- require('brace/mode/javascript');
- require('brace/mode/json');
- require('brace/mode/xml');
- require('brace/mode/html');
- require('brace/theme/xcode');
- require('brace/ext/language_tools.js');
- var json5 = require('json5');
- const MockExtra = require('common/mock-extra.js');
- var langTools = ace.acequire('ace/ext/language_tools'),
- wordList = [
- { name: '字符串', mock: '@string' },
- { name: '自然数', mock: '@natural' },
- { name: '浮点数', mock: '@float' },
- { name: '字符', mock: '@character' },
- { name: '布尔', mock: '@boolean' },
- { name: 'url', mock: '@url' },
- { name: '域名', mock: '@domain' },
- { name: 'ip地址', mock: '@ip' },
- { name: 'id', mock: '@id' },
- { name: 'guid', mock: '@guid' },
- { name: '当前时间', mock: '@now' },
- { name: '时间戳', mock: '@timestamp' },
- { name: '日期', mock: '@date' },
- { name: '时间', mock: '@time' },
- { name: '日期时间', mock: '@datetime' },
- { name: '图片连接', mock: '@image' },
- { name: '图片data', mock: '@imageData' },
- { name: '颜色', mock: '@color' },
- { name: '颜色hex', mock: '@hex' },
- { name: '颜色rgba', mock: '@rgba' },
- { name: '颜色rgb', mock: '@rgb' },
- { name: '颜色hsl', mock: '@hsl' },
- { name: '整数', mock: '@integer' },
- { name: 'email', mock: '@email' },
- { name: '大段文本', mock: '@paragraph' },
- { name: '句子', mock: '@sentence' },
- { name: '单词', mock: '@word' },
- { name: '大段中文文本', mock: '@cparagraph' },
- { name: '中文标题', mock: '@ctitle' },
- { name: '标题', mock: '@title' },
- { name: '姓名', mock: '@name' },
- { name: '中文姓名', mock: '@cname' },
- { name: '中文姓', mock: '@cfirst' },
- { name: '中文名', mock: '@clast' },
- { name: '英文姓', mock: '@first' },
- { name: '英文名', mock: '@last' },
- { name: '中文句子', mock: '@csentence' },
- { name: '中文词组', mock: '@cword' },
- { name: '地址', mock: '@region' },
- { name: '省份', mock: '@province' },
- { name: '城市', mock: '@city' },
- { name: '地区', mock: '@county' },
- { name: '转换为大写', mock: '@upper' },
- { name: '转换为小写', mock: '@lower' },
- { name: '挑选(枚举)', mock: '@pick' },
- { name: '打乱数组', mock: '@shuffle' },
- { name: '协议', mock: '@protocol' }
- ];
- let dom = ace.acequire('ace/lib/dom');
- ace.acequire('ace/commands/default_commands').commands.push({
- name: 'Toggle Fullscreen',
- bindKey: 'F9',
- exec: function(editor) {
- if (editor._fullscreen_yapi) {
- let fullScreen = dom.toggleCssClass(document.body, 'fullScreen');
- dom.setCssClass(editor.container, 'fullScreen', fullScreen);
- editor.setAutoScrollEditorIntoView(!fullScreen);
- editor.resize();
- }
- }
- });
- function run(options) {
- var editor, mockEditor, rhymeCompleter;
- function handleJson(json) {
- var curData = mockEditor.curData;
- try {
- curData.text = json;
- var obj = json5.parse(json);
- curData.format = true;
- curData.jsonData = obj;
- curData.mockData = () => Mock.mock(MockExtra(obj, {})); //为防止时时 mock 导致页面卡死的问题,改成函数式需要用到再计算
- } catch (e) {
- curData.format = e.message;
- }
- }
- options = options || {};
- var container, data;
- container = options.container || 'mock-editor';
- if (
- options.wordList &&
- typeof options.wordList === 'object' &&
- options.wordList.name &&
- options.wordList.mock
- ) {
- wordList.push(options.wordList);
- }
- data = options.data || '';
- options.readOnly = options.readOnly || false;
- options.fullScreen = options.fullScreen || false;
- editor = ace.edit(container);
- editor.$blockScrolling = Infinity;
- editor.getSession().setMode('ace/mode/javascript');
- if (options.readOnly === true) {
- editor.setReadOnly(true);
- editor.renderer.$cursorLayer.element.style.display = 'none';
- }
- editor.setTheme('ace/theme/xcode');
- editor.setOptions({
- enableBasicAutocompletion: true,
- enableSnippets: false,
- enableLiveAutocompletion: true,
- useWorker: true
- });
- editor._fullscreen_yapi = options.fullScreen;
- mockEditor = {
- curData: {},
- getValue: () => mockEditor.curData.text,
- setValue: function(data) {
- editor.setValue(handleData(data));
- },
- editor: editor,
- options: options,
- insertCode: code => {
- let pos = editor.selection.getCursor();
- editor.session.insert(pos, code);
- }
- };
- function formatJson(json) {
- try {
- return JSON.stringify(JSON.parse(json), null, 2);
- } catch (err) {
- return json;
- }
- }
- function handleData(data) {
- data = data || '';
- if (typeof data === 'string') {
- return formatJson(data);
- } else if (typeof data === 'object') {
- return JSON.stringify(data, null, ' ');
- } else {
- return '' + data;
- }
- }
- rhymeCompleter = {
- identifierRegexps: [/[@]/],
- getCompletions: function(editor, session, pos, prefix, callback) {
- if (prefix.length === 0) {
- callback(null, []);
- return;
- }
- callback(
- null,
- wordList.map(function(ea) {
- return { name: ea.mock, value: ea.mock, score: ea.mock, meta: ea.name };
- })
- );
- }
- };
- langTools.addCompleter(rhymeCompleter);
- mockEditor.setValue(handleData(data));
- handleJson(editor.getValue());
- editor.clearSelection();
- editor.getSession().on('change', () => {
- handleJson(editor.getValue());
- if (typeof options.onChange === 'function') {
- options.onChange.call(mockEditor, mockEditor.curData);
- }
- editor.clearSelection();
- });
- return mockEditor;
- }
- /**
- * mockEditor({
- container: 'req_body_json', //dom的id
- data: that.state.req_body_json, //初始化数据
- onChange: function (d) {
- that.setState({
- req_body_json: d.text
- })
- }
- })
- */
- module.exports = run;
|