Initializing...

 
var flw = parseInt(ui.get_editor_prefs('flw')); $(window).resize(function(){ $('#list-column').width(flw); $('#file-margin').css('left', flw); $('#file-column').css('left', flw + $('#file-margin').width()); var fixer = $('#fixer'); var fixerOffset = fixer.offset(); var filecolumn_offset = $('#file-column').offset(); var filecolumn_height = Math.max(fixerOffset.top + fixer[0].offsetHeight, $(window).height()) - filecolumn_offset.top; var filecolumn_width = Math.max(fixerOffset.left + fixer[0].offsetWidth, $(window).width()) - filecolumn_offset.left; var filearea_offset = $('#file-area').offset(); var filearea_height = Math.max(fixerOffset.top + fixer[0].offsetHeight, $(window).height()) - filearea_offset.top; $('.row').width( filecolumn_width ); $('.column').height( filecolumn_height - 1 ); $('#file-area').height( filearea_height - 1 ); $('#file-list').height( filearea_height - 55 ); $('.refresh-right').show(); }); $('#file-margin').draggable({ axis: 'x', iframeFix: true, containment: [125,,400,], drag : function(event, jqui) { flw = $('#file-margin').offset().left; $(window).trigger('resize'); }, stop : function(event, jqui) { flw = $('#file-margin').offset().left; ui.set_editor_prefs({flw: flw}); $(window).trigger('resize'); } }); $('#file-area').click(ui.do_click_error);
var store = ui.get_store(); var user = ui.get_user();

Apps

var app = ui.get_app();

Acre App Editor

Loading...

${app.get_display_name()}

${user.get_name()} Settings Sign Out Sign In Sign Up

var app = ui.get_app(); var is_author = app.is_author(); var user = ui.get_user(); var versions = app.get_versions(); var release = app.get_released_version(); var version = app.get_version_label(); var path = app.get_path(); var vpath = app.get_versioned_path(); var ppath = release ? path + '/' + release : null; var num = versions.length; if (ppath && ppath != vpath) { num -= 1; }
Version $version version = "Current"; Current
or
Sign in to make an app based on this one!
Versions: Release Current more...

Files

Find code in app:
  • ▼ ► $section_name $section_name
  • $filename
var app = ui.get_app(); var ordered_filenames = ui.order_section_files(app); function make_file_classes(file, section) { var classes = 'file-list-item'; var current_filepath = ui.get_file() ? ui.get_file().get_relative_path() : null; if (file.get_relative_path() == current_filepath) { classes += ' selected-file'; } if (file.is_dirty()) { classes += ' edited-file'; } if (!ui.get_editor_prefs("t_" + section)) { classes += ' hidden-file'; } return classes; }
${filelist_section( handler_key, handler.plural_name, app, ordered_filenames[handler_key])}
${filelist_section("test", "Tests", app, ordered_filenames["test"])}
$('.file-list-section-toggle').click(function(e){ var section = $(this).attr("section"); if ($(this).text() == "▼") { $(this).text("►"); ui.set_editor_prefs("t_"+section, false); $("ul[section='"+section+"'] .file-list-item").addClass('hidden-file'); } else { $(this).text("▼"); ui.set_editor_prefs("t_"+section, true); $("ul[section='"+section+"'] .file-list-item").removeClass('hidden-file'); } }); $('.file-list-item').click(function(e){ if (e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) { /* default browser behaviour = open link in new tab */ } else { var new_name = $(this).attr("fname"); ui.do_choose_file(new_name); return false; } });
var fileactions_open = $('#button-fileactions').hasClass('button-open'); var app = ui.get_app(); var file = ui.get_file(); var writable = app ? app.is_writable() : false; var opts = file ? file.get_editor_supported_features() : false; var show_opts = opts.margin || opts.softwrap || opts.hotswap || opts.emql;
Line
$('#linenumber').keypress(function(e){ if (e.which == 13) { var line = $('#linenumber').val(); ui.do_file_editor_goto_line(line); } });
var writable = ui.get_app().is_writable();
var user = ui.get_user(); var apps = ui.get_recents('apps'); var num_apps = Math.min(apps.length, 10);
New App...
App Directory...
Your Apps

Your Apps

Sign in to show your apps here.

Recent Apps

  • var app = apps[i]; $app.name
