Changes
+ substr variant that takes a length instead of an ending position
function str.sub( frame )
    return mw.ustring.sub( frame.args.s, tonumber( frame.args.i ), tonumber( frame.args.j ) )
end
function str.sublength( frame )
    local i = tonumber( frame.args.i ) or 1
    local len = tonumber( frame.args.len )
    return mw.ustring.sub( frame.args.s, i, len and ( i + len - 1 ) )
end