filename

function filename( path ) --> name

Description

Returns the file name without the extension used by path. The name is the prefix before the first dot in the final slash-separated element of path.

Parameters

path

Path with file name.

Return Values

name

File name without the extension.

Code

--ZFUNC-filename-v1
local function filename( path ) --> name
   --ZFUNC-basename-v1
   local function basename( path, ext )
      --ZFUNC-rmsuffix-v1
      local function rmsuffix( str, suffix )
         local suffixlen = string.len( suffix )
         local endsub = string.sub( str, -suffixlen )
         if endsub == suffix then
            local n = string.len( str ) - suffixlen
            return string.sub( str, 1, n )
         else
            return str
         end
      end

      local i = #path
      local c = string.sub( path, i, i )
      while i > 0 and c ~= "/" do
         i = i - 1
         c = string.sub( path, i, i )
      end

      local name = path
      if i ~= 0 then name = string.sub( path, i+1 ) end

      if ext then
         return rmsuffix( name, ext )
      else
         return name
      end
   end

   --ZFUNC-extname-v1
   local function extname( path )
      local i = #path
      local c = string.sub( path, i, i )
      while i > 0 and c ~= "." do
         i = i - 1
         c = string.sub( path, i, i )
         if c == "/" then return "" end
      end

      if i == 0 then return "" end --empty path

      return string.sub( path, i )
   end

   return basename( path, extname( path ) )
end

return filename

Examples

local t = require( "taptest" )
local filename = require( "filename" )

t( filename( "index.html" ), "index" )
t( filename( "index.coffee.md" ), "index.coffee" )

t( filename( "index.." ), "index." )
t( filename( "index" ), "index" )

t( filename( ".index" ), "" )
t( filename( "/.index" ), "" )

t( filename( "abc.def/index" ), "index" )

t()