message: Implement String Methods: basename, extension, filename, parent
diff: @@ -10,6 +10,7 @@ use super::ranges::parse_index_range;
  use super::{slice, is_expression};
  use types::Array;
  +use std::path::Path;
  // Bit Twiddling Guide:
  // var & FLAG != 0 checks if FLAG is enabled
  @@ -465,6 +466,46 @@ impl<'a> StringMethod<'a> {
  output.push_str(&word.as_bytes().len().to_string());
  }
  },
  + "basename" => {
  + if let Some(value) = expand.vars.get_var(self.variable) {
  + output.push_str(Path::new(&value).file_name()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(value.as_str()));
  + } else if is_expression(self.variable) {
  + let word = expand_string(self.variable, &expand, false).join(self.pattern);
  + output.push_str(Path::new(&word).file_name()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(word.as_str()));
  + }
  + },
  + "extension" => {
  + if let Some(value) = expand.vars.get_var(self.variable) {
  + output.push_str(Path::new(&value).extension()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(value.as_str()));
  + } else if is_expression(self.variable) {
  + let word = expand_string(self.variable, &expand, false).join(self.pattern);
  + output.push_str(Path::new(&word).extension()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(word.as_str()));
  + }
  + },
  + "filename" => {
  + if let Some(value) = expand.vars.get_var(self.variable) {
  + output.push_str(Path::new(&value).file_stem()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(value.as_str()));
  + } else if is_expression(self.variable) {
  + let word = expand_string(self.variable, &expand, false).join(self.pattern);
  + output.push_str(Path::new(&word).file_stem()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(word.as_str()));
  + }
  + },
  + "parent" => {
  + if let Some(value) = expand.vars.get_var(self.variable) {
  + output.push_str(Path::new(&value).parent()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(value.as_str()));
  + } else if is_expression(self.variable) {
  + let word = expand_string(self.variable, &expand, false).join(self.pattern);
  + output.push_str(Path::new(&word).parent()
  + .and_then(|os_str| os_str.to_str()).unwrap_or(word.as_str()));
  + }
  + },
  _ => {
  eprintln!("ion: unknown string method: {}", self.method);
  }
  