View difference between Paste ID: KgtjePFm and 7Nq6R70n
SHOW: | | - or go back to the newest paste.
1
-- Extensions version 2.1 by KnightMiner
2
3
-- Check if we are loading as an API or running the startup
4
if not shell then
5
  -- Load the list of extensions
6
  local file = fs.open( "extensions.cfg", "r" )
7
  list = textutils.unserialize( file.readAll() )
8
  file.close()
9
  
10
  -- Function to check if a program is a file and what to run it with
11
  function program( name )
12
    local prog, file, noExt
13
    if name:find( '^".-"' ) then
14
      prog = list[string.match( name, '^".-%.([^. ]+)"' )]
15
      file = string.match( name, '^(".-%.[^. ]+")' )
16
      noExt = name:gsub( '^"(.-)%.[^. ]+"', '"%1"' )
17
    else
18
      prog = list[string.match( name, '^[^ ]-%.([^. ]+)' )]
19
      file = string.match( name, '^([^ ]-%.[^. ]+)' )
20
      noExt = name:gsub( '^([^ ]-)%.[^. ]+', '%1' )
21
    end
22
    if type( prog ) == "table" then
23
      if prog.noExt then
24
        return prog[1], file, noExt
25
      else
26
        return prog[1], file
27
      end
28
    else
29
      return prog, file
30
    end
31
  end
32
  
33
-- Running as a program
34
else
35
  -- validate args
36
  local args = { ... }
37
  if #args > 2 or args[1] == "usage" then
38
    print( "Usage: extensions [option] [option2]" )
39
  end
40
41
  -- Check for an extensions configuration file
42
  -- If it does not exist, ask to create it
43
  if not fs.exists( "extensions.cfg" ) then
44
    function create( default )
45
      print( "Creating extension.cfg" )
46
      local file = fs.open( "extensions.cfg", "w" )
47
      file.write( '{\n  -- Lua table containing file extensions\n  cfg = "edit"\n}' )
48
      file.close()
49
      if default then
50
        print( "Created default extensions.cfg" )
51
      else
52
        shell.run( "edit extensions.cfg" )
53
      end
54
    end
55
    if args[1] == "create" or args[1] == "create-default" then
56
      create( args[1] == "create-default" )
57
    elseif args[1] == "skip" then
58
      print( "Missing extensions.cfg file, cancelling" )
59
      return
60
    else
61
      print( "Missing extensions.cfg file, create it? (y/n)" )
62
      while true do
63
        local _, key = os.pullEvent( "key" )
64
        -- remove any stray character events
65
        os.startTimer(0.1)
66
        os.pullEvent()
67
        if key == keys.y then
68
          create()
69
          break
70
        elseif key == keys.n then
71
          print( "Cancelling extension loading" )
72
          return
73
        end
74
      end
75
    end
76
  end
77
78
  -- Check to see if we already ran the extension program
79
  -- And if so, ask if we should reload
80
  if extensions then
81
    if ( args[2] or args[1] ) == "load" then
82
      print( "Extensions already loaded, cancelling" )
83
      return
84
    elseif ( args[2] or args[1] ) == "reload" then
85
      print( "Reloading extension support" )
86
    else
87
      print( "Extensions already loaded, reload them? (y/n)" )
88
      while true do
89
        local _, key = os.pullEvent( "key" )
90
        -- remove any stray character events
91
        os.startTimer(0.1)
92
        os.pullEvent()
93
        if key == keys.y then
94
          print( "Reloading extension support" )
95
          break
96
        elseif key == keys.n then
97
          print( "Cancelling extension reloading" )
98
          return
99
        end
100
      end
101
    end
102
    os.unloadAPI( "extensions" )
103
  else
104
    -- Preserve the original method of running
105
    print( "Loading extension support" )
106
    shell.runRaw = shell.run
107
  end
108
109
  os.loadAPI( "extensions" )
110
  if not extensions.list then
111
    print( "Error loading extensions" )
112
    return
113
  end
114
115
  -- Override the shell.run function, so extensions run is used by default
116
  shell.run = function( name, ... )
117
    local program, progName, noExt = extensions.program( name )
118
    if program then
119
      if fs.exists( progName ) then
120
        return shell.runRaw( program, noExt or name, ... )
121
      else
122
        printError( "No such file" )
123
        return false
124
      end
125
    else
126
      return shell.runRaw( name, ... )
127
    end
128
  end
129
130
  print( "Extensions successfully loaded" )
131
end