Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); ACE Utils API · devuxd/SeeCodeRun Wiki · GitHub
Skip to content
David Gonzalez edited this page Jul 21, 2017 · 19 revisions

ACE utils class provides visualizations for:

  • Text highlighting of expressions within given ranges [Ace's markers]

  • A popup when hovering over expressions within given ranges showing their matching values [Tooltips]

  • Text and style in the gutter and actions when hovering over them [Ace's gutter decorations]

Getting Ace Utils

The first step is to get the library in your class.

Import the library

Add the following import at the top of your code:

import{AceUtils}from'../utils/ace-utils';

Remember that the path when importing is relative.

Instantiate

letaceUtils=newAceUtils();

I would suggest to instantiate it in your class constructor and keep it as an attribute of your class.

Ace Utils Data Model and Trace Service Traces

Ace Utils uses a general data structure with ranges as data model. Trace Service provides data structures that satisfy such model, the traces. For operations in the trace, check Trace Helper.

A way to use Ace Utils is when iterating over a trace:

for(letkeyintrace){if(trace.hasOwnProperty(key)){letelement=trace[element];if(element.range){// your operations}}}

A method like isPositioninRange() offers Ace's format for a given position and resolves if a trace element has matching range.

Adding Text Highlighting

You will need an instance of Ace Utils, a collection of elements with range property and if desired, a CSS style for customization of your markers.

Get an Ace Marker Manager

It requires an Ace editor to work, if your class already have one, use that one instead.

letaceEditor=ace.edit('aceJsEditorDiv');// exampleletaceMarkerManager=aceUtils.makeAceMarkerManager(aceEditor);

Make sure your items have a range property

Ace Utils needs that the elements of your collection (e.g. an array) have range properties:

letelement1Range={start: {row: 0,column:0},end: {row: 0,column:10}};letelementsWithRangeProperty=[{elementProperty: "a property of element 1",range: element1Range}];

First, "element1Range" uses Ace's range format(Trace Service results use the same format). This the only attribute "updateAceMarkers" will read from your array ("elementsWithRangeProperty" in this case). If an element that does not have a range, it will be ignored and the highlighting will continue.

Highlight!

Once you get the manager, you can call the markers update method:

aceUtils.updateAceMarkers(aceMarkerManager,elementsWithRangeProperty);

Note. updateAceMarkers method will remove your previous markers before adding the new ones. Make sure your logic is compatible with this behavior.

Warning: Be sure that you are not accessing the DOM when you make such call. It will alter your page "silently". Please analyze Trace Search, I added a timeout to avoid such problem.

Customize your text highlighting

Create your own style

This is the default style for the marker renderer:

 .ace-chrome .ace_marker-layer .expression-range {
position: absolute;
background:rgb(250,250,155);
border:1px solid rgb(200,200,150);
}

WARNING: is "ace_marker-layer" not "ace-marker-layer". Thanks Varun =)

If you want to create your own style, use this one as a template. Remember to keep the tag ".ace_marker-layer" (Ace will enforce this match), and the position to be absolute. You can add your highlighter code in the src/ace/ace-editor.css, and add the marker reference in getAvailableMarkers() in src/utils/ace-utils.js.

Update the manager

aceMarkerManager.markerRenderer="expression-range";

In this case, "expression-range" should be replaced with your style tag. Ace allows to send a renderer function, that is the reason for the name. When a string is sent, it will match for CSS style instead.

You can also choose to highlight the text in the range or the whole line:

aceMarkerManager.markerType="text";

The previous case is for text, use "fullLine" to highlight the whole line (you knew that =]).

Finally, you can decide if you want the highlight in front or in the back of the text:

aceMarkerManager.inFront=false;

If false like the previous snippet, it will put your highlight behind the text.

Where do I see text highlighting being used?

Check our trace search component.

You can try this style jsfiddle.

What if I want to have different highlighters?

Of course you can. Create an Ace marker manager per each set of elements you want to highlight. Remember to define different CSS styles for each of them as well.

More info?

Ace's API.

Ace's Google group.

[Documentation in progress -->]

Adding Tooltips

Adding gutter decorations

Ace uses default gutter decorations that show text only: annotations. They could be for errors, warnings, and info. A common issue is to decide if annotations are enough for your cases. The rule of the thumb is: do you want to show Ace annotations with yours or more that text is to be shown? if so use decorations, otherwise use annotations.

Annotations are not be extended( based on the Gutter code). You can add decorations to change the CSS class of the gutter cell and override the gutter renderer to add custom text. Any other visual widget must be added from scratch. Obtaining configuration values from the gutter will help you shape your widgets accordingly.

To add custom decorations we need a CSS class and the row where we want to add it. As a collection, your decorations should be removed in proper system events such document or gutter changes.

Defining your class

please take a look and customize it. You can also send yours.

Adding decorations

Removing decorations

Adding or removing gutter decorations trigger "changeBreakpoint" events. That is, do not work with them when capturing that event.

Clone this wiki locally