If you work on multiple apps, recently opened ones will appear here.
ui.do_setup_submenu('your-apps-menu-item', 'yourapps'); if (auto_open) { $('#your-apps-menu-item').trigger('mouseenter'); } $('.file-link').click(function(e){ if (e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) { /* default browser behaviour = open link in new tab */ } else { var new_name = $(this).attr("fname"); ui.do_choose_file(new_name); ui.do_hide_overlays(); return false; } });
var user_apps = ui.get_store().get_user_apps(); /* refresh list in the background */ ui.get_store().t_refresh_user_apps();

Apps you create or clone will appear here.

  • $app.name
var submenu = $('#menu-yourapps'); var submenu_height = Math.min(submenu.height(), $(window).height() - submenu.offset().top - 25); submenu.height(submenu_height).css('visibility', 'visible'); $('#your-apps-loader').hide();
var app = ui.get_app(); var file = ui.get_file(); var user = ui.get_user(); var writable = app ? app.is_writable() : false; var acre_handler = file.get_acre_handler(); var mime_type = file.get_mime_type();

Name

Type

var acre_handlers = ui.get_store().get_acre_handlers(); var sup_acre_handlers = []; for (var key in acre_handlers) { if ($.inArray(mime_type, ui.get_store().get_supported_mime_types(key)) != -1) { sup_acre_handlers.push(acre_handlers[key]); } } var sup_mime_types = ui.get_store().get_supported_mime_types(acre_handler);
${metadata_section()}

Type

$acre_handler
$mime_type

Validate

History

Actions

ui.watch_inputs('name', { inputs: { 'file-name' : ui.get_file().get_name() }, submit: function(inputs) { ui.do_file_move(inputs['file-name']); ui.do_hide_overlays(); } }); ui.watch_inputs('metadata', { inputs : { 'file-handler' : ui.get_file().get_acre_handler(), 'file-mimetype' : ui.get_file().get_mime_type() }, change : function(inputs) { acre_handler = $('#file-handler :selected').val(); mime_type = $('#file-mimetype :selected').val(); $('#metadata-section').mjt(metadata_section()); }, submit : function(inputs) { if (inputs['file-handler']) { file.set_acre_handler(inputs['file-handler']); } if (inputs['file-mimetype']) { file.set_mime_type(inputs['file-mimetype']); } ui.do_file_save(); ui.do_hide_overlays(); } }); $('#button-revert').click(function(e){ ui.do_file_revert(); ui.do_hide_overlays(); });
var has_options = false; var store = ui.get_store(); var app = ui.get_app(); var file = ui.get_file(); var is_user = ui.get_user(); var writable = is_user && app.is_writable();
var has_options = true;

Line Numbers

var has_options = true;

Soft Wrap

var has_options = true;

Syntax Highlighting

var has_options = true;

Automatic Code Assist

var has_options = true;

Enable MQL Extensions (experimental)

No configuration options for this file type.

$("#menu-editoroptions input[type='radio']").click(function(){ var file = ui.get_file(); var name = $(this).attr('name').split('edopt-')[1]; var pref = {}; pref[name] = $(this).val(); ui.set_editor_prefs(pref); ui.do_hide_overlays(); file.mark_editor_dirty(); file.t_editor_show(ui._get_desired_editor_classname(), ui.get_editor_prefs()) .onready(function() { ui.refresh_file_templates(); }); });

Documentation

  • Keyboard Shortcuts
  • Acre API Reference
  • Acre Template Tag Reference
  • Javascript Reference
  • MQL Reference Guide
  • Freebase Documentation Hub

Code Search

Not sure how to use a particular method or template tag? See how someone else did!

About App Editor
$("#help-menu-content a").click(function(){ ui.do_hide_overlays(); });
var writable = ui.get_app().is_writable();
  • Versions
  • Authors
  • Web Services
  • Recent Changes
$('#button-appsettings').addClass('button-open'); var sel_tab = tab ? tab : 'general'; $("#settings-tabs").tabs({ selected: null, show: function(e, tabs) { $('#'+tabs.panel.id).mjt(ui.templates[tabs.panel.id]()); } }).tabs("select", "#app_" + sel_tab); $('#app-general-listing').click(function(){ window.open(ui.get_store().get_url() + '/apps/edit' + ui.get_app().get_path()); return false; })
var writable = ui.get_app().is_writable();

Versions

App authors can create and release new versions of their app any time.

Current is always the latest version; all edits are made to Current. Other versions are read only.

Release is the version the app author wants people to use. Any version can be released, but it's good practice to create and release a version other than Current to prevent development from impacting users.

