summary refs log tree commit diff stats
path: root/examples
Commit message (Expand)AuthorAgeFilesLines
* linting: pylint: Remove most `disabled=protected-access`nfnty2017-01-301-2/+2
* examples: Added plugin_fasd_add.pyTheo Laurent2017-01-291-0/+25
* Add setting `hostname_in_titlebar`nfnty2017-01-291-0/+3
* linting: pylint: Enable `broad-except`, Improve loggingnfnty2017-01-211-16/+13
* Python 3 division: Import `division` from `__future__`nfnty2017-01-218-8/+8
* linting: pylint 2.0.0nfnty2017-01-171-2/+1
* linting: Python 2 compat: Import from `__future__`nfnty2017-01-178-0/+17
* linting: Python 2 compatnfnty2017-01-172-6/+6
* linting: pylint and flake8nfnty2017-01-178-25/+46
* linting: autopep8nfnty2017-01-171-4/+10
* Merge branch 'automatic-cd-osx' of https://github.com/arshiamufti/rangerhut2016-11-041-0/+2
|\
| * Add correct path to ranger on OS XArshia Mufti2016-09-061-0/+2
* | Fix the urxvt preview documentationWojciech Siewierski2016-10-081-1/+1
* | Implement the urxvt-based image previewsWojciech Siewierski2016-10-051-0/+8
|/
* Fix misspellingsstepshal2016-06-261-1/+1
* Merge branch 'E301' of https://github.com/stepshal/rangerhut2016-06-182-0/+2
|\
| * Add one blank line where is expectedstepshal2016-06-162-0/+2
* | Add two blank lines where is expectedstepshal2016-06-167-0/+12
|/
* doc/tools/print_colors.py: remove trailing newlinestepshal2016-06-071-1/+0
* examples/plugin_new_macro.py: fix spaceshut2016-06-021-3/+3
* fixed key binding for new tabs in rc_emacs.conf, its now <C-x><C-f>hut2016-04-011-1/+1
* Merge branch 'vifon/pmount' of https://github.com/Vifon/rangerhut2015-11-141-0/+30
|\
| * Add plugin_pmount.pyWojciech Siewierski2015-10-091-0/+30
* | examples/rc_emacs.conf: re-enable numeric modifier keyshut2015-10-201-1/+0
|/
* Add ability to use ranger as file-chooser in gvimNg Oon-Ee2015-08-041-1/+5
* added examples/plugin_ipc.pyWojciech Siewierski2015-06-211-0/+45
* Fix mktemp invocation to work on Mac OS X and LinuxJesse Byler2015-06-101-1/+1
* Replaced file.basename with file.relative_path where appropriate.Wojciech Siewierski2015-05-082-3/+3
* added examples/rc_emacs.confhut2015-05-041-0/+533
* added example plugin that adds a linemodehut2015-04-191-0/+16
* Should I dual ranger/cleric or wait for the THAC0 bonus? v1.7.0hut2015-04-1410-10/+10
* moved "doc/examples" to "examples" for more visibilityhut2015-04-1311-0/+221
* move examples to doc/exampleshut2013-03-0911-200/+0
* examples/rifle_sxiv: fix rifle_sxiv with chars like []hut2013-03-091-1/+1
* Fixed the sxiv workaround to handle spaces and be more POSIX compliant.Pierre Neidhardt2013-03-051-7/+21
* Added version info to exampleshut2013-03-0111-0/+22
* use 4-space-indents in files that had 2-space-indentshut2013-02-221-5/+5
* core.main: added RANGER_LOAD_DEFAULT_RC environment variablehut2013-02-221-9/+0
* examples/plugin_chmod_keybindings.py: fixed crashhut2013-02-221-1/+1
* examples/rifle_sxiv.sh: removed realpath dependencyhut2013-02-181-1/+8
* examples/rifle_sxiv.sh: remove bash dependencyhut2013-02-181-1/+1
* fsobject.directory.accept_file: pass directory, not dirnamehut2013-02-151-3/+3
* examples/README: add instructions on how to install pluginshut2013-02-131-0/+3
* removed all trailing whitespaceshut2013-02-101-1/+1
* replaced tabs with 4 spaces in all python fileshut2013-02-101-7/+7
* added examples/rifle_different_file_opener.confhut2012-12-041-0/+7
* added examples/plugin_hello_world.pyhut2012-12-041-0/+21
* updated man page, improved hookshut2012-12-041-5/+5
* removed options.py, improved plugins. *UPDATE YOUR COMMANDS.PY*hut2012-12-046-1/+69
* examples/rifle_sxiv.sh: fix symlink handlinghut2012-08-071-1/+1
s='alt'>
d5f89e0f ^
a796831f ^



555d95c1 ^
4ad0f652 ^
a796831f ^


c4e143d6 ^

9dcbec39 ^
c4e143d6 ^


9dcbec39 ^
c4e143d6 ^


66abe7c1 ^






ce2e604e ^


c4e143d6 ^
08cf048f ^
79eef536 ^
b74443e5 ^
eb4eecea ^
66abe7c1 ^






ce2e604e ^
a17f9186 ^
a796831f ^
a796831f ^



