### Example Rangy Command Execution (Commented) Source: https://github.com/timdown/rangy/blob/master/demos/commands_new.html Commented-out examples illustrating how to execute 'bold' and 'italic' commands using the Rangy library, demonstrating the flexibility of specifying `styleWithCss` and `tagName` options for formatting. ```JavaScript /* function bold(styleWithCss, tagName) { rangy.execCommand("bold", { document: iframeDoc, styleWithCss: styleWithCss, tagName: tagName }); updateContentHtml(); iframeWin.focus(); } function italic(styleWithCss) { rangy.execCommand("italic", { document: iframeDoc, styleWithCss: styleWithCss }); ``` -------------------------------- ### Initialize log4javascript PopUpAppender (Commented) Source: https://github.com/timdown/rangy/blob/master/fiddlings/218.html Demonstrates the initialization of a log4javascript PopUpAppender and adding it to the root logger. This code is commented out in the original source, indicating it's either for reference or temporarily disabled. ```javascript //var appender = new log4javascript.PopUpAppender(); //log4javascript.getRootLogger().addAppender(appender); ``` -------------------------------- ### Rangy Selection Class Applier Example Source: https://github.com/timdown/rangy/blob/master/fiddlings/218.html Initializes the Rangy library, creates a class applier named 'something', and attaches an event listener to the document's mouseup event. On mouseup, it logs whether the created applier is applied to the current selection and inspects the details of the current Rangy selection. ```javascript rangy.init(); var applier = rangy.createClassApplier("something"); document.onmouseup = function() { console.log(applier.isAppliedToSelection(), rangy.getSelection().inspect()); } ``` -------------------------------- ### Initialize log4javascript PopUpAppender Source: https://github.com/timdown/rangy/blob/master/fiddlings/214.html This JavaScript snippet initializes a PopUpAppender from the log4javascript library and adds it to the root logger. It sets up a basic logging mechanism that displays logs in a new window. ```javascript var appender = new log4javascript.PopUpAppender(); log4javascript.getRootLogger().addAppender(appender); ``` -------------------------------- ### Rangy Initialization and UI Setup Source: https://github.com/timdown/rangy/blob/master/demos/core.html The main initialization script executed when the window loads. It initializes the Rangy library, attempts to enable multiple selections in Internet Explorer, and dynamically creates buttons for various selection and range manipulation actions, linking them to the respective demo functions. ```javascript window.onload = function() { rangy.init(); // Enable multiple selections in IE try { document.execCommand("MultipleSelection", true, true); } catch (ex) {} // Create selection buttons var selectionButtonsContainer = gEBI("selectionButtons"); createButton(selectionButtonsContainer, reportSelectionText, "Get selection text"); createButton(selectionButtonsContainer, inspectSelection, "Inspect selection"); createButton(selectionButtonsContainer, reportSelectionHtml, "Get selection HTML"); createButton(selectionButtonsContainer, deleteSelection, "Delete selection"); createButton(selectionButtonsContainer, collapseSelectionToStart, "Collapse to start"); createButton(selectionButtonsContainer, collapseSelectionToEnd, "Collapse to end"); // Create Range buttons var rangeButtonsContainer = gEBI("rangeButtons"); createButton(rangeButtonsContainer, inspectRange, "Inspect"); createButton(rangeButtonsContainer, reportRangeHtml, "Get HTML"); createButton(rangeButtonsContainer, extractRange, "Extract"); createButton(rangeButtonsContainer, cloneRange, "Clone"); createButton(rangeButtonsContainer, deleteRange, "Delete"); createButton(rangeButtonsContainer, surroundRange, "Surround (where possible)"); createButton(rangeButtonsContainer, insertNodeAtRange, "Insert node"); // Display the control range element in IE if (rangy.features.implementsControlRange) { gEBI("controlRange").style.display = "block"; } }; ``` -------------------------------- ### Asynchronous Selection Collapse and Focus Source: https://github.com/timdown/rangy/blob/master/test/extend.html This snippet demonstrates setting up a backwards selection and attempting to collapse it to the start within an asynchronous `setTimeout` block, followed by focusing an element. This test case focuses on the setup and execution flow rather than asserting selection properties. ```javascript s.test("collapseToStart with backwards selection", function(t) { window.setTimeout(function() { var range = document.createRange(); var textNode = document.getElementById("sel").firstChild; range.setStart(textNode, 13); range.setEnd(textNode, 13); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); sel.extend(textNode, 5); document.getElementById("sel").focus(); }, 1000); }); ``` -------------------------------- ### JavaScript Utility Functions and Logging Setup Source: https://github.com/timdown/rangy/blob/master/demos/position2.html Initializes the log4javascript library for debugging purposes, setting up a pop-up appender for log messages. It also includes two general utility functions: `gEBI` for conveniently getting a DOM element by its ID, and `rectToString` for converting a rectangle object into a human-readable string format. ```JavaScript var appender = new log4javascript.PopUpAppender(); log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); function gEBI(id) { return document.getElementById(id); } function rectToString(rect) { return "(" + rect.left + ", " + rect.top + "), (" + rect.right + ", " + rect.bottom + ")"; } ``` -------------------------------- ### JavaScript Test Environment Setup Source: https://github.com/timdown/rangy/blob/master/test/extend.html Initializes `log4javascript` for in-page logging and configures the `xn.test` framework. It enables stack traces for tests and disables logging output, setting up the environment for running selection-related unit tests. ```javascript var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Initialize Log4javascript and Test Environment Source: https://github.com/timdown/rangy/blob/master/test/commandnewtests.html This snippet configures the log4javascript library for in-page logging, setting up an appender and enabling stack traces. It also enables stack traces for the xn.test framework, which is crucial for detailed error reporting during test execution. ```javascript var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Configure log4javascript for Test Debugging Source: https://github.com/timdown/rangy/blob/master/test/rangetests.html Initializes and configures the log4javascript library to provide detailed logging and stack traces within the Rangy test suite. This setup aids in debugging test failures by providing comprehensive error information. ```JavaScript xn.test.enableStackTraces = true; var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); ``` -------------------------------- ### Configure log4javascript for In-Page Logging Source: https://github.com/timdown/rangy/blob/master/test/controlrange.html Initializes and configures log4javascript to display logs directly on the page. It sets up an InPageAppender, adds it to the root logger, and enables stack traces for better debugging. ```javascript var appender = new log4javascript.InPageAppender(); log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); ``` -------------------------------- ### JavaScript Initialization for Rangy Library and UI Events Source: https://github.com/timdown/rangy/blob/master/demos/position.html Handles the `window.onload` event to perform initial setup for the Rangy library, including calling `rangy.init()`. It attempts to enable multiple selections for Internet Explorer and sets up event listeners for buttons that trigger the `showSelectionPosition` function, allowing users to visualize the current text selection. ```javascript window.onload = function() { rangy.init(); // Enable multiple selections in IE try { document.execCommand("MultipleSelection", true, true); } catch (ex) {} // Create selection buttons var selectionButtonsContainer = gEBI("selectionButtons"); createButton(selectionButtonsContainer, showSelectionPosition, "Show selection position"); // Create Range buttons var rangeButtonsContainer = gEBI("rangeButtons"); // Display the control range element in IE if (rangy.features.implementsControlRange) { gEBI("controlRange").style.display = "block"; } }; ``` -------------------------------- ### Page Initialization and Event Binding Source: https://github.com/timdown/rangy/blob/master/demos/serializer.html This `window.onload` and `window.onbeforeunload` block handles the main setup logic. It initializes the Rangy library, attempts to enable multiple selections for IE, checks for the availability of the Rangy Serializer module, and then enables and binds event listeners to the serialize and deserialize buttons. It also manages the display of IE-specific control range elements and ensures selection persistence by restoring on load and saving on unload. ```javascript window.onload = function() { // Turn multiple selections on in IE try { document.execCommand("MultipleSelection", null, true); } catch(ex) {} rangy.init(); // Enable buttons var serializerModule = rangy.modules.Serializer; if (rangy.supported && serializerModule && serializerModule.supported) { gEBI("serializedSelection").disabled = false; var serializeButton = gEBI("serializeButton"); serializeButton.disabled = false; serializeButton.ontouchstart = serializeButton.onclick = serializeSelection; gEBI("selectionToDeserialize").disabled = false; var deserializeButton = gEBI("deserializeButton"); deserializeButton.disabled = false; deserializeButton.ontouchstart = deserializeButton.onclick = deserializeSelection; // Display the control range element in IE if (rangy.features.implementsControlRange) { gEBI("controlRange").style.display = "block"; } // Restore the selection from a previous visit to this page restoreSelection(); } }; window.onbeforeunload = saveSelection; ``` -------------------------------- ### Initialize Logging and Test Environment for Performance Tests Source: https://github.com/timdown/rangy/blob/master/test/featuretests.html This JavaScript snippet sets up the testing environment by enabling stack traces for 'xn.test' and configuring 'log4javascript' for in-page logging. It initializes an in-page appender and obtains the root logger, ensuring that stack traces are visible for debugging purposes during performance testing. ```JavaScript xn.test.enableStackTraces = true; var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); ``` -------------------------------- ### Initialize Rangy and Manipulate Selections on Page Load Source: https://github.com/timdown/rangy/blob/master/test/controlrange.html This function executes when the page finishes loading, initializing the Rangy library. It demonstrates setting multiple ranges, manipulating native selections, and refreshing the Rangy selection state, including an alert to show the refresh result. ```javascript window.onload = function() { document.execCommand('MultipleSelection', true, true); rangy.init(); if (rangy.features.implementsControlRange) { var im1 = document.getElementById("im1"); var controlRange = document.body.createControlRange(); //controlRange.add(im1); //controlRange.select(); } var im2 = document.getElementById("span1"); var sel = rangy.getSelection(); var range = rangy.createRange(); range.selectNode(im2); var im1 = document.getElementById("im1"); var range2 = rangy.createRange(); range2.selectNode(im1); sel.setRanges([range, range2]); var r = sel.nativeSelection.createRange(); r.remove(im1); r.select(); alert(sel.refresh(true)) } ``` -------------------------------- ### JavaScript Document Write Examples Source: https://github.com/timdown/rangy/blob/master/test/ietextnodes.html These snippets demonstrate the use of `document.write` to insert content directly into the HTML document, including newlines and carriage returns. ```javascript document.write("\n\nTwo\n\n") ``` ```javascript document.write("\r\rThree\r\r") ``` -------------------------------- ### Execute Callback on Window Load Source: https://github.com/timdown/rangy/blob/master/demos/content.html This JavaScript code executes a parent window's `contentLoadCallback` function if it exists, typically used for cross-frame communication or initialization after the page content has loaded. ```javascript window.onload = function() { var callback; if ( (callback = window.parent.contentLoadCallback) ) { callback(); } } ``` -------------------------------- ### Basic JavaScript Document Write Example Source: https://github.com/timdown/rangy/blob/master/test/domrange.html A simple JavaScript snippet demonstrating the use of `document.write` to output text directly into the HTML document. This example includes escaped newline and tab characters to show formatting within the output string. ```javascript document.write("text\n\tWonder ") ``` -------------------------------- ### Applying Styles and Classes with Rangy Source: https://github.com/timdown/rangy/blob/master/demos/commands_new.html This JavaScript snippet demonstrates how to apply CSS styles and classes within a WYSIWYG editor using Rangy's `execCommand` and `ClassApplier` functionalities. It includes examples for direct class application and using a `ClassApplier` object to toggle selection styles. ```javascript styleWithCss: styleWithCss }); updateContentHtml(); iframeWin.focus(); } function applyClass(className) { rangy.execCommand("applyClass", { document: iframeDoc, value: className }); updateContentHtml(); iframeWin.focus(); } function applyClassUsingClassApplier(className) { var applier = (className == "boldRed") ? boldRedClassApplier : greenBorderClassApplier; applier.toggleSelection(iframeWin); updateContentHtml(); iframeWin.focus(); } ``` -------------------------------- ### JavaScript Logging and Testing Framework Initialization Source: https://github.com/timdown/rangy/blob/master/test/textrangetests-old.html This snippet initializes log4javascript for browser console logging and configures xn.test to enable stack traces. It shows how to set up a logger and enable detailed error reporting for testing purposes. ```javascript //var appender = new log4javascript.InPageAppender(); var appender = new log4javascript.BrowserConsoleAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Collapse Backwards Selection to Start in JavaScript Source: https://github.com/timdown/rangy/blob/master/test/extend.html A unit test for `Selection.collapseToStart()` on a backwards selection. It creates a backwards selection using `extend()` and then collapses it, asserting that both anchor and focus points move to the original start of the selection. ```javascript s.test("collapseToStart with backwards selection", function(t) { var range = document.createRange(); var textNode = document.getElementById("sel").firstChild; range.setStart(textNode, 13); range.setEnd(textNode, 13); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); sel.extend(textNode, 5); sel.collapseToStart(); t.assertEquivalent(sel.anchorNode, textNode); t.assertEquivalent(sel.anchorOffset, 13); t.assertEquivalent(sel.focusNode, textNode); t.assertEquivalent(sel.focusOffset, 13); }); ``` -------------------------------- ### JavaScript Page Initialization and Event Setup Source: https://github.com/timdown/rangy/blob/master/demos/position2.html This `window.onload` function serves as the main entry point for the page's JavaScript logic. It initializes the Rangy library, attempts to enable multiple selections in Internet Explorer for compatibility, and then dynamically creates interactive buttons. These buttons, when clicked, trigger functions like `showSelectionPosition` to demonstrate Rangy's capabilities. It also includes a console log demonstrating `rangy.moveSelectionToPoints`. ```JavaScript window.onload = function() { rangy.init(); // Enable multiple selections in IE try { document.execCommand("MultipleSelection", true, true); } catch (ex) {} // Create selection buttons var selectionButtonsContainer = gEBI("selectionButtons"); createButton(selectionButtonsContainer, showSelectionPosition, "Show selection position"); // Create Range buttons var rangeButtonsContainer = gEBI("rangeButtons"); // Create selection from position buttons // Display the control range element in IE if (rangy.features.implementsControlRange) { gEBI("controlRange").style.display = "block"; } console.log(rangy.moveSelectionToPoints(100, 100, 300, 300)); }; ``` -------------------------------- ### Configure Log4javascript and Test Stack Traces in Rangy Source: https://github.com/timdown/rangy/blob/master/test/commandtests.html This JavaScript snippet initializes log4javascript for in-page logging, retrieves the root logger, enables stack traces for logging, and sets `xn.test.enableStackTraces` for the testing framework. Comments indicate optional configurations for adding the appender and enabling/disabling logging. ```JavaScript var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Collapse Forwards Selection to Start in JavaScript Source: https://github.com/timdown/rangy/blob/master/test/extend.html A unit test for `Selection.collapseToStart()` on a forwards selection. It creates a forwards selection using `extend()` and then collapses it, asserting that both anchor and focus points move to the original start of the selection. ```javascript s.test("collapseToStart with forwards selection", function(t) { var range = document.createRange(); var textNode = document.getElementById("sel").firstChild; range.setStart(textNode, 5); range.setEnd(textNode, 5); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); sel.extend(textNode, 13); sel.collapseToStart(); t.assertEquivalent(sel.anchorNode, textNode); t.assertEquivalent(sel.anchorOffset, 5); t.assertEquivalent(sel.focusNode, textNode); t.assertEquivalent(sel.focusOffset, 5); }); ``` -------------------------------- ### Configure log4javascript and xn.test for Test Environment Source: https://github.com/timdown/rangy/blob/master/test/selectionsaverestoretests.html This snippet initializes log4javascript to output logs to the browser console and enables stack traces for the xn.test framework, which is crucial for debugging during test execution. It sets up the root logger and ensures detailed error information is available. ```javascript //var appender = new log4javascript.InPageAppender(); var appender = new log4javascript.BrowserConsoleAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Initialize log4javascript for Rangy Performance Tests Source: https://github.com/timdown/rangy/blob/master/test/textrangeperformancetests.html This JavaScript snippet sets up the log4javascript library for logging within the Rangy performance test environment. It enables stack traces, initializes an in-page appender (though commented out for adding to the root logger), and configures the root logger to show stack traces. ```javascript xn.test.enableStackTraces = true; var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); ``` -------------------------------- ### Iframe Content Load Callback Source: https://github.com/timdown/rangy/blob/master/demos/commands.html A global callback function designed to be invoked when the iframe's content has fully loaded. It updates the `iframeLoaded` flag and, if the main page is also ready, triggers the `allLoaded` function to finalize setup. ```JavaScript window.contentLoadCallback = function() { iframeLoaded = true; if (mainLoaded) { allLoaded(); } }; ``` -------------------------------- ### Initialize Log4javascript and XN Test Suite for HTML5 Selection Tests Source: https://github.com/timdown/rangy/blob/master/test/html5.html This JavaScript snippet configures log4javascript for in-page logging, initially disabling it but enabling stack traces. It then sets up an XN test suite specifically for 'HTML5 Selection conformance tests', ensuring stack traces are enabled for the testing framework as well. ```javascript var appender = new log4javascript.InPageAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); log4javascript.setEnabled(false); xn.test.enableStackTraces = true; xn.test.suite("HTML5 Selection conformance tests", function(s) { }); ``` -------------------------------- ### Configure Log4javascript and XN.test for Rangy Tests Source: https://github.com/timdown/rangy/blob/master/test/classappliertests.html This JavaScript snippet initializes log4javascript for browser console logging and enables stack traces for the xn.test framework. It's typically used for debugging and detailed output during test execution. ```javascript //var appender = new log4javascript.InPageAppender(); var appender = new log4javascript.BrowserConsoleAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Configure Logging and Testing for Rangy Serializer Tests Source: https://github.com/timdown/rangy/blob/master/test/serializertests.html This snippet initializes `log4javascript` for browser console output, retrieves the root logger, and enables stack traces for both `log4javascript` and `xn.test`. It includes commented-out lines showing alternative appender setup and disabling logging, providing context for the configuration choices. ```JavaScript //var appender = new log4javascript.InPageAppender(); var appender = new log4javascript.BrowserConsoleAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log44javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; ``` -------------------------------- ### Apply Gradient and Box Shadow Styles to Buttons Source: https://github.com/timdown/rangy/blob/master/fiddlings/214.html This CSS block defines a comprehensive set of styles for various button-like elements, including `button`, `input[type=submit]`, `.btn`, and `.bookmarklet`. It applies linear gradients for background, border-radius, box-shadows, text styling, and other visual properties to create a consistent look. ```css button, input[type=submit], .btn, .bookmarklet { background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(10%, #ffffff), color-stop(100%, #f0f0f0)); background-image: -webkit-linear-gradient(top, #ffffff 0%, #ffffff 10%, #f0f0f0 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #ffffff 10%, #f0f0f0 100%); background-image: -o-linear-gradient(top, #ffffff 0%, #ffffff 10%, #f0f0f0 100%); background-image: linear-gradient(top, #ffffff 0%, #ffffff 10%, #f0f0f0 100%); -webkit-border-radius: 0.15em; -moz-border-radius: 0.15em; -ms-border-radius: 0.15em; -o-border-radius: 0.15em; border-radius: 0.15em; -webkit-box-shadow: inset 0 0.2em 0 rgba(255, 255, 255, 0.2), 0 0.05em 0.1em rgba(0, 0, 0, 0.08); -moz-box-shadow: inset 0 0.2em 0 rgba(255, 255, 255, 0.2), 0 0.05em 0.1em rgba(0, 0, 0, 0.08); box-shadow: inset 0 0.2em 0 rgba(255, 255, 255, 0.2), 0 0.05em 0.1em rgba(0, 0, 0, 0.08); color: #777777; background-color: white; border: 1px solid lightgrey; border-radius: .2em; font-family: "Source Sans Pro", "Open Sans", sans-serif; font-size: 1em; padding: .33em .5em; cursor: pointer; display: inline-block; padding: .4em .9em .5em; position: relative; text-decoration: none; text-shadow: 0 1px 2px rgba(255, 255, 255, 0.9); color: #585858; border-color: #969696 #969696 #777777; -ms-user-select: text; } ``` -------------------------------- ### Rangy Selection Manipulation Methods Source: https://github.com/timdown/rangy/blob/master/demos/core.html Functions demonstrating various ways to interact with the current text selection using the Rangy library. This includes reporting selection text/HTML, inspecting its properties, deleting its content, and collapsing it to either its start or end point. ```javascript function reportSelectionText() { alert( rangy.getSelection().toString() ); } function reportSelectionHtml() { alert( rangy.getSelection().toHtml() ); } function inspectSelection() { alert( rangy.getSelection().inspect() ); } function deleteSelection() { rangy.getSelection().deleteFromDocument(); } function collapseSelectionToStart() { rangy.getSelection().collapseToStart(); } function collapseSelectionToEnd() { rangy.getSelection().collapseToEnd(); } ``` -------------------------------- ### Configure log4javascript and xn.test for Rangy Source: https://github.com/timdown/rangy/blob/master/test/textrangetests.html This JavaScript snippet sets up logging using log4javascript and configures the xn.test framework for the Rangy project. It initializes a browser console appender for logging, enables stack traces for the logger, and also enables stack traces for the xn.test framework, while showing commented-out alternatives for in-page appenders and disabling logging/tests. ```javascript //var appender = new log4javascript.InPageAppender(); var appender = new log4javascript.BrowserConsoleAppender(); //log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); //log4javascript.setEnabled(false); xn.test.enableStackTraces = true; //xn.test.disableLogging = true; ``` -------------------------------- ### Rangy Selection Expansion to Words Source: https://github.com/timdown/rangy/blob/master/demos/textrange.html Demonstrates various ways to expand a user's text selection to encompass whole words using Rangy's `getSelection().expand("word")` method. Examples include basic word expansion, including trailing spaces, using a custom regex for word definition, and trimming whitespace. ```javascript function initSnapToWords1() { gEBI("demo1").onmouseup = function() { rangy.getSelection().expand("word"); }; } function initSnapToWords2() { gEBI("demo2").onmouseup = function() { rangy.getSelection().expand("word", { wordOptions: { includeTrailingSpace: true } }); }; } function initSnapToWords3() { gEBI("demo3").onmouseup = function() { rangy.getSelection().expand("word", { wordOptions: { wordRegex: /\\[a-z0-9\\]+(\\[\'\\\\-\\]\\[a-z0-9\\]+)\\\*/gi } }); }; } function initSnapToWords4() { gEBI("demo4").onmouseup = function() { rangy.getSelection().expand("word", { trim: true }); }; } ``` -------------------------------- ### JavaScript Utility Functions for DOM and Data Formatting Source: https://github.com/timdown/rangy/blob/master/demos/position.html Provides helper functions for common DOM operations like getting elements by ID (`gEBI`) and formatting rectangle objects into a human-readable string representation (`rectToString`). It also includes a utility function (`createButton`) to dynamically create and configure HTML button elements. ```javascript function gEBI(id) { return document.getElementById(id); } function rectToString(rect) { return "(" + rect.left + ", " + rect.top + "), (" + rect.right + ", " + rect.bottom + ")"; } function createButton(parentNode, clickHandler, value) { var button = document.createElement("input"); button.type = "button"; button.unselectable = true; button.className = "unselectable"; button.ontouchstart = button.onmousedown = function() { clickHandler(); return false; }; button.value = value; parentNode.appendChild(button); button = null; } ``` -------------------------------- ### Initialize log4javascript and Rangy, Manipulate Text Range Source: https://github.com/timdown/rangy/blob/master/test/textranges.html This JavaScript snippet initializes the log4javascript library for in-page logging and the Rangy library for text range manipulation. It demonstrates creating a text range, inserting a temporary element to find a specific position, and then inspecting the Rangy selection after setting the range. ```javascript var appender = new log4javascript.InPageAppender(); log4javascript.getRootLogger().addAppender(appender); var log = log4javascript.getRootLogger(); log4javascript.setShowStackTraces(true); window.onload = function() { rangy.init(); var textNode = document.getElementById("b1").nextSibling; var p = textNode.parentNode; var r = document.body.createTextRange(); var workingRange = r.duplicate(); var workingNode = document.createElement("span"); workingNode.innerHTML = "&#ffef;"; p.insertBefore(workingNode, textNode); workingRange.moveToElementText(workingNode); workingRange.collapse(false); p.removeChild(workingNode); r.setEndPoint("StartToStart", workingRange); r.select(); log.warn(rangy.getSelection().inspect()); }; ``` -------------------------------- ### Dynamically Embed Iframe for DOM Selection Tests Source: https://github.com/timdown/rangy/blob/master/test/rangetests.html Uses `document.write` to insert an iframe element into the current HTML document. This iframe, identified by 'selectors', is likely used as a target or context for testing various DOM selection and manipulation functionalities within the Rangy library. ```JavaScript document.write('