Method: Bike::Storage#navi

Defined in:
lib/_storage/_storage.rb


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
# File 'lib/_storage/_storage.rb', line 63

def navi(conds)
  conds[:p] = '1' unless conds[:p] || conds[:id] || (@sd[:p_size].to_i < 1)
  navi = {}
  (([:id, :p, :d] & conds.keys) | conds.keys).each {|cid|
    next unless conds[cid] && respond_to?("_sibs_#{cid}", true)
    sibs = __send__("_sibs_#{cid}", conds)

    c = (c.is_a?(::Array) && c.size < 2) ? conds[cid].first : conds[cid]
    if i = sibs.index(c)
      if !navi[:prev] && i > 0
        navi[:prev] = conds.merge(cid => sibs[i - 1])
        if ![:id, :p].include? cid
          navi[:prev][:id] = _select_without(:id, navi[:prev]).last if conds[:id]
          navi[:prev][:p] = _p_count(navi[:prev]).to_s if conds[:p]
        end
      end
      if !navi[:next] && i < (sibs.size - 1)
        navi[:next] = conds.merge(cid => sibs[i + 1])
        if ![:id, :p].include? cid
          navi[:next][:id] = _select_without(:id, navi[:next]).first if conds[:id]
          navi[:next][:p] = '1' if conds[:p]
        end
      end
    end
    navi[:sibs] ||= {cid => sibs} if navi[:prev] || navi[:next]

    break if navi[:prev] && navi[:next]
  }

  navi
end