mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-08-02 14:07:46 +00:00
Merge branch 'hbina-tr-reimplement-expansion' of github.com:hbina/coreutils into hbina-tr-reimplement-expansion
This commit is contained in:
commit
002584d0dd
3 changed files with 14 additions and 9 deletions
|
@ -15,7 +15,7 @@ fn parse_octal(input: &str) -> IResult<&str, char> {
|
||||||
preceded(tag("\\"), recognize(many_m_n(1, 3, one_of("01234567")))),
|
preceded(tag("\\"), recognize(many_m_n(1, 3, one_of("01234567")))),
|
||||||
|out: &str| {
|
|out: &str| {
|
||||||
u32::from_str_radix(out, 8)
|
u32::from_str_radix(out, 8)
|
||||||
.map(char::from_u32)
|
.map(std::char::from_u32)
|
||||||
.ok()
|
.ok()
|
||||||
.flatten()
|
.flatten()
|
||||||
},
|
},
|
||||||
|
|
|
@ -76,7 +76,7 @@ impl Sequence {
|
||||||
pub fn flatten(&self) -> Box<dyn Iterator<Item = char>> {
|
pub fn flatten(&self) -> Box<dyn Iterator<Item = char>> {
|
||||||
match self {
|
match self {
|
||||||
Sequence::Char(c) => Box::new(std::iter::once(*c)),
|
Sequence::Char(c) => Box::new(std::iter::once(*c)),
|
||||||
Sequence::CharRange(l, r) => Box::new((*l..=*r).flat_map(char::from_u32)),
|
Sequence::CharRange(l, r) => Box::new((*l..=*r).flat_map(std::char::from_u32)),
|
||||||
Sequence::CharStar(c) => Box::new(std::iter::repeat(*c)),
|
Sequence::CharStar(c) => Box::new(std::iter::repeat(*c)),
|
||||||
Sequence::CharRepeat(c, n) => Box::new(std::iter::repeat(*c).take(*n)),
|
Sequence::CharRepeat(c, n) => Box::new(std::iter::repeat(*c).take(*n)),
|
||||||
Sequence::Alnum => Box::new(('0'..='9').chain('A'..='Z').chain('a'..='z')),
|
Sequence::Alnum => Box::new(('0'..='9').chain('A'..='Z').chain('a'..='z')),
|
||||||
|
@ -85,7 +85,7 @@ impl Sequence {
|
||||||
Sequence::Control => Box::new(
|
Sequence::Control => Box::new(
|
||||||
(0..=31)
|
(0..=31)
|
||||||
.chain(std::iter::once(127))
|
.chain(std::iter::once(127))
|
||||||
.flat_map(char::from_u32),
|
.flat_map(std::char::from_u32),
|
||||||
),
|
),
|
||||||
Sequence::Digit => Box::new('0'..='9'),
|
Sequence::Digit => Box::new('0'..='9'),
|
||||||
Sequence::Graph => Box::new(
|
Sequence::Graph => Box::new(
|
||||||
|
@ -98,7 +98,7 @@ impl Sequence {
|
||||||
.chain(91..=96)
|
.chain(91..=96)
|
||||||
.chain(123..=126)
|
.chain(123..=126)
|
||||||
.chain(std::iter::once(32)) // space
|
.chain(std::iter::once(32)) // space
|
||||||
.flat_map(char::from_u32),
|
.flat_map(std::char::from_u32),
|
||||||
),
|
),
|
||||||
Sequence::Lower => Box::new('a'..='z'),
|
Sequence::Lower => Box::new('a'..='z'),
|
||||||
Sequence::Print => Box::new(
|
Sequence::Print => Box::new(
|
||||||
|
@ -110,14 +110,14 @@ impl Sequence {
|
||||||
.chain(58..=64)
|
.chain(58..=64)
|
||||||
.chain(91..=96)
|
.chain(91..=96)
|
||||||
.chain(123..=126)
|
.chain(123..=126)
|
||||||
.flat_map(char::from_u32),
|
.flat_map(std::char::from_u32),
|
||||||
),
|
),
|
||||||
Sequence::Punct => Box::new(
|
Sequence::Punct => Box::new(
|
||||||
(33..=47)
|
(33..=47)
|
||||||
.chain(58..=64)
|
.chain(58..=64)
|
||||||
.chain(91..=96)
|
.chain(91..=96)
|
||||||
.chain(123..=126)
|
.chain(123..=126)
|
||||||
.flat_map(char::from_u32),
|
.flat_map(std::char::from_u32),
|
||||||
),
|
),
|
||||||
Sequence::Space => Box::new(unicode_table::SPACES.iter().cloned()),
|
Sequence::Space => Box::new(unicode_table::SPACES.iter().cloned()),
|
||||||
Sequence::Upper => Box::new('A'..='Z'),
|
Sequence::Upper => Box::new('A'..='Z'),
|
||||||
|
@ -410,7 +410,11 @@ impl DeleteOperation {
|
||||||
impl SymbolTranslator for DeleteOperation {
|
impl SymbolTranslator for DeleteOperation {
|
||||||
fn translate(&mut self, current: char) -> Option<char> {
|
fn translate(&mut self, current: char) -> Option<char> {
|
||||||
let found = self.set.iter().any(|sequence| sequence.eq(¤t));
|
let found = self.set.iter().any(|sequence| sequence.eq(¤t));
|
||||||
(self.complement_flag == found).then(|| current)
|
if self.complement_flag == found {
|
||||||
|
Some(current)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -466,7 +470,7 @@ pub enum TranslateOperation {
|
||||||
impl TranslateOperation {
|
impl TranslateOperation {
|
||||||
fn next_complement_char(iter: u32, ignore_list: &[char]) -> (u32, char) {
|
fn next_complement_char(iter: u32, ignore_list: &[char]) -> (u32, char) {
|
||||||
(iter..)
|
(iter..)
|
||||||
.filter_map(char::from_u32)
|
.filter_map(std::char::from_u32)
|
||||||
.filter(|c| !ignore_list.iter().any(|s| s.eq(c)))
|
.filter(|c| !ignore_list.iter().any(|s| s.eq(c)))
|
||||||
.map(|c| (u32::from(c) + 1, c))
|
.map(|c| (u32::from(c) + 1, c))
|
||||||
.next()
|
.next()
|
||||||
|
@ -498,7 +502,7 @@ impl SymbolTranslator for TranslateOperation {
|
||||||
TranslateOperation::Standard(TranslateOperationStandard { translation_map }) => Some(
|
TranslateOperation::Standard(TranslateOperationStandard { translation_map }) => Some(
|
||||||
translation_map
|
translation_map
|
||||||
.iter()
|
.iter()
|
||||||
.find_map(|(l, r)| l.eq(¤t).then(|| *r))
|
.find_map(|(l, r)| if l.eq(¤t) { Some(*r) } else { None })
|
||||||
.unwrap_or(current),
|
.unwrap_or(current),
|
||||||
),
|
),
|
||||||
TranslateOperation::Complement(TranslateOperationComplement {
|
TranslateOperation::Complement(TranslateOperationComplement {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// spell-checker:ignore aabbaa aabbcc aabc abbb abcc abcdefabcdef abcdefghijk abcdefghijklmn abcdefghijklmnop ABCDEFGHIJKLMNOPQRS abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFZZ abcxyz ABCXYZ abcxyzabcxyz ABCXYZABCXYZ acbdef alnum amzamz AMZXAMZ bbbd cclass cefgm cntrl compl dabcdef dncase Gzabcdefg PQRST upcase wxyzz xdigit xycde xyyye xyyz xyzzzzxyzzzz ZABCDEF Zamz
|
||||||
use crate::common::util::*;
|
use crate::common::util::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue