Skip to main content
1-Visitor
November 22, 2010
Question

 

  • November 22, 2010
  • 11 replies
  • 3007 views
I would like to find a way to represent a as something visible. It
could be the background colored, glyph, or something else. I want it to be a
visible only in the Editor.

d

    11 replies

    1-Visitor
    November 22, 2010
    Do you use the same FOSI for editing as you do for print composing?
    18-Opal
    November 22, 2010
    Hi Douglas-



    I'm not sure how to do exactly what you want, but you can easily set up
    the opposite, i.e. highlight all the regular spaces but not the nbsp's,
    which might serve your purpose just as well. Then any space that is not
    highlighted can be identified as a non-breaking space (or some other
    space variant).



    To do that, just go to Tools->Preferences, select the View tab, and
    check the Spaces and Tabs option. Each space will now appear as a little
    dot. Any space you see that doesn't show a dot is a non-standard space.



    --Clay


    1-Visitor
    November 22, 2010
    I have code that will find words separated by and wrap all three
    things (leading word, , and trailing word) in a pub font PI so the
    words appear pink. And associated code that can be run manually or on close
    that will remove the pub PIs.

    Can post it later if anyone is interested. It's quick-and-dirty code, not
    bomb-proof.

    1-Visitor
    November 23, 2010
    Paul,

    That's sound great. I would love to see your code.

    d


    1-Visitor
    November 23, 2010
    nope. two separate FOSI's

    d


    1-Visitor
    November 23, 2010
    Clay:

    Yes I do use the mid-dot view from preferences, but not all writers. Since,
    my eyes are old, it is getting harder to see the mid-dot and any blank
    characters next to them. I just do not want to strain anymore (grin).

    d


    1-Visitor
    November 23, 2010
    On Mon, Nov 22, 2010 at 3:25 PM, Douglas Wade <-> wrote:

    > Paul,
    > That's sound great. I would love to see your code.
    >

    Gmail "ate" leading tabs and turned them into spaces. You might want to
    rename leading spaces back to tabs somehow ... it will improve readability.

    I hid some internal information with this:
    supportpersonororganizationgoeshere.

    I added some comments just now preceded by 20101122 on the first line of
    those new comments. Mostly they say, "Uh, I forget why." When we initially
    deployed this we called it on every open. Despite modifying the code to pay
    attention to nesting, there were edge cases we gave up trying to catch and
    now authors call it manually if/when they want it. Also, I think we are
    currently stripping the PI automatically on a save callback we developed
    originally for some other thing because we suspected (but never proved) this
    PI was causing a problem for one of our production processes.

    Anyhow, you'll want to deploy this to or call it from editinit or
    doctype.acl or some such.

    hide and unhide are presently attached to menu commands by other code.

    Assume all the usual disclaimers and read the code before deploying,
    especially in a production environment.

    ----------------------------

    package highlight_nbsp

    # forward declarations
    function get_pos_end_of_last_nbsp() {}
    function highlight_nbsp() {}
    function over_nested() {}
    function startup_highlight_nbsp() {}
    function unhighlight_nbsp() {}

    # Function to test for for nesting depth prior to inserting to
    prevent Editor
    # hard crashing after insert attempt bringing the depth to 99 (or is it
    crossing the 99-level
    # boundary? Anyhow.
    # 20101122: This is inconsistently called. I can't remember why.
    function over_nested() {
    if (oid_level(oid_root(),oid_caret()) > 75) {
    response('Nesting exceeded the seventy-fifth level. This is probably the
    result of an error condition within the Show NBSP code but may reflect a
    highly complex document. Please notify supportpersonororganizationgoeshere.
    This early exit should have no negative consequences other than probably NOT
    highlighting all occurrences of NBSP.');
    return 1;
    }
    return 0;
    }

    # Function to return the character count of the last character in the last
    .
    # Note: length() and match() count characters with the expanded as a
    named entity.
    # goto_oid($oid, $pos) counts the as a single character when
    evaluating $pos
    # resulting in a 5 character discrepancy.
    function get_pos_end_of_last_nbsp(nbsp_element_content) {
    local end_pos = 0;
    local end_pos_temp = 0;
    local keep_looking_for_nbsp_in_element = 1
    while (keep_looking_for_nbsp_in_element) {
    if (match($nbsp_element_content,'') > 0) {
    $end_pos = $end_pos + match($nbsp_element_content,'');
    $end_pos_temp = match($nbsp_element_content,'') + 6;
    if (length($nbsp_element_content) + 1 == $end_pos_temp) {
    end_pos = -1;
    $keep_looking_for_nbsp_in_element = 0;
    }
    $nbsp_element_content = substr($nbsp_element_content, $end_pos_temp);
    }
    else {
    $keep_looking_for_nbsp_in_element = 0;
    }
    }
    return end_pos;
    }

    # Function to remove all instances. The guts behind Hide
    NBSPs.
    function unhighlight_nbsp() {
    local chgtrk = option("changetracking")
    local current_oid = oid_caret();
    local current_pos = oid_caret_pos();

    set changetracking = off;

    goto_oid(oid_root());
    find -t -q -nosel -nowrapscan "<_font>"
    if (main::status == 0) {
    while(main::status == 0) {
    delete_tag;
    find -t -q -nosel -nowrapscan "<_font>"
    }
    goto_oid(current_oid, current_pos);
    set changetracking = $chgtrk;
    return;
    }
    goto_oid(current_oid, current_pos);
    set changetracking = $chgtrk;
    return;
    }

    # Function called on open of document. Bugs out right away if any of the
    following
    # elements root the chunk: big_element1, big_element2, big_element3,
    big_element4.
    # to be called from doctype.acl or some ACL in editinit.
    # 20101122: we stopped using this very
    # soon after initial deployment for some reason I can't remember. prossibly
    # to do with over-nesting.
    function startup_highlight_nbsp() {
    if (oid_name(oid_root()) == 'big_element1' || oid_name(oid_root()) ==
    'big_element2' || oid_name(oid_root()) == 'big_element3' ||
    oid_name(oid_root()) == 'big_element4') {
    return;
    }
    else {
    highlight_nbsp();
    }
    }

    # Function that does all the wrapping of s with .
    function highlight_nbsp() {
    # save current location of caret, change tracking setting.
    local chgtrk = option("changetracking")
    local current_oid = oid_caret();
    local current_pos = oid_caret_pos();

    # A counter for erroring out of the main loop after "too many" loops.
    # Should prevent infinite loops. Error number (50,000 when code released)
    # could conceivable need to be adjusted for long -full documents.
    local i = 0;

    set changetracking = off;
    doc_update_display(current_doc(), 0);

    # Let's get ready to go.
    goto_oid(oid_root());

    # Let's go. Priming find loop logic.
    keep_looking = find('', 0x0530);

    # Main program loop.
    while (keep_looking) {

    # The element are we going to be working with for the rest of the loop.
    oid = oid_caret();

    # Save this so when we do our next search, we can try again if
    # we catch the element we just processed.
    oid_last = oid_caret();
    oid_caret_pos_last = oid_caret_pos();

    # Get starting character positions for activities to come.
    first_nbsp_pos = oid_caret_pos();
    left_of_first_nbsp = oid_caret_pos() - 1;

    #response($first_nbsp_pos);

    # Avoid nesting if at all possible.
    # Avoid trying to insert within comments which Editor
    doesn't like.
    if (! inside_tag("_font") && ! inside_tag("_comment")) {
    #response('||' . oid_content($oid) . '||');
    #response(substr(oid_content($oid),1,$left_of_first_nbsp));
    # 1 and -1 are special.
    # 1 occurs when is first in an element.
    # -1 occurs when is last (and possibly first) in an element.
    # length of content with counts the as 6 characters instead
    of 1
    #
    if (first_nbsp_pos == -1) {
    #response('-1 Condition: is last (possibly first and last)
    character in element.');
    #response(length(oid_content($oid)));
    if (length(oid_content($oid)) > 6) {
    # Some characters precede the final .
    # response('Some characters precede the final .');
    # if (over_nested()) {return}

    mark -noselection begin
    caret prevword;
    caret prevword;
    mark -selection end
    if (! over_nested()) {
    insert_tag('_font')
    modify_attr('FontColor', '#9400D3')
    td -none
    }
    }
    else {
    # is the only character in the element.
    # response(' is the only character in the element.');
    # No further attention required for elements containing only an .
    # if (over_nested()) {return}

    CharLeftExtend
    insert_tag('_font')
    modify_attr('FontColor', '#9400D3')
    modify_attr('BackColor', '#9400D3')
    # td -local -full
    td -none
    }
    }
    else if (first_nbsp_pos == 1) {
    # response('1 Condition: is first (but not first and last)
    character in element.');
    # response($first_nbsp_pos);
    # insert_string('+');
    # if (over_nested()) {return}

    caret nextword;
    mark -noselection begin
    goto_oid($oid,$first_nbsp_pos)
    mark -selection end
    insert_tag('_font')
    modify_attr('FontColor', '#9400D3')
    td -none
    }
    else if (first_nbsp_pos == 0) {
    response('0 Condition: Please save a copy of this XML instance and
    e-mail it to supportpersonororganizationgoeshere. It contains an XML
    structure not encountered during development. This should not have any
    negative consequences other than possibly NOT highlighting a few occurrences
    of NBSP.');
    }
    else {
    # response('>1 Condition: is neither first nor last character in
    element.');
    # if (over_nested()) {return}

    caret nextword;
    mark -noselection begin
    caret prevword;
    caret prevword;
    caret prevword;
    mark -selection end
    insert_tag('_font')
    modify_attr('FontColor', '#9400D3')
    td -none
    caret nextword;
    caret nextword;
    #insert_string('+');
    last_pos = oid_caret_pos();
    junk = find('', 0x0530);

    # This loop processes the remainder of the element initially caught in
    the outer while loop.
    # It is definitely missing some occurrences and needs more attention.
    while (oid_caret() == $oid) {
    # if (over_nested()) {return}
    caret nextword;
    mark -noselection begin
    caret prevword;
    caret prevword;
    caret prevword;
    mark -selection end
    insert_tag('_font')
    modify_attr('FontColor', '#9400D3')
    td -none
    caret nextword;
    caret nextword;

    # Find the next next occurrence.
    junk = find('', 0x0530);
    # response(oid_last . ' ' . oid_caret());
    # response(oid_caret_pos_last . ' ' . oid_caret_pos());

    # Keep trying if we've found one we've already worked.
    # THIS IS PROBABLY SKIPPING SOMETIMES.
    if (oid_last == oid_caret() && oid_caret_pos_last = oid_caret_pos()) {
    junk = find('', 0x0530);
    }
    }
    }

    } # fi

    # Get to end of currently working element
    # This preps the next find to really "move on" to the next oid in the
    tree.
    goto_oid($oid, -1)

    # Bug out if we loop too many times during testing.
    # 50,000 is an arbitrary number. If we run into ti,
    # I'll be surprised, but one never knows.
    i++;
    if (i > 50000) {
    response('50,000 NBSPs processed. This is probably the result of an error
    condition within the Show NBSP code but may reflect a very long document.
    Please notify supportpersonororganizationgoeshere. This early exit should
    have no negative consequences other than probably NOT highlighting all
    occurrences of NBSP.');
    goto_oid(current_oid, current_pos);
    set changetracking = $chgtrk;
    doc_update_display(current_doc(), 1);
    return
    } # fi

    # Reprime the find pump with next occurrence before end of outer while
    loop.
    keep_looking = find('', 0x0530);
    # response(oid_last . ' ' . oid_caret());
    # response(oid_caret_pos_last . ' ' . oid_caret_pos());

    # Make sure we didn't somehow re-find the element we just handled.
    if (oid_last == oid_caret() && oid_caret_pos_last = oid_caret_pos()) {
    keep_looking = find('', 0x0530);
    }

    } # elihw

    # Reset all of the options/settings to their status prior to running this
    code.
    doc_update_display(current_doc(), 1);
    set changetracking = $chgtrk;
    goto_oid(current_oid, current_pos);

    # response('We found ~' . $i . ' s.');
    # response('Grace.');
    } # end highlight_nbsp

    --
    Paul Nagai
    1-Visitor
    November 23, 2010
    Hello,

    Another way is to add a menu that just launch a substitute :
    s -a -m //█/
    and another one (also automatically launched before save, quit or print)
    s -a -m /█//

    Very good for old eyes.

    Yves Deniard
    MBDA
    1 avenue Réaumur
    92358 Le Plessis-Robinson cedex
    France
    tél.:01.71.54.27.39
    yves.deniard@mbda-systems-com



    1-Visitor
    November 23, 2010
    Wow, all that code to display a non-breaking space. I will be looking at it
    here shortly. That you so much for sharing that.

    d


    1-Visitor
    November 23, 2010
    Clay could probably do it in 47 lines.