${app_versions_list()}
var app_path_segs = ui.get_app().get_path().split('/'); app_path_segs.pop(); var app_root = app_path_segs.join('/');

Your Dev URL points to Current:

http://.${ui.get_store().get_app_host(app_root)}

URL to Current version:

http://${ui.get_app().get_base_url()}

ui.watch_inputs('devurl', { inputs: { devurl: ui.get_app().get_name() }, update_on_submit : true, submit: function(inputs){ ui.do_app_move(app_root + '/' + inputs['devurl']); } });
${app_hosts_list()}
var app = ui.get_app(); var writable = app.is_writable(); var hosts = app.get_hosts(); var release = app.get_released_version() || 'current'; var published_regex = /([^.]*)\.freebaseapps\.com$/; var pub = null; for (var i=0; i < hosts.length; i++) { var host = hosts[i]; if (host.version == release) { var re = published_regex.exec(host.host); if (re) { pub = re[1]; break; } } }

Your Release URL points to Release:

http://.${ui.get_store().get_acre_host()}

Other URLs:

$host.host $host.version
ui.watch_inputs('puburl', { inputs : { puburl: $('#puburl').val() }, text_delay : 1000, update_on_submit : true, change : function(inputs) { $('#button-puburl').attr('disabled', 'disabled'); $('#puburl-status').removeClass().html('').addClass('puburl-wait'); ui.get_store().XhrGet('check_host_availability', { host: inputs['puburl']}) .enqueue() .onready(function(r){ $('#button-puburl').removeAttr('disabled'); $('#puburl-status').removeClass().addClass('puburl-success').html(r.message); }) .onerror(function(code, message, info){ $('#puburl-status').removeClass().addClass('puburl-fail').html(message); }); }, submit : function(inputs){ $('#puburl-status').removeClass().empty(); ui.do_app_set_host(inputs['puburl']); } });

URL to Release version:

http://${pub}.${ui.get_store().get_acre_host()}

var app = ui.get_app(); var app_path = app.get_path(); var writable = app.is_writable(); var release = app.get_released_version(); var released_id = release ? app_path + '/' + release : app_path; var versions = app.get_versions(); var re = new RegExp('(\\d+)'); var counter = 1; for (var i=0; i< versions.length; i++) { var r = re.exec(versions[i].name); if (r && r.length) { var cnt = parseInt(r[1], 10); if (counter <= cnt) { counter = cnt + 1; } } } var first_number = true;
release version snapshot time run on
sandbox
✓ Current view
var id = app_path + '/' + version.name; var view_url = ui.get_store().get_app_host(id); var show_update = false; if (/\d+/.test(version.name)) { if (first_number) { show_update = true; first_number = false; } } else { show_update = true; } ✓ $version.name ${ui.get_relative_timestamp(version.as_of_time)} [set to now] view x
$('#add-version-key').val(counter); $('.remove-version-button').click(function() { $(this).parents('tr').fadeOut('slow'); ui.do_app_remove_version($(this).attr('key')); return false; }); $("input[name='version-release']").click(function() { var ver = $(this).val(); ui.do_app_set_release(ver); return false; }); $(".version-service-url").click(function() { service_url = $(this).attr('checked') ? 'http://www.sandbox-freebase.com' : false; ui.do_app_add_version($(this).attr('key'), null, service_url); });

You can add other Freebase users as Authors to your app. Choose authors carefully! They can edit code, release versions, and delete files.

Add an Author

${app_authors_list(ui.get_app().get_authors())}
$("#add-author-input") .suggest({type: '/type/user'}) .bind("fb-select", function(e, data) { $(this).val(''); ui.do_app_add_author(data.name); }).focus();

Authors

${app_authors_list(ui.get_app().get_authors())}
var one_user = (function() { var r=0; for (var p in user_dict) { r++; }; return r == 1;})();

These authors can edit this app:

mugshot
${user.get_name()} x
$("#add-author-input").focus(); $('.remove-user-button').click(function() { $(this).parents('tr').fadeOut('slow'); ui.do_app_remove_author($(this).attr('user')); return false; });
var writable = ui.get_app().is_writable(); var write_user = ui.get_app().get_write_user(); var is_write_user = write_user && write_user.get_name() == ui.get_user().get_name() ? true : false; var oauth_enabled = ui.get_app().is_oauth_enabled(); var permission_attr = {}; var writeuser_attr = {}; var oauth_attr = {}; if (write_user) { permission_attr.checked = writeuser_attr.checked = 'checked'; if (!is_write_user) { permission_attr.disabled = writeuser_attr.disabled = oauth_attr.disabled = 'disabled'; }; } else if (oauth_enabled) { permission_attr.checked = oauth_attr.checked = 'checked'; } else { writeuser_attr.disabled = oauth_attr.disabled = 'disabled'; oauth_attr.checked = 'checked'; }

