forked from mirrors/gecko-dev
		
	<!-- Please describe your changes on the following line: --> Automatically verify that derive() lists are alphabetically ordered #18172 --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #18172 (github issue number if applicable). <!-- Either: --> - [X] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 474369618965569407d127b1e8c481e757cc59d3 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 421aa68def8e17f70580477a4203494db3b69382
		
			
				
	
	
		
			116 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
 | 
						|
pub enum CompressionMode {
 | 
						|
    CompressNone,
 | 
						|
    CompressWhitespace,
 | 
						|
    CompressWhitespaceNewline,
 | 
						|
    DiscardNewline
 | 
						|
}
 | 
						|
 | 
						|
// ported from Gecko's nsTextFrameUtils::TransformText.
 | 
						|
//
 | 
						|
// High level TODOs:
 | 
						|
//
 | 
						|
// * Issue #113: consider incoming text state (arabic, etc)
 | 
						|
//               and propagate outgoing text state (dual of above)
 | 
						|
//
 | 
						|
// * Issue #114: record skipped and kept chars for mapping original to new text
 | 
						|
//
 | 
						|
// * Untracked: various edge cases for bidi, CJK, etc.
 | 
						|
pub fn transform_text(text: &str,
 | 
						|
                      mode: CompressionMode,
 | 
						|
                      incoming_whitespace: bool,
 | 
						|
                      output_text: &mut String)
 | 
						|
                      -> bool {
 | 
						|
    let out_whitespace = match mode {
 | 
						|
        CompressionMode::CompressNone | CompressionMode::DiscardNewline => {
 | 
						|
            for ch in text.chars() {
 | 
						|
                if is_discardable_char(ch, mode) {
 | 
						|
                    // TODO: record skipped char
 | 
						|
                } else {
 | 
						|
                    // TODO: record kept char
 | 
						|
                    if ch == '\t' {
 | 
						|
                        // TODO: set "has tab" flag
 | 
						|
                    }
 | 
						|
                    output_text.push(ch);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            false
 | 
						|
        },
 | 
						|
 | 
						|
        CompressionMode::CompressWhitespace | CompressionMode::CompressWhitespaceNewline => {
 | 
						|
            let mut in_whitespace: bool = incoming_whitespace;
 | 
						|
            for ch in text.chars() {
 | 
						|
                // TODO: discard newlines between CJK chars
 | 
						|
                let mut next_in_whitespace: bool = is_in_whitespace(ch, mode);
 | 
						|
 | 
						|
                if !next_in_whitespace {
 | 
						|
                    if is_always_discardable_char(ch) {
 | 
						|
                        // revert whitespace setting, since this char was discarded
 | 
						|
                        next_in_whitespace = in_whitespace;
 | 
						|
                        // TODO: record skipped char
 | 
						|
                    } else {
 | 
						|
                        // TODO: record kept char
 | 
						|
                        output_text.push(ch);
 | 
						|
                    }
 | 
						|
                } else { /* next_in_whitespace; possibly add a space char */
 | 
						|
                    if in_whitespace {
 | 
						|
                        // TODO: record skipped char
 | 
						|
                    } else {
 | 
						|
                        // TODO: record kept char
 | 
						|
                        output_text.push(' ');
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                // save whitespace context for next char
 | 
						|
                in_whitespace = next_in_whitespace;
 | 
						|
            } /* /for str::each_char */
 | 
						|
            in_whitespace
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    return out_whitespace;
 | 
						|
 | 
						|
    fn is_in_whitespace(ch: char, mode: CompressionMode) -> bool {
 | 
						|
        match (ch, mode) {
 | 
						|
            (' ', _)  => true,
 | 
						|
            ('\t', _) => true,
 | 
						|
            ('\n', CompressionMode::CompressWhitespaceNewline) => true,
 | 
						|
            (_, _)    => false
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    fn is_discardable_char(ch: char, mode: CompressionMode) -> bool {
 | 
						|
        if is_always_discardable_char(ch) {
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
        match mode {
 | 
						|
            CompressionMode::DiscardNewline | CompressionMode::CompressWhitespaceNewline => ch == '\n',
 | 
						|
            _ => false
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    fn is_always_discardable_char(ch: char) -> bool {
 | 
						|
        // TODO: check for soft hyphens.
 | 
						|
        is_bidi_control(ch)
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
pub fn float_to_fixed(before: usize, f: f64) -> i32 {
 | 
						|
    ((1i32 << before) as f64 * f) as i32
 | 
						|
}
 | 
						|
 | 
						|
pub fn fixed_to_float(before: usize, f: i32) -> f64 {
 | 
						|
    f as f64 * 1.0f64 / ((1i32 << before) as f64)
 | 
						|
}
 | 
						|
 | 
						|
pub fn is_bidi_control(c: char) -> bool {
 | 
						|
    match c {
 | 
						|
        '\u{202A}'...'\u{202E}' => true,
 | 
						|
        '\u{2066}'...'\u{2069}' => true,
 | 
						|
        '\u{200E}' | '\u{200F}' | '\u{061C}' => true,
 | 
						|
        _ => false
 | 
						|
    }
 | 
						|
}
 |