79eef536 ^
a796831f ^
66abe7c1 ^




a072f674 ^
eb4eecea ^
a072f674 ^

a796831f ^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
                                                                             

                                                                          


                           
          

                                  
                                              
 
                                                   
          




                                     
                                        
          

                                                  
                                              


                                                              
          



                                                

                                                                
                                       




                                                             



                                                                          

                                            
                       
                         
                                      
                        
                
                      



                                                                            
                           




                                            

                                             



                                                                 




                                             



                                                                 



                                             



                                                                 




                                     
                                                   



                                    
                          
                             


                        

                       
                                                                       


                    
                                                              


           






                                                                          


                                                            
   
                        
                               
                              
                             






                                                                          
                                                  
                                                                 
   



         
                               
                                




                                                                        
                                                    
                       

                                                

                
//: An alternative syntax for reagents that permits whitespace in properties,
//: grouped by brackets. We'll use this ability in the next layer, when we
//: generalize types from lists to trees of properties.

:(scenarios load)
:(scenario dilated_reagent)
def main [
  {1: number, foo: bar} <- copy 34
]
+parse:   product: {1: "number", "foo": "bar"}

:(scenario load_trailing_space_after_curly_bracket)
def main [
  # line below has a space at the end
  { 
]
# successfully parsed

:(scenario dilated_reagent_with_comment)
def main [
  {1: number, foo: bar} <- copy 34  # test comment
]
+parse:   product: {1: "number", "foo": "bar"}
$error: 0

:(scenario dilated_reagent_with_comment_immediately_following)
def main [
  1:number <- copy {34: literal}  # test comment
]
$error: 0

//: First augment next_word to group balanced brackets together.

:(before "End next_word Special-cases")
if (in.peek() == '(')
  return slurp_balanced_bracket(in);
// treat curlies mostly like parens, but don't mess up labels
if (start_of_dilated_reagent(in))
  return slurp_balanced_bracket(in);

:(code)
// A curly is considered a label if it's the last thing on a line. Dilated
// reagents should remain all on one line.
bool start_of_dilated_reagent(istream& in) {
  if (in.peek() != '{') return false;
  int pos = in.tellg();
  in.get();  // slurp '{'
  skip_whitespace_but_not_newline(in);
  char next = in.peek();
  in.seekg(pos);
  return next != '\n';
}

// Assume the first letter is an open bracket, and read everything until the
// matching close bracket.
// We balance {} () and [].
string slurp_balanced_bracket(istream& in) {
  ostringstream result;
  char c;
  list<char> open_brackets;
  while (in >> c) {
    if (c == '(') open_brackets.push_back(c);
    if (c == ')') {
      if (open_brackets.empty() || open_brackets.back() != '(') {
        raise << "unbalanced ')'\n" << end();
        continue;
      }
      assert(open_brackets.back() == '(');
      open_brackets.pop_back();
    }
    if (c == '[') open_brackets.push_back(c);
    if (c == ']') {
      if (open_brackets.empty() || open_brackets.back() != '[') {
        raise << "unbalanced ']'\n" << end();
        continue;
      }
      open_brackets.pop_back();
    }
    if (c == '{') open_brackets.push_back(c);
    if (c == '}') {
      if (open_brackets.empty() || open_brackets.back() != '{') {
        raise << "unbalanced '}'\n" << end();
        continue;
      }
      open_brackets.pop_back();
    }
    result << c;
    if (open_brackets.empty()) break;
  }
  skip_whitespace_and_comments_but_not_newline(in);
  return result.str();
}

:(after "Parsing reagent(string s)")
if (starts_with(s, "{")) {
  assert(properties.empty());
  istringstream in(s);
  in >> std::noskipws;
  in.get();  // skip '{'
  name = slurp_key(in);
  if (name.empty()) {
    raise << "invalid reagent '" << s << "' without a name\n" << end();
    return;
  }
  if (name == "}") {
    raise << "invalid empty reagent '" << s << "'\n" << end();
    return;
  }
  {
    string s = next_word(in);
    if (s.empty()) {
      assert(!has_data(in));
      raise << "incomplete dilated reagent at end of file (0)\n" << end();
      return;
    }
    string_tree* type_names = new string_tree(s);
    // End Parsing Dilated Reagent Type Property(type_names)
    type = new_type_tree(type_names);
    delete type_names;
  }
  while (has_data(in)) {
    string key = slurp_key(in);
    if (key.empty()) continue;
    if (key == "}") continue;
    string s = next_word(in);
    if (s.empty()) {
      assert(!has_data(in));
      raise << "incomplete dilated reagent at end of file (1)\n" << end();
      return;
    }
    string_tree* value = new string_tree(s);
    // End Parsing Dilated Reagent Property(value)
    properties.push_back(pair<string, string_tree*>(key, value));
  }
  return;
}

:(code)
string slurp_key(istream& in) {
  string result = next_word(in);
  if (result.empty()) {
    assert(!has_data(in));
    raise << "incomplete dilated reagent at end of file (2)\n" << end();
    return result;
  }
  while (!result.empty() && *result.rbegin() == ':')
    strip_last(result);
  while (isspace(in.peek()) || in.peek() == ':')
    in.get();
  return result;
}