Allow this app to write data to Freebase

Write data as your user

Writes will be attributed to the user making them. Users will be asked to allow your app to use their Freebase account. This is usually is the best choice.

Write data as ${write_user ? write_user.get_name() : ui.get_user().get_name()}

Writes made by all of your users will be attributed to you. You may quickly exceed Freebase's daily single-user write limit if you have a lot of users!

API keys authorize information exchange with other web applications or services. Register your app with the service domain you want to use. Each service handles this differently, so follow their instructions. Once registered, enter the API key and secret (if required) provided by the service here.

Add an API Key

ui.get_app().t_get_apikeys()
var keys = apikeys.result.keys;
${app_apikeys_list(keys)}

Error loading API keys.

For your security, please switch to App Editor over SSL to add or edit your API keys.

$('#permissions-settings :input').change(function() { var type = null; if ($('#permission-enable').attr('checked')) { $('#permissions-settings :radio').removeAttr('disabled'); if ($("input[name='permission-type'][value='oauth']").attr('checked')) { type = "oauth"; } if ($("input[name='permission-type'][value='writeuser']").attr('checked')) { type = "writeuser"; } } else { $('#permissions-settings :radio').attr('disabled', 'disabled'); type = "none"; } ui.do_app_set_write_permissions(type); });

API Keys

Service Domain Key Secret
$key.key_id $key.token $key.secret x

You haven't added any API keys.

ui.watch_inputs('apikey-add',{ inputs : { 'apikey-name' : null, 'apikey-token' : null, 'apikey-secret' : null }, submit : function(inputs) { ui.do_app_add_apikey(inputs['apikey-name'], inputs['apikey-token'], inputs['apikey-secret']); } }); $('.remove-key-button').click(function() { $(this).parents('tr').fadeOut('slow'); ui.do_app_remove_apikey($(this).attr('key')); return false; });
ui.get_app().t_get_history(10)

Recent File Changes

changed by
${rev.file} ${ui.get_relative_timestamp(rev.timestamp)} ${rev.attribution.name}
$('.pick-file').click(function (e) { var filename = $(this).attr('fname'); ui.do_choose_file(filename); ui.do_hide_overlays(); return false; });

Abandon Changes?

You haven't saved all the changes you made to the app you currently have open. Abandon these changes?

Acre: Open Code for Open Data
  • See what you can build!
    Check out the App Directory or the documentation.
  • Ready to go?
  • Create your own Acre app
    Sign in or sign up for Freebase to get started.
  • See what you can build!
    Check out the App Directory or the documentation.
var app_name = clone ? ui.get_app().get_display_name() + " copy" : ""; var app_key = clone ? ui.get_app().get_path().split('/').pop() + "-copy" : "";

Create New App

:
http://.${ui.get_user().get_default_app_host()}
This URL points to the development version of your code. Later you can choose a shorter Release URL to share with others.
CC-BSD
All Acre apps are published on Freebase under the BSD license so everyone can "view source", clone code, and learn from each other.
$('#new-app-dialog-name').focus().select(); $("#dialog-new_app input[name='new-app']").change(function(){ $('#new-app-clone-field').toggle(); }); $("#new-app-clone-id") .suggest({ type: '/freebase/apps/acre_app' }) .bind("fb-select", function(e, data) { $(this).val(data.id); }); $('#button-new-app').click(function(){ var args = [ ui.get_user().get_default_app_path() + '/' + jQuery.trim($('#new-app-dialog-key').val()), jQuery.trim($('#new-app-dialog-name').val()) ]; var radio = $("#dialog-new_app input[name='new-app']:checked").val(); var clone_id = $('#new-app-clone-id').val(); if (radio == 'clone' && clone_id !== '') { args.push(clone_id); } ui.do_app_create_new.apply(this, args); })

Delete app “${ui.get_app().get_display_name()}”?

Are you sure you want to delete this entire app?

This can't be undone!

Save File As

ui.get_store().XhrGet('list_user_apps', {'include_filenames': true})
ui.app_keys = {}; jQuery.each(applist.result, function(){ ui.app_keys[this.appid] = this.files; });
Error loading dialog.
$('#clone-filename').focus().select(); $('#button-clone').click(function(e){ var new_name = jQuery.trim($('#clone-filename').val()); var app_path = jQuery.trim($('#clone-file-app :selected').val()); var key_conflict = jQuery.inArray(new_name, ui.app_keys[app_path]); if (key_conflict == -1) { ui.do_file_save_as(app_path, new_name); ui.do_hide_overlays(); } else { ui.MessagePanel.error("File exists! Try a different file name."); } });
var file = ui.get_app().get_untitled_file_name();

Create a New...

var sup_mime_types = ui.get_store().get_supported_mime_types(handler);
$('#add-file-name') .select() .keydown(function(e){ if (e.which == 13) { $('#button-add-file').click(); } }); ui.watch_inputs(null, { inputs : { 'add-file-name' : null }, change : function(inputs){ file = inputs['add-file-name'] } });
  • $handler.name

    $handler.description

ui.watch_inputs('add-file', { inputs : { 'new-file-handler' : null }, change : function(inputs){ var handler = inputs['new-file-handler']; $('.handler-new').empty(); $('#handler-'+handler + ' .handler-new').mjt(add_file(handler)); $('.handler-section-active').removeClass('handler-section-active'); $('#handler-'+handler).addClass('handler-section-active'); }, submit : function(inputs){ var filename = jQuery.trim($('#add-file-name').val()); if (ui.get_store().validate_filename(filename)) { var metadata = { acre_handler: inputs['new-file-handler'] }; if ($('#add-file-mimetype :selected').val()) { metadata['content_type'] = $('#add-file-mimetype :selected').val(); } ui.do_file_create_new(filename, metadata); ui.do_hide_overlays(); } else { ui.MessagePanel.error("Invalid filename. Only alphanumeric characters, '-', '_' and '.' are allowed."); } } }); $("input[name='new-file-handler'][value='mjt']") .attr('checked','checked') .trigger('click');

Delete file “$filename”?

Are you sure you want to delete the file “$filename”?

This can't be undone!

File Save Conflict

The saved version of this file has changed since it was loaded, likely because it was edited by another user or by you in another browser or tab. View the changes below and decide how to proceed.

${diff_view(data, ["Your Local Version","Saved Version"])}

File History

ui.get_file().t_get_revision(content_id)

Loading...

${get_task.result.text}
Image

Can't display file. Download it here.

ui.get_file().t_get_history()
var file = ui.get_file(); var based_on = file.get_based_on(); var history = get_history_task.result.history;

${ui.get_file().get_name()} is based on: $based_on.id

Compare Date Length By
| ${mjt.freebase.date_from_iso(chg.timestamp).toLocaleString()} ${chg.length} ${chg.attribution.name}

Click on a revision to view or choose two revisions to compare here.

$('.diff-section').height($('#history-div').height() / 2 - 21); /* WILL: HACK: is this still used? */ $('.show-revision, .revert-revision, .diff-button').unbind("click"); $('.show-revision').click(function (e) { var id = $(this).attr('fbid'); $('#history-diff-view').mjt(show_revision(id)); return false; }); $('.revert-revision').click(function (e) { var id = $(this).attr('fbid'); ui.do_file_revert(id); ui.do_hide_overlays(); return false; }); $("input[name='diff-from'], input[name='diff-to']").click(function(e){ var args = { revision1 : $("input[name='diff-from']:checked").val(), revision2 : $("input[name='diff-to']:checked").val() }; var to_task = ui.get_store().XhrGet('get_file_diff', args) .enqueue() .onready(function(data){ $('#history-diff-view').mjt(diff_view(data)); }) });

${ui.get_file().get_name()} is a new file.

App Editor Keyboard Shortcuts

${mjt.bless(ui.shortcut.get_keys(shortcut.op))} $shortcut.op

About App Editor

Version: $CONFIG.APPEDITOR_VERSION - ${ui.get_store().get_acre_version()}
Open in a new window
${mjt.bless(msg)} ${tid||""} $('#message-panel-close').click(function(){ ui.MessagePanel.clear(); })

${labels[0]}

${labels[1]}

${i + "\n"}
${data.baseTextLines[i].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0") + "\n"}
${i + "\n"}
${data.newTextLines[i].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0") + "\n"}